Message ID | 20240817094800.776408-2-john.g.garry@oracle.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | block atomic writes for xfs | expand |
On Sat, Aug 17, 2024 at 09:47:54AM +0000, John Garry wrote: > Darrick and Hannes thought it better that generic_atomic_write_valid() > should be passed a struct iocb, and not just the member of that struct > which is referenced; see [0] and [1]. > > I think that makes a more generic and clean API, so make that change. > > [0] https://lore.kernel.org/linux-block/680ce641-729b-4150-b875-531a98657682@suse.de/ > [1] https://lore.kernel.org/linux-xfs/20240620212401.GA3058325@frogsfrogsfrogs/ > > Suggested-by: Darrick J. Wong <djwong@kernel.org> > Suggested-by: Hannes Reinecke <hare@suse.de> > Signed-off-by: John Garry <john.g.garry@oracle.com> Thanks for doing this, Reviewed-by: Darrick J. Wong <djwong@kernel.org> --D > --- > block/fops.c | 8 ++++---- > fs/read_write.c | 4 ++-- > include/linux/fs.h | 2 +- > 3 files changed, 7 insertions(+), 7 deletions(-) > > diff --git a/block/fops.c b/block/fops.c > index 9825c1713a49..1c0f9d313845 100644 > --- a/block/fops.c > +++ b/block/fops.c > @@ -34,13 +34,13 @@ static blk_opf_t dio_bio_write_op(struct kiocb *iocb) > return opf; > } > > -static bool blkdev_dio_invalid(struct block_device *bdev, loff_t pos, > +static bool blkdev_dio_invalid(struct block_device *bdev, struct kiocb *iocb, > struct iov_iter *iter, bool is_atomic) > { > - if (is_atomic && !generic_atomic_write_valid(iter, pos)) > + if (is_atomic && !generic_atomic_write_valid(iocb, iter)) > return true; > > - return pos & (bdev_logical_block_size(bdev) - 1) || > + return iocb->ki_pos & (bdev_logical_block_size(bdev) - 1) || > !bdev_iter_is_aligned(bdev, iter); > } > > @@ -373,7 +373,7 @@ static ssize_t blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter) > if (!iov_iter_count(iter)) > return 0; > > - if (blkdev_dio_invalid(bdev, iocb->ki_pos, iter, is_atomic)) > + if (blkdev_dio_invalid(bdev, iocb, iter, is_atomic)) > return -EINVAL; > > nr_pages = bio_iov_vecs_to_alloc(iter, BIO_MAX_VECS + 1); > diff --git a/fs/read_write.c b/fs/read_write.c > index 90e283b31ca1..d8af6f2f1c9a 100644 > --- a/fs/read_write.c > +++ b/fs/read_write.c > @@ -1737,7 +1737,7 @@ int generic_file_rw_checks(struct file *file_in, struct file *file_out) > return 0; > } > > -bool generic_atomic_write_valid(struct iov_iter *iter, loff_t pos) > +bool generic_atomic_write_valid(struct kiocb *iocb, struct iov_iter *iter) > { > size_t len = iov_iter_count(iter); > > @@ -1747,7 +1747,7 @@ bool generic_atomic_write_valid(struct iov_iter *iter, loff_t pos) > if (!is_power_of_2(len)) > return false; > > - if (!IS_ALIGNED(pos, len)) > + if (!IS_ALIGNED(iocb->ki_pos, len)) > return false; > > return true; > diff --git a/include/linux/fs.h b/include/linux/fs.h > index fd34b5755c0b..55d8b6beac7a 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -3657,6 +3657,6 @@ static inline bool vfs_empty_path(int dfd, const char __user *path) > return !c; > } > > -bool generic_atomic_write_valid(struct iov_iter *iter, loff_t pos); > +bool generic_atomic_write_valid(struct kiocb *iocb, struct iov_iter *iter); > > #endif /* _LINUX_FS_H */ > -- > 2.31.1 >
diff --git a/block/fops.c b/block/fops.c index 9825c1713a49..1c0f9d313845 100644 --- a/block/fops.c +++ b/block/fops.c @@ -34,13 +34,13 @@ static blk_opf_t dio_bio_write_op(struct kiocb *iocb) return opf; } -static bool blkdev_dio_invalid(struct block_device *bdev, loff_t pos, +static bool blkdev_dio_invalid(struct block_device *bdev, struct kiocb *iocb, struct iov_iter *iter, bool is_atomic) { - if (is_atomic && !generic_atomic_write_valid(iter, pos)) + if (is_atomic && !generic_atomic_write_valid(iocb, iter)) return true; - return pos & (bdev_logical_block_size(bdev) - 1) || + return iocb->ki_pos & (bdev_logical_block_size(bdev) - 1) || !bdev_iter_is_aligned(bdev, iter); } @@ -373,7 +373,7 @@ static ssize_t blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter) if (!iov_iter_count(iter)) return 0; - if (blkdev_dio_invalid(bdev, iocb->ki_pos, iter, is_atomic)) + if (blkdev_dio_invalid(bdev, iocb, iter, is_atomic)) return -EINVAL; nr_pages = bio_iov_vecs_to_alloc(iter, BIO_MAX_VECS + 1); diff --git a/fs/read_write.c b/fs/read_write.c index 90e283b31ca1..d8af6f2f1c9a 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -1737,7 +1737,7 @@ int generic_file_rw_checks(struct file *file_in, struct file *file_out) return 0; } -bool generic_atomic_write_valid(struct iov_iter *iter, loff_t pos) +bool generic_atomic_write_valid(struct kiocb *iocb, struct iov_iter *iter) { size_t len = iov_iter_count(iter); @@ -1747,7 +1747,7 @@ bool generic_atomic_write_valid(struct iov_iter *iter, loff_t pos) if (!is_power_of_2(len)) return false; - if (!IS_ALIGNED(pos, len)) + if (!IS_ALIGNED(iocb->ki_pos, len)) return false; return true; diff --git a/include/linux/fs.h b/include/linux/fs.h index fd34b5755c0b..55d8b6beac7a 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -3657,6 +3657,6 @@ static inline bool vfs_empty_path(int dfd, const char __user *path) return !c; } -bool generic_atomic_write_valid(struct iov_iter *iter, loff_t pos); +bool generic_atomic_write_valid(struct kiocb *iocb, struct iov_iter *iter); #endif /* _LINUX_FS_H */
Darrick and Hannes thought it better that generic_atomic_write_valid() should be passed a struct iocb, and not just the member of that struct which is referenced; see [0] and [1]. I think that makes a more generic and clean API, so make that change. [0] https://lore.kernel.org/linux-block/680ce641-729b-4150-b875-531a98657682@suse.de/ [1] https://lore.kernel.org/linux-xfs/20240620212401.GA3058325@frogsfrogsfrogs/ Suggested-by: Darrick J. Wong <djwong@kernel.org> Suggested-by: Hannes Reinecke <hare@suse.de> Signed-off-by: John Garry <john.g.garry@oracle.com> --- block/fops.c | 8 ++++---- fs/read_write.c | 4 ++-- include/linux/fs.h | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-)