[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>
This commit is contained in:
parent
2ef8919830
commit
c0ed79a331
@ -769,20 +769,16 @@ static void sd_end_flush(request_queue_t *q, struct request *flush_rq)
|
|||||||
static int sd_prepare_flush(request_queue_t *q, struct request *rq)
|
static int sd_prepare_flush(request_queue_t *q, struct request *rq)
|
||||||
{
|
{
|
||||||
struct scsi_device *sdev = q->queuedata;
|
struct scsi_device *sdev = q->queuedata;
|
||||||
struct scsi_disk *sdkp = scsi_disk_get_from_dev(&sdev->sdev_gendev);
|
struct scsi_disk *sdkp = dev_get_drvdata(&sdev->sdev_gendev);
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (sdkp) {
|
if (!sdkp || !sdkp->WCE)
|
||||||
if (sdkp->WCE) {
|
return 0;
|
||||||
memset(rq->cmd, 0, sizeof(rq->cmd));
|
|
||||||
rq->flags |= REQ_BLOCK_PC | REQ_SOFTBARRIER;
|
memset(rq->cmd, 0, sizeof(rq->cmd));
|
||||||
rq->timeout = SD_TIMEOUT;
|
rq->flags |= REQ_BLOCK_PC | REQ_SOFTBARRIER;
|
||||||
rq->cmd[0] = SYNCHRONIZE_CACHE;
|
rq->timeout = SD_TIMEOUT;
|
||||||
ret = 1;
|
rq->cmd[0] = SYNCHRONIZE_CACHE;
|
||||||
}
|
return 1;
|
||||||
scsi_disk_put(sdkp);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sd_rescan(struct device *dev)
|
static void sd_rescan(struct device *dev)
|
||||||
|
Loading…
Reference in New Issue
Block a user