]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ext4: Check for atomic writes support in write iter
authorRitesh Harjani (IBM) <ritesh.list@gmail.com>
Tue, 5 Nov 2024 00:22:58 +0000 (16:22 -0800)
committerDarrick J. Wong <djwong@djwong.org>
Wed, 6 Nov 2024 00:20:40 +0000 (16:20 -0800)
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>
fs/ext4/file.c

index f14aed14b9cf3d944b8d6726362ee5a69a9a0597..a7b9b9751a3f165e59cd084c8eb8808bf6aeae4e 100644 (file)
@@ -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