sync_blockdev_range() is to support syncing multiple sectors with as few block device requests as possible, it is helpful to make the block device to give full play to its performance. Signed-off-by: Yuezhang Mo <Yuezhang.Mo@xxxxxxxx> Suggested-by: Christoph Hellwig <hch@xxxxxxxxxxxxx> Reviewed-by: Andy Wu <Andy.Wu@xxxxxxxx> Reviewed-by: Aoyama Wataru <wataru.aoyama@xxxxxxxx> cc: Jens Axboe <axboe@xxxxxxxxx> --- block/bdev.c | 10 ++++++++++ include/linux/blkdev.h | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/block/bdev.c b/block/bdev.c index 102837a37051..57043e4f3322 100644 --- a/block/bdev.c +++ b/block/bdev.c @@ -200,6 +200,16 @@ int sync_blockdev(struct block_device *bdev) } EXPORT_SYMBOL(sync_blockdev); +int sync_blockdev_range(struct block_device *bdev, loff_t lstart, loff_t lend) +{ + if (!bdev) + return 0; + + return filemap_write_and_wait_range(bdev->bd_inode->i_mapping, + lstart, lend); +} +EXPORT_SYMBOL(sync_blockdev_range); + /* * Write out and wait upon all dirty data associated with this * device. Filesystem data as well as the underlying block diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 16b47035e4b0..1e85d0688d9c 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1310,6 +1310,7 @@ int truncate_bdev_range(struct block_device *bdev, fmode_t mode, loff_t lstart, #ifdef CONFIG_BLOCK void invalidate_bdev(struct block_device *bdev); int sync_blockdev(struct block_device *bdev); +int sync_blockdev_range(struct block_device *bdev, loff_t lstart, loff_t lend); int sync_blockdev_nowait(struct block_device *bdev); void sync_bdevs(bool wait); #else @@ -1320,6 +1321,11 @@ static inline int sync_blockdev(struct block_device *bdev) { return 0; } +static inline int sync_blockdev_range(struct block_device *bdev, loff_t lstart, + loff_t lend) +{ + return 0; +} static inline int sync_blockdev_nowait(struct block_device *bdev) { return 0; -- 2.25.1
Attachment:
v2-0001-block-add-sync_blockdev_range.patch
Description: v2-0001-block-add-sync_blockdev_range.patch