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 }
 };