Commit ba5617de authored by Douglas Gilbert's avatar Douglas Gilbert Committed by Greg Kroah-Hartman

Fix bug 7994 sleeping function called from invalid context

  - addresses the reported bug (with GFP_KERNEL -> GFP_ATOMIC)
  - improves error checking, and
  - is a subset of the changes to scsi_debug in lk 2.6.21-rc*

Compiled and lightly tested (in lk 2.6.21-rc2 environment).
Signed-off-by: default avatarDouglas Gilbert <dougg@torque.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 7f5c005c
...@@ -954,7 +954,9 @@ static int resp_inquiry(struct scsi_cmnd * scp, int target, ...@@ -954,7 +954,9 @@ static int resp_inquiry(struct scsi_cmnd * scp, int target,
int alloc_len, n, ret; int alloc_len, n, ret;
alloc_len = (cmd[3] << 8) + cmd[4]; alloc_len = (cmd[3] << 8) + cmd[4];
arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_KERNEL); arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
if (! arr)
return DID_REQUEUE << 16;
if (devip->wlun) if (devip->wlun)
pq_pdt = 0x1e; /* present, wlun */ pq_pdt = 0x1e; /* present, wlun */
else if (scsi_debug_no_lun_0 && (0 == devip->lun)) else if (scsi_debug_no_lun_0 && (0 == devip->lun))
...@@ -1217,7 +1219,9 @@ static int resp_report_tgtpgs(struct scsi_cmnd * scp, ...@@ -1217,7 +1219,9 @@ static int resp_report_tgtpgs(struct scsi_cmnd * scp,
alen = ((cmd[6] << 24) + (cmd[7] << 16) + (cmd[8] << 8) alen = ((cmd[6] << 24) + (cmd[7] << 16) + (cmd[8] << 8)
+ cmd[9]); + cmd[9]);
arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_KERNEL); arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
if (! arr)
return DID_REQUEUE << 16;
/* /*
* EVPD page 0x88 states we have two ports, one * EVPD page 0x88 states we have two ports, one
* real and a fake port with no device connected. * real and a fake port with no device connected.
...@@ -1996,6 +2000,8 @@ static int scsi_debug_slave_configure(struct scsi_device * sdp) ...@@ -1996,6 +2000,8 @@ static int scsi_debug_slave_configure(struct scsi_device * sdp)
if (sdp->host->max_cmd_len != SCSI_DEBUG_MAX_CMD_LEN) if (sdp->host->max_cmd_len != SCSI_DEBUG_MAX_CMD_LEN)
sdp->host->max_cmd_len = SCSI_DEBUG_MAX_CMD_LEN; sdp->host->max_cmd_len = SCSI_DEBUG_MAX_CMD_LEN;
devip = devInfoReg(sdp); devip = devInfoReg(sdp);
if (NULL == devip)
return 1; /* no resources, will be marked offline */
sdp->hostdata = devip; sdp->hostdata = devip;
if (sdp->host->cmd_per_lun) if (sdp->host->cmd_per_lun)
scsi_adjust_queue_depth(sdp, SDEBUG_TAGGED_QUEUING, scsi_adjust_queue_depth(sdp, SDEBUG_TAGGED_QUEUING,
...@@ -2044,7 +2050,7 @@ static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev) ...@@ -2044,7 +2050,7 @@ static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev)
} }
} }
if (NULL == open_devip) { /* try and make a new one */ if (NULL == open_devip) { /* try and make a new one */
open_devip = kzalloc(sizeof(*open_devip),GFP_KERNEL); open_devip = kzalloc(sizeof(*open_devip),GFP_ATOMIC);
if (NULL == open_devip) { if (NULL == open_devip) {
printk(KERN_ERR "%s: out of memory at line %d\n", printk(KERN_ERR "%s: out of memory at line %d\n",
__FUNCTION__, __LINE__); __FUNCTION__, __LINE__);
......
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