scsi: stop using q->prepare_flush_fn
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Sat, 3 Jul 2010 08:45:34 +0000 (17:45 +0900)
committerJens Axboe <jaxboe@fusionio.com>
Sat, 7 Aug 2010 16:23:58 +0000 (18:23 +0200)
scsi-ml builds flush requests via q->prepare_flush_fn(), however,
builds discard requests via q->prep_rq_fn.

Using two different mechnisms for the similar requests (building
commands in SCSI ULD) doesn't make sense.

Handing both via q->prep_rq_fn makes the code design simpler.

Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Cc: James Bottomley <James.Bottomley@suse.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
drivers/scsi/sd.c

index aa6b48ba78b10dd4260a720c2a690bfe6cc37ad9..e8c295e01466d2af1a9885ad9b1b327d70b6c981 100644 (file)
@@ -471,6 +471,18 @@ static int scsi_setup_discard_cmnd(struct scsi_device *sdp, struct request *rq)
        return ret;
 }
 
+static int scsi_setup_flush_cmnd(struct scsi_device *sdp, struct request *rq)
+{
+       /* for now, we use REQ_TYPE_BLOCK_PC. */
+       rq->cmd_type = REQ_TYPE_BLOCK_PC;
+       rq->timeout = SD_TIMEOUT;
+       rq->retries = SD_MAX_RETRIES;
+       rq->cmd[0] = SYNCHRONIZE_CACHE;
+       rq->cmd_len = 10;
+
+       return scsi_setup_blk_pc_cmnd(sdp, rq);
+}
+
 static void sd_unprep_fn(struct request_queue *q, struct request *rq)
 {
        if (rq->cmd_flags & REQ_DISCARD)
@@ -504,6 +516,9 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq)
        if (rq->cmd_flags & REQ_DISCARD) {
                ret = scsi_setup_discard_cmnd(sdp, rq);
                goto out;
+       } else if (rq->cmd_flags & REQ_FLUSH) {
+               ret = scsi_setup_flush_cmnd(sdp, rq);
+               goto out;
        } else if (rq->cmd_type == REQ_TYPE_BLOCK_PC) {
                ret = scsi_setup_blk_pc_cmnd(sdp, rq);
                goto out;
@@ -1053,15 +1068,6 @@ static int sd_sync_cache(struct scsi_disk *sdkp)
        return 0;
 }
 
-static void sd_prepare_flush(struct request_queue *q, struct request *rq)
-{
-       rq->cmd_type = REQ_TYPE_BLOCK_PC;
-       rq->timeout = SD_TIMEOUT;
-       rq->retries = SD_MAX_RETRIES;
-       rq->cmd[0] = SYNCHRONIZE_CACHE;
-       rq->cmd_len = 10;
-}
-
 static void sd_rescan(struct device *dev)
 {
        struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev);
@@ -2129,7 +2135,7 @@ static int sd_revalidate_disk(struct gendisk *disk)
        else
                ordered = QUEUE_ORDERED_DRAIN;
 
-       blk_queue_ordered(sdkp->disk->queue, ordered, sd_prepare_flush);
+       blk_queue_ordered(sdkp->disk->queue, ordered, NULL);
 
        set_capacity(disk, sdkp->capacity);
        kfree(buffer);