SCSI fixes on 20161129
Four small fixes. The be2iscsi is a potential device overrun in consistent memory, which could have nasty consequences if the consistent allocations are packed. The hpsa one fixes a regression where older controllers can now get a numbering clash between the first internal disk and the controller. The libfc one is a regression in timespec conversions which causes a user visible issue in a command line tool and the mpt3sas one fixes a regression where the controller could remain permanently blocked after an ATA pass through command followed by a reset. Signed-off-by: James E.J. Bottomley <jejb@linux.vnet.ibm.com> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABAgAGBQJYPc7BAAoJEAVr7HOZEZN4odIP/2Rt4QLYQyAlwRcPoMOhhxgL 4DcZuU/aEqv7jb2UHDQxmYPyuGu4rSti/Zlj1GYo94KuZKd5nmC3U+vyMWEeBcfE l0v5A+rsRNJjVesGoTf0lcIuFWgUvy9nRA/XXIuWr1Aq8+ySy8ACFx91PamW9aiT yznBgZ8dbPSMozEveTv+Wy02T/w1H67idzOrAoH4oIyYHhDdeU1xkUwMFp87/OLL 0IGJLNHqkmrCTMXq533jAG9wIZVgJGBP5ddqxKz1P6sUBQfZ6YbSwecyC7d6/85X sadUiTMqT1mwCUbLYREyAuqSkuz7WhSBCB57N9yN33NUlW0kSbb4EkFZAj7rAEsU vWb0bMxqB8k2IwGhwsQhTESgxQNXGPGbfd/BNpN/ffeYfhCjxB0jLIHPjxTANJah E3j6HMWp4lxJJJEupQKoY2SeE20CMCTKaubRv8yw7EV2xng/slMVgzQL3XLszzFF h7WqkhPOyqgtBRaDuVsig1ZkwBhgZXkMM5sUGJp1nGZRoVnUbhtxdTS/xcN5pcnt G/Aq0LdDgYYtf1FQ83gX62rF8SSMu5xSVgBEDdVq/G/AaN/PwAr6DTWWV9rTodwH t4sdz/soPOwBvyp+m4S6RtPbNaF0Px8QRIWeaIUpQbvUhgwgmAGSOCIjhgJK3RMR /Hu9N+VFANZBf06Bv5Tk =9LSa -----END PGP SIGNATURE----- Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi Pull SCSI fixes from James Bottomley: "Four small fixes. The be2iscsi is a potential device overrun in consistent memory, which could have nasty consequences if the consistent allocations are packed. The hpsa one fixes a regression where older controllers can now get a numbering clash between the first internal disk and the controller. The libfc one is a regression in timespec conversions which causes a user visible issue in a command line tool and the mpt3sas one fixes a regression where the controller could remain permanently blocked after an ATA pass through command followed by a reset" * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: scsi: be2iscsi: allocate enough memory in beiscsi_boot_get_sinfo() scsi: mpt3sas: Unblock device after controller reset scsi: hpsa: use bus '3' for legacy HBA devices scsi: libfc: fix seconds_since_last_reset miscalculation
This commit is contained in:
commit
ab59d1f4b6
|
@ -1083,7 +1083,7 @@ unsigned int beiscsi_boot_get_sinfo(struct beiscsi_hba *phba)
|
||||||
nonemb_cmd = &phba->boot_struct.nonemb_cmd;
|
nonemb_cmd = &phba->boot_struct.nonemb_cmd;
|
||||||
nonemb_cmd->size = sizeof(*resp);
|
nonemb_cmd->size = sizeof(*resp);
|
||||||
nonemb_cmd->va = pci_alloc_consistent(phba->ctrl.pdev,
|
nonemb_cmd->va = pci_alloc_consistent(phba->ctrl.pdev,
|
||||||
sizeof(nonemb_cmd->size),
|
nonemb_cmd->size,
|
||||||
&nonemb_cmd->dma);
|
&nonemb_cmd->dma);
|
||||||
if (!nonemb_cmd->va) {
|
if (!nonemb_cmd->va) {
|
||||||
mutex_unlock(&ctrl->mbox_lock);
|
mutex_unlock(&ctrl->mbox_lock);
|
||||||
|
|
|
@ -2009,7 +2009,7 @@ static struct hpsa_scsi_dev_t *lookup_hpsa_scsi_dev(struct ctlr_info *h,
|
||||||
|
|
||||||
static int hpsa_slave_alloc(struct scsi_device *sdev)
|
static int hpsa_slave_alloc(struct scsi_device *sdev)
|
||||||
{
|
{
|
||||||
struct hpsa_scsi_dev_t *sd;
|
struct hpsa_scsi_dev_t *sd = NULL;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct ctlr_info *h;
|
struct ctlr_info *h;
|
||||||
|
|
||||||
|
@ -2026,7 +2026,8 @@ static int hpsa_slave_alloc(struct scsi_device *sdev)
|
||||||
sd->target = sdev_id(sdev);
|
sd->target = sdev_id(sdev);
|
||||||
sd->lun = sdev->lun;
|
sd->lun = sdev->lun;
|
||||||
}
|
}
|
||||||
} else
|
}
|
||||||
|
if (!sd)
|
||||||
sd = lookup_hpsa_scsi_dev(h, sdev_channel(sdev),
|
sd = lookup_hpsa_scsi_dev(h, sdev_channel(sdev),
|
||||||
sdev_id(sdev), sdev->lun);
|
sdev_id(sdev), sdev->lun);
|
||||||
|
|
||||||
|
@ -3840,6 +3841,7 @@ static int hpsa_update_device_info(struct ctlr_info *h,
|
||||||
sizeof(this_device->vendor));
|
sizeof(this_device->vendor));
|
||||||
memcpy(this_device->model, &inq_buff[16],
|
memcpy(this_device->model, &inq_buff[16],
|
||||||
sizeof(this_device->model));
|
sizeof(this_device->model));
|
||||||
|
this_device->rev = inq_buff[2];
|
||||||
memset(this_device->device_id, 0,
|
memset(this_device->device_id, 0,
|
||||||
sizeof(this_device->device_id));
|
sizeof(this_device->device_id));
|
||||||
if (hpsa_get_device_id(h, scsi3addr, this_device->device_id, 8,
|
if (hpsa_get_device_id(h, scsi3addr, this_device->device_id, 8,
|
||||||
|
@ -3929,10 +3931,14 @@ static void figure_bus_target_lun(struct ctlr_info *h,
|
||||||
|
|
||||||
if (!is_logical_dev_addr_mode(lunaddrbytes)) {
|
if (!is_logical_dev_addr_mode(lunaddrbytes)) {
|
||||||
/* physical device, target and lun filled in later */
|
/* physical device, target and lun filled in later */
|
||||||
if (is_hba_lunid(lunaddrbytes))
|
if (is_hba_lunid(lunaddrbytes)) {
|
||||||
|
int bus = HPSA_HBA_BUS;
|
||||||
|
|
||||||
|
if (!device->rev)
|
||||||
|
bus = HPSA_LEGACY_HBA_BUS;
|
||||||
hpsa_set_bus_target_lun(device,
|
hpsa_set_bus_target_lun(device,
|
||||||
HPSA_HBA_BUS, 0, lunid & 0x3fff);
|
bus, 0, lunid & 0x3fff);
|
||||||
else
|
} else
|
||||||
/* defer target, lun assignment for physical devices */
|
/* defer target, lun assignment for physical devices */
|
||||||
hpsa_set_bus_target_lun(device,
|
hpsa_set_bus_target_lun(device,
|
||||||
HPSA_PHYSICAL_DEVICE_BUS, -1, -1);
|
HPSA_PHYSICAL_DEVICE_BUS, -1, -1);
|
||||||
|
|
|
@ -69,6 +69,7 @@ struct hpsa_scsi_dev_t {
|
||||||
u64 sas_address;
|
u64 sas_address;
|
||||||
unsigned char vendor[8]; /* bytes 8-15 of inquiry data */
|
unsigned char vendor[8]; /* bytes 8-15 of inquiry data */
|
||||||
unsigned char model[16]; /* bytes 16-31 of inquiry data */
|
unsigned char model[16]; /* bytes 16-31 of inquiry data */
|
||||||
|
unsigned char rev; /* byte 2 of inquiry data */
|
||||||
unsigned char raid_level; /* from inquiry page 0xC1 */
|
unsigned char raid_level; /* from inquiry page 0xC1 */
|
||||||
unsigned char volume_offline; /* discovered via TUR or VPD */
|
unsigned char volume_offline; /* discovered via TUR or VPD */
|
||||||
u16 queue_depth; /* max queue_depth for this device */
|
u16 queue_depth; /* max queue_depth for this device */
|
||||||
|
@ -402,6 +403,7 @@ struct offline_device_entry {
|
||||||
#define HPSA_RAID_VOLUME_BUS 1
|
#define HPSA_RAID_VOLUME_BUS 1
|
||||||
#define HPSA_EXTERNAL_RAID_VOLUME_BUS 2
|
#define HPSA_EXTERNAL_RAID_VOLUME_BUS 2
|
||||||
#define HPSA_HBA_BUS 0
|
#define HPSA_HBA_BUS 0
|
||||||
|
#define HPSA_LEGACY_HBA_BUS 3
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Send the command to the hardware
|
Send the command to the hardware
|
||||||
|
|
|
@ -308,7 +308,7 @@ struct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *shost)
|
||||||
fc_stats = &lport->host_stats;
|
fc_stats = &lport->host_stats;
|
||||||
memset(fc_stats, 0, sizeof(struct fc_host_statistics));
|
memset(fc_stats, 0, sizeof(struct fc_host_statistics));
|
||||||
|
|
||||||
fc_stats->seconds_since_last_reset = (lport->boot_time - jiffies) / HZ;
|
fc_stats->seconds_since_last_reset = (jiffies - lport->boot_time) / HZ;
|
||||||
|
|
||||||
for_each_possible_cpu(cpu) {
|
for_each_possible_cpu(cpu) {
|
||||||
struct fc_stats *stats;
|
struct fc_stats *stats;
|
||||||
|
|
|
@ -3885,6 +3885,11 @@ _scsih_temp_threshold_events(struct MPT3SAS_ADAPTER *ioc,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool ata_12_16_cmd(struct scsi_cmnd *scmd)
|
||||||
|
{
|
||||||
|
return (scmd->cmnd[0] == ATA_12 || scmd->cmnd[0] == ATA_16);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* _scsih_flush_running_cmds - completing outstanding commands.
|
* _scsih_flush_running_cmds - completing outstanding commands.
|
||||||
* @ioc: per adapter object
|
* @ioc: per adapter object
|
||||||
|
@ -3906,6 +3911,9 @@ _scsih_flush_running_cmds(struct MPT3SAS_ADAPTER *ioc)
|
||||||
if (!scmd)
|
if (!scmd)
|
||||||
continue;
|
continue;
|
||||||
count++;
|
count++;
|
||||||
|
if (ata_12_16_cmd(scmd))
|
||||||
|
scsi_internal_device_unblock(scmd->device,
|
||||||
|
SDEV_RUNNING);
|
||||||
mpt3sas_base_free_smid(ioc, smid);
|
mpt3sas_base_free_smid(ioc, smid);
|
||||||
scsi_dma_unmap(scmd);
|
scsi_dma_unmap(scmd);
|
||||||
if (ioc->pci_error_recovery)
|
if (ioc->pci_error_recovery)
|
||||||
|
@ -4010,11 +4018,6 @@ _scsih_eedp_error_handling(struct scsi_cmnd *scmd, u16 ioc_status)
|
||||||
SAM_STAT_CHECK_CONDITION;
|
SAM_STAT_CHECK_CONDITION;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool ata_12_16_cmd(struct scsi_cmnd *scmd)
|
|
||||||
{
|
|
||||||
return (scmd->cmnd[0] == ATA_12 || scmd->cmnd[0] == ATA_16);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* scsih_qcmd - main scsi request entry point
|
* scsih_qcmd - main scsi request entry point
|
||||||
* @scmd: pointer to scsi command object
|
* @scmd: pointer to scsi command object
|
||||||
|
|
Loading…
Reference in New Issue