diff options
| -rw-r--r-- | fs/btrfs/acl.c | 5 | ||||
| -rw-r--r-- | fs/btrfs/extent-tree.c | 37 | ||||
| -rw-r--r-- | fs/btrfs/ioctl.c | 24 | ||||
| -rw-r--r-- | include/linux/fs.h | 1 |
4 files changed, 44 insertions, 23 deletions
diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c index 5d505aaa72fb..44ea5b92e1ba 100644 --- a/fs/btrfs/acl.c +++ b/fs/btrfs/acl.c | |||
| @@ -178,12 +178,13 @@ static int btrfs_xattr_acl_set(struct dentry *dentry, const char *name, | |||
| 178 | 178 | ||
| 179 | if (value) { | 179 | if (value) { |
| 180 | acl = posix_acl_from_xattr(value, size); | 180 | acl = posix_acl_from_xattr(value, size); |
| 181 | if (IS_ERR(acl)) | ||
| 182 | return PTR_ERR(acl); | ||
| 183 | |||
| 181 | if (acl) { | 184 | if (acl) { |
| 182 | ret = posix_acl_valid(acl); | 185 | ret = posix_acl_valid(acl); |
| 183 | if (ret) | 186 | if (ret) |
| 184 | goto out; | 187 | goto out; |
| 185 | } else if (IS_ERR(acl)) { | ||
| 186 | return PTR_ERR(acl); | ||
| 187 | } | 188 | } |
| 188 | } | 189 | } |
| 189 | 190 | ||
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index cd52f7f556ef..9ee6bd55e16c 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -8856,23 +8856,38 @@ out: | |||
| 8856 | int btrfs_init_space_info(struct btrfs_fs_info *fs_info) | 8856 | int btrfs_init_space_info(struct btrfs_fs_info *fs_info) |
| 8857 | { | 8857 | { |
| 8858 | struct btrfs_space_info *space_info; | 8858 | struct btrfs_space_info *space_info; |
| 8859 | struct btrfs_super_block *disk_super; | ||
| 8860 | u64 features; | ||
| 8861 | u64 flags; | ||
| 8862 | int mixed = 0; | ||
| 8859 | int ret; | 8863 | int ret; |
| 8860 | 8864 | ||
| 8861 | ret = update_space_info(fs_info, BTRFS_BLOCK_GROUP_SYSTEM, 0, 0, | 8865 | disk_super = &fs_info->super_copy; |
| 8862 | &space_info); | 8866 | if (!btrfs_super_root(disk_super)) |
| 8863 | if (ret) | 8867 | return 1; |
| 8864 | return ret; | ||
| 8865 | 8868 | ||
| 8866 | ret = update_space_info(fs_info, BTRFS_BLOCK_GROUP_METADATA, 0, 0, | 8869 | features = btrfs_super_incompat_flags(disk_super); |
| 8867 | &space_info); | 8870 | if (features & BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS) |
| 8868 | if (ret) | 8871 | mixed = 1; |
| 8869 | return ret; | ||
| 8870 | 8872 | ||
| 8871 | ret = update_space_info(fs_info, BTRFS_BLOCK_GROUP_DATA, 0, 0, | 8873 | flags = BTRFS_BLOCK_GROUP_SYSTEM; |
| 8872 | &space_info); | 8874 | ret = update_space_info(fs_info, flags, 0, 0, &space_info); |
| 8873 | if (ret) | 8875 | if (ret) |
| 8874 | return ret; | 8876 | goto out; |
| 8875 | 8877 | ||
| 8878 | if (mixed) { | ||
| 8879 | flags = BTRFS_BLOCK_GROUP_METADATA | BTRFS_BLOCK_GROUP_DATA; | ||
| 8880 | ret = update_space_info(fs_info, flags, 0, 0, &space_info); | ||
| 8881 | } else { | ||
| 8882 | flags = BTRFS_BLOCK_GROUP_METADATA; | ||
| 8883 | ret = update_space_info(fs_info, flags, 0, 0, &space_info); | ||
| 8884 | if (ret) | ||
| 8885 | goto out; | ||
| 8886 | |||
| 8887 | flags = BTRFS_BLOCK_GROUP_DATA; | ||
| 8888 | ret = update_space_info(fs_info, flags, 0, 0, &space_info); | ||
| 8889 | } | ||
| 8890 | out: | ||
| 8876 | return ret; | 8891 | return ret; |
| 8877 | } | 8892 | } |
| 8878 | 8893 | ||
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index ffb48d6c5433..2616f7ed4799 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) | |||
| 81 | iflags |= FS_NOATIME_FL; | 81 | iflags |= FS_NOATIME_FL; |
| 82 | if (flags & BTRFS_INODE_DIRSYNC) | 82 | if (flags & BTRFS_INODE_DIRSYNC) |
| 83 | iflags |= FS_DIRSYNC_FL; | 83 | iflags |= FS_DIRSYNC_FL; |
| 84 | if (flags & BTRFS_INODE_NODATACOW) | ||
| 85 | iflags |= FS_NOCOW_FL; | ||
| 86 | |||
| 87 | if ((flags & BTRFS_INODE_COMPRESS) && !(flags & BTRFS_INODE_NOCOMPRESS)) | ||
| 88 | iflags |= FS_COMPR_FL; | ||
| 89 | else if (flags & BTRFS_INODE_NOCOMPRESS) | ||
| 90 | iflags |= FS_NOCOMP_FL; | ||
| 84 | 91 | ||
| 85 | return iflags; | 92 | return iflags; |
| 86 | } | 93 | } |
| @@ -144,16 +151,13 @@ static int check_flags(unsigned int flags) | |||
| 144 | if (flags & ~(FS_IMMUTABLE_FL | FS_APPEND_FL | \ | 151 | if (flags & ~(FS_IMMUTABLE_FL | FS_APPEND_FL | \ |
| 145 | FS_NOATIME_FL | FS_NODUMP_FL | \ | 152 | FS_NOATIME_FL | FS_NODUMP_FL | \ |
| 146 | FS_SYNC_FL | FS_DIRSYNC_FL | \ | 153 | FS_SYNC_FL | FS_DIRSYNC_FL | \ |
| 147 | FS_NOCOMP_FL | FS_COMPR_FL | \ | 154 | FS_NOCOMP_FL | FS_COMPR_FL | |
| 148 | FS_NOCOW_FL | FS_COW_FL)) | 155 | FS_NOCOW_FL)) |
| 149 | return -EOPNOTSUPP; | 156 | return -EOPNOTSUPP; |
| 150 | 157 | ||
| 151 | if ((flags & FS_NOCOMP_FL) && (flags & FS_COMPR_FL)) | 158 | if ((flags & FS_NOCOMP_FL) && (flags & FS_COMPR_FL)) |
| 152 | return -EINVAL; | 159 | return -EINVAL; |
| 153 | 160 | ||
| 154 | if ((flags & FS_NOCOW_FL) && (flags & FS_COW_FL)) | ||
| 155 | return -EINVAL; | ||
| 156 | |||
| 157 | return 0; | 161 | return 0; |
| 158 | } | 162 | } |
| 159 | 163 | ||
| @@ -218,6 +222,10 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg) | |||
| 218 | ip->flags |= BTRFS_INODE_DIRSYNC; | 222 | ip->flags |= BTRFS_INODE_DIRSYNC; |
| 219 | else | 223 | else |
| 220 | ip->flags &= ~BTRFS_INODE_DIRSYNC; | 224 | ip->flags &= ~BTRFS_INODE_DIRSYNC; |
| 225 | if (flags & FS_NOCOW_FL) | ||
| 226 | ip->flags |= BTRFS_INODE_NODATACOW; | ||
| 227 | else | ||
| 228 | ip->flags &= ~BTRFS_INODE_NODATACOW; | ||
| 221 | 229 | ||
| 222 | /* | 230 | /* |
| 223 | * The COMPRESS flag can only be changed by users, while the NOCOMPRESS | 231 | * 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) | |||
| 230 | } else if (flags & FS_COMPR_FL) { | 238 | } else if (flags & FS_COMPR_FL) { |
| 231 | ip->flags |= BTRFS_INODE_COMPRESS; | 239 | ip->flags |= BTRFS_INODE_COMPRESS; |
| 232 | ip->flags &= ~BTRFS_INODE_NOCOMPRESS; | 240 | ip->flags &= ~BTRFS_INODE_NOCOMPRESS; |
| 241 | } else { | ||
| 242 | ip->flags &= ~(BTRFS_INODE_COMPRESS | BTRFS_INODE_NOCOMPRESS); | ||
| 233 | } | 243 | } |
| 234 | if (flags & FS_NOCOW_FL) | ||
| 235 | ip->flags |= BTRFS_INODE_NODATACOW; | ||
| 236 | else if (flags & FS_COW_FL) | ||
| 237 | ip->flags &= ~BTRFS_INODE_NODATACOW; | ||
| 238 | 244 | ||
| 239 | trans = btrfs_join_transaction(root, 1); | 245 | trans = btrfs_join_transaction(root, 1); |
| 240 | BUG_ON(IS_ERR(trans)); | 246 | BUG_ON(IS_ERR(trans)); |
diff --git a/include/linux/fs.h b/include/linux/fs.h index dbd860af0804..cdf9495df204 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -358,7 +358,6 @@ struct inodes_stat_t { | |||
| 358 | #define FS_EXTENT_FL 0x00080000 /* Extents */ | 358 | #define FS_EXTENT_FL 0x00080000 /* Extents */ |
| 359 | #define FS_DIRECTIO_FL 0x00100000 /* Use direct i/o */ | 359 | #define FS_DIRECTIO_FL 0x00100000 /* Use direct i/o */ |
| 360 | #define FS_NOCOW_FL 0x00800000 /* Do not cow file */ | 360 | #define FS_NOCOW_FL 0x00800000 /* Do not cow file */ |
| 361 | #define FS_COW_FL 0x02000000 /* Cow file */ | ||
| 362 | #define FS_RESERVED_FL 0x80000000 /* reserved for ext2 lib */ | 361 | #define FS_RESERVED_FL 0x80000000 /* reserved for ext2 lib */ |
| 363 | 362 | ||
| 364 | #define FS_FL_USER_VISIBLE 0x0003DFFF /* User visible flags */ | 363 | #define FS_FL_USER_VISIBLE 0x0003DFFF /* User visible flags */ |
