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>
This commit is contained in:
@@ -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))
|
if (flags & BTRFS_INODE_NOCOMPRESS) {
|
||||||
flags &= ~BTRFS_INODE_DIRSYNC;
|
BTRFS_I(inode)->flags &= ~BTRFS_INODE_COMPRESS;
|
||||||
else if (!S_ISDIR(inode->i_mode))
|
BTRFS_I(inode)->flags |= BTRFS_INODE_NOCOMPRESS;
|
||||||
flags &= (BTRFS_INODE_NODUMP | BTRFS_INODE_NOATIME);
|
} 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user