diff options
-rw-r--r-- | drivers/scsi/scsi_error.c | 17 |
1 files changed, 5 insertions, 12 deletions
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index a95d2bac0780..a1689353d7fd 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c | |||
@@ -1451,28 +1451,21 @@ static void eh_lock_door_done(struct request *req, int uptodate) | |||
1451 | * @sdev: SCSI device to prevent medium removal | 1451 | * @sdev: SCSI device to prevent medium removal |
1452 | * | 1452 | * |
1453 | * Locking: | 1453 | * Locking: |
1454 | * We must be called from process context; scsi_allocate_request() | 1454 | * We must be called from process context. |
1455 | * may sleep. | ||
1456 | * | 1455 | * |
1457 | * Notes: | 1456 | * Notes: |
1458 | * We queue up an asynchronous "ALLOW MEDIUM REMOVAL" request on the | 1457 | * We queue up an asynchronous "ALLOW MEDIUM REMOVAL" request on the |
1459 | * head of the devices request queue, and continue. | 1458 | * head of the devices request queue, and continue. |
1460 | * | ||
1461 | * Bugs: | ||
1462 | * scsi_allocate_request() may sleep waiting for existing requests to | ||
1463 | * be processed. However, since we haven't kicked off any request | ||
1464 | * processing for this host, this may deadlock. | ||
1465 | * | ||
1466 | * If scsi_allocate_request() fails for what ever reason, we | ||
1467 | * completely forget to lock the door. | ||
1468 | */ | 1459 | */ |
1469 | static void scsi_eh_lock_door(struct scsi_device *sdev) | 1460 | static void scsi_eh_lock_door(struct scsi_device *sdev) |
1470 | { | 1461 | { |
1471 | struct request *req; | 1462 | struct request *req; |
1472 | 1463 | ||
1464 | /* | ||
1465 | * blk_get_request with GFP_KERNEL (__GFP_WAIT) sleeps until a | ||
1466 | * request becomes available | ||
1467 | */ | ||
1473 | req = blk_get_request(sdev->request_queue, READ, GFP_KERNEL); | 1468 | req = blk_get_request(sdev->request_queue, READ, GFP_KERNEL); |
1474 | if (!req) | ||
1475 | return; | ||
1476 | 1469 | ||
1477 | req->cmd[0] = ALLOW_MEDIUM_REMOVAL; | 1470 | req->cmd[0] = ALLOW_MEDIUM_REMOVAL; |
1478 | req->cmd[1] = 0; | 1471 | req->cmd[1] = 0; |