Commit 6089a91f 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: three in drivers and one in the core.

  The core fix is also minor in scope since the bug it fixes is only
  known to affect systems using SCSI reservations. Of the driver bugs,
  the libsas one is the most major because it can lead to multiple disks
  on the same expander not being exposed"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
  scsi: core: reset host byte in DID_NEXUS_FAILURE case
  scsi: libsas: Fix rphy phy_identifier for PHYs with end devices attached
  scsi: sd_zbc: Fix sd_zbc_report_zones() buffer allocation
  scsi: libiscsi: Fix race between iscsi_xmit_task and iscsi_complete_task
parents cb268d80 4a067cf8
...@@ -1459,7 +1459,13 @@ static int iscsi_xmit_task(struct iscsi_conn *conn) ...@@ -1459,7 +1459,13 @@ static int iscsi_xmit_task(struct iscsi_conn *conn)
if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx))
return -ENODATA; return -ENODATA;
spin_lock_bh(&conn->session->back_lock);
if (conn->task == NULL) {
spin_unlock_bh(&conn->session->back_lock);
return -ENODATA;
}
__iscsi_get_task(task); __iscsi_get_task(task);
spin_unlock_bh(&conn->session->back_lock);
spin_unlock_bh(&conn->session->frwd_lock); spin_unlock_bh(&conn->session->frwd_lock);
rc = conn->session->tt->xmit_task(task); rc = conn->session->tt->xmit_task(task);
spin_lock_bh(&conn->session->frwd_lock); spin_lock_bh(&conn->session->frwd_lock);
......
...@@ -828,6 +828,7 @@ static struct domain_device *sas_ex_discover_end_dev( ...@@ -828,6 +828,7 @@ static struct domain_device *sas_ex_discover_end_dev(
rphy = sas_end_device_alloc(phy->port); rphy = sas_end_device_alloc(phy->port);
if (!rphy) if (!rphy)
goto out_free; goto out_free;
rphy->identify.phy_identifier = phy_id;
child->rphy = rphy; child->rphy = rphy;
get_device(&rphy->dev); get_device(&rphy->dev);
...@@ -854,6 +855,7 @@ static struct domain_device *sas_ex_discover_end_dev( ...@@ -854,6 +855,7 @@ static struct domain_device *sas_ex_discover_end_dev(
child->rphy = rphy; child->rphy = rphy;
get_device(&rphy->dev); get_device(&rphy->dev);
rphy->identify.phy_identifier = phy_id;
sas_fill_in_rphy(child, rphy); sas_fill_in_rphy(child, rphy);
list_add_tail(&child->disco_list_node, &parent->port->disco_list); list_add_tail(&child->disco_list_node, &parent->port->disco_list);
......
...@@ -655,6 +655,7 @@ static blk_status_t scsi_result_to_blk_status(struct scsi_cmnd *cmd, int result) ...@@ -655,6 +655,7 @@ static blk_status_t scsi_result_to_blk_status(struct scsi_cmnd *cmd, int result)
set_host_byte(cmd, DID_OK); set_host_byte(cmd, DID_OK);
return BLK_STS_TARGET; return BLK_STS_TARGET;
case DID_NEXUS_FAILURE: case DID_NEXUS_FAILURE:
set_host_byte(cmd, DID_OK);
return BLK_STS_NEXUS; return BLK_STS_NEXUS;
case DID_ALLOC_FAILURE: case DID_ALLOC_FAILURE:
set_host_byte(cmd, DID_OK); set_host_byte(cmd, DID_OK);
......
...@@ -142,10 +142,12 @@ int sd_zbc_report_zones(struct gendisk *disk, sector_t sector, ...@@ -142,10 +142,12 @@ int sd_zbc_report_zones(struct gendisk *disk, sector_t sector,
return -EOPNOTSUPP; return -EOPNOTSUPP;
/* /*
* Get a reply buffer for the number of requested zones plus a header. * Get a reply buffer for the number of requested zones plus a header,
* For ATA, buffers must be aligned to 512B. * without exceeding the device maximum command size. For ATA disks,
* buffers must be aligned to 512B.
*/ */
buflen = roundup((nrz + 1) * 64, 512); buflen = min(queue_max_hw_sectors(disk->queue) << 9,
roundup((nrz + 1) * 64, 512));
buf = kmalloc(buflen, gfp_mask); buf = kmalloc(buflen, gfp_mask);
if (!buf) if (!buf)
return -ENOMEM; return -ENOMEM;
......
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