aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorJames Bottomley <James.Bottomley@steeleye.com>2005-11-08 09:21:07 -0500
committerJames Bottomley <jejb@mulgrave.(none)>2005-11-09 09:31:46 -0500
commitc0ed79a331caa68ac027dd6afc02bb5b58ef2798 (patch)
tree5c04d3ac7c7d5d0e98e2ee6858a124dd27ea922c /drivers/scsi
parent2ef8919830a262f10fb5e4a685e95f71a64bce6c (diff)
[SCSI] sd: fix issue_flush
sd_issue_flush() is called from atomic context so we can't use the semaphore based routines to get a reference to the scsi_disk. Assume something else already got the reference so we can safely use it. Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/sd.c22
1 files changed, 9 insertions, 13 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index bb5b242ac6b4..8613a1317712 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -769,20 +769,16 @@ static void sd_end_flush(request_queue_t *q, struct request *flush_rq)
769static int sd_prepare_flush(request_queue_t *q, struct request *rq) 769static int sd_prepare_flush(request_queue_t *q, struct request *rq)
770{ 770{
771 struct scsi_device *sdev = q->queuedata; 771 struct scsi_device *sdev = q->queuedata;
772 struct scsi_disk *sdkp = scsi_disk_get_from_dev(&sdev->sdev_gendev); 772 struct scsi_disk *sdkp = dev_get_drvdata(&sdev->sdev_gendev);
773 int ret = 0;
774 773
775 if (sdkp) { 774 if (!sdkp || !sdkp->WCE)
776 if (sdkp->WCE) { 775 return 0;
777 memset(rq->cmd, 0, sizeof(rq->cmd)); 776
778 rq->flags |= REQ_BLOCK_PC | REQ_SOFTBARRIER; 777 memset(rq->cmd, 0, sizeof(rq->cmd));
779 rq->timeout = SD_TIMEOUT; 778 rq->flags |= REQ_BLOCK_PC | REQ_SOFTBARRIER;
780 rq->cmd[0] = SYNCHRONIZE_CACHE; 779 rq->timeout = SD_TIMEOUT;
781 ret = 1; 780 rq->cmd[0] = SYNCHRONIZE_CACHE;
782 } 781 return 1;
783 scsi_disk_put(sdkp);
784 }
785 return ret;
786} 782}
787 783
788static void sd_rescan(struct device *dev) 784static void sd_rescan(struct device *dev)