Message ID | 33e9dc5cd81f85d86e3b2eb95df4f7831e4f96a6.1709361537.git.ritesh.list@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | None | expand |
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 <ojaswin@linux.ibm.com> > Signed-off-by: Ojaswin Mujoo <ojaswin@linux.ibm.com> > Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com> > --- > 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 <david@fromorbit.com> 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 <ojaswin@linux.ibm.com> >> Signed-off-by: Ojaswin Mujoo <ojaswin@linux.ibm.com> >> Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com> >> --- >> 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 > david@fromorbit.com
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