This adds 'W' which is atomic write attribute to chattr. Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@xxxxxxxxx> --- lib/e2p/pf.c | 1 + lib/ext2fs/ext2_fs.h | 2 +- misc/chattr.1.in | 18 ++++++++++++++---- misc/chattr.c | 3 ++- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/e2p/pf.c b/lib/e2p/pf.c index 81e3bb26..9b311477 100644 --- a/lib/e2p/pf.c +++ b/lib/e2p/pf.c @@ -45,6 +45,7 @@ static struct flags_name flags_array[] = { { EXT4_EXTENTS_FL, "e", "Extents" }, { FS_NOCOW_FL, "C", "No_COW" }, { FS_DAX_FL, "x", "DAX" }, + { FS_ATOMICWRITES_FL, "W", "ATOMIC_WRITES" }, { EXT4_CASEFOLD_FL, "F", "Casefold" }, { EXT4_INLINE_DATA_FL, "N", "Inline_Data" }, { EXT4_PROJINHERIT_FL, "P", "Project_Hierarchy" }, diff --git a/lib/ext2fs/ext2_fs.h b/lib/ext2fs/ext2_fs.h index 0fc9c09a..f9dcf71f 100644 --- a/lib/ext2fs/ext2_fs.h +++ b/lib/ext2fs/ext2_fs.h @@ -346,7 +346,7 @@ struct ext2_dx_tail { #define EXT4_EA_INODE_FL 0x00200000 /* Inode used for large EA */ /* EXT4_EOFBLOCKS_FL 0x00400000 was here */ #define FS_NOCOW_FL 0x00800000 /* Do not cow file */ -#define EXT4_SNAPFILE_FL 0x01000000 /* Inode is a snapshot */ +#define FS_ATOMICWRITES_FL 0x01000000 /* Inode can do atomic writes */ #define FS_DAX_FL 0x02000000 /* Inode is DAX */ #define EXT4_SNAPFILE_DELETED_FL 0x04000000 /* Snapshot is being deleted */ #define EXT4_SNAPFILE_SHRUNK_FL 0x08000000 /* Snapshot shrink has completed */ diff --git a/misc/chattr.1.in b/misc/chattr.1.in index 50c54e7d..22757123 100644 --- a/misc/chattr.1.in +++ b/misc/chattr.1.in @@ -26,7 +26,7 @@ changes the file attributes on a Linux file system. The format of a symbolic .I mode is -.BR +-= [ aAcCdDeFijmPsStTux ]. +.BR +-= [ aAcCdDeFijmPsStTuxW ]. .PP The operator .RB ' + ' @@ -38,7 +38,7 @@ causes them to be removed; and causes them to be the only attributes that the files have. .PP The letters -.RB ' aAcCdDeFijmPsStTux ' +.RB ' aAcCdDeFijmPsStTuxW ' select the new attributes for the files: append only .RB ( a ), @@ -74,8 +74,10 @@ top of directory hierarchy .RB ( T ), undeletable .RB ( u ), -and direct access for files -.RB ( x ). +direct access for files +.RB ( x ), +and atomic writes for files. +.RB ( W ). .PP The following attributes are read-only, and may be listed by .BR lsattr (1) @@ -263,6 +265,14 @@ directory. If an existing directory has contained some files and subdirectories, modifying the attribute on the parent directory doesn't change the attributes on these files and subdirectories. .TP +.B W +The 'W' attribute can only be set on a regular file. A file which has this +attribute set can do untorn writes i.e. if an atomic write is requested by +user with proper alignment and atomic flags set (such as RWF_ATOMIC), then +a subsequent read to that block(s) will either read entire new data or entire +old data (in case of a power failure). The block(s) written can never contain +mix of both. +.TP .B V A file with the 'V' attribute set has fs-verity enabled. It cannot be written to, and the file system will automatically verify all data read diff --git a/misc/chattr.c b/misc/chattr.c index c7382a37..24db790e 100644 --- a/misc/chattr.c +++ b/misc/chattr.c @@ -86,7 +86,7 @@ static unsigned long sf; static void usage(void) { fprintf(stderr, - _("Usage: %s [-RVf] [-+=aAcCdDeijPsStTuFx] [-p project] [-v version] files...\n"), + _("Usage: %s [-RVf] [-+=aAcCdDeijPsStTuFxW] [-p project] [-v version] files...\n"), program_name); exit(1); } @@ -114,6 +114,7 @@ static const struct flags_char flags_array[] = { { EXT2_TOPDIR_FL, 'T' }, { FS_NOCOW_FL, 'C' }, { FS_DAX_FL, 'x' }, + { FS_ATOMICWRITES_FL, 'W' }, { EXT4_CASEFOLD_FL, 'F' }, { 0, 0 } }; -- 2.39.2