diff options
author | Chris Mason <chris.mason@oracle.com> | 2009-10-01 12:58:13 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2009-10-01 12:58:13 -0400 |
commit | 25472b880c69c0daa485c4f80a6550437ed1149f (patch) | |
tree | d12bc091e8991513db0d2891111ba773eb5c52e2 /fs/btrfs/inode.c | |
parent | 17d857be649a21ca90008c6dc425d849fa83db5c (diff) | |
parent | ab93dbecfba72bbc04b7036343d180aaff1b61a3 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable into for-linus
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 224 |
1 files changed, 193 insertions, 31 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index e9b76bcd1c12..5b9c8e0d6dd6 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,12 @@ again: | |||
4778 | goto again; | 4909 | goto again; |
4779 | } | 4910 | } |
4780 | 4911 | ||
4781 | btrfs_set_extent_delalloc(inode, page_start, page_end); | 4912 | ret = btrfs_set_extent_delalloc(inode, page_start, page_end); |
4913 | if (ret) { | ||
4914 | unlock_extent(io_tree, page_start, page_end, GFP_NOFS); | ||
4915 | ret = VM_FAULT_SIGBUS; | ||
4916 | goto out_unlock; | ||
4917 | } | ||
4782 | ret = 0; | 4918 | ret = 0; |
4783 | 4919 | ||
4784 | /* page is wholly or partially inside EOF */ | 4920 | /* page is wholly or partially inside EOF */ |
@@ -4801,6 +4937,7 @@ again: | |||
4801 | unlock_extent(io_tree, page_start, page_end, GFP_NOFS); | 4937 | unlock_extent(io_tree, page_start, page_end, GFP_NOFS); |
4802 | 4938 | ||
4803 | out_unlock: | 4939 | out_unlock: |
4940 | btrfs_unreserve_metadata_for_delalloc(root, inode, 1); | ||
4804 | if (!ret) | 4941 | if (!ret) |
4805 | return VM_FAULT_LOCKED; | 4942 | return VM_FAULT_LOCKED; |
4806 | unlock_page(page); | 4943 | unlock_page(page); |
@@ -4917,6 +5054,8 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) | |||
4917 | return NULL; | 5054 | return NULL; |
4918 | ei->last_trans = 0; | 5055 | ei->last_trans = 0; |
4919 | ei->logged_trans = 0; | 5056 | ei->logged_trans = 0; |
5057 | ei->delalloc_extents = 0; | ||
5058 | ei->delalloc_reserved_extents = 0; | ||
4920 | btrfs_ordered_inode_tree_init(&ei->ordered_tree); | 5059 | btrfs_ordered_inode_tree_init(&ei->ordered_tree); |
4921 | INIT_LIST_HEAD(&ei->i_orphan); | 5060 | INIT_LIST_HEAD(&ei->i_orphan); |
4922 | INIT_LIST_HEAD(&ei->ordered_operations); | 5061 | INIT_LIST_HEAD(&ei->ordered_operations); |
@@ -5070,7 +5209,12 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
5070 | new_inode->i_size > BTRFS_EMPTY_DIR_SIZE) | 5209 | new_inode->i_size > BTRFS_EMPTY_DIR_SIZE) |
5071 | return -ENOTEMPTY; | 5210 | return -ENOTEMPTY; |
5072 | 5211 | ||
5073 | ret = btrfs_check_metadata_free_space(root); | 5212 | /* |
5213 | * 2 items for dir items | ||
5214 | * 1 item for orphan entry | ||
5215 | * 1 item for ref | ||
5216 | */ | ||
5217 | ret = btrfs_reserve_metadata_space(root, 4); | ||
5074 | if (ret) | 5218 | if (ret) |
5075 | return ret; | 5219 | return ret; |
5076 | 5220 | ||
@@ -5185,6 +5329,8 @@ out_fail: | |||
5185 | 5329 | ||
5186 | if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) | 5330 | if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) |
5187 | up_read(&root->fs_info->subvol_sem); | 5331 | up_read(&root->fs_info->subvol_sem); |
5332 | |||
5333 | btrfs_unreserve_metadata_space(root, 4); | ||
5188 | return ret; | 5334 | return ret; |
5189 | } | 5335 | } |
5190 | 5336 | ||
@@ -5256,11 +5402,18 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
5256 | if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(root)) | 5402 | if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(root)) |
5257 | return -ENAMETOOLONG; | 5403 | return -ENAMETOOLONG; |
5258 | 5404 | ||
5259 | err = btrfs_check_metadata_free_space(root); | 5405 | /* |
5406 | * 2 items for inode item and ref | ||
5407 | * 2 items for dir items | ||
5408 | * 1 item for xattr if selinux is on | ||
5409 | */ | ||
5410 | err = btrfs_reserve_metadata_space(root, 5); | ||
5260 | if (err) | 5411 | if (err) |
5261 | goto out_fail; | 5412 | return err; |
5262 | 5413 | ||
5263 | trans = btrfs_start_transaction(root, 1); | 5414 | trans = btrfs_start_transaction(root, 1); |
5415 | if (!trans) | ||
5416 | goto out_fail; | ||
5264 | btrfs_set_trans_block_group(trans, dir); | 5417 | btrfs_set_trans_block_group(trans, dir); |
5265 | 5418 | ||
5266 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); | 5419 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); |
@@ -5341,6 +5494,7 @@ out_unlock: | |||
5341 | nr = trans->blocks_used; | 5494 | nr = trans->blocks_used; |
5342 | btrfs_end_transaction_throttle(trans, root); | 5495 | btrfs_end_transaction_throttle(trans, root); |
5343 | out_fail: | 5496 | out_fail: |
5497 | btrfs_unreserve_metadata_space(root, 5); | ||
5344 | if (drop_inode) { | 5498 | if (drop_inode) { |
5345 | inode_dec_link_count(inode); | 5499 | inode_dec_link_count(inode); |
5346 | iput(inode); | 5500 | iput(inode); |
@@ -5362,6 +5516,11 @@ static int prealloc_file_range(struct btrfs_trans_handle *trans, | |||
5362 | 5516 | ||
5363 | while (num_bytes > 0) { | 5517 | while (num_bytes > 0) { |
5364 | alloc_size = min(num_bytes, root->fs_info->max_extent); | 5518 | alloc_size = min(num_bytes, root->fs_info->max_extent); |
5519 | |||
5520 | ret = btrfs_reserve_metadata_space(root, 1); | ||
5521 | if (ret) | ||
5522 | goto out; | ||
5523 | |||
5365 | ret = btrfs_reserve_extent(trans, root, alloc_size, | 5524 | ret = btrfs_reserve_extent(trans, root, alloc_size, |
5366 | root->sectorsize, 0, alloc_hint, | 5525 | root->sectorsize, 0, alloc_hint, |
5367 | (u64)-1, &ins, 1); | 5526 | (u64)-1, &ins, 1); |
@@ -5381,6 +5540,7 @@ static int prealloc_file_range(struct btrfs_trans_handle *trans, | |||
5381 | num_bytes -= ins.offset; | 5540 | num_bytes -= ins.offset; |
5382 | cur_offset += ins.offset; | 5541 | cur_offset += ins.offset; |
5383 | alloc_hint = ins.objectid + ins.offset; | 5542 | alloc_hint = ins.objectid + ins.offset; |
5543 | btrfs_unreserve_metadata_space(root, 1); | ||
5384 | } | 5544 | } |
5385 | out: | 5545 | out: |
5386 | if (cur_offset > start) { | 5546 | if (cur_offset > start) { |
@@ -5566,6 +5726,8 @@ static struct extent_io_ops btrfs_extent_io_ops = { | |||
5566 | .readpage_io_failed_hook = btrfs_io_failed_hook, | 5726 | .readpage_io_failed_hook = btrfs_io_failed_hook, |
5567 | .set_bit_hook = btrfs_set_bit_hook, | 5727 | .set_bit_hook = btrfs_set_bit_hook, |
5568 | .clear_bit_hook = btrfs_clear_bit_hook, | 5728 | .clear_bit_hook = btrfs_clear_bit_hook, |
5729 | .merge_extent_hook = btrfs_merge_extent_hook, | ||
5730 | .split_extent_hook = btrfs_split_extent_hook, | ||
5569 | }; | 5731 | }; |
5570 | 5732 | ||
5571 | /* | 5733 | /* |