diff options
author | Ritesh Harjani (IBM) <ritesh.list@gmail.com> | 2024-11-04 16:22:58 -0800 |
---|---|---|
committer | Darrick J. Wong <djwong@djwong.org> | 2024-11-05 16:20:40 -0800 |
commit | 43c696f9d094061e958e31be7f1dae66bc25d389 (patch) | |
tree | f16a5927f790e4293b8b6df193e2c7b91cfffb32 /fs/ext4 | |
parent | 6dfc1c1d597f8b6ebffe25f51f013494994f9b84 (diff) | |
download | lwn-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.c | 14 |
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 |