diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-10-01 23:23:15 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-10-01 23:23:15 -0400 |
commit | 0efe5e32c8729ef44b00d9a7203e4c99a6378b27 (patch) | |
tree | 8df3309198b2ab87f549c82c59125d2b106bcdbe /fs/btrfs/inode.c | |
parent | e6a0a8bfef1094084e53bfaad6d512c23da7a6dd (diff) | |
parent | 9c2693c9243b81802c6860570557165e874779a7 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable:
Btrfs: fix data space leak fix
Btrfs: remove duplicates of filemap_ helpers
Btrfs: take i_mutex before generic_write_checks
Btrfs: fix arguments to btrfs_wait_on_page_writeback_range
Btrfs: fix deadlock with free space handling and user transactions
Btrfs: fix error cases for ioctl transactions
Btrfs: Use CONFIG_BTRFS_POSIX_ACL to enable ACL code
Btrfs: introduce missing kfree
Btrfs: Fix setting umask when POSIX ACLs are not enabled
Btrfs: proper -ENOSPC handling
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 235 |
1 files changed, 204 insertions, 31 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index b9fe06d751c0..112e5aa85892 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -1159,6 +1159,83 @@ static int run_delalloc_range(struct inode *inode, struct page *locked_page, | |||
1159 | return ret; | 1159 | return ret; |
1160 | } | 1160 | } |
1161 | 1161 | ||
1162 | static int btrfs_split_extent_hook(struct inode *inode, | ||
1163 | struct extent_state *orig, u64 split) | ||
1164 | { | ||
1165 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
1166 | u64 size; | ||
1167 | |||
1168 | if (!(orig->state & EXTENT_DELALLOC)) | ||
1169 | return 0; | ||
1170 | |||
1171 | size = orig->end - orig->start + 1; | ||
1172 | if (size > root->fs_info->max_extent) { | ||
1173 | u64 num_extents; | ||
1174 | u64 new_size; | ||
1175 | |||
1176 | new_size = orig->end - split + 1; | ||
1177 | num_extents = div64_u64(size + root->fs_info->max_extent - 1, | ||
1178 | root->fs_info->max_extent); | ||
1179 | |||
1180 | /* | ||
1181 | * if we break a large extent up then leave delalloc_extents be, | ||
1182 | * since we've already accounted for the large extent. | ||
1183 | */ | ||
1184 | if (div64_u64(new_size + root->fs_info->max_extent - 1, | ||
1185 | root->fs_info->max_extent) < num_extents) | ||
1186 | return 0; | ||
1187 | } | ||
1188 | |||
1189 | BTRFS_I(inode)->delalloc_extents++; | ||
1190 | |||
1191 | return 0; | ||
1192 | } | ||
1193 | |||
1194 | /* | ||
1195 | * extent_io.c merge_extent_hook, used to track merged delayed allocation | ||
1196 | * extents so we can keep track of new extents that are just merged onto old | ||
1197 | * extents, such as when we are doing sequential writes, so we can properly | ||
1198 | * account for the metadata space we'll need. | ||
1199 | */ | ||
1200 | static int btrfs_merge_extent_hook(struct inode *inode, | ||
1201 | struct extent_state *new, | ||
1202 | struct extent_state *other) | ||
1203 | { | ||
1204 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
1205 | u64 new_size, old_size; | ||
1206 | u64 num_extents; | ||
1207 | |||
1208 | /* not delalloc, ignore it */ | ||
1209 | if (!(other->state & EXTENT_DELALLOC)) | ||
1210 | return 0; | ||
1211 | |||
1212 | old_size = other->end - other->start + 1; | ||
1213 | if (new->start < other->start) | ||
1214 | new_size = other->end - new->start + 1; | ||
1215 | else | ||
1216 | new_size = new->end - other->start + 1; | ||
1217 | |||
1218 | /* we're not bigger than the max, unreserve the space and go */ | ||
1219 | if (new_size <= root->fs_info->max_extent) { | ||
1220 | BTRFS_I(inode)->delalloc_extents--; | ||
1221 | return 0; | ||
1222 | } | ||
1223 | |||
1224 | /* | ||
1225 | * If we grew by another max_extent, just return, we want to keep that | ||
1226 | * reserved amount. | ||
1227 | */ | ||
1228 | num_extents = div64_u64(old_size + root->fs_info->max_extent - 1, | ||
1229 | root->fs_info->max_extent); | ||
1230 | if (div64_u64(new_size + root->fs_info->max_extent - 1, | ||
1231 | root->fs_info->max_extent) > num_extents) | ||
1232 | return 0; | ||
1233 | |||
1234 | BTRFS_I(inode)->delalloc_extents--; | ||
1235 | |||
1236 | return 0; | ||
1237 | } | ||
1238 | |||
1162 | /* | 1239 | /* |
1163 | * extent_io.c set_bit_hook, used to track delayed allocation | 1240 | * extent_io.c set_bit_hook, used to track delayed allocation |
1164 | * bytes in this file, and to maintain the list of inodes that | 1241 | * bytes in this file, and to maintain the list of inodes that |
@@ -1167,6 +1244,7 @@ static int run_delalloc_range(struct inode *inode, struct page *locked_page, | |||
1167 | static int btrfs_set_bit_hook(struct inode *inode, u64 start, u64 end, | 1244 | static int btrfs_set_bit_hook(struct inode *inode, u64 start, u64 end, |
1168 | unsigned long old, unsigned long bits) | 1245 | unsigned long old, unsigned long bits) |
1169 | { | 1246 | { |
1247 | |||
1170 | /* | 1248 | /* |
1171 | * set_bit and clear bit hooks normally require _irqsave/restore | 1249 | * set_bit and clear bit hooks normally require _irqsave/restore |
1172 | * but in this case, we are only testeing for the DELALLOC | 1250 | * but in this case, we are only testeing for the DELALLOC |
@@ -1174,6 +1252,8 @@ static int btrfs_set_bit_hook(struct inode *inode, u64 start, u64 end, | |||
1174 | */ | 1252 | */ |
1175 | if (!(old & EXTENT_DELALLOC) && (bits & EXTENT_DELALLOC)) { | 1253 | if (!(old & EXTENT_DELALLOC) && (bits & EXTENT_DELALLOC)) { |
1176 | struct btrfs_root *root = BTRFS_I(inode)->root; | 1254 | struct btrfs_root *root = BTRFS_I(inode)->root; |
1255 | |||
1256 | BTRFS_I(inode)->delalloc_extents++; | ||
1177 | btrfs_delalloc_reserve_space(root, inode, end - start + 1); | 1257 | btrfs_delalloc_reserve_space(root, inode, end - start + 1); |
1178 | spin_lock(&root->fs_info->delalloc_lock); | 1258 | spin_lock(&root->fs_info->delalloc_lock); |
1179 | BTRFS_I(inode)->delalloc_bytes += end - start + 1; | 1259 | BTRFS_I(inode)->delalloc_bytes += end - start + 1; |
@@ -1190,22 +1270,27 @@ static int btrfs_set_bit_hook(struct inode *inode, u64 start, u64 end, | |||
1190 | /* | 1270 | /* |
1191 | * extent_io.c clear_bit_hook, see set_bit_hook for why | 1271 | * extent_io.c clear_bit_hook, see set_bit_hook for why |
1192 | */ | 1272 | */ |
1193 | static int btrfs_clear_bit_hook(struct inode *inode, u64 start, u64 end, | 1273 | static int btrfs_clear_bit_hook(struct inode *inode, |
1194 | unsigned long old, unsigned long bits) | 1274 | struct extent_state *state, unsigned long bits) |
1195 | { | 1275 | { |
1196 | /* | 1276 | /* |
1197 | * set_bit and clear bit hooks normally require _irqsave/restore | 1277 | * set_bit and clear bit hooks normally require _irqsave/restore |
1198 | * but in this case, we are only testeing for the DELALLOC | 1278 | * but in this case, we are only testeing for the DELALLOC |
1199 | * bit, which is only set or cleared with irqs on | 1279 | * bit, which is only set or cleared with irqs on |
1200 | */ | 1280 | */ |
1201 | if ((old & EXTENT_DELALLOC) && (bits & EXTENT_DELALLOC)) { | 1281 | if ((state->state & EXTENT_DELALLOC) && (bits & EXTENT_DELALLOC)) { |
1202 | struct btrfs_root *root = BTRFS_I(inode)->root; | 1282 | struct btrfs_root *root = BTRFS_I(inode)->root; |
1203 | 1283 | ||
1284 | BTRFS_I(inode)->delalloc_extents--; | ||
1285 | btrfs_unreserve_metadata_for_delalloc(root, inode, 1); | ||
1286 | |||
1204 | spin_lock(&root->fs_info->delalloc_lock); | 1287 | spin_lock(&root->fs_info->delalloc_lock); |
1205 | if (end - start + 1 > root->fs_info->delalloc_bytes) { | 1288 | if (state->end - state->start + 1 > |
1289 | root->fs_info->delalloc_bytes) { | ||
1206 | printk(KERN_INFO "btrfs warning: delalloc account " | 1290 | printk(KERN_INFO "btrfs warning: delalloc account " |
1207 | "%llu %llu\n", | 1291 | "%llu %llu\n", |
1208 | (unsigned long long)end - start + 1, | 1292 | (unsigned long long) |
1293 | state->end - state->start + 1, | ||
1209 | (unsigned long long) | 1294 | (unsigned long long) |
1210 | root->fs_info->delalloc_bytes); | 1295 | root->fs_info->delalloc_bytes); |
1211 | btrfs_delalloc_free_space(root, inode, (u64)-1); | 1296 | btrfs_delalloc_free_space(root, inode, (u64)-1); |
@@ -1213,9 +1298,12 @@ static int btrfs_clear_bit_hook(struct inode *inode, u64 start, u64 end, | |||
1213 | BTRFS_I(inode)->delalloc_bytes = 0; | 1298 | BTRFS_I(inode)->delalloc_bytes = 0; |
1214 | } else { | 1299 | } else { |
1215 | btrfs_delalloc_free_space(root, inode, | 1300 | btrfs_delalloc_free_space(root, inode, |
1216 | end - start + 1); | 1301 | state->end - |
1217 | root->fs_info->delalloc_bytes -= end - start + 1; | 1302 | state->start + 1); |
1218 | BTRFS_I(inode)->delalloc_bytes -= end - start + 1; | 1303 | root->fs_info->delalloc_bytes -= state->end - |
1304 | state->start + 1; | ||
1305 | BTRFS_I(inode)->delalloc_bytes -= state->end - | ||
1306 | state->start + 1; | ||
1219 | } | 1307 | } |
1220 | if (BTRFS_I(inode)->delalloc_bytes == 0 && | 1308 | if (BTRFS_I(inode)->delalloc_bytes == 0 && |
1221 | !list_empty(&BTRFS_I(inode)->delalloc_inodes)) { | 1309 | !list_empty(&BTRFS_I(inode)->delalloc_inodes)) { |
@@ -2950,7 +3038,12 @@ again: | |||
2950 | goto again; | 3038 | goto again; |
2951 | } | 3039 | } |
2952 | 3040 | ||
2953 | btrfs_set_extent_delalloc(inode, page_start, page_end); | 3041 | ret = btrfs_set_extent_delalloc(inode, page_start, page_end); |
3042 | if (ret) { | ||
3043 | unlock_extent(io_tree, page_start, page_end, GFP_NOFS); | ||
3044 | goto out_unlock; | ||
3045 | } | ||
3046 | |||
2954 | ret = 0; | 3047 | ret = 0; |
2955 | if (offset != PAGE_CACHE_SIZE) { | 3048 | if (offset != PAGE_CACHE_SIZE) { |
2956 | kaddr = kmap(page); | 3049 | kaddr = kmap(page); |
@@ -2981,15 +3074,11 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
2981 | u64 last_byte; | 3074 | u64 last_byte; |
2982 | u64 cur_offset; | 3075 | u64 cur_offset; |
2983 | u64 hole_size; | 3076 | u64 hole_size; |
2984 | int err; | 3077 | int err = 0; |
2985 | 3078 | ||
2986 | if (size <= hole_start) | 3079 | if (size <= hole_start) |
2987 | return 0; | 3080 | return 0; |
2988 | 3081 | ||
2989 | err = btrfs_check_metadata_free_space(root); | ||
2990 | if (err) | ||
2991 | return err; | ||
2992 | |||
2993 | btrfs_truncate_page(inode->i_mapping, inode->i_size); | 3082 | btrfs_truncate_page(inode->i_mapping, inode->i_size); |
2994 | 3083 | ||
2995 | while (1) { | 3084 | while (1) { |
@@ -3024,12 +3113,18 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3024 | cur_offset, &hint_byte, 1); | 3113 | cur_offset, &hint_byte, 1); |
3025 | if (err) | 3114 | if (err) |
3026 | break; | 3115 | break; |
3116 | |||
3117 | err = btrfs_reserve_metadata_space(root, 1); | ||
3118 | if (err) | ||
3119 | break; | ||
3120 | |||
3027 | err = btrfs_insert_file_extent(trans, root, | 3121 | err = btrfs_insert_file_extent(trans, root, |
3028 | inode->i_ino, cur_offset, 0, | 3122 | inode->i_ino, cur_offset, 0, |
3029 | 0, hole_size, 0, hole_size, | 3123 | 0, hole_size, 0, hole_size, |
3030 | 0, 0, 0); | 3124 | 0, 0, 0); |
3031 | btrfs_drop_extent_cache(inode, hole_start, | 3125 | btrfs_drop_extent_cache(inode, hole_start, |
3032 | last_byte - 1, 0); | 3126 | last_byte - 1, 0); |
3127 | btrfs_unreserve_metadata_space(root, 1); | ||
3033 | } | 3128 | } |
3034 | free_extent_map(em); | 3129 | free_extent_map(em); |
3035 | cur_offset = last_byte; | 3130 | cur_offset = last_byte; |
@@ -3990,11 +4085,18 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
3990 | if (!new_valid_dev(rdev)) | 4085 | if (!new_valid_dev(rdev)) |
3991 | return -EINVAL; | 4086 | return -EINVAL; |
3992 | 4087 | ||
3993 | err = btrfs_check_metadata_free_space(root); | 4088 | /* |
4089 | * 2 for inode item and ref | ||
4090 | * 2 for dir items | ||
4091 | * 1 for xattr if selinux is on | ||
4092 | */ | ||
4093 | err = btrfs_reserve_metadata_space(root, 5); | ||
3994 | if (err) | 4094 | if (err) |
3995 | goto fail; | 4095 | return err; |
3996 | 4096 | ||
3997 | trans = btrfs_start_transaction(root, 1); | 4097 | trans = btrfs_start_transaction(root, 1); |
4098 | if (!trans) | ||
4099 | goto fail; | ||
3998 | btrfs_set_trans_block_group(trans, dir); | 4100 | btrfs_set_trans_block_group(trans, dir); |
3999 | 4101 | ||
4000 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); | 4102 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); |
@@ -4032,6 +4134,7 @@ out_unlock: | |||
4032 | nr = trans->blocks_used; | 4134 | nr = trans->blocks_used; |
4033 | btrfs_end_transaction_throttle(trans, root); | 4135 | btrfs_end_transaction_throttle(trans, root); |
4034 | fail: | 4136 | fail: |
4137 | btrfs_unreserve_metadata_space(root, 5); | ||
4035 | if (drop_inode) { | 4138 | if (drop_inode) { |
4036 | inode_dec_link_count(inode); | 4139 | inode_dec_link_count(inode); |
4037 | iput(inode); | 4140 | iput(inode); |
@@ -4052,10 +4155,18 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4052 | u64 objectid; | 4155 | u64 objectid; |
4053 | u64 index = 0; | 4156 | u64 index = 0; |
4054 | 4157 | ||
4055 | err = btrfs_check_metadata_free_space(root); | 4158 | /* |
4159 | * 2 for inode item and ref | ||
4160 | * 2 for dir items | ||
4161 | * 1 for xattr if selinux is on | ||
4162 | */ | ||
4163 | err = btrfs_reserve_metadata_space(root, 5); | ||
4056 | if (err) | 4164 | if (err) |
4057 | goto fail; | 4165 | return err; |
4166 | |||
4058 | trans = btrfs_start_transaction(root, 1); | 4167 | trans = btrfs_start_transaction(root, 1); |
4168 | if (!trans) | ||
4169 | goto fail; | ||
4059 | btrfs_set_trans_block_group(trans, dir); | 4170 | btrfs_set_trans_block_group(trans, dir); |
4060 | 4171 | ||
4061 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); | 4172 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); |
@@ -4096,6 +4207,7 @@ out_unlock: | |||
4096 | nr = trans->blocks_used; | 4207 | nr = trans->blocks_used; |
4097 | btrfs_end_transaction_throttle(trans, root); | 4208 | btrfs_end_transaction_throttle(trans, root); |
4098 | fail: | 4209 | fail: |
4210 | btrfs_unreserve_metadata_space(root, 5); | ||
4099 | if (drop_inode) { | 4211 | if (drop_inode) { |
4100 | inode_dec_link_count(inode); | 4212 | inode_dec_link_count(inode); |
4101 | iput(inode); | 4213 | iput(inode); |
@@ -4118,10 +4230,16 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
4118 | if (inode->i_nlink == 0) | 4230 | if (inode->i_nlink == 0) |
4119 | return -ENOENT; | 4231 | return -ENOENT; |
4120 | 4232 | ||
4121 | btrfs_inc_nlink(inode); | 4233 | /* |
4122 | err = btrfs_check_metadata_free_space(root); | 4234 | * 1 item for inode ref |
4235 | * 2 items for dir items | ||
4236 | */ | ||
4237 | err = btrfs_reserve_metadata_space(root, 3); | ||
4123 | if (err) | 4238 | if (err) |
4124 | goto fail; | 4239 | return err; |
4240 | |||
4241 | btrfs_inc_nlink(inode); | ||
4242 | |||
4125 | err = btrfs_set_inode_index(dir, &index); | 4243 | err = btrfs_set_inode_index(dir, &index); |
4126 | if (err) | 4244 | if (err) |
4127 | goto fail; | 4245 | goto fail; |
@@ -4145,6 +4263,7 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
4145 | nr = trans->blocks_used; | 4263 | nr = trans->blocks_used; |
4146 | btrfs_end_transaction_throttle(trans, root); | 4264 | btrfs_end_transaction_throttle(trans, root); |
4147 | fail: | 4265 | fail: |
4266 | btrfs_unreserve_metadata_space(root, 3); | ||
4148 | if (drop_inode) { | 4267 | if (drop_inode) { |
4149 | inode_dec_link_count(inode); | 4268 | inode_dec_link_count(inode); |
4150 | iput(inode); | 4269 | iput(inode); |
@@ -4164,17 +4283,21 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
4164 | u64 index = 0; | 4283 | u64 index = 0; |
4165 | unsigned long nr = 1; | 4284 | unsigned long nr = 1; |
4166 | 4285 | ||
4167 | err = btrfs_check_metadata_free_space(root); | 4286 | /* |
4287 | * 2 items for inode and ref | ||
4288 | * 2 items for dir items | ||
4289 | * 1 for xattr if selinux is on | ||
4290 | */ | ||
4291 | err = btrfs_reserve_metadata_space(root, 5); | ||
4168 | if (err) | 4292 | if (err) |
4169 | goto out_unlock; | 4293 | return err; |
4170 | 4294 | ||
4171 | trans = btrfs_start_transaction(root, 1); | 4295 | trans = btrfs_start_transaction(root, 1); |
4172 | btrfs_set_trans_block_group(trans, dir); | 4296 | if (!trans) { |
4173 | 4297 | err = -ENOMEM; | |
4174 | if (IS_ERR(trans)) { | ||
4175 | err = PTR_ERR(trans); | ||
4176 | goto out_unlock; | 4298 | goto out_unlock; |
4177 | } | 4299 | } |
4300 | btrfs_set_trans_block_group(trans, dir); | ||
4178 | 4301 | ||
4179 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); | 4302 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); |
4180 | if (err) { | 4303 | if (err) { |
@@ -4223,6 +4346,7 @@ out_fail: | |||
4223 | btrfs_end_transaction_throttle(trans, root); | 4346 | btrfs_end_transaction_throttle(trans, root); |
4224 | 4347 | ||
4225 | out_unlock: | 4348 | out_unlock: |
4349 | btrfs_unreserve_metadata_space(root, 5); | ||
4226 | if (drop_on_err) | 4350 | if (drop_on_err) |
4227 | iput(inode); | 4351 | iput(inode); |
4228 | btrfs_btree_balance_dirty(root, nr); | 4352 | btrfs_btree_balance_dirty(root, nr); |
@@ -4747,6 +4871,13 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
4747 | goto out; | 4871 | goto out; |
4748 | } | 4872 | } |
4749 | 4873 | ||
4874 | ret = btrfs_reserve_metadata_for_delalloc(root, inode, 1); | ||
4875 | if (ret) { | ||
4876 | btrfs_free_reserved_data_space(root, inode, PAGE_CACHE_SIZE); | ||
4877 | ret = VM_FAULT_SIGBUS; | ||
4878 | goto out; | ||
4879 | } | ||
4880 | |||
4750 | ret = VM_FAULT_NOPAGE; /* make the VM retry the fault */ | 4881 | ret = VM_FAULT_NOPAGE; /* make the VM retry the fault */ |
4751 | again: | 4882 | again: |
4752 | lock_page(page); | 4883 | lock_page(page); |
@@ -4778,7 +4909,23 @@ again: | |||
4778 | goto again; | 4909 | goto again; |
4779 | } | 4910 | } |
4780 | 4911 | ||
4781 | btrfs_set_extent_delalloc(inode, page_start, page_end); | 4912 | /* |
4913 | * XXX - page_mkwrite gets called every time the page is dirtied, even | ||
4914 | * if it was already dirty, so for space accounting reasons we need to | ||
4915 | * clear any delalloc bits for the range we are fixing to save. There | ||
4916 | * is probably a better way to do this, but for now keep consistent with | ||
4917 | * prepare_pages in the normal write path. | ||
4918 | */ | ||
4919 | clear_extent_bits(&BTRFS_I(inode)->io_tree, page_start, page_end, | ||
4920 | EXTENT_DIRTY | EXTENT_DELALLOC, GFP_NOFS); | ||
4921 | |||
4922 | ret = btrfs_set_extent_delalloc(inode, page_start, page_end); | ||
4923 | if (ret) { | ||
4924 | unlock_extent(io_tree, page_start, page_end, GFP_NOFS); | ||
4925 | ret = VM_FAULT_SIGBUS; | ||
4926 | btrfs_free_reserved_data_space(root, inode, PAGE_CACHE_SIZE); | ||
4927 | goto out_unlock; | ||
4928 | } | ||
4782 | ret = 0; | 4929 | ret = 0; |
4783 | 4930 | ||
4784 | /* page is wholly or partially inside EOF */ | 4931 | /* page is wholly or partially inside EOF */ |
@@ -4801,6 +4948,7 @@ again: | |||
4801 | unlock_extent(io_tree, page_start, page_end, GFP_NOFS); | 4948 | unlock_extent(io_tree, page_start, page_end, GFP_NOFS); |
4802 | 4949 | ||
4803 | out_unlock: | 4950 | out_unlock: |
4951 | btrfs_unreserve_metadata_for_delalloc(root, inode, 1); | ||
4804 | if (!ret) | 4952 | if (!ret) |
4805 | return VM_FAULT_LOCKED; | 4953 | return VM_FAULT_LOCKED; |
4806 | unlock_page(page); | 4954 | unlock_page(page); |
@@ -4917,6 +5065,8 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) | |||
4917 | return NULL; | 5065 | return NULL; |
4918 | ei->last_trans = 0; | 5066 | ei->last_trans = 0; |
4919 | ei->logged_trans = 0; | 5067 | ei->logged_trans = 0; |
5068 | ei->delalloc_extents = 0; | ||
5069 | ei->delalloc_reserved_extents = 0; | ||
4920 | btrfs_ordered_inode_tree_init(&ei->ordered_tree); | 5070 | btrfs_ordered_inode_tree_init(&ei->ordered_tree); |
4921 | INIT_LIST_HEAD(&ei->i_orphan); | 5071 | INIT_LIST_HEAD(&ei->i_orphan); |
4922 | INIT_LIST_HEAD(&ei->ordered_operations); | 5072 | INIT_LIST_HEAD(&ei->ordered_operations); |
@@ -5070,7 +5220,12 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
5070 | new_inode->i_size > BTRFS_EMPTY_DIR_SIZE) | 5220 | new_inode->i_size > BTRFS_EMPTY_DIR_SIZE) |
5071 | return -ENOTEMPTY; | 5221 | return -ENOTEMPTY; |
5072 | 5222 | ||
5073 | ret = btrfs_check_metadata_free_space(root); | 5223 | /* |
5224 | * 2 items for dir items | ||
5225 | * 1 item for orphan entry | ||
5226 | * 1 item for ref | ||
5227 | */ | ||
5228 | ret = btrfs_reserve_metadata_space(root, 4); | ||
5074 | if (ret) | 5229 | if (ret) |
5075 | return ret; | 5230 | return ret; |
5076 | 5231 | ||
@@ -5185,6 +5340,8 @@ out_fail: | |||
5185 | 5340 | ||
5186 | if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) | 5341 | if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) |
5187 | up_read(&root->fs_info->subvol_sem); | 5342 | up_read(&root->fs_info->subvol_sem); |
5343 | |||
5344 | btrfs_unreserve_metadata_space(root, 4); | ||
5188 | return ret; | 5345 | return ret; |
5189 | } | 5346 | } |
5190 | 5347 | ||
@@ -5256,11 +5413,18 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
5256 | if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(root)) | 5413 | if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(root)) |
5257 | return -ENAMETOOLONG; | 5414 | return -ENAMETOOLONG; |
5258 | 5415 | ||
5259 | err = btrfs_check_metadata_free_space(root); | 5416 | /* |
5417 | * 2 items for inode item and ref | ||
5418 | * 2 items for dir items | ||
5419 | * 1 item for xattr if selinux is on | ||
5420 | */ | ||
5421 | err = btrfs_reserve_metadata_space(root, 5); | ||
5260 | if (err) | 5422 | if (err) |
5261 | goto out_fail; | 5423 | return err; |
5262 | 5424 | ||
5263 | trans = btrfs_start_transaction(root, 1); | 5425 | trans = btrfs_start_transaction(root, 1); |
5426 | if (!trans) | ||
5427 | goto out_fail; | ||
5264 | btrfs_set_trans_block_group(trans, dir); | 5428 | btrfs_set_trans_block_group(trans, dir); |
5265 | 5429 | ||
5266 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); | 5430 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); |
@@ -5341,6 +5505,7 @@ out_unlock: | |||
5341 | nr = trans->blocks_used; | 5505 | nr = trans->blocks_used; |
5342 | btrfs_end_transaction_throttle(trans, root); | 5506 | btrfs_end_transaction_throttle(trans, root); |
5343 | out_fail: | 5507 | out_fail: |
5508 | btrfs_unreserve_metadata_space(root, 5); | ||
5344 | if (drop_inode) { | 5509 | if (drop_inode) { |
5345 | inode_dec_link_count(inode); | 5510 | inode_dec_link_count(inode); |
5346 | iput(inode); | 5511 | iput(inode); |
@@ -5362,6 +5527,11 @@ static int prealloc_file_range(struct btrfs_trans_handle *trans, | |||
5362 | 5527 | ||
5363 | while (num_bytes > 0) { | 5528 | while (num_bytes > 0) { |
5364 | alloc_size = min(num_bytes, root->fs_info->max_extent); | 5529 | alloc_size = min(num_bytes, root->fs_info->max_extent); |
5530 | |||
5531 | ret = btrfs_reserve_metadata_space(root, 1); | ||
5532 | if (ret) | ||
5533 | goto out; | ||
5534 | |||
5365 | ret = btrfs_reserve_extent(trans, root, alloc_size, | 5535 | ret = btrfs_reserve_extent(trans, root, alloc_size, |
5366 | root->sectorsize, 0, alloc_hint, | 5536 | root->sectorsize, 0, alloc_hint, |
5367 | (u64)-1, &ins, 1); | 5537 | (u64)-1, &ins, 1); |
@@ -5381,6 +5551,7 @@ static int prealloc_file_range(struct btrfs_trans_handle *trans, | |||
5381 | num_bytes -= ins.offset; | 5551 | num_bytes -= ins.offset; |
5382 | cur_offset += ins.offset; | 5552 | cur_offset += ins.offset; |
5383 | alloc_hint = ins.objectid + ins.offset; | 5553 | alloc_hint = ins.objectid + ins.offset; |
5554 | btrfs_unreserve_metadata_space(root, 1); | ||
5384 | } | 5555 | } |
5385 | out: | 5556 | out: |
5386 | if (cur_offset > start) { | 5557 | if (cur_offset > start) { |
@@ -5566,6 +5737,8 @@ static struct extent_io_ops btrfs_extent_io_ops = { | |||
5566 | .readpage_io_failed_hook = btrfs_io_failed_hook, | 5737 | .readpage_io_failed_hook = btrfs_io_failed_hook, |
5567 | .set_bit_hook = btrfs_set_bit_hook, | 5738 | .set_bit_hook = btrfs_set_bit_hook, |
5568 | .clear_bit_hook = btrfs_clear_bit_hook, | 5739 | .clear_bit_hook = btrfs_clear_bit_hook, |
5740 | .merge_extent_hook = btrfs_merge_extent_hook, | ||
5741 | .split_extent_hook = btrfs_split_extent_hook, | ||
5569 | }; | 5742 | }; |
5570 | 5743 | ||
5571 | /* | 5744 | /* |