mtd: mtd_blkdevs: handle REQ_FLUSH request and do explicit flush of writeback buffer
authorRoman Peniaev <r.peniaev@gmail.com>
Sat, 8 Mar 2014 12:59:14 +0000 (21:59 +0900)
committerBrian Norris <computersforpeace@gmail.com>
Wed, 16 Apr 2014 06:25:37 +0000 (23:25 -0700)
mtd_blkdevs is device with volatile cache (writeback buffer), so it should support
REQ_FLUSH to do explicit flush.

Without this patch 'sync' does not guarantee that writeback buffer will be flushed
on disk in case of power off, e.g.:

  $ cp some_file /mnt
  $ sync

  ### POWER OFF

In case of this sequence writeback buffer will not be flushed on disk.

This patch fixes this behaviour and explicitly reports to block layer that flush
requests are being supported.

Signed-off-by: Roman Peniaev <r.peniaev@gmail.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: linux-mtd@lists.infradead.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
drivers/mtd/mtd_blkdevs.c

index 0b2ccb68c0d0240efdb9c5de9189f8e89a4ca890..d2f0da91a5bd552371abe266843bdb9562181aa2 100644 (file)
@@ -88,6 +88,9 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr,
        if (req->cmd_type != REQ_TYPE_FS)
                return -EIO;
 
+       if (req->cmd_flags & REQ_FLUSH)
+               return tr->flush(dev);
+
        if (blk_rq_pos(req) + blk_rq_cur_sectors(req) >
            get_capacity(req->rq_disk))
                return -EIO;
@@ -408,6 +411,9 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
        if (!new->rq)
                goto error3;
 
+       if (tr->flush)
+               blk_queue_flush(new->rq, REQ_FLUSH);
+
        new->rq->queuedata = new;
        blk_queue_logical_block_size(new->rq, tr->blksize);