This patch adds an inode atomic writes flag to ext4
(EXT4_ATOMICWRITES_FL which uses FS_ATOMICWRITES_FL flag).
Also add support for setting of this flag via ioctl.
Co-developed-by: Ojaswin Mujoo <[email protected]>
Signed-off-by: Ojaswin Mujoo <[email protected]>
Signed-off-by: Ritesh Harjani (IBM) <[email protected]>
---
fs/ext4/ext4.h | 6 ++++++
fs/ext4/ioctl.c | 11 +++++++++++
2 files changed, 17 insertions(+)
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 1d2bce26e616..aa7fff2d6f96 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -495,8 +495,12 @@ struct flex_groups {
#define EXT4_EA_INODE_FL 0x00200000 /* Inode used for large EA */
/* 0x00400000 was formerly EXT4_EOFBLOCKS_FL */
+#define EXT4_ATOMICWRITES_FL FS_ATOMICWRITES_FL /* Inode supports atomic writes */
#define EXT4_DAX_FL 0x02000000 /* Inode is DAX */
+/* 0x04000000 unused for now */
+/* 0x08000000 unused for now */
+
#define EXT4_INLINE_DATA_FL 0x10000000 /* Inode has inline data. */
#define EXT4_PROJINHERIT_FL 0x20000000 /* Create with parents projid */
#define EXT4_CASEFOLD_FL 0x40000000 /* Casefolded directory */
@@ -519,6 +523,7 @@ struct flex_groups {
0x00400000 /* EXT4_EOFBLOCKS_FL */ | \
EXT4_DAX_FL | \
EXT4_PROJINHERIT_FL | \
+ EXT4_ATOMICWRITES_FL | \
EXT4_CASEFOLD_FL)
/* User visible flags */
@@ -593,6 +598,7 @@ enum {
EXT4_INODE_VERITY = 20, /* Verity protected inode */
EXT4_INODE_EA_INODE = 21, /* Inode used for large EA */
/* 22 was formerly EXT4_INODE_EOFBLOCKS */
+ EXT4_INODE_ATOMIC_WRITE = 24, /* file does ATOMIC WRITE */
EXT4_INODE_DAX = 25, /* Inode is DAX */
EXT4_INODE_INLINE_DATA = 28, /* Data in inode. */
EXT4_INODE_PROJINHERIT = 29, /* Create with parents projid */
diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c
index 7160a71044c8..03d0b501cbc8 100644
--- a/fs/ext4/ioctl.c
+++ b/fs/ext4/ioctl.c
@@ -632,6 +632,17 @@ static int ext4_ioctl_setflags(struct inode *inode,
}
}
+ if (flags & EXT4_ATOMICWRITES_FL) {
+ if (!ext4_can_atomic_write_fsawu(sb))
+ return -EOPNOTSUPP;
+
+ /* TODO: Do we need locks to check i_reserved_data_blocks */
+ if (!S_ISREG(inode->i_mode) || ext4_has_inline_data(inode) ||
+ READ_ONCE(ei->i_disksize) ||
+ EXT4_I(inode)->i_reserved_data_blocks)
+ return -EOPNOTSUPP;
+ }
+
/*
* Wait for all pending directio and then flush all the dirty pages
* for this file. The flush marks all the pages readonly, so any
--
2.43.0
On Sat, Mar 02, 2024 at 01:12:03PM +0530, Ritesh Harjani (IBM) wrote:
> This patch adds an inode atomic writes flag to ext4
> (EXT4_ATOMICWRITES_FL which uses FS_ATOMICWRITES_FL flag).
> Also add support for setting of this flag via ioctl.
>
> Co-developed-by: Ojaswin Mujoo <[email protected]>
> Signed-off-by: Ojaswin Mujoo <[email protected]>
> Signed-off-by: Ritesh Harjani (IBM) <[email protected]>
> ---
> fs/ext4/ext4.h | 6 ++++++
> fs/ext4/ioctl.c | 11 +++++++++++
> 2 files changed, 17 insertions(+)
>
> diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
> index 1d2bce26e616..aa7fff2d6f96 100644
> --- a/fs/ext4/ext4.h
> +++ b/fs/ext4/ext4.h
> @@ -495,8 +495,12 @@ struct flex_groups {
> #define EXT4_EA_INODE_FL 0x00200000 /* Inode used for large EA */
> /* 0x00400000 was formerly EXT4_EOFBLOCKS_FL */
>
> +#define EXT4_ATOMICWRITES_FL FS_ATOMICWRITES_FL /* Inode supports atomic writes */
> #define EXT4_DAX_FL 0x02000000 /* Inode is DAX */
Tying the on disk format to the kernel user API is a poor choice.
While the flag bits might have the same value, anything parsing the
on-disk format should not be required to include kernel syscall API
header files just to get all the on-disk format definitions it
needs.
-Dave.
--
Dave Chinner
[email protected]
Dave Chinner <[email protected]> writes:
> On Sat, Mar 02, 2024 at 01:12:03PM +0530, Ritesh Harjani (IBM) wrote:
>> This patch adds an inode atomic writes flag to ext4
>> (EXT4_ATOMICWRITES_FL which uses FS_ATOMICWRITES_FL flag).
>> Also add support for setting of this flag via ioctl.
>>
>> Co-developed-by: Ojaswin Mujoo <[email protected]>
>> Signed-off-by: Ojaswin Mujoo <[email protected]>
>> Signed-off-by: Ritesh Harjani (IBM) <[email protected]>
>> ---
>> fs/ext4/ext4.h | 6 ++++++
>> fs/ext4/ioctl.c | 11 +++++++++++
>> 2 files changed, 17 insertions(+)
>>
>> diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
>> index 1d2bce26e616..aa7fff2d6f96 100644
>> --- a/fs/ext4/ext4.h
>> +++ b/fs/ext4/ext4.h
>> @@ -495,8 +495,12 @@ struct flex_groups {
>> #define EXT4_EA_INODE_FL 0x00200000 /* Inode used for large EA */
>> /* 0x00400000 was formerly EXT4_EOFBLOCKS_FL */
>>
>> +#define EXT4_ATOMICWRITES_FL FS_ATOMICWRITES_FL /* Inode supports atomic writes */
>> #define EXT4_DAX_FL 0x02000000 /* Inode is DAX */
>
> Tying the on disk format to the kernel user API is a poor choice.
> While the flag bits might have the same value, anything parsing the
> on-disk format should not be required to include kernel syscall API
> header files just to get all the on-disk format definitions it
> needs.
sure. Make sense.
I will hardcode that value.
-ritesh
>
> -Dave.
> --
> Dave Chinner
> [email protected]