Browse Source

Btrfs: only inherit btrfs specific flags when creating files

Xfstests 79 was failing because we were inheriting the S_APPEND flag when we
weren't supposed to.  There isn't any specific documentation on this so I'm
taking the test as the standard of how things work, and having S_APPEND set on a
directory doesn't mean that S_APPEND gets inherited by its children according to
this test.  So only inherit btrfs specific things.  This will let us set
compress/nocompress on specific directories and everything in the directories
will inherit this flag, same with nodatacow.  With this patch test 79 passes.
Thanks,

Signed-off-by: Josef Bacik <josef@redhat.com>
Josef Bacik 13 years ago
parent
commit
e27425d614
1 changed files with 11 additions and 6 deletions
  1. 11 6
      fs/btrfs/ioctl.c

+ 11 - 6
fs/btrfs/ioctl.c

@@ -117,7 +117,7 @@ void btrfs_update_iflags(struct inode *inode)
 /*
 /*
  * Inherit flags from the parent inode.
  * Inherit flags from the parent inode.
  *
  *
- * Unlike extN we don't have any flags we don't want to inherit currently.
+ * Currently only the compression flags and the cow flags are inherited.
  */
  */
 void btrfs_inherit_iflags(struct inode *inode, struct inode *dir)
 void btrfs_inherit_iflags(struct inode *inode, struct inode *dir)
 {
 {
@@ -128,12 +128,17 @@ void btrfs_inherit_iflags(struct inode *inode, struct inode *dir)
 
 
 	flags = BTRFS_I(dir)->flags;
 	flags = BTRFS_I(dir)->flags;
 
 
-	if (S_ISREG(inode->i_mode))
-		flags &= ~BTRFS_INODE_DIRSYNC;
-	else if (!S_ISDIR(inode->i_mode))
-		flags &= (BTRFS_INODE_NODUMP | BTRFS_INODE_NOATIME);
+	if (flags & BTRFS_INODE_NOCOMPRESS) {
+		BTRFS_I(inode)->flags &= ~BTRFS_INODE_COMPRESS;
+		BTRFS_I(inode)->flags |= BTRFS_INODE_NOCOMPRESS;
+	} else if (flags & BTRFS_INODE_COMPRESS) {
+		BTRFS_I(inode)->flags &= ~BTRFS_INODE_NOCOMPRESS;
+		BTRFS_I(inode)->flags |= BTRFS_INODE_COMPRESS;
+	}
+
+	if (flags & BTRFS_INODE_NODATACOW)
+		BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW;
 
 
-	BTRFS_I(inode)->flags = flags;
 	btrfs_update_iflags(inode);
 	btrfs_update_iflags(inode);
 }
 }