From 0796e660859724f304155e094b6cf5739a610ae4 Mon Sep 17 00:00:00 2001
From: Theodore Ts'o <tytso@mit.edu>
Date: Tue, 12 Jun 2012 17:09:39 -0400
Subject: [PATCH] lsattr, chattr: add support for btrfs's No_COW flag
References: fate#315089

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Acked-by: Jan Kara <jack@suse.cz>
---
 lib/e2p/pf.c         |  1 +
 lib/ext2fs/ext2_fs.h |  1 +
 misc/chattr.1.in     | 44 ++++++++++++++++++++++++++------------------
 misc/chattr.c        |  1 +
 4 files changed, 29 insertions(+), 18 deletions(-)

Index: e2fsprogs-1.41.9/lib/e2p/pf.c
===================================================================
--- e2fsprogs-1.41.9.orig/lib/e2p/pf.c
+++ e2fsprogs-1.41.9/lib/e2p/pf.c
@@ -46,6 +46,7 @@ static struct flags_name flags_array[] =
 	{ 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 }
 };
 
Index: e2fsprogs-1.41.9/lib/ext2fs/ext2_fs.h
===================================================================
--- e2fsprogs-1.41.9.orig/lib/ext2fs/ext2_fs.h
+++ e2fsprogs-1.41.9/lib/ext2fs/ext2_fs.h
@@ -273,6 +273,7 @@ struct ext2_dx_countlimit {
 #define EXT2_TOPDIR_FL			0x00020000 /* Top of directory hierarchies*/
 #define EXT4_HUGE_FILE_FL               0x00040000 /* Set to each huge file */
 #define EXT4_EXTENTS_FL 		0x00080000 /* Inode uses extents */
+#define FS_NOCOW_FL			0x00800000 /* Do not cow file */
 #define EXT2_RESERVED_FL		0x80000000 /* reserved for ext2 lib */
 
 #define EXT2_FL_USER_VISIBLE		0x000BDFFF /* User visible flags */
Index: e2fsprogs-1.41.9/misc/chattr.1.in
===================================================================
--- e2fsprogs-1.41.9.orig/misc/chattr.1.in
+++ e2fsprogs-1.41.9/misc/chattr.1.in
@@ -27,8 +27,8 @@ existing attributes of the files; `-' ca
 .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 @@ not modified.  This avoids a certain amo
 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 @@ A file with the `d' attribute set is not
 .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 @@ the blocks on disk.  It may not be remov
 .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 @@ A file with the `j' attribute has all of
 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 @@ When a file with the `S' attribute set i
 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 @@ group subdirectories closer together whe
 .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 @@ saved.  This allows the user to ask for
 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 @@ although it can be displayed by
 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
Index: e2fsprogs-1.41.9/misc/chattr.c
===================================================================
--- e2fsprogs-1.41.9.orig/misc/chattr.c
+++ e2fsprogs-1.41.9/misc/chattr.c
@@ -106,6 +106,7 @@ static const struct flags_char flags_arr
 	{ EXT2_UNRM_FL, 'u' },
 	{ EXT2_NOTAIL_FL, 't' },
 	{ EXT2_TOPDIR_FL, 'T' },
+	{ FS_NOCOW_FL, 'C' },
 	{ 0, 0 }
 };
 
