lsattr, chattr: add support for btrfs's No_COW flag
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
diff --git a/lib/e2p/pf.c b/lib/e2p/pf.c
index f03193c..e2f8ce5 100644
--- a/lib/e2p/pf.c
+++ b/lib/e2p/pf.c
@@ -49,6 +49,7 @@
{ EXT2_TOPDIR_FL, "T", "Top_of_Directory_Hierarchies" },
{ EXT4_EXTENTS_FL, "e", "Extents" },
{ EXT4_HUGE_FILE_FL, "h", "Huge_file" },
+ { FS_NOCOW_FL, "C", "No_COW" },
{ 0, NULL, NULL }
};
diff --git a/lib/ext2fs/ext2_fs.h b/lib/ext2fs/ext2_fs.h
index f46a1a9..fb3f7cc 100644
--- a/lib/ext2fs/ext2_fs.h
+++ b/lib/ext2fs/ext2_fs.h
@@ -301,6 +301,7 @@
#define EXT4_EXTENTS_FL 0x00080000 /* Inode uses extents */
#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 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 92f6d70..2500561 100644
--- a/misc/chattr.1.in
+++ b/misc/chattr.1.in
@@ -27,8 +27,8 @@
.PP
The letters `acdeijstuADST' select the new attributes for the files:
append only (a), compressed (c), no dump (d), extent format (e), immutable (i),
-data journalling (j), secure deletion (s), no tail-merging (t),
-undeletable (u), no atime updates (A), synchronous directory updates (D),
+data journalling (j), secure deletion (s), no tail-merging (t),
+undeletable (u), no atime updates (A), synchronous directory updates (D),
synchronous updates (S), and top of directory hierarchy (T).
.PP
The following attributes are read-only, and may be listed by
@@ -55,15 +55,24 @@
systems.
.PP
A file with the `a' attribute set can only be open in append mode for writing.
-Only the superuser or a process possessing the CAP_LINUX_IMMUTABLE
+Only the superuser or a process possessing the CAP_LINUX_IMMUTABLE
capability can set or clear this attribute.
.PP
A file with the `c' attribute set is automatically compressed on the disk
by the kernel. A read from this file returns uncompressed data. A write to
-this file compresses data before storing them on the disk. Note: please
+this file compresses data before storing them on the disk. Note: please
make sure to read the bugs and limitations section at the end of this
document.
.PP
+A file with the 'C' attribute set will not be subject to copy-on-write
+updates. This flag is only supported on file systems which perform
+copy-on-write. (Note: For btrfs, the 'C' flag should be
+set on new or empty files. If it is set on a file which already has
+data blocks, it is undefined when the blocks assigned to the file will
+be fully stable. If the 'C' flag is set on a directory, it will have no
+effect on the directory, but new files created in that directory will
+the No_COW attribute.)
+.PP
When a directory with the `D' attribute set is modified,
the changes are written synchronously on the disk; this is equivalent to
the `dirsync' mount option applied to a subset of the files.
@@ -72,9 +81,9 @@
.BR dump (8)
program is run.
.PP
-The 'E' attribute is used by the experimental compression patches to
+The 'E' attribute is used by the experimental compression patches to
indicate that a compressed file has a compression error. It may not be
-set or reset using
+set or reset using
.BR chattr (1),
although it can be displayed by
.BR lsattr (1).
@@ -84,7 +93,7 @@
.BR chattr (1).
.PP
The 'I' attribute is used by the htree code to indicate that a directory
-is being indexed using hashed trees. It may not be set or reset using
+is being indexed using hashed trees. It may not be set or reset using
.BR chattr (1),
although it can be displayed by
.BR lsattr (1).
@@ -105,8 +114,8 @@
journal before being written to the file itself, if the filesystem is
mounted with the "data=ordered" or "data=writeback" options. When the
filesystem is mounted with the "data=journal" option all file data
-is already journalled and this attribute has no effect.
-Only the superuser or a process possessing the CAP_SYS_RESOURCE
+is already journalled and this attribute has no effect. Only
+the superuser or a process possessing the CAP_SYS_RESOURCE
capability can set or clear this attribute.
.PP
When a file with the `s' attribute set is deleted, its blocks are zeroed
@@ -117,7 +126,7 @@
the changes are written synchronously on the disk; this is equivalent to
the `sync' mount option applied to a subset of the files.
.PP
-A directory with the 'T' attribute will be deemed to be the top of
+A directory with the 'T' attribute will be deemed to be the top of
directory hierarchies for the purposes of the Orlov block allocator.
This is a hint to the block allocator used by ext3 and ext4 that the
subdirectories under this directory are not related, and thus should be
@@ -129,7 +138,7 @@
.PP
A file with the 't' attribute will not have a partial block fragment at
the end of the file merged with other files (for those filesystems which
-support tail-merging). This is necessary for applications such as LILO
+support tail-merging). This is necessary for applications such as LILO
which read the filesystem directly, and which don't understand tail-merged
files. Note: As of this writing, the ext2 or ext3 filesystems do not
(yet, except in very experimental patches) support tail-merging.
@@ -139,15 +148,15 @@
make sure to read the bugs and limitations section at the end of this
document.
.PP
-The 'X' attribute is used by the experimental compression patches to
+The 'X' attribute is used by the experimental compression patches to
indicate that a raw contents of a compressed file can be accessed
-directly. It currently may not be set or reset using
+directly. It currently may not be set or reset using
.BR chattr (1),
although it can be displayed by
.BR lsattr (1).
.PP
-The 'Z' attribute is used by the experimental compression patches to
-indicate a compressed file is dirty. It may not be set or reset using
+The 'Z' attribute is used by the experimental compression patches to
+indicate a compressed file is dirty. It may not be set or reset using
.BR chattr (1),
although it can be displayed by
.BR lsattr (1).
@@ -157,10 +166,9 @@
was written by Remy Card <Remy.Card@linux.org>. It is currently being
maintained by Theodore Ts'o <tytso@alum.mit.edu>.
.SH BUGS AND LIMITATIONS
-The `c', 's', and `u' attributes are not honored
+The `c', 's', and `u' attributes are not honored
by the ext2 and ext3 filesystems as implemented in the current mainline
-Linux kernels. These attributes may be implemented
-in future versions of the ext2 and ext3 filesystems.
+Linux kernels.
.PP
The `j' option is only useful if the filesystem is mounted as ext3.
.PP
diff --git a/misc/chattr.c b/misc/chattr.c
index 8a2d61f..141ea6e 100644
--- a/misc/chattr.c
+++ b/misc/chattr.c
@@ -107,6 +107,7 @@
{ EXT2_UNRM_FL, 'u' },
{ EXT2_NOTAIL_FL, 't' },
{ EXT2_TOPDIR_FL, 'T' },
+ { FS_NOCOW_FL, 'C' },
{ 0, 0 }
};