Thread (8 messages) 8 messages, 2 authors, 2012-09-06

Re: [PATCH 1/6] Btrfs: fix a bug of per-file nocow

From: David Sterba <hidden>
Date: 2012-09-06 16:26:23

On Fri, Aug 31, 2012 at 01:36:54PM +0800, Liu Bo wrote:
The new created file should not only inherit the NODATACOW flag, but also
honor NODATASUM flag, because we must do COW on a file extent with checksum.
I was not entierly correct when suggesting to move NODATASUM to
inherit_iflags. Se below.
quoted hunk ↗ jump to hunk
Signed-off-by: Liu Bo <redacted>
---
 fs/btrfs/inode.c |    3 +--
 fs/btrfs/ioctl.c |    3 ++-
 2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index b2c3514..9bce6e9 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -4720,8 +4720,7 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
 	if (S_ISREG(mode)) {
Originaly it applied to regular files only.
quoted hunk ↗ jump to hunk
 		if (btrfs_test_opt(root, NODATASUM))
 			BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM;
-		if (btrfs_test_opt(root, NODATACOW) ||
-		    (BTRFS_I(dir)->flags & BTRFS_INODE_NODATACOW))
+		if (btrfs_test_opt(root, NODATACOW))
 			BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW;
 	}
 
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 00ddf22..7390b25 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -141,7 +141,8 @@ void btrfs_inherit_iflags(struct inode *inode, struct inode *dir)
 	}
 
 	if (flags & BTRFS_INODE_NODATACOW)
-		BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW;
+		BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW |
+					 BTRFS_INODE_NODATASUM;
But now this will happen to:

* nodes (mknod)
* directories -- NODATASUM for a dir does nothing, but does not feel
  right
* symlinks -- same
* subvolume roots -- same, and even more confusing what it does

While the fix you suggested in

http://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg18292.html

is simple, I'm still inclined to keep all flag inheritance at one place,
so the fix I'm proposing is to do
 	if (flags & BTRFS_INODE_NODATACOW)
 		BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW;
		if (S_ISREG(inode->i_mode))
			BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM;
	}
 
 	btrfs_update_iflags(inode);
 }
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help