Message ID | HK2PR04MB38914CCBCA891B82060B659281E39@HK2PR04MB3891.apcprd04.prod.outlook.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | exfat: reduce block requests when zeroing a cluster | expand |
On Sat, Apr 02, 2022 at 03:28:00AM +0000, Yuezhang.Mo@sony.com wrote: > 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@sony.com> > Suggested-by: Christoph Hellwig <hch@infradead.org> > Reviewed-by: Andy Wu <Andy.Wu@sony.com> > Reviewed-by: Aoyama Wataru <wataru.aoyama@sony.com> > cc: Jens Axboe <axboe@kernel.dk> > --- > 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; This check isn't really needed, and I don't think we need a !CONFIG_BLOCK stub for this either.
> From: Christoph Hellwig <hch@infradead.org> > > --- 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; > > This check isn't really needed, and I don't think we need a !CONFIG_BLOCK > stub for this either. sync_blockdev() and related helpers have this check and a !CONFIG_BLOCK stub. I would like to understand the background of your comment, could you explain a little more? Thanks.
On Wed, Apr 06, 2022 at 10:21:15AM +0000, Yuezhang.Mo@sony.com wrote: > > From: Christoph Hellwig <hch@infradead.org> > > > --- 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; > > > > This check isn't really needed, and I don't think we need a !CONFIG_BLOCK > > stub for this either. > > sync_blockdev() and related helpers have this check and a !CONFIG_BLOCK stub. > I would like to understand the background of your comment, could you explain a little more? sync_blockdev and sync_blockdev do that because they are unconditionally called from sync_filesystem, and not just from block-dependent code. Eventually that should be cleaned up as well, but please don't add it to new code.
> From: Christoph Hellwig <hch@infradead.org> > > > This check isn't really needed, and I don't think we need a > > > !CONFIG_BLOCK stub for this either. > > > > sync_blockdev() and related helpers have this check and a !CONFIG_BLOCK > stub. > > I would like to understand the background of your comment, could you > explain a little more? > > sync_blockdev and sync_blockdev do that because they are unconditionally > called from sync_filesystem, and not just from block-dependent code. > Eventually that should be cleaned up as well, but please don't add it to new > code. Thank you for your explanation. I will update the patch to remove the check and the !CONFIG_BLOCK stub.
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;