summaryrefslogtreecommitdiff
path: root/fs/ext4
diff options
context:
space:
mode:
authorRitesh Harjani (IBM) <ritesh.list@gmail.com>2024-11-04 16:22:58 -0800
committerDarrick J. Wong <djwong@djwong.org>2024-11-05 16:20:40 -0800
commit43c696f9d094061e958e31be7f1dae66bc25d389 (patch)
treef16a5927f790e4293b8b6df193e2c7b91cfffb32 /fs/ext4
parent6dfc1c1d597f8b6ebffe25f51f013494994f9b84 (diff)
downloadlwn-43c696f9d094061e958e31be7f1dae66bc25d389.tar.gz
lwn-43c696f9d094061e958e31be7f1dae66bc25d389.zip
ext4: Check for atomic writes support in write iter
Let's validate the given constraints for atomic write request. Otherwise it will fail with -EINVAL. Currently atomic write is only supported on DIO, so for buffered-io it will return -EOPNOTSUPP. Reviewed-by: John Garry <john.g.garry@oracle.com> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com> Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/ext4')
-rw-r--r--fs/ext4/file.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/fs/ext4/file.c b/fs/ext4/file.c
index f14aed14b9cf..a7b9b9751a3f 100644
--- a/fs/ext4/file.c
+++ b/fs/ext4/file.c
@@ -692,6 +692,20 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
if (IS_DAX(inode))
return ext4_dax_write_iter(iocb, from);
#endif
+
+ if (iocb->ki_flags & IOCB_ATOMIC) {
+ size_t len = iov_iter_count(from);
+ int ret;
+
+ if (len < EXT4_SB(inode->i_sb)->s_awu_min ||
+ len > EXT4_SB(inode->i_sb)->s_awu_max)
+ return -EINVAL;
+
+ ret = generic_atomic_write_valid(iocb, from);
+ if (ret)
+ return ret;
+ }
+
if (iocb->ki_flags & IOCB_DIRECT)
return ext4_dio_write_iter(iocb, from);
else