Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mtd: mtd_blkdevs: handle REQ_FLUSH request and do explicit flush of writeback buffer

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>

authored by

Roman Peniaev and committed by
Brian Norris
566c0d6a 47570bb1

+6
+6
drivers/mtd/mtd_blkdevs.c
··· 88 88 if (req->cmd_type != REQ_TYPE_FS) 89 89 return -EIO; 90 90 91 + if (req->cmd_flags & REQ_FLUSH) 92 + return tr->flush(dev); 93 + 91 94 if (blk_rq_pos(req) + blk_rq_cur_sectors(req) > 92 95 get_capacity(req->rq_disk)) 93 96 return -EIO; ··· 410 407 411 408 if (!new->rq) 412 409 goto error3; 410 + 411 + if (tr->flush) 412 + blk_queue_flush(new->rq, REQ_FLUSH); 413 413 414 414 new->rq->queuedata = new; 415 415 blk_queue_logical_block_size(new->rq, tr->blksize);