Commit ab59d1f4 authored by Linus Torvalds's avatar Linus Torvalds

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
parents a2ce2666 c65c945c
...@@ -1083,7 +1083,7 @@ unsigned int beiscsi_boot_get_sinfo(struct beiscsi_hba *phba) ...@@ -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, ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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 { ...@@ -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 { ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment