diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 357 |
1 files changed, 296 insertions, 61 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index e9b76bcd1c12..dae12dc7e159 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -62,7 +62,7 @@ static const struct inode_operations btrfs_special_inode_operations; | |||
62 | static const struct inode_operations btrfs_file_inode_operations; | 62 | static const struct inode_operations btrfs_file_inode_operations; |
63 | static const struct address_space_operations btrfs_aops; | 63 | static const struct address_space_operations btrfs_aops; |
64 | static const struct address_space_operations btrfs_symlink_aops; | 64 | static const struct address_space_operations btrfs_symlink_aops; |
65 | static struct file_operations btrfs_dir_file_operations; | 65 | static const struct file_operations btrfs_dir_file_operations; |
66 | static struct extent_io_ops btrfs_extent_io_ops; | 66 | static struct extent_io_ops btrfs_extent_io_ops; |
67 | 67 | ||
68 | static struct kmem_cache *btrfs_inode_cachep; | 68 | static struct kmem_cache *btrfs_inode_cachep; |
@@ -424,9 +424,12 @@ again: | |||
424 | * and free up our temp pages. | 424 | * and free up our temp pages. |
425 | */ | 425 | */ |
426 | extent_clear_unlock_delalloc(inode, | 426 | extent_clear_unlock_delalloc(inode, |
427 | &BTRFS_I(inode)->io_tree, | 427 | &BTRFS_I(inode)->io_tree, |
428 | start, end, NULL, 1, 0, | 428 | start, end, NULL, |
429 | 0, 1, 1, 1, 0); | 429 | EXTENT_CLEAR_UNLOCK_PAGE | EXTENT_CLEAR_DIRTY | |
430 | EXTENT_CLEAR_DELALLOC | | ||
431 | EXTENT_CLEAR_ACCOUNTING | | ||
432 | EXTENT_SET_WRITEBACK | EXTENT_END_WRITEBACK); | ||
430 | ret = 0; | 433 | ret = 0; |
431 | goto free_pages_out; | 434 | goto free_pages_out; |
432 | } | 435 | } |
@@ -637,11 +640,14 @@ static noinline int submit_compressed_extents(struct inode *inode, | |||
637 | * clear dirty, set writeback and unlock the pages. | 640 | * clear dirty, set writeback and unlock the pages. |
638 | */ | 641 | */ |
639 | extent_clear_unlock_delalloc(inode, | 642 | extent_clear_unlock_delalloc(inode, |
640 | &BTRFS_I(inode)->io_tree, | 643 | &BTRFS_I(inode)->io_tree, |
641 | async_extent->start, | 644 | async_extent->start, |
642 | async_extent->start + | 645 | async_extent->start + |
643 | async_extent->ram_size - 1, | 646 | async_extent->ram_size - 1, |
644 | NULL, 1, 1, 0, 1, 1, 0, 0); | 647 | NULL, EXTENT_CLEAR_UNLOCK_PAGE | |
648 | EXTENT_CLEAR_UNLOCK | | ||
649 | EXTENT_CLEAR_DELALLOC | | ||
650 | EXTENT_CLEAR_DIRTY | EXTENT_SET_WRITEBACK); | ||
645 | 651 | ||
646 | ret = btrfs_submit_compressed_write(inode, | 652 | ret = btrfs_submit_compressed_write(inode, |
647 | async_extent->start, | 653 | async_extent->start, |
@@ -712,9 +718,15 @@ static noinline int cow_file_range(struct inode *inode, | |||
712 | start, end, 0, NULL); | 718 | start, end, 0, NULL); |
713 | if (ret == 0) { | 719 | if (ret == 0) { |
714 | extent_clear_unlock_delalloc(inode, | 720 | extent_clear_unlock_delalloc(inode, |
715 | &BTRFS_I(inode)->io_tree, | 721 | &BTRFS_I(inode)->io_tree, |
716 | start, end, NULL, 1, 1, | 722 | start, end, NULL, |
717 | 1, 1, 1, 1, 0); | 723 | EXTENT_CLEAR_UNLOCK_PAGE | |
724 | EXTENT_CLEAR_UNLOCK | | ||
725 | EXTENT_CLEAR_DELALLOC | | ||
726 | EXTENT_CLEAR_ACCOUNTING | | ||
727 | EXTENT_CLEAR_DIRTY | | ||
728 | EXTENT_SET_WRITEBACK | | ||
729 | EXTENT_END_WRITEBACK); | ||
718 | *nr_written = *nr_written + | 730 | *nr_written = *nr_written + |
719 | (end - start + PAGE_CACHE_SIZE) / PAGE_CACHE_SIZE; | 731 | (end - start + PAGE_CACHE_SIZE) / PAGE_CACHE_SIZE; |
720 | *page_started = 1; | 732 | *page_started = 1; |
@@ -738,6 +750,8 @@ static noinline int cow_file_range(struct inode *inode, | |||
738 | btrfs_drop_extent_cache(inode, start, start + num_bytes - 1, 0); | 750 | btrfs_drop_extent_cache(inode, start, start + num_bytes - 1, 0); |
739 | 751 | ||
740 | while (disk_num_bytes > 0) { | 752 | while (disk_num_bytes > 0) { |
753 | unsigned long op; | ||
754 | |||
741 | cur_alloc_size = min(disk_num_bytes, root->fs_info->max_extent); | 755 | cur_alloc_size = min(disk_num_bytes, root->fs_info->max_extent); |
742 | ret = btrfs_reserve_extent(trans, root, cur_alloc_size, | 756 | ret = btrfs_reserve_extent(trans, root, cur_alloc_size, |
743 | root->sectorsize, 0, alloc_hint, | 757 | root->sectorsize, 0, alloc_hint, |
@@ -789,10 +803,13 @@ static noinline int cow_file_range(struct inode *inode, | |||
789 | * Do set the Private2 bit so we know this page was properly | 803 | * Do set the Private2 bit so we know this page was properly |
790 | * setup for writepage | 804 | * setup for writepage |
791 | */ | 805 | */ |
806 | op = unlock ? EXTENT_CLEAR_UNLOCK_PAGE : 0; | ||
807 | op |= EXTENT_CLEAR_UNLOCK | EXTENT_CLEAR_DELALLOC | | ||
808 | EXTENT_SET_PRIVATE2; | ||
809 | |||
792 | extent_clear_unlock_delalloc(inode, &BTRFS_I(inode)->io_tree, | 810 | extent_clear_unlock_delalloc(inode, &BTRFS_I(inode)->io_tree, |
793 | start, start + ram_size - 1, | 811 | start, start + ram_size - 1, |
794 | locked_page, unlock, 1, | 812 | locked_page, op); |
795 | 1, 0, 0, 0, 1); | ||
796 | disk_num_bytes -= cur_alloc_size; | 813 | disk_num_bytes -= cur_alloc_size; |
797 | num_bytes -= cur_alloc_size; | 814 | num_bytes -= cur_alloc_size; |
798 | alloc_hint = ins.objectid + ins.offset; | 815 | alloc_hint = ins.objectid + ins.offset; |
@@ -864,8 +881,8 @@ static int cow_file_range_async(struct inode *inode, struct page *locked_page, | |||
864 | u64 cur_end; | 881 | u64 cur_end; |
865 | int limit = 10 * 1024 * 1042; | 882 | int limit = 10 * 1024 * 1042; |
866 | 883 | ||
867 | clear_extent_bit(&BTRFS_I(inode)->io_tree, start, end, EXTENT_LOCKED | | 884 | clear_extent_bit(&BTRFS_I(inode)->io_tree, start, end, EXTENT_LOCKED, |
868 | EXTENT_DELALLOC, 1, 0, NULL, GFP_NOFS); | 885 | 1, 0, NULL, GFP_NOFS); |
869 | while (start < end) { | 886 | while (start < end) { |
870 | async_cow = kmalloc(sizeof(*async_cow), GFP_NOFS); | 887 | async_cow = kmalloc(sizeof(*async_cow), GFP_NOFS); |
871 | async_cow->inode = inode; | 888 | async_cow->inode = inode; |
@@ -1006,6 +1023,7 @@ next_slot: | |||
1006 | 1023 | ||
1007 | if (found_key.offset > cur_offset) { | 1024 | if (found_key.offset > cur_offset) { |
1008 | extent_end = found_key.offset; | 1025 | extent_end = found_key.offset; |
1026 | extent_type = 0; | ||
1009 | goto out_check; | 1027 | goto out_check; |
1010 | } | 1028 | } |
1011 | 1029 | ||
@@ -1112,8 +1130,10 @@ out_check: | |||
1112 | BUG_ON(ret); | 1130 | BUG_ON(ret); |
1113 | 1131 | ||
1114 | extent_clear_unlock_delalloc(inode, &BTRFS_I(inode)->io_tree, | 1132 | extent_clear_unlock_delalloc(inode, &BTRFS_I(inode)->io_tree, |
1115 | cur_offset, cur_offset + num_bytes - 1, | 1133 | cur_offset, cur_offset + num_bytes - 1, |
1116 | locked_page, 1, 1, 1, 0, 0, 0, 1); | 1134 | locked_page, EXTENT_CLEAR_UNLOCK_PAGE | |
1135 | EXTENT_CLEAR_UNLOCK | EXTENT_CLEAR_DELALLOC | | ||
1136 | EXTENT_SET_PRIVATE2); | ||
1117 | cur_offset = extent_end; | 1137 | cur_offset = extent_end; |
1118 | if (cur_offset > end) | 1138 | if (cur_offset > end) |
1119 | break; | 1139 | break; |
@@ -1159,6 +1179,89 @@ static int run_delalloc_range(struct inode *inode, struct page *locked_page, | |||
1159 | return ret; | 1179 | return ret; |
1160 | } | 1180 | } |
1161 | 1181 | ||
1182 | static int btrfs_split_extent_hook(struct inode *inode, | ||
1183 | struct extent_state *orig, u64 split) | ||
1184 | { | ||
1185 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
1186 | u64 size; | ||
1187 | |||
1188 | if (!(orig->state & EXTENT_DELALLOC)) | ||
1189 | return 0; | ||
1190 | |||
1191 | size = orig->end - orig->start + 1; | ||
1192 | if (size > root->fs_info->max_extent) { | ||
1193 | u64 num_extents; | ||
1194 | u64 new_size; | ||
1195 | |||
1196 | new_size = orig->end - split + 1; | ||
1197 | num_extents = div64_u64(size + root->fs_info->max_extent - 1, | ||
1198 | root->fs_info->max_extent); | ||
1199 | |||
1200 | /* | ||
1201 | * if we break a large extent up then leave oustanding_extents | ||
1202 | * be, since we've already accounted for the large extent. | ||
1203 | */ | ||
1204 | if (div64_u64(new_size + root->fs_info->max_extent - 1, | ||
1205 | root->fs_info->max_extent) < num_extents) | ||
1206 | return 0; | ||
1207 | } | ||
1208 | |||
1209 | spin_lock(&BTRFS_I(inode)->accounting_lock); | ||
1210 | BTRFS_I(inode)->outstanding_extents++; | ||
1211 | spin_unlock(&BTRFS_I(inode)->accounting_lock); | ||
1212 | |||
1213 | return 0; | ||
1214 | } | ||
1215 | |||
1216 | /* | ||
1217 | * extent_io.c merge_extent_hook, used to track merged delayed allocation | ||
1218 | * extents so we can keep track of new extents that are just merged onto old | ||
1219 | * extents, such as when we are doing sequential writes, so we can properly | ||
1220 | * account for the metadata space we'll need. | ||
1221 | */ | ||
1222 | static int btrfs_merge_extent_hook(struct inode *inode, | ||
1223 | struct extent_state *new, | ||
1224 | struct extent_state *other) | ||
1225 | { | ||
1226 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
1227 | u64 new_size, old_size; | ||
1228 | u64 num_extents; | ||
1229 | |||
1230 | /* not delalloc, ignore it */ | ||
1231 | if (!(other->state & EXTENT_DELALLOC)) | ||
1232 | return 0; | ||
1233 | |||
1234 | old_size = other->end - other->start + 1; | ||
1235 | if (new->start < other->start) | ||
1236 | new_size = other->end - new->start + 1; | ||
1237 | else | ||
1238 | new_size = new->end - other->start + 1; | ||
1239 | |||
1240 | /* we're not bigger than the max, unreserve the space and go */ | ||
1241 | if (new_size <= root->fs_info->max_extent) { | ||
1242 | spin_lock(&BTRFS_I(inode)->accounting_lock); | ||
1243 | BTRFS_I(inode)->outstanding_extents--; | ||
1244 | spin_unlock(&BTRFS_I(inode)->accounting_lock); | ||
1245 | return 0; | ||
1246 | } | ||
1247 | |||
1248 | /* | ||
1249 | * If we grew by another max_extent, just return, we want to keep that | ||
1250 | * reserved amount. | ||
1251 | */ | ||
1252 | num_extents = div64_u64(old_size + root->fs_info->max_extent - 1, | ||
1253 | root->fs_info->max_extent); | ||
1254 | if (div64_u64(new_size + root->fs_info->max_extent - 1, | ||
1255 | root->fs_info->max_extent) > num_extents) | ||
1256 | return 0; | ||
1257 | |||
1258 | spin_lock(&BTRFS_I(inode)->accounting_lock); | ||
1259 | BTRFS_I(inode)->outstanding_extents--; | ||
1260 | spin_unlock(&BTRFS_I(inode)->accounting_lock); | ||
1261 | |||
1262 | return 0; | ||
1263 | } | ||
1264 | |||
1162 | /* | 1265 | /* |
1163 | * extent_io.c set_bit_hook, used to track delayed allocation | 1266 | * extent_io.c set_bit_hook, used to track delayed allocation |
1164 | * bytes in this file, and to maintain the list of inodes that | 1267 | * bytes in this file, and to maintain the list of inodes that |
@@ -1167,6 +1270,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, | 1270 | static int btrfs_set_bit_hook(struct inode *inode, u64 start, u64 end, |
1168 | unsigned long old, unsigned long bits) | 1271 | unsigned long old, unsigned long bits) |
1169 | { | 1272 | { |
1273 | |||
1170 | /* | 1274 | /* |
1171 | * set_bit and clear bit hooks normally require _irqsave/restore | 1275 | * set_bit and clear bit hooks normally require _irqsave/restore |
1172 | * but in this case, we are only testeing for the DELALLOC | 1276 | * but in this case, we are only testeing for the DELALLOC |
@@ -1174,6 +1278,10 @@ static int btrfs_set_bit_hook(struct inode *inode, u64 start, u64 end, | |||
1174 | */ | 1278 | */ |
1175 | if (!(old & EXTENT_DELALLOC) && (bits & EXTENT_DELALLOC)) { | 1279 | if (!(old & EXTENT_DELALLOC) && (bits & EXTENT_DELALLOC)) { |
1176 | struct btrfs_root *root = BTRFS_I(inode)->root; | 1280 | struct btrfs_root *root = BTRFS_I(inode)->root; |
1281 | |||
1282 | spin_lock(&BTRFS_I(inode)->accounting_lock); | ||
1283 | BTRFS_I(inode)->outstanding_extents++; | ||
1284 | spin_unlock(&BTRFS_I(inode)->accounting_lock); | ||
1177 | btrfs_delalloc_reserve_space(root, inode, end - start + 1); | 1285 | btrfs_delalloc_reserve_space(root, inode, end - start + 1); |
1178 | spin_lock(&root->fs_info->delalloc_lock); | 1286 | spin_lock(&root->fs_info->delalloc_lock); |
1179 | BTRFS_I(inode)->delalloc_bytes += end - start + 1; | 1287 | BTRFS_I(inode)->delalloc_bytes += end - start + 1; |
@@ -1190,22 +1298,31 @@ static int btrfs_set_bit_hook(struct inode *inode, u64 start, u64 end, | |||
1190 | /* | 1298 | /* |
1191 | * extent_io.c clear_bit_hook, see set_bit_hook for why | 1299 | * extent_io.c clear_bit_hook, see set_bit_hook for why |
1192 | */ | 1300 | */ |
1193 | static int btrfs_clear_bit_hook(struct inode *inode, u64 start, u64 end, | 1301 | static int btrfs_clear_bit_hook(struct inode *inode, |
1194 | unsigned long old, unsigned long bits) | 1302 | struct extent_state *state, unsigned long bits) |
1195 | { | 1303 | { |
1196 | /* | 1304 | /* |
1197 | * set_bit and clear bit hooks normally require _irqsave/restore | 1305 | * set_bit and clear bit hooks normally require _irqsave/restore |
1198 | * but in this case, we are only testeing for the DELALLOC | 1306 | * but in this case, we are only testeing for the DELALLOC |
1199 | * bit, which is only set or cleared with irqs on | 1307 | * bit, which is only set or cleared with irqs on |
1200 | */ | 1308 | */ |
1201 | if ((old & EXTENT_DELALLOC) && (bits & EXTENT_DELALLOC)) { | 1309 | if ((state->state & EXTENT_DELALLOC) && (bits & EXTENT_DELALLOC)) { |
1202 | struct btrfs_root *root = BTRFS_I(inode)->root; | 1310 | struct btrfs_root *root = BTRFS_I(inode)->root; |
1203 | 1311 | ||
1312 | if (bits & EXTENT_DO_ACCOUNTING) { | ||
1313 | spin_lock(&BTRFS_I(inode)->accounting_lock); | ||
1314 | BTRFS_I(inode)->outstanding_extents--; | ||
1315 | spin_unlock(&BTRFS_I(inode)->accounting_lock); | ||
1316 | btrfs_unreserve_metadata_for_delalloc(root, inode, 1); | ||
1317 | } | ||
1318 | |||
1204 | spin_lock(&root->fs_info->delalloc_lock); | 1319 | spin_lock(&root->fs_info->delalloc_lock); |
1205 | if (end - start + 1 > root->fs_info->delalloc_bytes) { | 1320 | if (state->end - state->start + 1 > |
1321 | root->fs_info->delalloc_bytes) { | ||
1206 | printk(KERN_INFO "btrfs warning: delalloc account " | 1322 | printk(KERN_INFO "btrfs warning: delalloc account " |
1207 | "%llu %llu\n", | 1323 | "%llu %llu\n", |
1208 | (unsigned long long)end - start + 1, | 1324 | (unsigned long long) |
1325 | state->end - state->start + 1, | ||
1209 | (unsigned long long) | 1326 | (unsigned long long) |
1210 | root->fs_info->delalloc_bytes); | 1327 | root->fs_info->delalloc_bytes); |
1211 | btrfs_delalloc_free_space(root, inode, (u64)-1); | 1328 | btrfs_delalloc_free_space(root, inode, (u64)-1); |
@@ -1213,9 +1330,12 @@ static int btrfs_clear_bit_hook(struct inode *inode, u64 start, u64 end, | |||
1213 | BTRFS_I(inode)->delalloc_bytes = 0; | 1330 | BTRFS_I(inode)->delalloc_bytes = 0; |
1214 | } else { | 1331 | } else { |
1215 | btrfs_delalloc_free_space(root, inode, | 1332 | btrfs_delalloc_free_space(root, inode, |
1216 | end - start + 1); | 1333 | state->end - |
1217 | root->fs_info->delalloc_bytes -= end - start + 1; | 1334 | state->start + 1); |
1218 | BTRFS_I(inode)->delalloc_bytes -= end - start + 1; | 1335 | root->fs_info->delalloc_bytes -= state->end - |
1336 | state->start + 1; | ||
1337 | BTRFS_I(inode)->delalloc_bytes -= state->end - | ||
1338 | state->start + 1; | ||
1219 | } | 1339 | } |
1220 | if (BTRFS_I(inode)->delalloc_bytes == 0 && | 1340 | if (BTRFS_I(inode)->delalloc_bytes == 0 && |
1221 | !list_empty(&BTRFS_I(inode)->delalloc_inodes)) { | 1341 | !list_empty(&BTRFS_I(inode)->delalloc_inodes)) { |
@@ -2912,12 +3032,22 @@ static int btrfs_truncate_page(struct address_space *mapping, loff_t from) | |||
2912 | 3032 | ||
2913 | if ((offset & (blocksize - 1)) == 0) | 3033 | if ((offset & (blocksize - 1)) == 0) |
2914 | goto out; | 3034 | goto out; |
3035 | ret = btrfs_check_data_free_space(root, inode, PAGE_CACHE_SIZE); | ||
3036 | if (ret) | ||
3037 | goto out; | ||
3038 | |||
3039 | ret = btrfs_reserve_metadata_for_delalloc(root, inode, 1); | ||
3040 | if (ret) | ||
3041 | goto out; | ||
2915 | 3042 | ||
2916 | ret = -ENOMEM; | 3043 | ret = -ENOMEM; |
2917 | again: | 3044 | again: |
2918 | page = grab_cache_page(mapping, index); | 3045 | page = grab_cache_page(mapping, index); |
2919 | if (!page) | 3046 | if (!page) { |
3047 | btrfs_free_reserved_data_space(root, inode, PAGE_CACHE_SIZE); | ||
3048 | btrfs_unreserve_metadata_for_delalloc(root, inode, 1); | ||
2920 | goto out; | 3049 | goto out; |
3050 | } | ||
2921 | 3051 | ||
2922 | page_start = page_offset(page); | 3052 | page_start = page_offset(page); |
2923 | page_end = page_start + PAGE_CACHE_SIZE - 1; | 3053 | page_end = page_start + PAGE_CACHE_SIZE - 1; |
@@ -2950,7 +3080,16 @@ again: | |||
2950 | goto again; | 3080 | goto again; |
2951 | } | 3081 | } |
2952 | 3082 | ||
2953 | btrfs_set_extent_delalloc(inode, page_start, page_end); | 3083 | clear_extent_bits(&BTRFS_I(inode)->io_tree, page_start, page_end, |
3084 | EXTENT_DIRTY | EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING, | ||
3085 | GFP_NOFS); | ||
3086 | |||
3087 | ret = btrfs_set_extent_delalloc(inode, page_start, page_end); | ||
3088 | if (ret) { | ||
3089 | unlock_extent(io_tree, page_start, page_end, GFP_NOFS); | ||
3090 | goto out_unlock; | ||
3091 | } | ||
3092 | |||
2954 | ret = 0; | 3093 | ret = 0; |
2955 | if (offset != PAGE_CACHE_SIZE) { | 3094 | if (offset != PAGE_CACHE_SIZE) { |
2956 | kaddr = kmap(page); | 3095 | kaddr = kmap(page); |
@@ -2963,6 +3102,9 @@ again: | |||
2963 | unlock_extent(io_tree, page_start, page_end, GFP_NOFS); | 3102 | unlock_extent(io_tree, page_start, page_end, GFP_NOFS); |
2964 | 3103 | ||
2965 | out_unlock: | 3104 | out_unlock: |
3105 | if (ret) | ||
3106 | btrfs_free_reserved_data_space(root, inode, PAGE_CACHE_SIZE); | ||
3107 | btrfs_unreserve_metadata_for_delalloc(root, inode, 1); | ||
2966 | unlock_page(page); | 3108 | unlock_page(page); |
2967 | page_cache_release(page); | 3109 | page_cache_release(page); |
2968 | out: | 3110 | out: |
@@ -2981,17 +3123,15 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
2981 | u64 last_byte; | 3123 | u64 last_byte; |
2982 | u64 cur_offset; | 3124 | u64 cur_offset; |
2983 | u64 hole_size; | 3125 | u64 hole_size; |
2984 | int err; | 3126 | int err = 0; |
2985 | 3127 | ||
2986 | if (size <= hole_start) | 3128 | if (size <= hole_start) |
2987 | return 0; | 3129 | return 0; |
2988 | 3130 | ||
2989 | err = btrfs_check_metadata_free_space(root); | 3131 | err = btrfs_truncate_page(inode->i_mapping, inode->i_size); |
2990 | if (err) | 3132 | if (err) |
2991 | return err; | 3133 | return err; |
2992 | 3134 | ||
2993 | btrfs_truncate_page(inode->i_mapping, inode->i_size); | ||
2994 | |||
2995 | while (1) { | 3135 | while (1) { |
2996 | struct btrfs_ordered_extent *ordered; | 3136 | struct btrfs_ordered_extent *ordered; |
2997 | btrfs_wait_ordered_range(inode, hole_start, | 3137 | btrfs_wait_ordered_range(inode, hole_start, |
@@ -3024,12 +3164,18 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3024 | cur_offset, &hint_byte, 1); | 3164 | cur_offset, &hint_byte, 1); |
3025 | if (err) | 3165 | if (err) |
3026 | break; | 3166 | break; |
3167 | |||
3168 | err = btrfs_reserve_metadata_space(root, 1); | ||
3169 | if (err) | ||
3170 | break; | ||
3171 | |||
3027 | err = btrfs_insert_file_extent(trans, root, | 3172 | err = btrfs_insert_file_extent(trans, root, |
3028 | inode->i_ino, cur_offset, 0, | 3173 | inode->i_ino, cur_offset, 0, |
3029 | 0, hole_size, 0, hole_size, | 3174 | 0, hole_size, 0, hole_size, |
3030 | 0, 0, 0); | 3175 | 0, 0, 0); |
3031 | btrfs_drop_extent_cache(inode, hole_start, | 3176 | btrfs_drop_extent_cache(inode, hole_start, |
3032 | last_byte - 1, 0); | 3177 | last_byte - 1, 0); |
3178 | btrfs_unreserve_metadata_space(root, 1); | ||
3033 | } | 3179 | } |
3034 | free_extent_map(em); | 3180 | free_extent_map(em); |
3035 | cur_offset = last_byte; | 3181 | cur_offset = last_byte; |
@@ -3353,6 +3499,7 @@ static noinline void init_btrfs_i(struct inode *inode) | |||
3353 | bi->generation = 0; | 3499 | bi->generation = 0; |
3354 | bi->sequence = 0; | 3500 | bi->sequence = 0; |
3355 | bi->last_trans = 0; | 3501 | bi->last_trans = 0; |
3502 | bi->last_sub_trans = 0; | ||
3356 | bi->logged_trans = 0; | 3503 | bi->logged_trans = 0; |
3357 | bi->delalloc_bytes = 0; | 3504 | bi->delalloc_bytes = 0; |
3358 | bi->reserved_bytes = 0; | 3505 | bi->reserved_bytes = 0; |
@@ -3503,12 +3650,14 @@ static int btrfs_dentry_delete(struct dentry *dentry) | |||
3503 | { | 3650 | { |
3504 | struct btrfs_root *root; | 3651 | struct btrfs_root *root; |
3505 | 3652 | ||
3506 | if (!dentry->d_inode) | 3653 | if (!dentry->d_inode && !IS_ROOT(dentry)) |
3507 | return 0; | 3654 | dentry = dentry->d_parent; |
3508 | 3655 | ||
3509 | root = BTRFS_I(dentry->d_inode)->root; | 3656 | if (dentry->d_inode) { |
3510 | if (btrfs_root_refs(&root->root_item) == 0) | 3657 | root = BTRFS_I(dentry->d_inode)->root; |
3511 | return 1; | 3658 | if (btrfs_root_refs(&root->root_item) == 0) |
3659 | return 1; | ||
3660 | } | ||
3512 | return 0; | 3661 | return 0; |
3513 | } | 3662 | } |
3514 | 3663 | ||
@@ -3990,11 +4139,18 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
3990 | if (!new_valid_dev(rdev)) | 4139 | if (!new_valid_dev(rdev)) |
3991 | return -EINVAL; | 4140 | return -EINVAL; |
3992 | 4141 | ||
3993 | err = btrfs_check_metadata_free_space(root); | 4142 | /* |
4143 | * 2 for inode item and ref | ||
4144 | * 2 for dir items | ||
4145 | * 1 for xattr if selinux is on | ||
4146 | */ | ||
4147 | err = btrfs_reserve_metadata_space(root, 5); | ||
3994 | if (err) | 4148 | if (err) |
3995 | goto fail; | 4149 | return err; |
3996 | 4150 | ||
3997 | trans = btrfs_start_transaction(root, 1); | 4151 | trans = btrfs_start_transaction(root, 1); |
4152 | if (!trans) | ||
4153 | goto fail; | ||
3998 | btrfs_set_trans_block_group(trans, dir); | 4154 | btrfs_set_trans_block_group(trans, dir); |
3999 | 4155 | ||
4000 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); | 4156 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); |
@@ -4032,6 +4188,7 @@ out_unlock: | |||
4032 | nr = trans->blocks_used; | 4188 | nr = trans->blocks_used; |
4033 | btrfs_end_transaction_throttle(trans, root); | 4189 | btrfs_end_transaction_throttle(trans, root); |
4034 | fail: | 4190 | fail: |
4191 | btrfs_unreserve_metadata_space(root, 5); | ||
4035 | if (drop_inode) { | 4192 | if (drop_inode) { |
4036 | inode_dec_link_count(inode); | 4193 | inode_dec_link_count(inode); |
4037 | iput(inode); | 4194 | iput(inode); |
@@ -4052,10 +4209,18 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4052 | u64 objectid; | 4209 | u64 objectid; |
4053 | u64 index = 0; | 4210 | u64 index = 0; |
4054 | 4211 | ||
4055 | err = btrfs_check_metadata_free_space(root); | 4212 | /* |
4213 | * 2 for inode item and ref | ||
4214 | * 2 for dir items | ||
4215 | * 1 for xattr if selinux is on | ||
4216 | */ | ||
4217 | err = btrfs_reserve_metadata_space(root, 5); | ||
4056 | if (err) | 4218 | if (err) |
4057 | goto fail; | 4219 | return err; |
4220 | |||
4058 | trans = btrfs_start_transaction(root, 1); | 4221 | trans = btrfs_start_transaction(root, 1); |
4222 | if (!trans) | ||
4223 | goto fail; | ||
4059 | btrfs_set_trans_block_group(trans, dir); | 4224 | btrfs_set_trans_block_group(trans, dir); |
4060 | 4225 | ||
4061 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); | 4226 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); |
@@ -4096,6 +4261,7 @@ out_unlock: | |||
4096 | nr = trans->blocks_used; | 4261 | nr = trans->blocks_used; |
4097 | btrfs_end_transaction_throttle(trans, root); | 4262 | btrfs_end_transaction_throttle(trans, root); |
4098 | fail: | 4263 | fail: |
4264 | btrfs_unreserve_metadata_space(root, 5); | ||
4099 | if (drop_inode) { | 4265 | if (drop_inode) { |
4100 | inode_dec_link_count(inode); | 4266 | inode_dec_link_count(inode); |
4101 | iput(inode); | 4267 | iput(inode); |
@@ -4118,10 +4284,16 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
4118 | if (inode->i_nlink == 0) | 4284 | if (inode->i_nlink == 0) |
4119 | return -ENOENT; | 4285 | return -ENOENT; |
4120 | 4286 | ||
4121 | btrfs_inc_nlink(inode); | 4287 | /* |
4122 | err = btrfs_check_metadata_free_space(root); | 4288 | * 1 item for inode ref |
4289 | * 2 items for dir items | ||
4290 | */ | ||
4291 | err = btrfs_reserve_metadata_space(root, 3); | ||
4123 | if (err) | 4292 | if (err) |
4124 | goto fail; | 4293 | return err; |
4294 | |||
4295 | btrfs_inc_nlink(inode); | ||
4296 | |||
4125 | err = btrfs_set_inode_index(dir, &index); | 4297 | err = btrfs_set_inode_index(dir, &index); |
4126 | if (err) | 4298 | if (err) |
4127 | goto fail; | 4299 | goto fail; |
@@ -4145,6 +4317,7 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
4145 | nr = trans->blocks_used; | 4317 | nr = trans->blocks_used; |
4146 | btrfs_end_transaction_throttle(trans, root); | 4318 | btrfs_end_transaction_throttle(trans, root); |
4147 | fail: | 4319 | fail: |
4320 | btrfs_unreserve_metadata_space(root, 3); | ||
4148 | if (drop_inode) { | 4321 | if (drop_inode) { |
4149 | inode_dec_link_count(inode); | 4322 | inode_dec_link_count(inode); |
4150 | iput(inode); | 4323 | iput(inode); |
@@ -4164,17 +4337,21 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
4164 | u64 index = 0; | 4337 | u64 index = 0; |
4165 | unsigned long nr = 1; | 4338 | unsigned long nr = 1; |
4166 | 4339 | ||
4167 | err = btrfs_check_metadata_free_space(root); | 4340 | /* |
4341 | * 2 items for inode and ref | ||
4342 | * 2 items for dir items | ||
4343 | * 1 for xattr if selinux is on | ||
4344 | */ | ||
4345 | err = btrfs_reserve_metadata_space(root, 5); | ||
4168 | if (err) | 4346 | if (err) |
4169 | goto out_unlock; | 4347 | return err; |
4170 | 4348 | ||
4171 | trans = btrfs_start_transaction(root, 1); | 4349 | trans = btrfs_start_transaction(root, 1); |
4172 | btrfs_set_trans_block_group(trans, dir); | 4350 | if (!trans) { |
4173 | 4351 | err = -ENOMEM; | |
4174 | if (IS_ERR(trans)) { | ||
4175 | err = PTR_ERR(trans); | ||
4176 | goto out_unlock; | 4352 | goto out_unlock; |
4177 | } | 4353 | } |
4354 | btrfs_set_trans_block_group(trans, dir); | ||
4178 | 4355 | ||
4179 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); | 4356 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); |
4180 | if (err) { | 4357 | if (err) { |
@@ -4223,6 +4400,7 @@ out_fail: | |||
4223 | btrfs_end_transaction_throttle(trans, root); | 4400 | btrfs_end_transaction_throttle(trans, root); |
4224 | 4401 | ||
4225 | out_unlock: | 4402 | out_unlock: |
4403 | btrfs_unreserve_metadata_space(root, 5); | ||
4226 | if (drop_on_err) | 4404 | if (drop_on_err) |
4227 | iput(inode); | 4405 | iput(inode); |
4228 | btrfs_btree_balance_dirty(root, nr); | 4406 | btrfs_btree_balance_dirty(root, nr); |
@@ -4684,7 +4862,8 @@ static void btrfs_invalidatepage(struct page *page, unsigned long offset) | |||
4684 | */ | 4862 | */ |
4685 | clear_extent_bit(tree, page_start, page_end, | 4863 | clear_extent_bit(tree, page_start, page_end, |
4686 | EXTENT_DIRTY | EXTENT_DELALLOC | | 4864 | EXTENT_DIRTY | EXTENT_DELALLOC | |
4687 | EXTENT_LOCKED, 1, 0, NULL, GFP_NOFS); | 4865 | EXTENT_LOCKED | EXTENT_DO_ACCOUNTING, 1, 0, |
4866 | NULL, GFP_NOFS); | ||
4688 | /* | 4867 | /* |
4689 | * whoever cleared the private bit is responsible | 4868 | * whoever cleared the private bit is responsible |
4690 | * for the finish_ordered_io | 4869 | * for the finish_ordered_io |
@@ -4697,8 +4876,8 @@ static void btrfs_invalidatepage(struct page *page, unsigned long offset) | |||
4697 | lock_extent(tree, page_start, page_end, GFP_NOFS); | 4876 | lock_extent(tree, page_start, page_end, GFP_NOFS); |
4698 | } | 4877 | } |
4699 | clear_extent_bit(tree, page_start, page_end, | 4878 | clear_extent_bit(tree, page_start, page_end, |
4700 | EXTENT_LOCKED | EXTENT_DIRTY | EXTENT_DELALLOC, | 4879 | EXTENT_LOCKED | EXTENT_DIRTY | EXTENT_DELALLOC | |
4701 | 1, 1, NULL, GFP_NOFS); | 4880 | EXTENT_DO_ACCOUNTING, 1, 1, NULL, GFP_NOFS); |
4702 | __btrfs_releasepage(page, GFP_NOFS); | 4881 | __btrfs_releasepage(page, GFP_NOFS); |
4703 | 4882 | ||
4704 | ClearPageChecked(page); | 4883 | ClearPageChecked(page); |
@@ -4747,6 +4926,13 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
4747 | goto out; | 4926 | goto out; |
4748 | } | 4927 | } |
4749 | 4928 | ||
4929 | ret = btrfs_reserve_metadata_for_delalloc(root, inode, 1); | ||
4930 | if (ret) { | ||
4931 | btrfs_free_reserved_data_space(root, inode, PAGE_CACHE_SIZE); | ||
4932 | ret = VM_FAULT_SIGBUS; | ||
4933 | goto out; | ||
4934 | } | ||
4935 | |||
4750 | ret = VM_FAULT_NOPAGE; /* make the VM retry the fault */ | 4936 | ret = VM_FAULT_NOPAGE; /* make the VM retry the fault */ |
4751 | again: | 4937 | again: |
4752 | lock_page(page); | 4938 | lock_page(page); |
@@ -4778,7 +4964,24 @@ again: | |||
4778 | goto again; | 4964 | goto again; |
4779 | } | 4965 | } |
4780 | 4966 | ||
4781 | btrfs_set_extent_delalloc(inode, page_start, page_end); | 4967 | /* |
4968 | * XXX - page_mkwrite gets called every time the page is dirtied, even | ||
4969 | * if it was already dirty, so for space accounting reasons we need to | ||
4970 | * clear any delalloc bits for the range we are fixing to save. There | ||
4971 | * is probably a better way to do this, but for now keep consistent with | ||
4972 | * prepare_pages in the normal write path. | ||
4973 | */ | ||
4974 | clear_extent_bits(&BTRFS_I(inode)->io_tree, page_start, page_end, | ||
4975 | EXTENT_DIRTY | EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING, | ||
4976 | GFP_NOFS); | ||
4977 | |||
4978 | ret = btrfs_set_extent_delalloc(inode, page_start, page_end); | ||
4979 | if (ret) { | ||
4980 | unlock_extent(io_tree, page_start, page_end, GFP_NOFS); | ||
4981 | ret = VM_FAULT_SIGBUS; | ||
4982 | btrfs_free_reserved_data_space(root, inode, PAGE_CACHE_SIZE); | ||
4983 | goto out_unlock; | ||
4984 | } | ||
4782 | ret = 0; | 4985 | ret = 0; |
4783 | 4986 | ||
4784 | /* page is wholly or partially inside EOF */ | 4987 | /* page is wholly or partially inside EOF */ |
@@ -4797,10 +5000,13 @@ again: | |||
4797 | set_page_dirty(page); | 5000 | set_page_dirty(page); |
4798 | SetPageUptodate(page); | 5001 | SetPageUptodate(page); |
4799 | 5002 | ||
4800 | BTRFS_I(inode)->last_trans = root->fs_info->generation + 1; | 5003 | BTRFS_I(inode)->last_trans = root->fs_info->generation; |
5004 | BTRFS_I(inode)->last_sub_trans = BTRFS_I(inode)->root->log_transid; | ||
5005 | |||
4801 | unlock_extent(io_tree, page_start, page_end, GFP_NOFS); | 5006 | unlock_extent(io_tree, page_start, page_end, GFP_NOFS); |
4802 | 5007 | ||
4803 | out_unlock: | 5008 | out_unlock: |
5009 | btrfs_unreserve_metadata_for_delalloc(root, inode, 1); | ||
4804 | if (!ret) | 5010 | if (!ret) |
4805 | return VM_FAULT_LOCKED; | 5011 | return VM_FAULT_LOCKED; |
4806 | unlock_page(page); | 5012 | unlock_page(page); |
@@ -4821,7 +5027,9 @@ static void btrfs_truncate(struct inode *inode) | |||
4821 | if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) | 5027 | if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) |
4822 | return; | 5028 | return; |
4823 | 5029 | ||
4824 | btrfs_truncate_page(inode->i_mapping, inode->i_size); | 5030 | ret = btrfs_truncate_page(inode->i_mapping, inode->i_size); |
5031 | if (ret) | ||
5032 | return; | ||
4825 | btrfs_wait_ordered_range(inode, inode->i_size & (~mask), (u64)-1); | 5033 | btrfs_wait_ordered_range(inode, inode->i_size & (~mask), (u64)-1); |
4826 | 5034 | ||
4827 | trans = btrfs_start_transaction(root, 1); | 5035 | trans = btrfs_start_transaction(root, 1); |
@@ -4916,7 +5124,11 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) | |||
4916 | if (!ei) | 5124 | if (!ei) |
4917 | return NULL; | 5125 | return NULL; |
4918 | ei->last_trans = 0; | 5126 | ei->last_trans = 0; |
5127 | ei->last_sub_trans = 0; | ||
4919 | ei->logged_trans = 0; | 5128 | ei->logged_trans = 0; |
5129 | ei->outstanding_extents = 0; | ||
5130 | ei->reserved_extents = 0; | ||
5131 | spin_lock_init(&ei->accounting_lock); | ||
4920 | btrfs_ordered_inode_tree_init(&ei->ordered_tree); | 5132 | btrfs_ordered_inode_tree_init(&ei->ordered_tree); |
4921 | INIT_LIST_HEAD(&ei->i_orphan); | 5133 | INIT_LIST_HEAD(&ei->i_orphan); |
4922 | INIT_LIST_HEAD(&ei->ordered_operations); | 5134 | INIT_LIST_HEAD(&ei->ordered_operations); |
@@ -5070,7 +5282,12 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
5070 | new_inode->i_size > BTRFS_EMPTY_DIR_SIZE) | 5282 | new_inode->i_size > BTRFS_EMPTY_DIR_SIZE) |
5071 | return -ENOTEMPTY; | 5283 | return -ENOTEMPTY; |
5072 | 5284 | ||
5073 | ret = btrfs_check_metadata_free_space(root); | 5285 | /* |
5286 | * 2 items for dir items | ||
5287 | * 1 item for orphan entry | ||
5288 | * 1 item for ref | ||
5289 | */ | ||
5290 | ret = btrfs_reserve_metadata_space(root, 4); | ||
5074 | if (ret) | 5291 | if (ret) |
5075 | return ret; | 5292 | return ret; |
5076 | 5293 | ||
@@ -5185,6 +5402,8 @@ out_fail: | |||
5185 | 5402 | ||
5186 | if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) | 5403 | if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) |
5187 | up_read(&root->fs_info->subvol_sem); | 5404 | up_read(&root->fs_info->subvol_sem); |
5405 | |||
5406 | btrfs_unreserve_metadata_space(root, 4); | ||
5188 | return ret; | 5407 | return ret; |
5189 | } | 5408 | } |
5190 | 5409 | ||
@@ -5256,11 +5475,18 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
5256 | if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(root)) | 5475 | if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(root)) |
5257 | return -ENAMETOOLONG; | 5476 | return -ENAMETOOLONG; |
5258 | 5477 | ||
5259 | err = btrfs_check_metadata_free_space(root); | 5478 | /* |
5479 | * 2 items for inode item and ref | ||
5480 | * 2 items for dir items | ||
5481 | * 1 item for xattr if selinux is on | ||
5482 | */ | ||
5483 | err = btrfs_reserve_metadata_space(root, 5); | ||
5260 | if (err) | 5484 | if (err) |
5261 | goto out_fail; | 5485 | return err; |
5262 | 5486 | ||
5263 | trans = btrfs_start_transaction(root, 1); | 5487 | trans = btrfs_start_transaction(root, 1); |
5488 | if (!trans) | ||
5489 | goto out_fail; | ||
5264 | btrfs_set_trans_block_group(trans, dir); | 5490 | btrfs_set_trans_block_group(trans, dir); |
5265 | 5491 | ||
5266 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); | 5492 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); |
@@ -5341,6 +5567,7 @@ out_unlock: | |||
5341 | nr = trans->blocks_used; | 5567 | nr = trans->blocks_used; |
5342 | btrfs_end_transaction_throttle(trans, root); | 5568 | btrfs_end_transaction_throttle(trans, root); |
5343 | out_fail: | 5569 | out_fail: |
5570 | btrfs_unreserve_metadata_space(root, 5); | ||
5344 | if (drop_inode) { | 5571 | if (drop_inode) { |
5345 | inode_dec_link_count(inode); | 5572 | inode_dec_link_count(inode); |
5346 | iput(inode); | 5573 | iput(inode); |
@@ -5362,6 +5589,11 @@ static int prealloc_file_range(struct btrfs_trans_handle *trans, | |||
5362 | 5589 | ||
5363 | while (num_bytes > 0) { | 5590 | while (num_bytes > 0) { |
5364 | alloc_size = min(num_bytes, root->fs_info->max_extent); | 5591 | alloc_size = min(num_bytes, root->fs_info->max_extent); |
5592 | |||
5593 | ret = btrfs_reserve_metadata_space(root, 1); | ||
5594 | if (ret) | ||
5595 | goto out; | ||
5596 | |||
5365 | ret = btrfs_reserve_extent(trans, root, alloc_size, | 5597 | ret = btrfs_reserve_extent(trans, root, alloc_size, |
5366 | root->sectorsize, 0, alloc_hint, | 5598 | root->sectorsize, 0, alloc_hint, |
5367 | (u64)-1, &ins, 1); | 5599 | (u64)-1, &ins, 1); |
@@ -5381,6 +5613,7 @@ static int prealloc_file_range(struct btrfs_trans_handle *trans, | |||
5381 | num_bytes -= ins.offset; | 5613 | num_bytes -= ins.offset; |
5382 | cur_offset += ins.offset; | 5614 | cur_offset += ins.offset; |
5383 | alloc_hint = ins.objectid + ins.offset; | 5615 | alloc_hint = ins.objectid + ins.offset; |
5616 | btrfs_unreserve_metadata_space(root, 1); | ||
5384 | } | 5617 | } |
5385 | out: | 5618 | out: |
5386 | if (cur_offset > start) { | 5619 | if (cur_offset > start) { |
@@ -5544,7 +5777,7 @@ static const struct inode_operations btrfs_dir_ro_inode_operations = { | |||
5544 | .permission = btrfs_permission, | 5777 | .permission = btrfs_permission, |
5545 | }; | 5778 | }; |
5546 | 5779 | ||
5547 | static struct file_operations btrfs_dir_file_operations = { | 5780 | static const struct file_operations btrfs_dir_file_operations = { |
5548 | .llseek = generic_file_llseek, | 5781 | .llseek = generic_file_llseek, |
5549 | .read = generic_read_dir, | 5782 | .read = generic_read_dir, |
5550 | .readdir = btrfs_real_readdir, | 5783 | .readdir = btrfs_real_readdir, |
@@ -5566,6 +5799,8 @@ static struct extent_io_ops btrfs_extent_io_ops = { | |||
5566 | .readpage_io_failed_hook = btrfs_io_failed_hook, | 5799 | .readpage_io_failed_hook = btrfs_io_failed_hook, |
5567 | .set_bit_hook = btrfs_set_bit_hook, | 5800 | .set_bit_hook = btrfs_set_bit_hook, |
5568 | .clear_bit_hook = btrfs_clear_bit_hook, | 5801 | .clear_bit_hook = btrfs_clear_bit_hook, |
5802 | .merge_extent_hook = btrfs_merge_extent_hook, | ||
5803 | .split_extent_hook = btrfs_split_extent_hook, | ||
5569 | }; | 5804 | }; |
5570 | 5805 | ||
5571 | /* | 5806 | /* |
@@ -5632,6 +5867,6 @@ static const struct inode_operations btrfs_symlink_inode_operations = { | |||
5632 | .removexattr = btrfs_removexattr, | 5867 | .removexattr = btrfs_removexattr, |
5633 | }; | 5868 | }; |
5634 | 5869 | ||
5635 | struct dentry_operations btrfs_dentry_operations = { | 5870 | const struct dentry_operations btrfs_dentry_operations = { |
5636 | .d_delete = btrfs_dentry_delete, | 5871 | .d_delete = btrfs_dentry_delete, |
5637 | }; | 5872 | }; |