diff options
Diffstat (limited to 'fs/btrfs/ioctl.c')
| -rw-r--r-- | fs/btrfs/ioctl.c | 24 | 
1 files changed, 15 insertions, 9 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index ffb48d6c543..2616f7ed479 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -81,6 +81,13 @@ static unsigned int btrfs_flags_to_ioctl(unsigned int flags)  		iflags |= FS_NOATIME_FL;  	if (flags & BTRFS_INODE_DIRSYNC)  		iflags |= FS_DIRSYNC_FL; +	if (flags & BTRFS_INODE_NODATACOW) +		iflags |= FS_NOCOW_FL; + +	if ((flags & BTRFS_INODE_COMPRESS) && !(flags & BTRFS_INODE_NOCOMPRESS)) +		iflags |= FS_COMPR_FL; +	else if (flags & BTRFS_INODE_NOCOMPRESS) +		iflags |= FS_NOCOMP_FL;  	return iflags;  } @@ -144,16 +151,13 @@ static int check_flags(unsigned int flags)  	if (flags & ~(FS_IMMUTABLE_FL | FS_APPEND_FL | \  		      FS_NOATIME_FL | FS_NODUMP_FL | \  		      FS_SYNC_FL | FS_DIRSYNC_FL | \ -		      FS_NOCOMP_FL | FS_COMPR_FL | \ -		      FS_NOCOW_FL | FS_COW_FL)) +		      FS_NOCOMP_FL | FS_COMPR_FL | +		      FS_NOCOW_FL))  		return -EOPNOTSUPP;  	if ((flags & FS_NOCOMP_FL) && (flags & FS_COMPR_FL))  		return -EINVAL; -	if ((flags & FS_NOCOW_FL) && (flags & FS_COW_FL)) -		return -EINVAL; -  	return 0;  } @@ -218,6 +222,10 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg)  		ip->flags |= BTRFS_INODE_DIRSYNC;  	else  		ip->flags &= ~BTRFS_INODE_DIRSYNC; +	if (flags & FS_NOCOW_FL) +		ip->flags |= BTRFS_INODE_NODATACOW; +	else +		ip->flags &= ~BTRFS_INODE_NODATACOW;  	/*  	 * The COMPRESS flag can only be changed by users, while the NOCOMPRESS @@ -230,11 +238,9 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg)  	} else if (flags & FS_COMPR_FL) {  		ip->flags |= BTRFS_INODE_COMPRESS;  		ip->flags &= ~BTRFS_INODE_NOCOMPRESS; +	} else { +		ip->flags &= ~(BTRFS_INODE_COMPRESS | BTRFS_INODE_NOCOMPRESS);  	} -	if (flags & FS_NOCOW_FL) -		ip->flags |= BTRFS_INODE_NODATACOW; -	else if (flags & FS_COW_FL) -		ip->flags &= ~BTRFS_INODE_NODATACOW;  	trans = btrfs_join_transaction(root, 1);  	BUG_ON(IS_ERR(trans));  |