diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /fs/btrfs/inode.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 2207 |
1 files changed, 1309 insertions, 898 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index c03864406af3..3601f0aebddf 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <linux/posix_acl.h> | 37 | #include <linux/posix_acl.h> |
38 | #include <linux/falloc.h> | 38 | #include <linux/falloc.h> |
39 | #include <linux/slab.h> | 39 | #include <linux/slab.h> |
40 | #include <linux/ratelimit.h> | ||
40 | #include "compat.h" | 41 | #include "compat.h" |
41 | #include "ctree.h" | 42 | #include "ctree.h" |
42 | #include "disk-io.h" | 43 | #include "disk-io.h" |
@@ -50,6 +51,8 @@ | |||
50 | #include "tree-log.h" | 51 | #include "tree-log.h" |
51 | #include "compression.h" | 52 | #include "compression.h" |
52 | #include "locking.h" | 53 | #include "locking.h" |
54 | #include "free-space-cache.h" | ||
55 | #include "inode-map.h" | ||
53 | 56 | ||
54 | struct btrfs_iget_args { | 57 | struct btrfs_iget_args { |
55 | u64 ino; | 58 | u64 ino; |
@@ -70,6 +73,7 @@ static struct kmem_cache *btrfs_inode_cachep; | |||
70 | struct kmem_cache *btrfs_trans_handle_cachep; | 73 | struct kmem_cache *btrfs_trans_handle_cachep; |
71 | struct kmem_cache *btrfs_transaction_cachep; | 74 | struct kmem_cache *btrfs_transaction_cachep; |
72 | struct kmem_cache *btrfs_path_cachep; | 75 | struct kmem_cache *btrfs_path_cachep; |
76 | struct kmem_cache *btrfs_free_space_cachep; | ||
73 | 77 | ||
74 | #define S_SHIFT 12 | 78 | #define S_SHIFT 12 |
75 | static unsigned char btrfs_type_by_mode[S_IFMT >> S_SHIFT] = { | 79 | static unsigned char btrfs_type_by_mode[S_IFMT >> S_SHIFT] = { |
@@ -82,7 +86,8 @@ static unsigned char btrfs_type_by_mode[S_IFMT >> S_SHIFT] = { | |||
82 | [S_IFLNK >> S_SHIFT] = BTRFS_FT_SYMLINK, | 86 | [S_IFLNK >> S_SHIFT] = BTRFS_FT_SYMLINK, |
83 | }; | 87 | }; |
84 | 88 | ||
85 | static void btrfs_truncate(struct inode *inode); | 89 | static int btrfs_setsize(struct inode *inode, loff_t newsize); |
90 | static int btrfs_truncate(struct inode *inode); | ||
86 | static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end); | 91 | static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end); |
87 | static noinline int cow_file_range(struct inode *inode, | 92 | static noinline int cow_file_range(struct inode *inode, |
88 | struct page *locked_page, | 93 | struct page *locked_page, |
@@ -90,13 +95,14 @@ static noinline int cow_file_range(struct inode *inode, | |||
90 | unsigned long *nr_written, int unlock); | 95 | unsigned long *nr_written, int unlock); |
91 | 96 | ||
92 | static int btrfs_init_inode_security(struct btrfs_trans_handle *trans, | 97 | static int btrfs_init_inode_security(struct btrfs_trans_handle *trans, |
93 | struct inode *inode, struct inode *dir) | 98 | struct inode *inode, struct inode *dir, |
99 | const struct qstr *qstr) | ||
94 | { | 100 | { |
95 | int err; | 101 | int err; |
96 | 102 | ||
97 | err = btrfs_init_acl(trans, inode, dir); | 103 | err = btrfs_init_acl(trans, inode, dir); |
98 | if (!err) | 104 | if (!err) |
99 | err = btrfs_xattr_security_init(trans, inode, dir); | 105 | err = btrfs_xattr_security_init(trans, inode, dir, qstr); |
100 | return err; | 106 | return err; |
101 | } | 107 | } |
102 | 108 | ||
@@ -108,6 +114,7 @@ static int btrfs_init_inode_security(struct btrfs_trans_handle *trans, | |||
108 | static noinline int insert_inline_extent(struct btrfs_trans_handle *trans, | 114 | static noinline int insert_inline_extent(struct btrfs_trans_handle *trans, |
109 | struct btrfs_root *root, struct inode *inode, | 115 | struct btrfs_root *root, struct inode *inode, |
110 | u64 start, size_t size, size_t compressed_size, | 116 | u64 start, size_t size, size_t compressed_size, |
117 | int compress_type, | ||
111 | struct page **compressed_pages) | 118 | struct page **compressed_pages) |
112 | { | 119 | { |
113 | struct btrfs_key key; | 120 | struct btrfs_key key; |
@@ -122,21 +129,17 @@ static noinline int insert_inline_extent(struct btrfs_trans_handle *trans, | |||
122 | size_t cur_size = size; | 129 | size_t cur_size = size; |
123 | size_t datasize; | 130 | size_t datasize; |
124 | unsigned long offset; | 131 | unsigned long offset; |
125 | int use_compress = 0; | ||
126 | 132 | ||
127 | if (compressed_size && compressed_pages) { | 133 | if (compressed_size && compressed_pages) |
128 | use_compress = 1; | ||
129 | cur_size = compressed_size; | 134 | cur_size = compressed_size; |
130 | } | ||
131 | 135 | ||
132 | path = btrfs_alloc_path(); | 136 | path = btrfs_alloc_path(); |
133 | if (!path) | 137 | if (!path) |
134 | return -ENOMEM; | 138 | return -ENOMEM; |
135 | 139 | ||
136 | path->leave_spinning = 1; | 140 | path->leave_spinning = 1; |
137 | btrfs_set_trans_block_group(trans, inode); | ||
138 | 141 | ||
139 | key.objectid = inode->i_ino; | 142 | key.objectid = btrfs_ino(inode); |
140 | key.offset = start; | 143 | key.offset = start; |
141 | btrfs_set_key_type(&key, BTRFS_EXTENT_DATA_KEY); | 144 | btrfs_set_key_type(&key, BTRFS_EXTENT_DATA_KEY); |
142 | datasize = btrfs_file_extent_calc_inline_size(cur_size); | 145 | datasize = btrfs_file_extent_calc_inline_size(cur_size); |
@@ -159,7 +162,7 @@ static noinline int insert_inline_extent(struct btrfs_trans_handle *trans, | |||
159 | btrfs_set_file_extent_ram_bytes(leaf, ei, size); | 162 | btrfs_set_file_extent_ram_bytes(leaf, ei, size); |
160 | ptr = btrfs_file_extent_inline_start(ei); | 163 | ptr = btrfs_file_extent_inline_start(ei); |
161 | 164 | ||
162 | if (use_compress) { | 165 | if (compress_type != BTRFS_COMPRESS_NONE) { |
163 | struct page *cpage; | 166 | struct page *cpage; |
164 | int i = 0; | 167 | int i = 0; |
165 | while (compressed_size > 0) { | 168 | while (compressed_size > 0) { |
@@ -176,7 +179,7 @@ static noinline int insert_inline_extent(struct btrfs_trans_handle *trans, | |||
176 | compressed_size -= cur_size; | 179 | compressed_size -= cur_size; |
177 | } | 180 | } |
178 | btrfs_set_file_extent_compression(leaf, ei, | 181 | btrfs_set_file_extent_compression(leaf, ei, |
179 | BTRFS_COMPRESS_ZLIB); | 182 | compress_type); |
180 | } else { | 183 | } else { |
181 | page = find_get_page(inode->i_mapping, | 184 | page = find_get_page(inode->i_mapping, |
182 | start >> PAGE_CACHE_SHIFT); | 185 | start >> PAGE_CACHE_SHIFT); |
@@ -217,7 +220,7 @@ fail: | |||
217 | static noinline int cow_file_range_inline(struct btrfs_trans_handle *trans, | 220 | static noinline int cow_file_range_inline(struct btrfs_trans_handle *trans, |
218 | struct btrfs_root *root, | 221 | struct btrfs_root *root, |
219 | struct inode *inode, u64 start, u64 end, | 222 | struct inode *inode, u64 start, u64 end, |
220 | size_t compressed_size, | 223 | size_t compressed_size, int compress_type, |
221 | struct page **compressed_pages) | 224 | struct page **compressed_pages) |
222 | { | 225 | { |
223 | u64 isize = i_size_read(inode); | 226 | u64 isize = i_size_read(inode); |
@@ -250,7 +253,7 @@ static noinline int cow_file_range_inline(struct btrfs_trans_handle *trans, | |||
250 | inline_len = min_t(u64, isize, actual_end); | 253 | inline_len = min_t(u64, isize, actual_end); |
251 | ret = insert_inline_extent(trans, root, inode, start, | 254 | ret = insert_inline_extent(trans, root, inode, start, |
252 | inline_len, compressed_size, | 255 | inline_len, compressed_size, |
253 | compressed_pages); | 256 | compress_type, compressed_pages); |
254 | BUG_ON(ret); | 257 | BUG_ON(ret); |
255 | btrfs_delalloc_release_metadata(inode, end + 1 - start); | 258 | btrfs_delalloc_release_metadata(inode, end + 1 - start); |
256 | btrfs_drop_extent_cache(inode, start, aligned_end - 1, 0); | 259 | btrfs_drop_extent_cache(inode, start, aligned_end - 1, 0); |
@@ -263,6 +266,7 @@ struct async_extent { | |||
263 | u64 compressed_size; | 266 | u64 compressed_size; |
264 | struct page **pages; | 267 | struct page **pages; |
265 | unsigned long nr_pages; | 268 | unsigned long nr_pages; |
269 | int compress_type; | ||
266 | struct list_head list; | 270 | struct list_head list; |
267 | }; | 271 | }; |
268 | 272 | ||
@@ -280,16 +284,19 @@ static noinline int add_async_extent(struct async_cow *cow, | |||
280 | u64 start, u64 ram_size, | 284 | u64 start, u64 ram_size, |
281 | u64 compressed_size, | 285 | u64 compressed_size, |
282 | struct page **pages, | 286 | struct page **pages, |
283 | unsigned long nr_pages) | 287 | unsigned long nr_pages, |
288 | int compress_type) | ||
284 | { | 289 | { |
285 | struct async_extent *async_extent; | 290 | struct async_extent *async_extent; |
286 | 291 | ||
287 | async_extent = kmalloc(sizeof(*async_extent), GFP_NOFS); | 292 | async_extent = kmalloc(sizeof(*async_extent), GFP_NOFS); |
293 | BUG_ON(!async_extent); | ||
288 | async_extent->start = start; | 294 | async_extent->start = start; |
289 | async_extent->ram_size = ram_size; | 295 | async_extent->ram_size = ram_size; |
290 | async_extent->compressed_size = compressed_size; | 296 | async_extent->compressed_size = compressed_size; |
291 | async_extent->pages = pages; | 297 | async_extent->pages = pages; |
292 | async_extent->nr_pages = nr_pages; | 298 | async_extent->nr_pages = nr_pages; |
299 | async_extent->compress_type = compress_type; | ||
293 | list_add_tail(&async_extent->list, &cow->extents); | 300 | list_add_tail(&async_extent->list, &cow->extents); |
294 | return 0; | 301 | return 0; |
295 | } | 302 | } |
@@ -319,8 +326,6 @@ static noinline int compress_file_range(struct inode *inode, | |||
319 | struct btrfs_root *root = BTRFS_I(inode)->root; | 326 | struct btrfs_root *root = BTRFS_I(inode)->root; |
320 | struct btrfs_trans_handle *trans; | 327 | struct btrfs_trans_handle *trans; |
321 | u64 num_bytes; | 328 | u64 num_bytes; |
322 | u64 orig_start; | ||
323 | u64 disk_num_bytes; | ||
324 | u64 blocksize = root->sectorsize; | 329 | u64 blocksize = root->sectorsize; |
325 | u64 actual_end; | 330 | u64 actual_end; |
326 | u64 isize = i_size_read(inode); | 331 | u64 isize = i_size_read(inode); |
@@ -334,8 +339,11 @@ static noinline int compress_file_range(struct inode *inode, | |||
334 | unsigned long max_uncompressed = 128 * 1024; | 339 | unsigned long max_uncompressed = 128 * 1024; |
335 | int i; | 340 | int i; |
336 | int will_compress; | 341 | int will_compress; |
342 | int compress_type = root->fs_info->compress_type; | ||
337 | 343 | ||
338 | orig_start = start; | 344 | /* if this is a small write inside eof, kick off a defragbot */ |
345 | if (end <= BTRFS_I(inode)->disk_i_size && (end - start + 1) < 16 * 1024) | ||
346 | btrfs_add_inode_defrag(NULL, inode); | ||
339 | 347 | ||
340 | actual_end = min_t(u64, isize, end + 1); | 348 | actual_end = min_t(u64, isize, end + 1); |
341 | again: | 349 | again: |
@@ -371,7 +379,6 @@ again: | |||
371 | total_compressed = min(total_compressed, max_uncompressed); | 379 | total_compressed = min(total_compressed, max_uncompressed); |
372 | num_bytes = (end - start + blocksize) & ~(blocksize - 1); | 380 | num_bytes = (end - start + blocksize) & ~(blocksize - 1); |
373 | num_bytes = max(blocksize, num_bytes); | 381 | num_bytes = max(blocksize, num_bytes); |
374 | disk_num_bytes = num_bytes; | ||
375 | total_in = 0; | 382 | total_in = 0; |
376 | ret = 0; | 383 | ret = 0; |
377 | 384 | ||
@@ -382,16 +389,22 @@ again: | |||
382 | */ | 389 | */ |
383 | if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NOCOMPRESS) && | 390 | if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NOCOMPRESS) && |
384 | (btrfs_test_opt(root, COMPRESS) || | 391 | (btrfs_test_opt(root, COMPRESS) || |
385 | (BTRFS_I(inode)->force_compress))) { | 392 | (BTRFS_I(inode)->force_compress) || |
393 | (BTRFS_I(inode)->flags & BTRFS_INODE_COMPRESS))) { | ||
386 | WARN_ON(pages); | 394 | WARN_ON(pages); |
387 | pages = kzalloc(sizeof(struct page *) * nr_pages, GFP_NOFS); | 395 | pages = kzalloc(sizeof(struct page *) * nr_pages, GFP_NOFS); |
396 | BUG_ON(!pages); | ||
397 | |||
398 | if (BTRFS_I(inode)->force_compress) | ||
399 | compress_type = BTRFS_I(inode)->force_compress; | ||
388 | 400 | ||
389 | ret = btrfs_zlib_compress_pages(inode->i_mapping, start, | 401 | ret = btrfs_compress_pages(compress_type, |
390 | total_compressed, pages, | 402 | inode->i_mapping, start, |
391 | nr_pages, &nr_pages_ret, | 403 | total_compressed, pages, |
392 | &total_in, | 404 | nr_pages, &nr_pages_ret, |
393 | &total_compressed, | 405 | &total_in, |
394 | max_compressed); | 406 | &total_compressed, |
407 | max_compressed); | ||
395 | 408 | ||
396 | if (!ret) { | 409 | if (!ret) { |
397 | unsigned long offset = total_compressed & | 410 | unsigned long offset = total_compressed & |
@@ -412,9 +425,8 @@ again: | |||
412 | } | 425 | } |
413 | } | 426 | } |
414 | if (start == 0) { | 427 | if (start == 0) { |
415 | trans = btrfs_join_transaction(root, 1); | 428 | trans = btrfs_join_transaction(root); |
416 | BUG_ON(!trans); | 429 | BUG_ON(IS_ERR(trans)); |
417 | btrfs_set_trans_block_group(trans, inode); | ||
418 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 430 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
419 | 431 | ||
420 | /* lets try to make an inline extent */ | 432 | /* lets try to make an inline extent */ |
@@ -423,12 +435,13 @@ again: | |||
423 | * to make an uncompressed inline extent. | 435 | * to make an uncompressed inline extent. |
424 | */ | 436 | */ |
425 | ret = cow_file_range_inline(trans, root, inode, | 437 | ret = cow_file_range_inline(trans, root, inode, |
426 | start, end, 0, NULL); | 438 | start, end, 0, 0, NULL); |
427 | } else { | 439 | } else { |
428 | /* try making a compressed inline extent */ | 440 | /* try making a compressed inline extent */ |
429 | ret = cow_file_range_inline(trans, root, inode, | 441 | ret = cow_file_range_inline(trans, root, inode, |
430 | start, end, | 442 | start, end, |
431 | total_compressed, pages); | 443 | total_compressed, |
444 | compress_type, pages); | ||
432 | } | 445 | } |
433 | if (ret == 0) { | 446 | if (ret == 0) { |
434 | /* | 447 | /* |
@@ -467,7 +480,6 @@ again: | |||
467 | if (total_compressed >= total_in) { | 480 | if (total_compressed >= total_in) { |
468 | will_compress = 0; | 481 | will_compress = 0; |
469 | } else { | 482 | } else { |
470 | disk_num_bytes = total_compressed; | ||
471 | num_bytes = total_in; | 483 | num_bytes = total_in; |
472 | } | 484 | } |
473 | } | 485 | } |
@@ -499,9 +511,10 @@ again: | |||
499 | * and will submit them to the elevator. | 511 | * and will submit them to the elevator. |
500 | */ | 512 | */ |
501 | add_async_extent(async_cow, start, num_bytes, | 513 | add_async_extent(async_cow, start, num_bytes, |
502 | total_compressed, pages, nr_pages_ret); | 514 | total_compressed, pages, nr_pages_ret, |
515 | compress_type); | ||
503 | 516 | ||
504 | if (start + num_bytes < end && start + num_bytes < actual_end) { | 517 | if (start + num_bytes < end) { |
505 | start += num_bytes; | 518 | start += num_bytes; |
506 | pages = NULL; | 519 | pages = NULL; |
507 | cond_resched(); | 520 | cond_resched(); |
@@ -521,7 +534,8 @@ cleanup_and_bail_uncompressed: | |||
521 | __set_page_dirty_nobuffers(locked_page); | 534 | __set_page_dirty_nobuffers(locked_page); |
522 | /* unlocked later on in the async handlers */ | 535 | /* unlocked later on in the async handlers */ |
523 | } | 536 | } |
524 | add_async_extent(async_cow, start, end - start + 1, 0, NULL, 0); | 537 | add_async_extent(async_cow, start, end - start + 1, |
538 | 0, NULL, 0, BTRFS_COMPRESS_NONE); | ||
525 | *num_added += 1; | 539 | *num_added += 1; |
526 | } | 540 | } |
527 | 541 | ||
@@ -607,7 +621,9 @@ retry: | |||
607 | async_extent->start + async_extent->ram_size - 1, | 621 | async_extent->start + async_extent->ram_size - 1, |
608 | GFP_NOFS); | 622 | GFP_NOFS); |
609 | 623 | ||
610 | trans = btrfs_join_transaction(root, 1); | 624 | trans = btrfs_join_transaction(root); |
625 | BUG_ON(IS_ERR(trans)); | ||
626 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | ||
611 | ret = btrfs_reserve_extent(trans, root, | 627 | ret = btrfs_reserve_extent(trans, root, |
612 | async_extent->compressed_size, | 628 | async_extent->compressed_size, |
613 | async_extent->compressed_size, | 629 | async_extent->compressed_size, |
@@ -638,7 +654,8 @@ retry: | |||
638 | async_extent->start + | 654 | async_extent->start + |
639 | async_extent->ram_size - 1, 0); | 655 | async_extent->ram_size - 1, 0); |
640 | 656 | ||
641 | em = alloc_extent_map(GFP_NOFS); | 657 | em = alloc_extent_map(); |
658 | BUG_ON(!em); | ||
642 | em->start = async_extent->start; | 659 | em->start = async_extent->start; |
643 | em->len = async_extent->ram_size; | 660 | em->len = async_extent->ram_size; |
644 | em->orig_start = em->start; | 661 | em->orig_start = em->start; |
@@ -646,6 +663,7 @@ retry: | |||
646 | em->block_start = ins.objectid; | 663 | em->block_start = ins.objectid; |
647 | em->block_len = ins.offset; | 664 | em->block_len = ins.offset; |
648 | em->bdev = root->fs_info->fs_devices->latest_bdev; | 665 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
666 | em->compress_type = async_extent->compress_type; | ||
649 | set_bit(EXTENT_FLAG_PINNED, &em->flags); | 667 | set_bit(EXTENT_FLAG_PINNED, &em->flags); |
650 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); | 668 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); |
651 | 669 | ||
@@ -662,11 +680,13 @@ retry: | |||
662 | async_extent->ram_size - 1, 0); | 680 | async_extent->ram_size - 1, 0); |
663 | } | 681 | } |
664 | 682 | ||
665 | ret = btrfs_add_ordered_extent(inode, async_extent->start, | 683 | ret = btrfs_add_ordered_extent_compress(inode, |
666 | ins.objectid, | 684 | async_extent->start, |
667 | async_extent->ram_size, | 685 | ins.objectid, |
668 | ins.offset, | 686 | async_extent->ram_size, |
669 | BTRFS_ORDERED_COMPRESSED); | 687 | ins.offset, |
688 | BTRFS_ORDERED_COMPRESSED, | ||
689 | async_extent->compress_type); | ||
670 | BUG_ON(ret); | 690 | BUG_ON(ret); |
671 | 691 | ||
672 | /* | 692 | /* |
@@ -730,6 +750,15 @@ static u64 get_extent_allocation_hint(struct inode *inode, u64 start, | |||
730 | return alloc_hint; | 750 | return alloc_hint; |
731 | } | 751 | } |
732 | 752 | ||
753 | static inline bool is_free_space_inode(struct btrfs_root *root, | ||
754 | struct inode *inode) | ||
755 | { | ||
756 | if (root == root->fs_info->tree_root || | ||
757 | BTRFS_I(inode)->location.objectid == BTRFS_FREE_INO_OBJECTID) | ||
758 | return true; | ||
759 | return false; | ||
760 | } | ||
761 | |||
733 | /* | 762 | /* |
734 | * when extent_io.c finds a delayed allocation range in the file, | 763 | * when extent_io.c finds a delayed allocation range in the file, |
735 | * the call backs end up in this code. The basic idea is to | 764 | * the call backs end up in this code. The basic idea is to |
@@ -757,29 +786,29 @@ static noinline int cow_file_range(struct inode *inode, | |||
757 | u64 disk_num_bytes; | 786 | u64 disk_num_bytes; |
758 | u64 cur_alloc_size; | 787 | u64 cur_alloc_size; |
759 | u64 blocksize = root->sectorsize; | 788 | u64 blocksize = root->sectorsize; |
760 | u64 actual_end; | ||
761 | u64 isize = i_size_read(inode); | ||
762 | struct btrfs_key ins; | 789 | struct btrfs_key ins; |
763 | struct extent_map *em; | 790 | struct extent_map *em; |
764 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; | 791 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; |
765 | int ret = 0; | 792 | int ret = 0; |
766 | 793 | ||
767 | trans = btrfs_join_transaction(root, 1); | 794 | BUG_ON(is_free_space_inode(root, inode)); |
768 | BUG_ON(!trans); | 795 | trans = btrfs_join_transaction(root); |
769 | btrfs_set_trans_block_group(trans, inode); | 796 | BUG_ON(IS_ERR(trans)); |
770 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 797 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
771 | 798 | ||
772 | actual_end = min_t(u64, isize, end + 1); | ||
773 | |||
774 | num_bytes = (end - start + blocksize) & ~(blocksize - 1); | 799 | num_bytes = (end - start + blocksize) & ~(blocksize - 1); |
775 | num_bytes = max(blocksize, num_bytes); | 800 | num_bytes = max(blocksize, num_bytes); |
776 | disk_num_bytes = num_bytes; | 801 | disk_num_bytes = num_bytes; |
777 | ret = 0; | 802 | ret = 0; |
778 | 803 | ||
804 | /* if this is a small write inside eof, kick off defrag */ | ||
805 | if (end <= BTRFS_I(inode)->disk_i_size && num_bytes < 64 * 1024) | ||
806 | btrfs_add_inode_defrag(trans, inode); | ||
807 | |||
779 | if (start == 0) { | 808 | if (start == 0) { |
780 | /* lets try to make an inline extent */ | 809 | /* lets try to make an inline extent */ |
781 | ret = cow_file_range_inline(trans, root, inode, | 810 | ret = cow_file_range_inline(trans, root, inode, |
782 | start, end, 0, NULL); | 811 | start, end, 0, 0, NULL); |
783 | if (ret == 0) { | 812 | if (ret == 0) { |
784 | extent_clear_unlock_delalloc(inode, | 813 | extent_clear_unlock_delalloc(inode, |
785 | &BTRFS_I(inode)->io_tree, | 814 | &BTRFS_I(inode)->io_tree, |
@@ -814,7 +843,8 @@ static noinline int cow_file_range(struct inode *inode, | |||
814 | (u64)-1, &ins, 1); | 843 | (u64)-1, &ins, 1); |
815 | BUG_ON(ret); | 844 | BUG_ON(ret); |
816 | 845 | ||
817 | em = alloc_extent_map(GFP_NOFS); | 846 | em = alloc_extent_map(); |
847 | BUG_ON(!em); | ||
818 | em->start = start; | 848 | em->start = start; |
819 | em->orig_start = em->start; | 849 | em->orig_start = em->start; |
820 | ram_size = ins.offset; | 850 | ram_size = ins.offset; |
@@ -941,6 +971,7 @@ static int cow_file_range_async(struct inode *inode, struct page *locked_page, | |||
941 | 1, 0, NULL, GFP_NOFS); | 971 | 1, 0, NULL, GFP_NOFS); |
942 | while (start < end) { | 972 | while (start < end) { |
943 | async_cow = kmalloc(sizeof(*async_cow), GFP_NOFS); | 973 | async_cow = kmalloc(sizeof(*async_cow), GFP_NOFS); |
974 | BUG_ON(!async_cow); | ||
944 | async_cow->inode = inode; | 975 | async_cow->inode = inode; |
945 | async_cow->root = root; | 976 | async_cow->root = root; |
946 | async_cow->locked_page = locked_page; | 977 | async_cow->locked_page = locked_page; |
@@ -994,7 +1025,7 @@ static noinline int csum_exist_in_range(struct btrfs_root *root, | |||
994 | LIST_HEAD(list); | 1025 | LIST_HEAD(list); |
995 | 1026 | ||
996 | ret = btrfs_lookup_csums_range(root->fs_info->csum_root, bytenr, | 1027 | ret = btrfs_lookup_csums_range(root->fs_info->csum_root, bytenr, |
997 | bytenr + num_bytes - 1, &list); | 1028 | bytenr + num_bytes - 1, &list, 0); |
998 | if (ret == 0 && list_empty(&list)) | 1029 | if (ret == 0 && list_empty(&list)) |
999 | return 0; | 1030 | return 0; |
1000 | 1031 | ||
@@ -1035,23 +1066,33 @@ static noinline int run_delalloc_nocow(struct inode *inode, | |||
1035 | int type; | 1066 | int type; |
1036 | int nocow; | 1067 | int nocow; |
1037 | int check_prev = 1; | 1068 | int check_prev = 1; |
1069 | bool nolock; | ||
1070 | u64 ino = btrfs_ino(inode); | ||
1038 | 1071 | ||
1039 | path = btrfs_alloc_path(); | 1072 | path = btrfs_alloc_path(); |
1040 | BUG_ON(!path); | 1073 | BUG_ON(!path); |
1041 | trans = btrfs_join_transaction(root, 1); | 1074 | |
1042 | BUG_ON(!trans); | 1075 | nolock = is_free_space_inode(root, inode); |
1076 | |||
1077 | if (nolock) | ||
1078 | trans = btrfs_join_transaction_nolock(root); | ||
1079 | else | ||
1080 | trans = btrfs_join_transaction(root); | ||
1081 | |||
1082 | BUG_ON(IS_ERR(trans)); | ||
1083 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | ||
1043 | 1084 | ||
1044 | cow_start = (u64)-1; | 1085 | cow_start = (u64)-1; |
1045 | cur_offset = start; | 1086 | cur_offset = start; |
1046 | while (1) { | 1087 | while (1) { |
1047 | ret = btrfs_lookup_file_extent(trans, root, path, inode->i_ino, | 1088 | ret = btrfs_lookup_file_extent(trans, root, path, ino, |
1048 | cur_offset, 0); | 1089 | cur_offset, 0); |
1049 | BUG_ON(ret < 0); | 1090 | BUG_ON(ret < 0); |
1050 | if (ret > 0 && path->slots[0] > 0 && check_prev) { | 1091 | if (ret > 0 && path->slots[0] > 0 && check_prev) { |
1051 | leaf = path->nodes[0]; | 1092 | leaf = path->nodes[0]; |
1052 | btrfs_item_key_to_cpu(leaf, &found_key, | 1093 | btrfs_item_key_to_cpu(leaf, &found_key, |
1053 | path->slots[0] - 1); | 1094 | path->slots[0] - 1); |
1054 | if (found_key.objectid == inode->i_ino && | 1095 | if (found_key.objectid == ino && |
1055 | found_key.type == BTRFS_EXTENT_DATA_KEY) | 1096 | found_key.type == BTRFS_EXTENT_DATA_KEY) |
1056 | path->slots[0]--; | 1097 | path->slots[0]--; |
1057 | } | 1098 | } |
@@ -1072,7 +1113,7 @@ next_slot: | |||
1072 | num_bytes = 0; | 1113 | num_bytes = 0; |
1073 | btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); | 1114 | btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); |
1074 | 1115 | ||
1075 | if (found_key.objectid > inode->i_ino || | 1116 | if (found_key.objectid > ino || |
1076 | found_key.type > BTRFS_EXTENT_DATA_KEY || | 1117 | found_key.type > BTRFS_EXTENT_DATA_KEY || |
1077 | found_key.offset > end) | 1118 | found_key.offset > end) |
1078 | break; | 1119 | break; |
@@ -1107,7 +1148,7 @@ next_slot: | |||
1107 | goto out_check; | 1148 | goto out_check; |
1108 | if (btrfs_extent_readonly(root, disk_bytenr)) | 1149 | if (btrfs_extent_readonly(root, disk_bytenr)) |
1109 | goto out_check; | 1150 | goto out_check; |
1110 | if (btrfs_cross_ref_exist(trans, root, inode->i_ino, | 1151 | if (btrfs_cross_ref_exist(trans, root, ino, |
1111 | found_key.offset - | 1152 | found_key.offset - |
1112 | extent_offset, disk_bytenr)) | 1153 | extent_offset, disk_bytenr)) |
1113 | goto out_check; | 1154 | goto out_check; |
@@ -1144,7 +1185,7 @@ out_check: | |||
1144 | goto next_slot; | 1185 | goto next_slot; |
1145 | } | 1186 | } |
1146 | 1187 | ||
1147 | btrfs_release_path(root, path); | 1188 | btrfs_release_path(path); |
1148 | if (cow_start != (u64)-1) { | 1189 | if (cow_start != (u64)-1) { |
1149 | ret = cow_file_range(inode, locked_page, cow_start, | 1190 | ret = cow_file_range(inode, locked_page, cow_start, |
1150 | found_key.offset - 1, page_started, | 1191 | found_key.offset - 1, page_started, |
@@ -1157,7 +1198,8 @@ out_check: | |||
1157 | struct extent_map *em; | 1198 | struct extent_map *em; |
1158 | struct extent_map_tree *em_tree; | 1199 | struct extent_map_tree *em_tree; |
1159 | em_tree = &BTRFS_I(inode)->extent_tree; | 1200 | em_tree = &BTRFS_I(inode)->extent_tree; |
1160 | em = alloc_extent_map(GFP_NOFS); | 1201 | em = alloc_extent_map(); |
1202 | BUG_ON(!em); | ||
1161 | em->start = cur_offset; | 1203 | em->start = cur_offset; |
1162 | em->orig_start = em->start; | 1204 | em->orig_start = em->start; |
1163 | em->len = num_bytes; | 1205 | em->len = num_bytes; |
@@ -1201,7 +1243,7 @@ out_check: | |||
1201 | if (cur_offset > end) | 1243 | if (cur_offset > end) |
1202 | break; | 1244 | break; |
1203 | } | 1245 | } |
1204 | btrfs_release_path(root, path); | 1246 | btrfs_release_path(path); |
1205 | 1247 | ||
1206 | if (cur_offset <= end && cow_start == (u64)-1) | 1248 | if (cur_offset <= end && cow_start == (u64)-1) |
1207 | cow_start = cur_offset; | 1249 | cow_start = cur_offset; |
@@ -1211,8 +1253,13 @@ out_check: | |||
1211 | BUG_ON(ret); | 1253 | BUG_ON(ret); |
1212 | } | 1254 | } |
1213 | 1255 | ||
1214 | ret = btrfs_end_transaction(trans, root); | 1256 | if (nolock) { |
1215 | BUG_ON(ret); | 1257 | ret = btrfs_end_transaction_nolock(trans, root); |
1258 | BUG_ON(ret); | ||
1259 | } else { | ||
1260 | ret = btrfs_end_transaction(trans, root); | ||
1261 | BUG_ON(ret); | ||
1262 | } | ||
1216 | btrfs_free_path(path); | 1263 | btrfs_free_path(path); |
1217 | return 0; | 1264 | return 0; |
1218 | } | 1265 | } |
@@ -1234,7 +1281,8 @@ static int run_delalloc_range(struct inode *inode, struct page *locked_page, | |||
1234 | ret = run_delalloc_nocow(inode, locked_page, start, end, | 1281 | ret = run_delalloc_nocow(inode, locked_page, start, end, |
1235 | page_started, 0, nr_written); | 1282 | page_started, 0, nr_written); |
1236 | else if (!btrfs_test_opt(root, COMPRESS) && | 1283 | else if (!btrfs_test_opt(root, COMPRESS) && |
1237 | !(BTRFS_I(inode)->force_compress)) | 1284 | !(BTRFS_I(inode)->force_compress) && |
1285 | !(BTRFS_I(inode)->flags & BTRFS_INODE_COMPRESS)) | ||
1238 | ret = cow_file_range(inode, locked_page, start, end, | 1286 | ret = cow_file_range(inode, locked_page, start, end, |
1239 | page_started, nr_written, 1); | 1287 | page_started, nr_written, 1); |
1240 | else | 1288 | else |
@@ -1283,12 +1331,13 @@ static int btrfs_set_bit_hook(struct inode *inode, | |||
1283 | 1331 | ||
1284 | /* | 1332 | /* |
1285 | * set_bit and clear bit hooks normally require _irqsave/restore | 1333 | * set_bit and clear bit hooks normally require _irqsave/restore |
1286 | * but in this case, we are only testeing for the DELALLOC | 1334 | * but in this case, we are only testing for the DELALLOC |
1287 | * bit, which is only set or cleared with irqs on | 1335 | * bit, which is only set or cleared with irqs on |
1288 | */ | 1336 | */ |
1289 | if (!(state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) { | 1337 | if (!(state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) { |
1290 | struct btrfs_root *root = BTRFS_I(inode)->root; | 1338 | struct btrfs_root *root = BTRFS_I(inode)->root; |
1291 | u64 len = state->end + 1 - state->start; | 1339 | u64 len = state->end + 1 - state->start; |
1340 | bool do_list = !is_free_space_inode(root, inode); | ||
1292 | 1341 | ||
1293 | if (*bits & EXTENT_FIRST_DELALLOC) | 1342 | if (*bits & EXTENT_FIRST_DELALLOC) |
1294 | *bits &= ~EXTENT_FIRST_DELALLOC; | 1343 | *bits &= ~EXTENT_FIRST_DELALLOC; |
@@ -1298,7 +1347,7 @@ static int btrfs_set_bit_hook(struct inode *inode, | |||
1298 | spin_lock(&root->fs_info->delalloc_lock); | 1347 | spin_lock(&root->fs_info->delalloc_lock); |
1299 | BTRFS_I(inode)->delalloc_bytes += len; | 1348 | BTRFS_I(inode)->delalloc_bytes += len; |
1300 | root->fs_info->delalloc_bytes += len; | 1349 | root->fs_info->delalloc_bytes += len; |
1301 | if (list_empty(&BTRFS_I(inode)->delalloc_inodes)) { | 1350 | if (do_list && list_empty(&BTRFS_I(inode)->delalloc_inodes)) { |
1302 | list_add_tail(&BTRFS_I(inode)->delalloc_inodes, | 1351 | list_add_tail(&BTRFS_I(inode)->delalloc_inodes, |
1303 | &root->fs_info->delalloc_inodes); | 1352 | &root->fs_info->delalloc_inodes); |
1304 | } | 1353 | } |
@@ -1315,12 +1364,13 @@ static int btrfs_clear_bit_hook(struct inode *inode, | |||
1315 | { | 1364 | { |
1316 | /* | 1365 | /* |
1317 | * set_bit and clear bit hooks normally require _irqsave/restore | 1366 | * set_bit and clear bit hooks normally require _irqsave/restore |
1318 | * but in this case, we are only testeing for the DELALLOC | 1367 | * but in this case, we are only testing for the DELALLOC |
1319 | * bit, which is only set or cleared with irqs on | 1368 | * bit, which is only set or cleared with irqs on |
1320 | */ | 1369 | */ |
1321 | if ((state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) { | 1370 | if ((state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) { |
1322 | struct btrfs_root *root = BTRFS_I(inode)->root; | 1371 | struct btrfs_root *root = BTRFS_I(inode)->root; |
1323 | u64 len = state->end + 1 - state->start; | 1372 | u64 len = state->end + 1 - state->start; |
1373 | bool do_list = !is_free_space_inode(root, inode); | ||
1324 | 1374 | ||
1325 | if (*bits & EXTENT_FIRST_DELALLOC) | 1375 | if (*bits & EXTENT_FIRST_DELALLOC) |
1326 | *bits &= ~EXTENT_FIRST_DELALLOC; | 1376 | *bits &= ~EXTENT_FIRST_DELALLOC; |
@@ -1330,14 +1380,15 @@ static int btrfs_clear_bit_hook(struct inode *inode, | |||
1330 | if (*bits & EXTENT_DO_ACCOUNTING) | 1380 | if (*bits & EXTENT_DO_ACCOUNTING) |
1331 | btrfs_delalloc_release_metadata(inode, len); | 1381 | btrfs_delalloc_release_metadata(inode, len); |
1332 | 1382 | ||
1333 | if (root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID) | 1383 | if (root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID |
1384 | && do_list) | ||
1334 | btrfs_free_reserved_data_space(inode, len); | 1385 | btrfs_free_reserved_data_space(inode, len); |
1335 | 1386 | ||
1336 | spin_lock(&root->fs_info->delalloc_lock); | 1387 | spin_lock(&root->fs_info->delalloc_lock); |
1337 | root->fs_info->delalloc_bytes -= len; | 1388 | root->fs_info->delalloc_bytes -= len; |
1338 | BTRFS_I(inode)->delalloc_bytes -= len; | 1389 | BTRFS_I(inode)->delalloc_bytes -= len; |
1339 | 1390 | ||
1340 | if (BTRFS_I(inode)->delalloc_bytes == 0 && | 1391 | if (do_list && BTRFS_I(inode)->delalloc_bytes == 0 && |
1341 | !list_empty(&BTRFS_I(inode)->delalloc_inodes)) { | 1392 | !list_empty(&BTRFS_I(inode)->delalloc_inodes)) { |
1342 | list_del_init(&BTRFS_I(inode)->delalloc_inodes); | 1393 | list_del_init(&BTRFS_I(inode)->delalloc_inodes); |
1343 | } | 1394 | } |
@@ -1372,7 +1423,7 @@ int btrfs_merge_bio_hook(struct page *page, unsigned long offset, | |||
1372 | 1423 | ||
1373 | if (map_length < length + size) | 1424 | if (map_length < length + size) |
1374 | return 1; | 1425 | return 1; |
1375 | return 0; | 1426 | return ret; |
1376 | } | 1427 | } |
1377 | 1428 | ||
1378 | /* | 1429 | /* |
@@ -1426,15 +1477,21 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, | |||
1426 | 1477 | ||
1427 | skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; | 1478 | skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; |
1428 | 1479 | ||
1429 | ret = btrfs_bio_wq_end_io(root->fs_info, bio, 0); | 1480 | if (is_free_space_inode(root, inode)) |
1481 | ret = btrfs_bio_wq_end_io(root->fs_info, bio, 2); | ||
1482 | else | ||
1483 | ret = btrfs_bio_wq_end_io(root->fs_info, bio, 0); | ||
1430 | BUG_ON(ret); | 1484 | BUG_ON(ret); |
1431 | 1485 | ||
1432 | if (!(rw & REQ_WRITE)) { | 1486 | if (!(rw & REQ_WRITE)) { |
1433 | if (bio_flags & EXTENT_BIO_COMPRESSED) { | 1487 | if (bio_flags & EXTENT_BIO_COMPRESSED) { |
1434 | return btrfs_submit_compressed_read(inode, bio, | 1488 | return btrfs_submit_compressed_read(inode, bio, |
1435 | mirror_num, bio_flags); | 1489 | mirror_num, bio_flags); |
1436 | } else if (!skip_sum) | 1490 | } else if (!skip_sum) { |
1437 | btrfs_lookup_bio_sums(root, inode, bio, NULL); | 1491 | ret = btrfs_lookup_bio_sums(root, inode, bio, NULL); |
1492 | if (ret) | ||
1493 | return ret; | ||
1494 | } | ||
1438 | goto mapit; | 1495 | goto mapit; |
1439 | } else if (!skip_sum) { | 1496 | } else if (!skip_sum) { |
1440 | /* csum items have already been cloned */ | 1497 | /* csum items have already been cloned */ |
@@ -1462,8 +1519,6 @@ static noinline int add_pending_csums(struct btrfs_trans_handle *trans, | |||
1462 | { | 1519 | { |
1463 | struct btrfs_ordered_sum *sum; | 1520 | struct btrfs_ordered_sum *sum; |
1464 | 1521 | ||
1465 | btrfs_set_trans_block_group(trans, inode); | ||
1466 | |||
1467 | list_for_each_entry(sum, list, list) { | 1522 | list_for_each_entry(sum, list, list) { |
1468 | btrfs_csum_file_blocks(trans, | 1523 | btrfs_csum_file_blocks(trans, |
1469 | BTRFS_I(inode)->root->fs_info->csum_root, sum); | 1524 | BTRFS_I(inode)->root->fs_info->csum_root, sum); |
@@ -1534,6 +1589,7 @@ out: | |||
1534 | out_page: | 1589 | out_page: |
1535 | unlock_page(page); | 1590 | unlock_page(page); |
1536 | page_cache_release(page); | 1591 | page_cache_release(page); |
1592 | kfree(fixup); | ||
1537 | } | 1593 | } |
1538 | 1594 | ||
1539 | /* | 1595 | /* |
@@ -1605,7 +1661,7 @@ static int insert_reserved_file_extent(struct btrfs_trans_handle *trans, | |||
1605 | &hint, 0); | 1661 | &hint, 0); |
1606 | BUG_ON(ret); | 1662 | BUG_ON(ret); |
1607 | 1663 | ||
1608 | ins.objectid = inode->i_ino; | 1664 | ins.objectid = btrfs_ino(inode); |
1609 | ins.offset = file_pos; | 1665 | ins.offset = file_pos; |
1610 | ins.type = BTRFS_EXTENT_DATA_KEY; | 1666 | ins.type = BTRFS_EXTENT_DATA_KEY; |
1611 | ret = btrfs_insert_empty_item(trans, root, path, &ins, sizeof(*fi)); | 1667 | ret = btrfs_insert_empty_item(trans, root, path, &ins, sizeof(*fi)); |
@@ -1636,7 +1692,7 @@ static int insert_reserved_file_extent(struct btrfs_trans_handle *trans, | |||
1636 | ins.type = BTRFS_EXTENT_ITEM_KEY; | 1692 | ins.type = BTRFS_EXTENT_ITEM_KEY; |
1637 | ret = btrfs_alloc_reserved_file_extent(trans, root, | 1693 | ret = btrfs_alloc_reserved_file_extent(trans, root, |
1638 | root->root_key.objectid, | 1694 | root->root_key.objectid, |
1639 | inode->i_ino, file_pos, &ins); | 1695 | btrfs_ino(inode), file_pos, &ins); |
1640 | BUG_ON(ret); | 1696 | BUG_ON(ret); |
1641 | btrfs_free_path(path); | 1697 | btrfs_free_path(path); |
1642 | 1698 | ||
@@ -1660,8 +1716,9 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1660 | struct btrfs_ordered_extent *ordered_extent = NULL; | 1716 | struct btrfs_ordered_extent *ordered_extent = NULL; |
1661 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; | 1717 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; |
1662 | struct extent_state *cached_state = NULL; | 1718 | struct extent_state *cached_state = NULL; |
1663 | int compressed = 0; | 1719 | int compress_type = 0; |
1664 | int ret; | 1720 | int ret; |
1721 | bool nolock; | ||
1665 | 1722 | ||
1666 | ret = btrfs_dec_test_ordered_pending(inode, &ordered_extent, start, | 1723 | ret = btrfs_dec_test_ordered_pending(inode, &ordered_extent, start, |
1667 | end - start + 1); | 1724 | end - start + 1); |
@@ -1669,12 +1726,17 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1669 | return 0; | 1726 | return 0; |
1670 | BUG_ON(!ordered_extent); | 1727 | BUG_ON(!ordered_extent); |
1671 | 1728 | ||
1729 | nolock = is_free_space_inode(root, inode); | ||
1730 | |||
1672 | if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { | 1731 | if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { |
1673 | BUG_ON(!list_empty(&ordered_extent->list)); | 1732 | BUG_ON(!list_empty(&ordered_extent->list)); |
1674 | ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); | 1733 | ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); |
1675 | if (!ret) { | 1734 | if (!ret) { |
1676 | trans = btrfs_join_transaction(root, 1); | 1735 | if (nolock) |
1677 | btrfs_set_trans_block_group(trans, inode); | 1736 | trans = btrfs_join_transaction_nolock(root); |
1737 | else | ||
1738 | trans = btrfs_join_transaction(root); | ||
1739 | BUG_ON(IS_ERR(trans)); | ||
1678 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 1740 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
1679 | ret = btrfs_update_inode(trans, root, inode); | 1741 | ret = btrfs_update_inode(trans, root, inode); |
1680 | BUG_ON(ret); | 1742 | BUG_ON(ret); |
@@ -1686,27 +1748,31 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1686 | ordered_extent->file_offset + ordered_extent->len - 1, | 1748 | ordered_extent->file_offset + ordered_extent->len - 1, |
1687 | 0, &cached_state, GFP_NOFS); | 1749 | 0, &cached_state, GFP_NOFS); |
1688 | 1750 | ||
1689 | trans = btrfs_join_transaction(root, 1); | 1751 | if (nolock) |
1690 | btrfs_set_trans_block_group(trans, inode); | 1752 | trans = btrfs_join_transaction_nolock(root); |
1753 | else | ||
1754 | trans = btrfs_join_transaction(root); | ||
1755 | BUG_ON(IS_ERR(trans)); | ||
1691 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 1756 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
1692 | 1757 | ||
1693 | if (test_bit(BTRFS_ORDERED_COMPRESSED, &ordered_extent->flags)) | 1758 | if (test_bit(BTRFS_ORDERED_COMPRESSED, &ordered_extent->flags)) |
1694 | compressed = 1; | 1759 | compress_type = ordered_extent->compress_type; |
1695 | if (test_bit(BTRFS_ORDERED_PREALLOC, &ordered_extent->flags)) { | 1760 | if (test_bit(BTRFS_ORDERED_PREALLOC, &ordered_extent->flags)) { |
1696 | BUG_ON(compressed); | 1761 | BUG_ON(compress_type); |
1697 | ret = btrfs_mark_extent_written(trans, inode, | 1762 | ret = btrfs_mark_extent_written(trans, inode, |
1698 | ordered_extent->file_offset, | 1763 | ordered_extent->file_offset, |
1699 | ordered_extent->file_offset + | 1764 | ordered_extent->file_offset + |
1700 | ordered_extent->len); | 1765 | ordered_extent->len); |
1701 | BUG_ON(ret); | 1766 | BUG_ON(ret); |
1702 | } else { | 1767 | } else { |
1768 | BUG_ON(root == root->fs_info->tree_root); | ||
1703 | ret = insert_reserved_file_extent(trans, inode, | 1769 | ret = insert_reserved_file_extent(trans, inode, |
1704 | ordered_extent->file_offset, | 1770 | ordered_extent->file_offset, |
1705 | ordered_extent->start, | 1771 | ordered_extent->start, |
1706 | ordered_extent->disk_len, | 1772 | ordered_extent->disk_len, |
1707 | ordered_extent->len, | 1773 | ordered_extent->len, |
1708 | ordered_extent->len, | 1774 | ordered_extent->len, |
1709 | compressed, 0, 0, | 1775 | compress_type, 0, 0, |
1710 | BTRFS_FILE_EXTENT_REG); | 1776 | BTRFS_FILE_EXTENT_REG); |
1711 | unpin_extent_cache(&BTRFS_I(inode)->extent_tree, | 1777 | unpin_extent_cache(&BTRFS_I(inode)->extent_tree, |
1712 | ordered_extent->file_offset, | 1778 | ordered_extent->file_offset, |
@@ -1720,13 +1786,22 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1720 | add_pending_csums(trans, inode, ordered_extent->file_offset, | 1786 | add_pending_csums(trans, inode, ordered_extent->file_offset, |
1721 | &ordered_extent->list); | 1787 | &ordered_extent->list); |
1722 | 1788 | ||
1723 | btrfs_ordered_update_i_size(inode, 0, ordered_extent); | 1789 | ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); |
1724 | ret = btrfs_update_inode(trans, root, inode); | 1790 | if (!ret) { |
1725 | BUG_ON(ret); | 1791 | ret = btrfs_update_inode(trans, root, inode); |
1792 | BUG_ON(ret); | ||
1793 | } | ||
1794 | ret = 0; | ||
1726 | out: | 1795 | out: |
1727 | btrfs_delalloc_release_metadata(inode, ordered_extent->len); | 1796 | if (nolock) { |
1728 | if (trans) | 1797 | if (trans) |
1729 | btrfs_end_transaction(trans, root); | 1798 | btrfs_end_transaction_nolock(trans, root); |
1799 | } else { | ||
1800 | btrfs_delalloc_release_metadata(inode, ordered_extent->len); | ||
1801 | if (trans) | ||
1802 | btrfs_end_transaction(trans, root); | ||
1803 | } | ||
1804 | |||
1730 | /* once for us */ | 1805 | /* once for us */ |
1731 | btrfs_put_ordered_extent(ordered_extent); | 1806 | btrfs_put_ordered_extent(ordered_extent); |
1732 | /* once for the tree */ | 1807 | /* once for the tree */ |
@@ -1738,6 +1813,8 @@ out: | |||
1738 | static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end, | 1813 | static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end, |
1739 | struct extent_state *state, int uptodate) | 1814 | struct extent_state *state, int uptodate) |
1740 | { | 1815 | { |
1816 | trace_btrfs_writepage_end_io_hook(page, start, end, uptodate); | ||
1817 | |||
1741 | ClearPagePrivate2(page); | 1818 | ClearPagePrivate2(page); |
1742 | return btrfs_finish_ordered_io(page->mapping->host, start, end); | 1819 | return btrfs_finish_ordered_io(page->mapping->host, start, end); |
1743 | } | 1820 | } |
@@ -1793,7 +1870,7 @@ static int btrfs_io_failed_hook(struct bio *failed_bio, | |||
1793 | } | 1870 | } |
1794 | read_unlock(&em_tree->lock); | 1871 | read_unlock(&em_tree->lock); |
1795 | 1872 | ||
1796 | if (!em || IS_ERR(em)) { | 1873 | if (IS_ERR_OR_NULL(em)) { |
1797 | kfree(failrec); | 1874 | kfree(failrec); |
1798 | return -EIO; | 1875 | return -EIO; |
1799 | } | 1876 | } |
@@ -1802,6 +1879,8 @@ static int btrfs_io_failed_hook(struct bio *failed_bio, | |||
1802 | if (test_bit(EXTENT_FLAG_COMPRESSED, &em->flags)) { | 1879 | if (test_bit(EXTENT_FLAG_COMPRESSED, &em->flags)) { |
1803 | logical = em->block_start; | 1880 | logical = em->block_start; |
1804 | failrec->bio_flags = EXTENT_BIO_COMPRESSED; | 1881 | failrec->bio_flags = EXTENT_BIO_COMPRESSED; |
1882 | extent_set_compress_type(&failrec->bio_flags, | ||
1883 | em->compress_type); | ||
1805 | } | 1884 | } |
1806 | failrec->logical = logical; | 1885 | failrec->logical = logical; |
1807 | free_extent_map(em); | 1886 | free_extent_map(em); |
@@ -1846,10 +1925,10 @@ static int btrfs_io_failed_hook(struct bio *failed_bio, | |||
1846 | else | 1925 | else |
1847 | rw = READ; | 1926 | rw = READ; |
1848 | 1927 | ||
1849 | BTRFS_I(inode)->io_tree.ops->submit_bio_hook(inode, rw, bio, | 1928 | ret = BTRFS_I(inode)->io_tree.ops->submit_bio_hook(inode, rw, bio, |
1850 | failrec->last_mirror, | 1929 | failrec->last_mirror, |
1851 | failrec->bio_flags, 0); | 1930 | failrec->bio_flags, 0); |
1852 | return 0; | 1931 | return ret; |
1853 | } | 1932 | } |
1854 | 1933 | ||
1855 | /* | 1934 | /* |
@@ -1865,7 +1944,7 @@ static int btrfs_clean_io_failures(struct inode *inode, u64 start) | |||
1865 | 1944 | ||
1866 | private = 0; | 1945 | private = 0; |
1867 | if (count_range_bits(&BTRFS_I(inode)->io_failure_tree, &private, | 1946 | if (count_range_bits(&BTRFS_I(inode)->io_failure_tree, &private, |
1868 | (u64)-1, 1, EXTENT_DIRTY)) { | 1947 | (u64)-1, 1, EXTENT_DIRTY, 0)) { |
1869 | ret = get_state_private(&BTRFS_I(inode)->io_failure_tree, | 1948 | ret = get_state_private(&BTRFS_I(inode)->io_failure_tree, |
1870 | start, &private_failure); | 1949 | start, &private_failure); |
1871 | if (ret == 0) { | 1950 | if (ret == 0) { |
@@ -1907,7 +1986,7 @@ static int btrfs_readpage_end_io_hook(struct page *page, u64 start, u64 end, | |||
1907 | } | 1986 | } |
1908 | 1987 | ||
1909 | if (BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM) | 1988 | if (BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM) |
1910 | return 0; | 1989 | goto good; |
1911 | 1990 | ||
1912 | if (root->root_key.objectid == BTRFS_DATA_RELOC_TREE_OBJECTID && | 1991 | if (root->root_key.objectid == BTRFS_DATA_RELOC_TREE_OBJECTID && |
1913 | test_range_bit(io_tree, start, end, EXTENT_NODATASUM, 1, NULL)) { | 1992 | test_range_bit(io_tree, start, end, EXTENT_NODATASUM, 1, NULL)) { |
@@ -1940,12 +2019,11 @@ good: | |||
1940 | return 0; | 2019 | return 0; |
1941 | 2020 | ||
1942 | zeroit: | 2021 | zeroit: |
1943 | if (printk_ratelimit()) { | 2022 | printk_ratelimited(KERN_INFO "btrfs csum failed ino %llu off %llu csum %u " |
1944 | printk(KERN_INFO "btrfs csum failed ino %lu off %llu csum %u " | 2023 | "private %llu\n", |
1945 | "private %llu\n", page->mapping->host->i_ino, | 2024 | (unsigned long long)btrfs_ino(page->mapping->host), |
1946 | (unsigned long long)start, csum, | 2025 | (unsigned long long)start, csum, |
1947 | (unsigned long long)private); | 2026 | (unsigned long long)private); |
1948 | } | ||
1949 | memset(kaddr + offset, 1, end - start + 1); | 2027 | memset(kaddr + offset, 1, end - start + 1); |
1950 | flush_dcache_page(page); | 2028 | flush_dcache_page(page); |
1951 | kunmap_atomic(kaddr, KM_USER0); | 2029 | kunmap_atomic(kaddr, KM_USER0); |
@@ -2161,8 +2239,6 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode) | |||
2161 | insert = 1; | 2239 | insert = 1; |
2162 | #endif | 2240 | #endif |
2163 | insert = 1; | 2241 | insert = 1; |
2164 | } else { | ||
2165 | WARN_ON(!BTRFS_I(inode)->orphan_meta_reserved); | ||
2166 | } | 2242 | } |
2167 | 2243 | ||
2168 | if (!BTRFS_I(inode)->orphan_meta_reserved) { | 2244 | if (!BTRFS_I(inode)->orphan_meta_reserved) { |
@@ -2182,7 +2258,7 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode) | |||
2182 | 2258 | ||
2183 | /* insert an orphan item to track this unlinked/truncated file */ | 2259 | /* insert an orphan item to track this unlinked/truncated file */ |
2184 | if (insert >= 1) { | 2260 | if (insert >= 1) { |
2185 | ret = btrfs_insert_orphan_item(trans, root, inode->i_ino); | 2261 | ret = btrfs_insert_orphan_item(trans, root, btrfs_ino(inode)); |
2186 | BUG_ON(ret); | 2262 | BUG_ON(ret); |
2187 | } | 2263 | } |
2188 | 2264 | ||
@@ -2219,7 +2295,7 @@ int btrfs_orphan_del(struct btrfs_trans_handle *trans, struct inode *inode) | |||
2219 | spin_unlock(&root->orphan_lock); | 2295 | spin_unlock(&root->orphan_lock); |
2220 | 2296 | ||
2221 | if (trans && delete_item) { | 2297 | if (trans && delete_item) { |
2222 | ret = btrfs_del_orphan_item(trans, root, inode->i_ino); | 2298 | ret = btrfs_del_orphan_item(trans, root, btrfs_ino(inode)); |
2223 | BUG_ON(ret); | 2299 | BUG_ON(ret); |
2224 | } | 2300 | } |
2225 | 2301 | ||
@@ -2233,21 +2309,23 @@ int btrfs_orphan_del(struct btrfs_trans_handle *trans, struct inode *inode) | |||
2233 | * this cleans up any orphans that may be left on the list from the last use | 2309 | * this cleans up any orphans that may be left on the list from the last use |
2234 | * of this root. | 2310 | * of this root. |
2235 | */ | 2311 | */ |
2236 | void btrfs_orphan_cleanup(struct btrfs_root *root) | 2312 | int btrfs_orphan_cleanup(struct btrfs_root *root) |
2237 | { | 2313 | { |
2238 | struct btrfs_path *path; | 2314 | struct btrfs_path *path; |
2239 | struct extent_buffer *leaf; | 2315 | struct extent_buffer *leaf; |
2240 | struct btrfs_item *item; | ||
2241 | struct btrfs_key key, found_key; | 2316 | struct btrfs_key key, found_key; |
2242 | struct btrfs_trans_handle *trans; | 2317 | struct btrfs_trans_handle *trans; |
2243 | struct inode *inode; | 2318 | struct inode *inode; |
2244 | int ret = 0, nr_unlink = 0, nr_truncate = 0; | 2319 | int ret = 0, nr_unlink = 0, nr_truncate = 0; |
2245 | 2320 | ||
2246 | if (cmpxchg(&root->orphan_cleanup_state, 0, ORPHAN_CLEANUP_STARTED)) | 2321 | if (cmpxchg(&root->orphan_cleanup_state, 0, ORPHAN_CLEANUP_STARTED)) |
2247 | return; | 2322 | return 0; |
2248 | 2323 | ||
2249 | path = btrfs_alloc_path(); | 2324 | path = btrfs_alloc_path(); |
2250 | BUG_ON(!path); | 2325 | if (!path) { |
2326 | ret = -ENOMEM; | ||
2327 | goto out; | ||
2328 | } | ||
2251 | path->reada = -1; | 2329 | path->reada = -1; |
2252 | 2330 | ||
2253 | key.objectid = BTRFS_ORPHAN_OBJECTID; | 2331 | key.objectid = BTRFS_ORPHAN_OBJECTID; |
@@ -2256,18 +2334,16 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2256 | 2334 | ||
2257 | while (1) { | 2335 | while (1) { |
2258 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | 2336 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); |
2259 | if (ret < 0) { | 2337 | if (ret < 0) |
2260 | printk(KERN_ERR "Error searching slot for orphan: %d" | 2338 | goto out; |
2261 | "\n", ret); | ||
2262 | break; | ||
2263 | } | ||
2264 | 2339 | ||
2265 | /* | 2340 | /* |
2266 | * if ret == 0 means we found what we were searching for, which | 2341 | * if ret == 0 means we found what we were searching for, which |
2267 | * is weird, but possible, so only screw with path if we didnt | 2342 | * is weird, but possible, so only screw with path if we didn't |
2268 | * find the key and see if we have stuff that matches | 2343 | * find the key and see if we have stuff that matches |
2269 | */ | 2344 | */ |
2270 | if (ret > 0) { | 2345 | if (ret > 0) { |
2346 | ret = 0; | ||
2271 | if (path->slots[0] == 0) | 2347 | if (path->slots[0] == 0) |
2272 | break; | 2348 | break; |
2273 | path->slots[0]--; | 2349 | path->slots[0]--; |
@@ -2275,7 +2351,6 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2275 | 2351 | ||
2276 | /* pull out the item */ | 2352 | /* pull out the item */ |
2277 | leaf = path->nodes[0]; | 2353 | leaf = path->nodes[0]; |
2278 | item = btrfs_item_nr(leaf, path->slots[0]); | ||
2279 | btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); | 2354 | btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); |
2280 | 2355 | ||
2281 | /* make sure the item matches what we want */ | 2356 | /* make sure the item matches what we want */ |
@@ -2285,7 +2360,7 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2285 | break; | 2360 | break; |
2286 | 2361 | ||
2287 | /* release the path since we're done with it */ | 2362 | /* release the path since we're done with it */ |
2288 | btrfs_release_path(root, path); | 2363 | btrfs_release_path(path); |
2289 | 2364 | ||
2290 | /* | 2365 | /* |
2291 | * this is where we are basically btrfs_lookup, without the | 2366 | * this is where we are basically btrfs_lookup, without the |
@@ -2296,7 +2371,10 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2296 | found_key.type = BTRFS_INODE_ITEM_KEY; | 2371 | found_key.type = BTRFS_INODE_ITEM_KEY; |
2297 | found_key.offset = 0; | 2372 | found_key.offset = 0; |
2298 | inode = btrfs_iget(root->fs_info->sb, &found_key, root, NULL); | 2373 | inode = btrfs_iget(root->fs_info->sb, &found_key, root, NULL); |
2299 | BUG_ON(IS_ERR(inode)); | 2374 | if (IS_ERR(inode)) { |
2375 | ret = PTR_ERR(inode); | ||
2376 | goto out; | ||
2377 | } | ||
2300 | 2378 | ||
2301 | /* | 2379 | /* |
2302 | * add this inode to the orphan list so btrfs_orphan_del does | 2380 | * add this inode to the orphan list so btrfs_orphan_del does |
@@ -2314,6 +2392,10 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2314 | */ | 2392 | */ |
2315 | if (is_bad_inode(inode)) { | 2393 | if (is_bad_inode(inode)) { |
2316 | trans = btrfs_start_transaction(root, 0); | 2394 | trans = btrfs_start_transaction(root, 0); |
2395 | if (IS_ERR(trans)) { | ||
2396 | ret = PTR_ERR(trans); | ||
2397 | goto out; | ||
2398 | } | ||
2317 | btrfs_orphan_del(trans, inode); | 2399 | btrfs_orphan_del(trans, inode); |
2318 | btrfs_end_transaction(trans, root); | 2400 | btrfs_end_transaction(trans, root); |
2319 | iput(inode); | 2401 | iput(inode); |
@@ -2322,17 +2404,22 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2322 | 2404 | ||
2323 | /* if we have links, this was a truncate, lets do that */ | 2405 | /* if we have links, this was a truncate, lets do that */ |
2324 | if (inode->i_nlink) { | 2406 | if (inode->i_nlink) { |
2407 | if (!S_ISREG(inode->i_mode)) { | ||
2408 | WARN_ON(1); | ||
2409 | iput(inode); | ||
2410 | continue; | ||
2411 | } | ||
2325 | nr_truncate++; | 2412 | nr_truncate++; |
2326 | btrfs_truncate(inode); | 2413 | ret = btrfs_truncate(inode); |
2327 | } else { | 2414 | } else { |
2328 | nr_unlink++; | 2415 | nr_unlink++; |
2329 | } | 2416 | } |
2330 | 2417 | ||
2331 | /* this will do delete_inode and everything for us */ | 2418 | /* this will do delete_inode and everything for us */ |
2332 | iput(inode); | 2419 | iput(inode); |
2420 | if (ret) | ||
2421 | goto out; | ||
2333 | } | 2422 | } |
2334 | btrfs_free_path(path); | ||
2335 | |||
2336 | root->orphan_cleanup_state = ORPHAN_CLEANUP_DONE; | 2423 | root->orphan_cleanup_state = ORPHAN_CLEANUP_DONE; |
2337 | 2424 | ||
2338 | if (root->orphan_block_rsv) | 2425 | if (root->orphan_block_rsv) |
@@ -2340,14 +2427,21 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2340 | (u64)-1); | 2427 | (u64)-1); |
2341 | 2428 | ||
2342 | if (root->orphan_block_rsv || root->orphan_item_inserted) { | 2429 | if (root->orphan_block_rsv || root->orphan_item_inserted) { |
2343 | trans = btrfs_join_transaction(root, 1); | 2430 | trans = btrfs_join_transaction(root); |
2344 | btrfs_end_transaction(trans, root); | 2431 | if (!IS_ERR(trans)) |
2432 | btrfs_end_transaction(trans, root); | ||
2345 | } | 2433 | } |
2346 | 2434 | ||
2347 | if (nr_unlink) | 2435 | if (nr_unlink) |
2348 | printk(KERN_INFO "btrfs: unlinked %d orphans\n", nr_unlink); | 2436 | printk(KERN_INFO "btrfs: unlinked %d orphans\n", nr_unlink); |
2349 | if (nr_truncate) | 2437 | if (nr_truncate) |
2350 | printk(KERN_INFO "btrfs: truncated %d orphans\n", nr_truncate); | 2438 | printk(KERN_INFO "btrfs: truncated %d orphans\n", nr_truncate); |
2439 | |||
2440 | out: | ||
2441 | if (ret) | ||
2442 | printk(KERN_CRIT "btrfs: could not do orphan cleanup %d\n", ret); | ||
2443 | btrfs_free_path(path); | ||
2444 | return ret; | ||
2351 | } | 2445 | } |
2352 | 2446 | ||
2353 | /* | 2447 | /* |
@@ -2413,12 +2507,17 @@ static void btrfs_read_locked_inode(struct inode *inode) | |||
2413 | struct btrfs_root *root = BTRFS_I(inode)->root; | 2507 | struct btrfs_root *root = BTRFS_I(inode)->root; |
2414 | struct btrfs_key location; | 2508 | struct btrfs_key location; |
2415 | int maybe_acls; | 2509 | int maybe_acls; |
2416 | u64 alloc_group_block; | ||
2417 | u32 rdev; | 2510 | u32 rdev; |
2418 | int ret; | 2511 | int ret; |
2512 | bool filled = false; | ||
2513 | |||
2514 | ret = btrfs_fill_inode(inode, &rdev); | ||
2515 | if (!ret) | ||
2516 | filled = true; | ||
2419 | 2517 | ||
2420 | path = btrfs_alloc_path(); | 2518 | path = btrfs_alloc_path(); |
2421 | BUG_ON(!path); | 2519 | BUG_ON(!path); |
2520 | path->leave_spinning = 1; | ||
2422 | memcpy(&location, &BTRFS_I(inode)->location, sizeof(location)); | 2521 | memcpy(&location, &BTRFS_I(inode)->location, sizeof(location)); |
2423 | 2522 | ||
2424 | ret = btrfs_lookup_inode(NULL, root, path, &location, 0); | 2523 | ret = btrfs_lookup_inode(NULL, root, path, &location, 0); |
@@ -2426,8 +2525,18 @@ static void btrfs_read_locked_inode(struct inode *inode) | |||
2426 | goto make_bad; | 2525 | goto make_bad; |
2427 | 2526 | ||
2428 | leaf = path->nodes[0]; | 2527 | leaf = path->nodes[0]; |
2528 | |||
2529 | if (filled) | ||
2530 | goto cache_acl; | ||
2531 | |||
2429 | inode_item = btrfs_item_ptr(leaf, path->slots[0], | 2532 | inode_item = btrfs_item_ptr(leaf, path->slots[0], |
2430 | struct btrfs_inode_item); | 2533 | struct btrfs_inode_item); |
2534 | if (!leaf->map_token) | ||
2535 | map_private_extent_buffer(leaf, (unsigned long)inode_item, | ||
2536 | sizeof(struct btrfs_inode_item), | ||
2537 | &leaf->map_token, &leaf->kaddr, | ||
2538 | &leaf->map_start, &leaf->map_len, | ||
2539 | KM_USER1); | ||
2431 | 2540 | ||
2432 | inode->i_mode = btrfs_inode_mode(leaf, inode_item); | 2541 | inode->i_mode = btrfs_inode_mode(leaf, inode_item); |
2433 | inode->i_nlink = btrfs_inode_nlink(leaf, inode_item); | 2542 | inode->i_nlink = btrfs_inode_nlink(leaf, inode_item); |
@@ -2456,21 +2565,22 @@ static void btrfs_read_locked_inode(struct inode *inode) | |||
2456 | 2565 | ||
2457 | BTRFS_I(inode)->index_cnt = (u64)-1; | 2566 | BTRFS_I(inode)->index_cnt = (u64)-1; |
2458 | BTRFS_I(inode)->flags = btrfs_inode_flags(leaf, inode_item); | 2567 | BTRFS_I(inode)->flags = btrfs_inode_flags(leaf, inode_item); |
2459 | 2568 | cache_acl: | |
2460 | alloc_group_block = btrfs_inode_block_group(leaf, inode_item); | ||
2461 | |||
2462 | /* | 2569 | /* |
2463 | * try to precache a NULL acl entry for files that don't have | 2570 | * try to precache a NULL acl entry for files that don't have |
2464 | * any xattrs or acls | 2571 | * any xattrs or acls |
2465 | */ | 2572 | */ |
2466 | maybe_acls = acls_after_inode_item(leaf, path->slots[0], inode->i_ino); | 2573 | maybe_acls = acls_after_inode_item(leaf, path->slots[0], |
2574 | btrfs_ino(inode)); | ||
2467 | if (!maybe_acls) | 2575 | if (!maybe_acls) |
2468 | cache_no_acl(inode); | 2576 | cache_no_acl(inode); |
2469 | 2577 | ||
2470 | BTRFS_I(inode)->block_group = btrfs_find_block_group(root, 0, | 2578 | if (leaf->map_token) { |
2471 | alloc_group_block, 0); | 2579 | unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); |
2580 | leaf->map_token = NULL; | ||
2581 | } | ||
2582 | |||
2472 | btrfs_free_path(path); | 2583 | btrfs_free_path(path); |
2473 | inode_item = NULL; | ||
2474 | 2584 | ||
2475 | switch (inode->i_mode & S_IFMT) { | 2585 | switch (inode->i_mode & S_IFMT) { |
2476 | case S_IFREG: | 2586 | case S_IFREG: |
@@ -2514,6 +2624,13 @@ static void fill_inode_item(struct btrfs_trans_handle *trans, | |||
2514 | struct btrfs_inode_item *item, | 2624 | struct btrfs_inode_item *item, |
2515 | struct inode *inode) | 2625 | struct inode *inode) |
2516 | { | 2626 | { |
2627 | if (!leaf->map_token) | ||
2628 | map_private_extent_buffer(leaf, (unsigned long)item, | ||
2629 | sizeof(struct btrfs_inode_item), | ||
2630 | &leaf->map_token, &leaf->kaddr, | ||
2631 | &leaf->map_start, &leaf->map_len, | ||
2632 | KM_USER1); | ||
2633 | |||
2517 | btrfs_set_inode_uid(leaf, item, inode->i_uid); | 2634 | btrfs_set_inode_uid(leaf, item, inode->i_uid); |
2518 | btrfs_set_inode_gid(leaf, item, inode->i_gid); | 2635 | btrfs_set_inode_gid(leaf, item, inode->i_gid); |
2519 | btrfs_set_inode_size(leaf, item, BTRFS_I(inode)->disk_i_size); | 2636 | btrfs_set_inode_size(leaf, item, BTRFS_I(inode)->disk_i_size); |
@@ -2541,7 +2658,12 @@ static void fill_inode_item(struct btrfs_trans_handle *trans, | |||
2541 | btrfs_set_inode_transid(leaf, item, trans->transid); | 2658 | btrfs_set_inode_transid(leaf, item, trans->transid); |
2542 | btrfs_set_inode_rdev(leaf, item, inode->i_rdev); | 2659 | btrfs_set_inode_rdev(leaf, item, inode->i_rdev); |
2543 | btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags); | 2660 | btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags); |
2544 | btrfs_set_inode_block_group(leaf, item, BTRFS_I(inode)->block_group); | 2661 | btrfs_set_inode_block_group(leaf, item, 0); |
2662 | |||
2663 | if (leaf->map_token) { | ||
2664 | unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); | ||
2665 | leaf->map_token = NULL; | ||
2666 | } | ||
2545 | } | 2667 | } |
2546 | 2668 | ||
2547 | /* | 2669 | /* |
@@ -2555,11 +2677,28 @@ noinline int btrfs_update_inode(struct btrfs_trans_handle *trans, | |||
2555 | struct extent_buffer *leaf; | 2677 | struct extent_buffer *leaf; |
2556 | int ret; | 2678 | int ret; |
2557 | 2679 | ||
2680 | /* | ||
2681 | * If the inode is a free space inode, we can deadlock during commit | ||
2682 | * if we put it into the delayed code. | ||
2683 | * | ||
2684 | * The data relocation inode should also be directly updated | ||
2685 | * without delay | ||
2686 | */ | ||
2687 | if (!is_free_space_inode(root, inode) | ||
2688 | && root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID) { | ||
2689 | ret = btrfs_delayed_update_inode(trans, root, inode); | ||
2690 | if (!ret) | ||
2691 | btrfs_set_inode_last_trans(trans, inode); | ||
2692 | return ret; | ||
2693 | } | ||
2694 | |||
2558 | path = btrfs_alloc_path(); | 2695 | path = btrfs_alloc_path(); |
2559 | BUG_ON(!path); | 2696 | if (!path) |
2697 | return -ENOMEM; | ||
2698 | |||
2560 | path->leave_spinning = 1; | 2699 | path->leave_spinning = 1; |
2561 | ret = btrfs_lookup_inode(trans, root, path, | 2700 | ret = btrfs_lookup_inode(trans, root, path, &BTRFS_I(inode)->location, |
2562 | &BTRFS_I(inode)->location, 1); | 2701 | 1); |
2563 | if (ret) { | 2702 | if (ret) { |
2564 | if (ret > 0) | 2703 | if (ret > 0) |
2565 | ret = -ENOENT; | 2704 | ret = -ENOENT; |
@@ -2569,7 +2708,7 @@ noinline int btrfs_update_inode(struct btrfs_trans_handle *trans, | |||
2569 | btrfs_unlock_up_safe(path, 1); | 2708 | btrfs_unlock_up_safe(path, 1); |
2570 | leaf = path->nodes[0]; | 2709 | leaf = path->nodes[0]; |
2571 | inode_item = btrfs_item_ptr(leaf, path->slots[0], | 2710 | inode_item = btrfs_item_ptr(leaf, path->slots[0], |
2572 | struct btrfs_inode_item); | 2711 | struct btrfs_inode_item); |
2573 | 2712 | ||
2574 | fill_inode_item(trans, leaf, inode_item, inode); | 2713 | fill_inode_item(trans, leaf, inode_item, inode); |
2575 | btrfs_mark_buffer_dirty(leaf); | 2714 | btrfs_mark_buffer_dirty(leaf); |
@@ -2580,16 +2719,15 @@ failed: | |||
2580 | return ret; | 2719 | return ret; |
2581 | } | 2720 | } |
2582 | 2721 | ||
2583 | |||
2584 | /* | 2722 | /* |
2585 | * unlink helper that gets used here in inode.c and in the tree logging | 2723 | * unlink helper that gets used here in inode.c and in the tree logging |
2586 | * recovery code. It remove a link in a directory with a given name, and | 2724 | * recovery code. It remove a link in a directory with a given name, and |
2587 | * also drops the back refs in the inode to the directory | 2725 | * also drops the back refs in the inode to the directory |
2588 | */ | 2726 | */ |
2589 | int btrfs_unlink_inode(struct btrfs_trans_handle *trans, | 2727 | static int __btrfs_unlink_inode(struct btrfs_trans_handle *trans, |
2590 | struct btrfs_root *root, | 2728 | struct btrfs_root *root, |
2591 | struct inode *dir, struct inode *inode, | 2729 | struct inode *dir, struct inode *inode, |
2592 | const char *name, int name_len) | 2730 | const char *name, int name_len) |
2593 | { | 2731 | { |
2594 | struct btrfs_path *path; | 2732 | struct btrfs_path *path; |
2595 | int ret = 0; | 2733 | int ret = 0; |
@@ -2597,15 +2735,17 @@ int btrfs_unlink_inode(struct btrfs_trans_handle *trans, | |||
2597 | struct btrfs_dir_item *di; | 2735 | struct btrfs_dir_item *di; |
2598 | struct btrfs_key key; | 2736 | struct btrfs_key key; |
2599 | u64 index; | 2737 | u64 index; |
2738 | u64 ino = btrfs_ino(inode); | ||
2739 | u64 dir_ino = btrfs_ino(dir); | ||
2600 | 2740 | ||
2601 | path = btrfs_alloc_path(); | 2741 | path = btrfs_alloc_path(); |
2602 | if (!path) { | 2742 | if (!path) { |
2603 | ret = -ENOMEM; | 2743 | ret = -ENOMEM; |
2604 | goto err; | 2744 | goto out; |
2605 | } | 2745 | } |
2606 | 2746 | ||
2607 | path->leave_spinning = 1; | 2747 | path->leave_spinning = 1; |
2608 | di = btrfs_lookup_dir_item(trans, root, path, dir->i_ino, | 2748 | di = btrfs_lookup_dir_item(trans, root, path, dir_ino, |
2609 | name, name_len, -1); | 2749 | name, name_len, -1); |
2610 | if (IS_ERR(di)) { | 2750 | if (IS_ERR(di)) { |
2611 | ret = PTR_ERR(di); | 2751 | ret = PTR_ERR(di); |
@@ -2620,38 +2760,29 @@ int btrfs_unlink_inode(struct btrfs_trans_handle *trans, | |||
2620 | ret = btrfs_delete_one_dir_name(trans, root, path, di); | 2760 | ret = btrfs_delete_one_dir_name(trans, root, path, di); |
2621 | if (ret) | 2761 | if (ret) |
2622 | goto err; | 2762 | goto err; |
2623 | btrfs_release_path(root, path); | 2763 | btrfs_release_path(path); |
2624 | 2764 | ||
2625 | ret = btrfs_del_inode_ref(trans, root, name, name_len, | 2765 | ret = btrfs_del_inode_ref(trans, root, name, name_len, ino, |
2626 | inode->i_ino, | 2766 | dir_ino, &index); |
2627 | dir->i_ino, &index); | ||
2628 | if (ret) { | 2767 | if (ret) { |
2629 | printk(KERN_INFO "btrfs failed to delete reference to %.*s, " | 2768 | printk(KERN_INFO "btrfs failed to delete reference to %.*s, " |
2630 | "inode %lu parent %lu\n", name_len, name, | 2769 | "inode %llu parent %llu\n", name_len, name, |
2631 | inode->i_ino, dir->i_ino); | 2770 | (unsigned long long)ino, (unsigned long long)dir_ino); |
2632 | goto err; | 2771 | goto err; |
2633 | } | 2772 | } |
2634 | 2773 | ||
2635 | di = btrfs_lookup_dir_index_item(trans, root, path, dir->i_ino, | 2774 | ret = btrfs_delete_delayed_dir_index(trans, root, dir, index); |
2636 | index, name, name_len, -1); | 2775 | if (ret) |
2637 | if (IS_ERR(di)) { | ||
2638 | ret = PTR_ERR(di); | ||
2639 | goto err; | ||
2640 | } | ||
2641 | if (!di) { | ||
2642 | ret = -ENOENT; | ||
2643 | goto err; | 2776 | goto err; |
2644 | } | ||
2645 | ret = btrfs_delete_one_dir_name(trans, root, path, di); | ||
2646 | btrfs_release_path(root, path); | ||
2647 | 2777 | ||
2648 | ret = btrfs_del_inode_ref_in_log(trans, root, name, name_len, | 2778 | ret = btrfs_del_inode_ref_in_log(trans, root, name, name_len, |
2649 | inode, dir->i_ino); | 2779 | inode, dir_ino); |
2650 | BUG_ON(ret != 0 && ret != -ENOENT); | 2780 | BUG_ON(ret != 0 && ret != -ENOENT); |
2651 | 2781 | ||
2652 | ret = btrfs_del_dir_entries_in_log(trans, root, name, name_len, | 2782 | ret = btrfs_del_dir_entries_in_log(trans, root, name, name_len, |
2653 | dir, index); | 2783 | dir, index); |
2654 | BUG_ON(ret); | 2784 | if (ret == -ENOENT) |
2785 | ret = 0; | ||
2655 | err: | 2786 | err: |
2656 | btrfs_free_path(path); | 2787 | btrfs_free_path(path); |
2657 | if (ret) | 2788 | if (ret) |
@@ -2660,22 +2791,36 @@ err: | |||
2660 | btrfs_i_size_write(dir, dir->i_size - name_len * 2); | 2791 | btrfs_i_size_write(dir, dir->i_size - name_len * 2); |
2661 | inode->i_ctime = dir->i_mtime = dir->i_ctime = CURRENT_TIME; | 2792 | inode->i_ctime = dir->i_mtime = dir->i_ctime = CURRENT_TIME; |
2662 | btrfs_update_inode(trans, root, dir); | 2793 | btrfs_update_inode(trans, root, dir); |
2663 | btrfs_drop_nlink(inode); | ||
2664 | ret = btrfs_update_inode(trans, root, inode); | ||
2665 | out: | 2794 | out: |
2666 | return ret; | 2795 | return ret; |
2667 | } | 2796 | } |
2668 | 2797 | ||
2798 | int btrfs_unlink_inode(struct btrfs_trans_handle *trans, | ||
2799 | struct btrfs_root *root, | ||
2800 | struct inode *dir, struct inode *inode, | ||
2801 | const char *name, int name_len) | ||
2802 | { | ||
2803 | int ret; | ||
2804 | ret = __btrfs_unlink_inode(trans, root, dir, inode, name, name_len); | ||
2805 | if (!ret) { | ||
2806 | btrfs_drop_nlink(inode); | ||
2807 | ret = btrfs_update_inode(trans, root, inode); | ||
2808 | } | ||
2809 | return ret; | ||
2810 | } | ||
2811 | |||
2812 | |||
2669 | /* helper to check if there is any shared block in the path */ | 2813 | /* helper to check if there is any shared block in the path */ |
2670 | static int check_path_shared(struct btrfs_root *root, | 2814 | static int check_path_shared(struct btrfs_root *root, |
2671 | struct btrfs_path *path) | 2815 | struct btrfs_path *path) |
2672 | { | 2816 | { |
2673 | struct extent_buffer *eb; | 2817 | struct extent_buffer *eb; |
2674 | int level; | 2818 | int level; |
2675 | int ret; | ||
2676 | u64 refs = 1; | 2819 | u64 refs = 1; |
2677 | 2820 | ||
2678 | for (level = 0; level < BTRFS_MAX_LEVEL; level++) { | 2821 | for (level = 0; level < BTRFS_MAX_LEVEL; level++) { |
2822 | int ret; | ||
2823 | |||
2679 | if (!path->nodes[level]) | 2824 | if (!path->nodes[level]) |
2680 | break; | 2825 | break; |
2681 | eb = path->nodes[level]; | 2826 | eb = path->nodes[level]; |
@@ -2709,12 +2854,14 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir, | |||
2709 | int check_link = 1; | 2854 | int check_link = 1; |
2710 | int err = -ENOSPC; | 2855 | int err = -ENOSPC; |
2711 | int ret; | 2856 | int ret; |
2857 | u64 ino = btrfs_ino(inode); | ||
2858 | u64 dir_ino = btrfs_ino(dir); | ||
2712 | 2859 | ||
2713 | trans = btrfs_start_transaction(root, 10); | 2860 | trans = btrfs_start_transaction(root, 10); |
2714 | if (!IS_ERR(trans) || PTR_ERR(trans) != -ENOSPC) | 2861 | if (!IS_ERR(trans) || PTR_ERR(trans) != -ENOSPC) |
2715 | return trans; | 2862 | return trans; |
2716 | 2863 | ||
2717 | if (inode->i_ino == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID) | 2864 | if (ino == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID) |
2718 | return ERR_PTR(-ENOSPC); | 2865 | return ERR_PTR(-ENOSPC); |
2719 | 2866 | ||
2720 | /* check if there is someone else holds reference */ | 2867 | /* check if there is someone else holds reference */ |
@@ -2755,7 +2902,7 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir, | |||
2755 | } else { | 2902 | } else { |
2756 | check_link = 0; | 2903 | check_link = 0; |
2757 | } | 2904 | } |
2758 | btrfs_release_path(root, path); | 2905 | btrfs_release_path(path); |
2759 | 2906 | ||
2760 | ret = btrfs_lookup_inode(trans, root, path, | 2907 | ret = btrfs_lookup_inode(trans, root, path, |
2761 | &BTRFS_I(inode)->location, 0); | 2908 | &BTRFS_I(inode)->location, 0); |
@@ -2769,11 +2916,11 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir, | |||
2769 | } else { | 2916 | } else { |
2770 | check_link = 0; | 2917 | check_link = 0; |
2771 | } | 2918 | } |
2772 | btrfs_release_path(root, path); | 2919 | btrfs_release_path(path); |
2773 | 2920 | ||
2774 | if (ret == 0 && S_ISREG(inode->i_mode)) { | 2921 | if (ret == 0 && S_ISREG(inode->i_mode)) { |
2775 | ret = btrfs_lookup_file_extent(trans, root, path, | 2922 | ret = btrfs_lookup_file_extent(trans, root, path, |
2776 | inode->i_ino, (u64)-1, 0); | 2923 | ino, (u64)-1, 0); |
2777 | if (ret < 0) { | 2924 | if (ret < 0) { |
2778 | err = ret; | 2925 | err = ret; |
2779 | goto out; | 2926 | goto out; |
@@ -2781,7 +2928,7 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir, | |||
2781 | BUG_ON(ret == 0); | 2928 | BUG_ON(ret == 0); |
2782 | if (check_path_shared(root, path)) | 2929 | if (check_path_shared(root, path)) |
2783 | goto out; | 2930 | goto out; |
2784 | btrfs_release_path(root, path); | 2931 | btrfs_release_path(path); |
2785 | } | 2932 | } |
2786 | 2933 | ||
2787 | if (!check_link) { | 2934 | if (!check_link) { |
@@ -2789,7 +2936,7 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir, | |||
2789 | goto out; | 2936 | goto out; |
2790 | } | 2937 | } |
2791 | 2938 | ||
2792 | di = btrfs_lookup_dir_item(trans, root, path, dir->i_ino, | 2939 | di = btrfs_lookup_dir_item(trans, root, path, dir_ino, |
2793 | dentry->d_name.name, dentry->d_name.len, 0); | 2940 | dentry->d_name.name, dentry->d_name.len, 0); |
2794 | if (IS_ERR(di)) { | 2941 | if (IS_ERR(di)) { |
2795 | err = PTR_ERR(di); | 2942 | err = PTR_ERR(di); |
@@ -2802,11 +2949,11 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir, | |||
2802 | err = 0; | 2949 | err = 0; |
2803 | goto out; | 2950 | goto out; |
2804 | } | 2951 | } |
2805 | btrfs_release_path(root, path); | 2952 | btrfs_release_path(path); |
2806 | 2953 | ||
2807 | ref = btrfs_lookup_inode_ref(trans, root, path, | 2954 | ref = btrfs_lookup_inode_ref(trans, root, path, |
2808 | dentry->d_name.name, dentry->d_name.len, | 2955 | dentry->d_name.name, dentry->d_name.len, |
2809 | inode->i_ino, dir->i_ino, 0); | 2956 | ino, dir_ino, 0); |
2810 | if (IS_ERR(ref)) { | 2957 | if (IS_ERR(ref)) { |
2811 | err = PTR_ERR(ref); | 2958 | err = PTR_ERR(ref); |
2812 | goto out; | 2959 | goto out; |
@@ -2815,9 +2962,17 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir, | |||
2815 | if (check_path_shared(root, path)) | 2962 | if (check_path_shared(root, path)) |
2816 | goto out; | 2963 | goto out; |
2817 | index = btrfs_inode_ref_index(path->nodes[0], ref); | 2964 | index = btrfs_inode_ref_index(path->nodes[0], ref); |
2818 | btrfs_release_path(root, path); | 2965 | btrfs_release_path(path); |
2819 | 2966 | ||
2820 | di = btrfs_lookup_dir_index_item(trans, root, path, dir->i_ino, index, | 2967 | /* |
2968 | * This is a commit root search, if we can lookup inode item and other | ||
2969 | * relative items in the commit root, it means the transaction of | ||
2970 | * dir/file creation has been committed, and the dir index item that we | ||
2971 | * delay to insert has also been inserted into the commit root. So | ||
2972 | * we needn't worry about the delayed insertion of the dir index item | ||
2973 | * here. | ||
2974 | */ | ||
2975 | di = btrfs_lookup_dir_index_item(trans, root, path, dir_ino, index, | ||
2821 | dentry->d_name.name, dentry->d_name.len, 0); | 2976 | dentry->d_name.name, dentry->d_name.len, 0); |
2822 | if (IS_ERR(di)) { | 2977 | if (IS_ERR(di)) { |
2823 | err = PTR_ERR(di); | 2978 | err = PTR_ERR(di); |
@@ -2862,8 +3017,6 @@ static int btrfs_unlink(struct inode *dir, struct dentry *dentry) | |||
2862 | if (IS_ERR(trans)) | 3017 | if (IS_ERR(trans)) |
2863 | return PTR_ERR(trans); | 3018 | return PTR_ERR(trans); |
2864 | 3019 | ||
2865 | btrfs_set_trans_block_group(trans, dir); | ||
2866 | |||
2867 | btrfs_record_unlink_dir(trans, dir, dentry->d_inode, 0); | 3020 | btrfs_record_unlink_dir(trans, dir, dentry->d_inode, 0); |
2868 | 3021 | ||
2869 | ret = btrfs_unlink_inode(trans, root, dir, dentry->d_inode, | 3022 | ret = btrfs_unlink_inode(trans, root, dir, dentry->d_inode, |
@@ -2892,47 +3045,41 @@ int btrfs_unlink_subvol(struct btrfs_trans_handle *trans, | |||
2892 | struct btrfs_key key; | 3045 | struct btrfs_key key; |
2893 | u64 index; | 3046 | u64 index; |
2894 | int ret; | 3047 | int ret; |
3048 | u64 dir_ino = btrfs_ino(dir); | ||
2895 | 3049 | ||
2896 | path = btrfs_alloc_path(); | 3050 | path = btrfs_alloc_path(); |
2897 | if (!path) | 3051 | if (!path) |
2898 | return -ENOMEM; | 3052 | return -ENOMEM; |
2899 | 3053 | ||
2900 | di = btrfs_lookup_dir_item(trans, root, path, dir->i_ino, | 3054 | di = btrfs_lookup_dir_item(trans, root, path, dir_ino, |
2901 | name, name_len, -1); | 3055 | name, name_len, -1); |
2902 | BUG_ON(!di || IS_ERR(di)); | 3056 | BUG_ON(IS_ERR_OR_NULL(di)); |
2903 | 3057 | ||
2904 | leaf = path->nodes[0]; | 3058 | leaf = path->nodes[0]; |
2905 | btrfs_dir_item_key_to_cpu(leaf, di, &key); | 3059 | btrfs_dir_item_key_to_cpu(leaf, di, &key); |
2906 | WARN_ON(key.type != BTRFS_ROOT_ITEM_KEY || key.objectid != objectid); | 3060 | WARN_ON(key.type != BTRFS_ROOT_ITEM_KEY || key.objectid != objectid); |
2907 | ret = btrfs_delete_one_dir_name(trans, root, path, di); | 3061 | ret = btrfs_delete_one_dir_name(trans, root, path, di); |
2908 | BUG_ON(ret); | 3062 | BUG_ON(ret); |
2909 | btrfs_release_path(root, path); | 3063 | btrfs_release_path(path); |
2910 | 3064 | ||
2911 | ret = btrfs_del_root_ref(trans, root->fs_info->tree_root, | 3065 | ret = btrfs_del_root_ref(trans, root->fs_info->tree_root, |
2912 | objectid, root->root_key.objectid, | 3066 | objectid, root->root_key.objectid, |
2913 | dir->i_ino, &index, name, name_len); | 3067 | dir_ino, &index, name, name_len); |
2914 | if (ret < 0) { | 3068 | if (ret < 0) { |
2915 | BUG_ON(ret != -ENOENT); | 3069 | BUG_ON(ret != -ENOENT); |
2916 | di = btrfs_search_dir_index_item(root, path, dir->i_ino, | 3070 | di = btrfs_search_dir_index_item(root, path, dir_ino, |
2917 | name, name_len); | 3071 | name, name_len); |
2918 | BUG_ON(!di || IS_ERR(di)); | 3072 | BUG_ON(IS_ERR_OR_NULL(di)); |
2919 | 3073 | ||
2920 | leaf = path->nodes[0]; | 3074 | leaf = path->nodes[0]; |
2921 | btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); | 3075 | btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); |
2922 | btrfs_release_path(root, path); | 3076 | btrfs_release_path(path); |
2923 | index = key.offset; | 3077 | index = key.offset; |
2924 | } | 3078 | } |
3079 | btrfs_release_path(path); | ||
2925 | 3080 | ||
2926 | di = btrfs_lookup_dir_index_item(trans, root, path, dir->i_ino, | 3081 | ret = btrfs_delete_delayed_dir_index(trans, root, dir, index); |
2927 | index, name, name_len, -1); | ||
2928 | BUG_ON(!di || IS_ERR(di)); | ||
2929 | |||
2930 | leaf = path->nodes[0]; | ||
2931 | btrfs_dir_item_key_to_cpu(leaf, di, &key); | ||
2932 | WARN_ON(key.type != BTRFS_ROOT_ITEM_KEY || key.objectid != objectid); | ||
2933 | ret = btrfs_delete_one_dir_name(trans, root, path, di); | ||
2934 | BUG_ON(ret); | 3082 | BUG_ON(ret); |
2935 | btrfs_release_path(root, path); | ||
2936 | 3083 | ||
2937 | btrfs_i_size_write(dir, dir->i_size - name_len * 2); | 3084 | btrfs_i_size_write(dir, dir->i_size - name_len * 2); |
2938 | dir->i_mtime = dir->i_ctime = CURRENT_TIME; | 3085 | dir->i_mtime = dir->i_ctime = CURRENT_TIME; |
@@ -2952,16 +3099,14 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
2952 | unsigned long nr = 0; | 3099 | unsigned long nr = 0; |
2953 | 3100 | ||
2954 | if (inode->i_size > BTRFS_EMPTY_DIR_SIZE || | 3101 | if (inode->i_size > BTRFS_EMPTY_DIR_SIZE || |
2955 | inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) | 3102 | btrfs_ino(inode) == BTRFS_FIRST_FREE_OBJECTID) |
2956 | return -ENOTEMPTY; | 3103 | return -ENOTEMPTY; |
2957 | 3104 | ||
2958 | trans = __unlink_start_trans(dir, dentry); | 3105 | trans = __unlink_start_trans(dir, dentry); |
2959 | if (IS_ERR(trans)) | 3106 | if (IS_ERR(trans)) |
2960 | return PTR_ERR(trans); | 3107 | return PTR_ERR(trans); |
2961 | 3108 | ||
2962 | btrfs_set_trans_block_group(trans, dir); | 3109 | if (unlikely(btrfs_ino(inode) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) { |
2963 | |||
2964 | if (unlikely(inode->i_ino == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) { | ||
2965 | err = btrfs_unlink_subvol(trans, root, dir, | 3110 | err = btrfs_unlink_subvol(trans, root, dir, |
2966 | BTRFS_I(inode)->location.objectid, | 3111 | BTRFS_I(inode)->location.objectid, |
2967 | dentry->d_name.name, | 3112 | dentry->d_name.name, |
@@ -2986,178 +3131,6 @@ out: | |||
2986 | return err; | 3131 | return err; |
2987 | } | 3132 | } |
2988 | 3133 | ||
2989 | #if 0 | ||
2990 | /* | ||
2991 | * when truncating bytes in a file, it is possible to avoid reading | ||
2992 | * the leaves that contain only checksum items. This can be the | ||
2993 | * majority of the IO required to delete a large file, but it must | ||
2994 | * be done carefully. | ||
2995 | * | ||
2996 | * The keys in the level just above the leaves are checked to make sure | ||
2997 | * the lowest key in a given leaf is a csum key, and starts at an offset | ||
2998 | * after the new size. | ||
2999 | * | ||
3000 | * Then the key for the next leaf is checked to make sure it also has | ||
3001 | * a checksum item for the same file. If it does, we know our target leaf | ||
3002 | * contains only checksum items, and it can be safely freed without reading | ||
3003 | * it. | ||
3004 | * | ||
3005 | * This is just an optimization targeted at large files. It may do | ||
3006 | * nothing. It will return 0 unless things went badly. | ||
3007 | */ | ||
3008 | static noinline int drop_csum_leaves(struct btrfs_trans_handle *trans, | ||
3009 | struct btrfs_root *root, | ||
3010 | struct btrfs_path *path, | ||
3011 | struct inode *inode, u64 new_size) | ||
3012 | { | ||
3013 | struct btrfs_key key; | ||
3014 | int ret; | ||
3015 | int nritems; | ||
3016 | struct btrfs_key found_key; | ||
3017 | struct btrfs_key other_key; | ||
3018 | struct btrfs_leaf_ref *ref; | ||
3019 | u64 leaf_gen; | ||
3020 | u64 leaf_start; | ||
3021 | |||
3022 | path->lowest_level = 1; | ||
3023 | key.objectid = inode->i_ino; | ||
3024 | key.type = BTRFS_CSUM_ITEM_KEY; | ||
3025 | key.offset = new_size; | ||
3026 | again: | ||
3027 | ret = btrfs_search_slot(trans, root, &key, path, -1, 1); | ||
3028 | if (ret < 0) | ||
3029 | goto out; | ||
3030 | |||
3031 | if (path->nodes[1] == NULL) { | ||
3032 | ret = 0; | ||
3033 | goto out; | ||
3034 | } | ||
3035 | ret = 0; | ||
3036 | btrfs_node_key_to_cpu(path->nodes[1], &found_key, path->slots[1]); | ||
3037 | nritems = btrfs_header_nritems(path->nodes[1]); | ||
3038 | |||
3039 | if (!nritems) | ||
3040 | goto out; | ||
3041 | |||
3042 | if (path->slots[1] >= nritems) | ||
3043 | goto next_node; | ||
3044 | |||
3045 | /* did we find a key greater than anything we want to delete? */ | ||
3046 | if (found_key.objectid > inode->i_ino || | ||
3047 | (found_key.objectid == inode->i_ino && found_key.type > key.type)) | ||
3048 | goto out; | ||
3049 | |||
3050 | /* we check the next key in the node to make sure the leave contains | ||
3051 | * only checksum items. This comparison doesn't work if our | ||
3052 | * leaf is the last one in the node | ||
3053 | */ | ||
3054 | if (path->slots[1] + 1 >= nritems) { | ||
3055 | next_node: | ||
3056 | /* search forward from the last key in the node, this | ||
3057 | * will bring us into the next node in the tree | ||
3058 | */ | ||
3059 | btrfs_node_key_to_cpu(path->nodes[1], &found_key, nritems - 1); | ||
3060 | |||
3061 | /* unlikely, but we inc below, so check to be safe */ | ||
3062 | if (found_key.offset == (u64)-1) | ||
3063 | goto out; | ||
3064 | |||
3065 | /* search_forward needs a path with locks held, do the | ||
3066 | * search again for the original key. It is possible | ||
3067 | * this will race with a balance and return a path that | ||
3068 | * we could modify, but this drop is just an optimization | ||
3069 | * and is allowed to miss some leaves. | ||
3070 | */ | ||
3071 | btrfs_release_path(root, path); | ||
3072 | found_key.offset++; | ||
3073 | |||
3074 | /* setup a max key for search_forward */ | ||
3075 | other_key.offset = (u64)-1; | ||
3076 | other_key.type = key.type; | ||
3077 | other_key.objectid = key.objectid; | ||
3078 | |||
3079 | path->keep_locks = 1; | ||
3080 | ret = btrfs_search_forward(root, &found_key, &other_key, | ||
3081 | path, 0, 0); | ||
3082 | path->keep_locks = 0; | ||
3083 | if (ret || found_key.objectid != key.objectid || | ||
3084 | found_key.type != key.type) { | ||
3085 | ret = 0; | ||
3086 | goto out; | ||
3087 | } | ||
3088 | |||
3089 | key.offset = found_key.offset; | ||
3090 | btrfs_release_path(root, path); | ||
3091 | cond_resched(); | ||
3092 | goto again; | ||
3093 | } | ||
3094 | |||
3095 | /* we know there's one more slot after us in the tree, | ||
3096 | * read that key so we can verify it is also a checksum item | ||
3097 | */ | ||
3098 | btrfs_node_key_to_cpu(path->nodes[1], &other_key, path->slots[1] + 1); | ||
3099 | |||
3100 | if (found_key.objectid < inode->i_ino) | ||
3101 | goto next_key; | ||
3102 | |||
3103 | if (found_key.type != key.type || found_key.offset < new_size) | ||
3104 | goto next_key; | ||
3105 | |||
3106 | /* | ||
3107 | * if the key for the next leaf isn't a csum key from this objectid, | ||
3108 | * we can't be sure there aren't good items inside this leaf. | ||
3109 | * Bail out | ||
3110 | */ | ||
3111 | if (other_key.objectid != inode->i_ino || other_key.type != key.type) | ||
3112 | goto out; | ||
3113 | |||
3114 | leaf_start = btrfs_node_blockptr(path->nodes[1], path->slots[1]); | ||
3115 | leaf_gen = btrfs_node_ptr_generation(path->nodes[1], path->slots[1]); | ||
3116 | /* | ||
3117 | * it is safe to delete this leaf, it contains only | ||
3118 | * csum items from this inode at an offset >= new_size | ||
3119 | */ | ||
3120 | ret = btrfs_del_leaf(trans, root, path, leaf_start); | ||
3121 | BUG_ON(ret); | ||
3122 | |||
3123 | if (root->ref_cows && leaf_gen < trans->transid) { | ||
3124 | ref = btrfs_alloc_leaf_ref(root, 0); | ||
3125 | if (ref) { | ||
3126 | ref->root_gen = root->root_key.offset; | ||
3127 | ref->bytenr = leaf_start; | ||
3128 | ref->owner = 0; | ||
3129 | ref->generation = leaf_gen; | ||
3130 | ref->nritems = 0; | ||
3131 | |||
3132 | btrfs_sort_leaf_ref(ref); | ||
3133 | |||
3134 | ret = btrfs_add_leaf_ref(root, ref, 0); | ||
3135 | WARN_ON(ret); | ||
3136 | btrfs_free_leaf_ref(root, ref); | ||
3137 | } else { | ||
3138 | WARN_ON(1); | ||
3139 | } | ||
3140 | } | ||
3141 | next_key: | ||
3142 | btrfs_release_path(root, path); | ||
3143 | |||
3144 | if (other_key.objectid == inode->i_ino && | ||
3145 | other_key.type == key.type && other_key.offset > key.offset) { | ||
3146 | key.offset = other_key.offset; | ||
3147 | cond_resched(); | ||
3148 | goto again; | ||
3149 | } | ||
3150 | ret = 0; | ||
3151 | out: | ||
3152 | /* fixup any changes we've made to the path */ | ||
3153 | path->lowest_level = 0; | ||
3154 | path->keep_locks = 0; | ||
3155 | btrfs_release_path(root, path); | ||
3156 | return ret; | ||
3157 | } | ||
3158 | |||
3159 | #endif | ||
3160 | |||
3161 | /* | 3134 | /* |
3162 | * this can truncate away extent items, csum items and directory items. | 3135 | * this can truncate away extent items, csum items and directory items. |
3163 | * It starts at a high offset and removes keys until it can't find | 3136 | * It starts at a high offset and removes keys until it can't find |
@@ -3193,17 +3166,27 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, | |||
3193 | int encoding; | 3166 | int encoding; |
3194 | int ret; | 3167 | int ret; |
3195 | int err = 0; | 3168 | int err = 0; |
3169 | u64 ino = btrfs_ino(inode); | ||
3196 | 3170 | ||
3197 | BUG_ON(new_size > 0 && min_type != BTRFS_EXTENT_DATA_KEY); | 3171 | BUG_ON(new_size > 0 && min_type != BTRFS_EXTENT_DATA_KEY); |
3198 | 3172 | ||
3199 | if (root->ref_cows) | 3173 | if (root->ref_cows || root == root->fs_info->tree_root) |
3200 | btrfs_drop_extent_cache(inode, new_size & (~mask), (u64)-1, 0); | 3174 | btrfs_drop_extent_cache(inode, new_size & (~mask), (u64)-1, 0); |
3201 | 3175 | ||
3176 | /* | ||
3177 | * This function is also used to drop the items in the log tree before | ||
3178 | * we relog the inode, so if root != BTRFS_I(inode)->root, it means | ||
3179 | * it is used to drop the loged items. So we shouldn't kill the delayed | ||
3180 | * items. | ||
3181 | */ | ||
3182 | if (min_type == 0 && root == BTRFS_I(inode)->root) | ||
3183 | btrfs_kill_delayed_inode_items(inode); | ||
3184 | |||
3202 | path = btrfs_alloc_path(); | 3185 | path = btrfs_alloc_path(); |
3203 | BUG_ON(!path); | 3186 | BUG_ON(!path); |
3204 | path->reada = -1; | 3187 | path->reada = -1; |
3205 | 3188 | ||
3206 | key.objectid = inode->i_ino; | 3189 | key.objectid = ino; |
3207 | key.offset = (u64)-1; | 3190 | key.offset = (u64)-1; |
3208 | key.type = (u8)-1; | 3191 | key.type = (u8)-1; |
3209 | 3192 | ||
@@ -3231,7 +3214,7 @@ search_again: | |||
3231 | found_type = btrfs_key_type(&found_key); | 3214 | found_type = btrfs_key_type(&found_key); |
3232 | encoding = 0; | 3215 | encoding = 0; |
3233 | 3216 | ||
3234 | if (found_key.objectid != inode->i_ino) | 3217 | if (found_key.objectid != ino) |
3235 | break; | 3218 | break; |
3236 | 3219 | ||
3237 | if (found_type < min_type) | 3220 | if (found_type < min_type) |
@@ -3321,7 +3304,6 @@ search_again: | |||
3321 | btrfs_file_extent_calc_inline_size(size); | 3304 | btrfs_file_extent_calc_inline_size(size); |
3322 | ret = btrfs_truncate_item(trans, root, path, | 3305 | ret = btrfs_truncate_item(trans, root, path, |
3323 | size, 1); | 3306 | size, 1); |
3324 | BUG_ON(ret); | ||
3325 | } else if (root->ref_cows) { | 3307 | } else if (root->ref_cows) { |
3326 | inode_sub_bytes(inode, item_end + 1 - | 3308 | inode_sub_bytes(inode, item_end + 1 - |
3327 | found_key.offset); | 3309 | found_key.offset); |
@@ -3344,12 +3326,13 @@ delete: | |||
3344 | } else { | 3326 | } else { |
3345 | break; | 3327 | break; |
3346 | } | 3328 | } |
3347 | if (found_extent && root->ref_cows) { | 3329 | if (found_extent && (root->ref_cows || |
3330 | root == root->fs_info->tree_root)) { | ||
3348 | btrfs_set_path_blocking(path); | 3331 | btrfs_set_path_blocking(path); |
3349 | ret = btrfs_free_extent(trans, root, extent_start, | 3332 | ret = btrfs_free_extent(trans, root, extent_start, |
3350 | extent_num_bytes, 0, | 3333 | extent_num_bytes, 0, |
3351 | btrfs_header_owner(leaf), | 3334 | btrfs_header_owner(leaf), |
3352 | inode->i_ino, extent_offset); | 3335 | ino, extent_offset); |
3353 | BUG_ON(ret); | 3336 | BUG_ON(ret); |
3354 | } | 3337 | } |
3355 | 3338 | ||
@@ -3358,7 +3341,9 @@ delete: | |||
3358 | 3341 | ||
3359 | if (path->slots[0] == 0 || | 3342 | if (path->slots[0] == 0 || |
3360 | path->slots[0] != pending_del_slot) { | 3343 | path->slots[0] != pending_del_slot) { |
3361 | if (root->ref_cows) { | 3344 | if (root->ref_cows && |
3345 | BTRFS_I(inode)->location.objectid != | ||
3346 | BTRFS_FREE_INO_OBJECTID) { | ||
3362 | err = -EAGAIN; | 3347 | err = -EAGAIN; |
3363 | goto out; | 3348 | goto out; |
3364 | } | 3349 | } |
@@ -3369,7 +3354,7 @@ delete: | |||
3369 | BUG_ON(ret); | 3354 | BUG_ON(ret); |
3370 | pending_del_nr = 0; | 3355 | pending_del_nr = 0; |
3371 | } | 3356 | } |
3372 | btrfs_release_path(root, path); | 3357 | btrfs_release_path(path); |
3373 | goto search_again; | 3358 | goto search_again; |
3374 | } else { | 3359 | } else { |
3375 | path->slots[0]--; | 3360 | path->slots[0]--; |
@@ -3485,7 +3470,13 @@ out: | |||
3485 | return ret; | 3470 | return ret; |
3486 | } | 3471 | } |
3487 | 3472 | ||
3488 | int btrfs_cont_expand(struct inode *inode, loff_t size) | 3473 | /* |
3474 | * This function puts in dummy file extents for the area we're creating a hole | ||
3475 | * for. So if we are truncating this file to a larger size we need to insert | ||
3476 | * these file extents so that btrfs_get_extent will return a EXTENT_MAP_HOLE for | ||
3477 | * the range between oldsize and size | ||
3478 | */ | ||
3479 | int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size) | ||
3489 | { | 3480 | { |
3490 | struct btrfs_trans_handle *trans; | 3481 | struct btrfs_trans_handle *trans; |
3491 | struct btrfs_root *root = BTRFS_I(inode)->root; | 3482 | struct btrfs_root *root = BTRFS_I(inode)->root; |
@@ -3493,7 +3484,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3493 | struct extent_map *em = NULL; | 3484 | struct extent_map *em = NULL; |
3494 | struct extent_state *cached_state = NULL; | 3485 | struct extent_state *cached_state = NULL; |
3495 | u64 mask = root->sectorsize - 1; | 3486 | u64 mask = root->sectorsize - 1; |
3496 | u64 hole_start = (inode->i_size + mask) & ~mask; | 3487 | u64 hole_start = (oldsize + mask) & ~mask; |
3497 | u64 block_end = (size + mask) & ~mask; | 3488 | u64 block_end = (size + mask) & ~mask; |
3498 | u64 last_byte; | 3489 | u64 last_byte; |
3499 | u64 cur_offset; | 3490 | u64 cur_offset; |
@@ -3521,7 +3512,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3521 | while (1) { | 3512 | while (1) { |
3522 | em = btrfs_get_extent(inode, NULL, 0, cur_offset, | 3513 | em = btrfs_get_extent(inode, NULL, 0, cur_offset, |
3523 | block_end - cur_offset, 0); | 3514 | block_end - cur_offset, 0); |
3524 | BUG_ON(IS_ERR(em) || !em); | 3515 | BUG_ON(IS_ERR_OR_NULL(em)); |
3525 | last_byte = min(extent_map_end(em), block_end); | 3516 | last_byte = min(extent_map_end(em), block_end); |
3526 | last_byte = (last_byte + mask) & ~mask; | 3517 | last_byte = (last_byte + mask) & ~mask; |
3527 | if (!test_bit(EXTENT_FLAG_PREALLOC, &em->flags)) { | 3518 | if (!test_bit(EXTENT_FLAG_PREALLOC, &em->flags)) { |
@@ -3533,18 +3524,19 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3533 | err = PTR_ERR(trans); | 3524 | err = PTR_ERR(trans); |
3534 | break; | 3525 | break; |
3535 | } | 3526 | } |
3536 | btrfs_set_trans_block_group(trans, inode); | ||
3537 | 3527 | ||
3538 | err = btrfs_drop_extents(trans, inode, cur_offset, | 3528 | err = btrfs_drop_extents(trans, inode, cur_offset, |
3539 | cur_offset + hole_size, | 3529 | cur_offset + hole_size, |
3540 | &hint_byte, 1); | 3530 | &hint_byte, 1); |
3541 | BUG_ON(err); | 3531 | if (err) |
3532 | break; | ||
3542 | 3533 | ||
3543 | err = btrfs_insert_file_extent(trans, root, | 3534 | err = btrfs_insert_file_extent(trans, root, |
3544 | inode->i_ino, cur_offset, 0, | 3535 | btrfs_ino(inode), cur_offset, 0, |
3545 | 0, hole_size, 0, hole_size, | 3536 | 0, hole_size, 0, hole_size, |
3546 | 0, 0, 0); | 3537 | 0, 0, 0); |
3547 | BUG_ON(err); | 3538 | if (err) |
3539 | break; | ||
3548 | 3540 | ||
3549 | btrfs_drop_extent_cache(inode, hole_start, | 3541 | btrfs_drop_extent_cache(inode, hole_start, |
3550 | last_byte - 1, 0); | 3542 | last_byte - 1, 0); |
@@ -3564,94 +3556,58 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3564 | return err; | 3556 | return err; |
3565 | } | 3557 | } |
3566 | 3558 | ||
3567 | static int btrfs_setattr_size(struct inode *inode, struct iattr *attr) | 3559 | static int btrfs_setsize(struct inode *inode, loff_t newsize) |
3568 | { | 3560 | { |
3569 | struct btrfs_root *root = BTRFS_I(inode)->root; | 3561 | loff_t oldsize = i_size_read(inode); |
3570 | struct btrfs_trans_handle *trans; | ||
3571 | unsigned long nr; | ||
3572 | int ret; | 3562 | int ret; |
3573 | 3563 | ||
3574 | if (attr->ia_size == inode->i_size) | 3564 | if (newsize == oldsize) |
3575 | return 0; | 3565 | return 0; |
3576 | 3566 | ||
3577 | if (attr->ia_size > inode->i_size) { | 3567 | if (newsize > oldsize) { |
3578 | unsigned long limit; | 3568 | i_size_write(inode, newsize); |
3579 | limit = current->signal->rlim[RLIMIT_FSIZE].rlim_cur; | 3569 | btrfs_ordered_update_i_size(inode, i_size_read(inode), NULL); |
3580 | if (attr->ia_size > inode->i_sb->s_maxbytes) | 3570 | truncate_pagecache(inode, oldsize, newsize); |
3581 | return -EFBIG; | 3571 | ret = btrfs_cont_expand(inode, oldsize, newsize); |
3582 | if (limit != RLIM_INFINITY && attr->ia_size > limit) { | ||
3583 | send_sig(SIGXFSZ, current, 0); | ||
3584 | return -EFBIG; | ||
3585 | } | ||
3586 | } | ||
3587 | |||
3588 | trans = btrfs_start_transaction(root, 5); | ||
3589 | if (IS_ERR(trans)) | ||
3590 | return PTR_ERR(trans); | ||
3591 | |||
3592 | btrfs_set_trans_block_group(trans, inode); | ||
3593 | |||
3594 | ret = btrfs_orphan_add(trans, inode); | ||
3595 | BUG_ON(ret); | ||
3596 | |||
3597 | nr = trans->blocks_used; | ||
3598 | btrfs_end_transaction(trans, root); | ||
3599 | btrfs_btree_balance_dirty(root, nr); | ||
3600 | |||
3601 | if (attr->ia_size > inode->i_size) { | ||
3602 | ret = btrfs_cont_expand(inode, attr->ia_size); | ||
3603 | if (ret) { | 3572 | if (ret) { |
3604 | btrfs_truncate(inode); | 3573 | btrfs_setsize(inode, oldsize); |
3605 | return ret; | 3574 | return ret; |
3606 | } | 3575 | } |
3607 | 3576 | ||
3608 | i_size_write(inode, attr->ia_size); | 3577 | mark_inode_dirty(inode); |
3609 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); | 3578 | } else { |
3610 | 3579 | ||
3611 | trans = btrfs_start_transaction(root, 0); | 3580 | /* |
3612 | BUG_ON(IS_ERR(trans)); | 3581 | * We're truncating a file that used to have good data down to |
3613 | btrfs_set_trans_block_group(trans, inode); | 3582 | * zero. Make sure it gets into the ordered flush list so that |
3614 | trans->block_rsv = root->orphan_block_rsv; | 3583 | * any new writes get down to disk quickly. |
3615 | BUG_ON(!trans->block_rsv); | 3584 | */ |
3585 | if (newsize == 0) | ||
3586 | BTRFS_I(inode)->ordered_data_close = 1; | ||
3616 | 3587 | ||
3617 | ret = btrfs_update_inode(trans, root, inode); | 3588 | /* we don't support swapfiles, so vmtruncate shouldn't fail */ |
3618 | BUG_ON(ret); | 3589 | truncate_setsize(inode, newsize); |
3619 | if (inode->i_nlink > 0) { | 3590 | ret = btrfs_truncate(inode); |
3620 | ret = btrfs_orphan_del(trans, inode); | ||
3621 | BUG_ON(ret); | ||
3622 | } | ||
3623 | nr = trans->blocks_used; | ||
3624 | btrfs_end_transaction(trans, root); | ||
3625 | btrfs_btree_balance_dirty(root, nr); | ||
3626 | return 0; | ||
3627 | } | 3591 | } |
3628 | 3592 | ||
3629 | /* | 3593 | return ret; |
3630 | * We're truncating a file that used to have good data down to | ||
3631 | * zero. Make sure it gets into the ordered flush list so that | ||
3632 | * any new writes get down to disk quickly. | ||
3633 | */ | ||
3634 | if (attr->ia_size == 0) | ||
3635 | BTRFS_I(inode)->ordered_data_close = 1; | ||
3636 | |||
3637 | /* we don't support swapfiles, so vmtruncate shouldn't fail */ | ||
3638 | ret = vmtruncate(inode, attr->ia_size); | ||
3639 | BUG_ON(ret); | ||
3640 | |||
3641 | return 0; | ||
3642 | } | 3594 | } |
3643 | 3595 | ||
3644 | static int btrfs_setattr(struct dentry *dentry, struct iattr *attr) | 3596 | static int btrfs_setattr(struct dentry *dentry, struct iattr *attr) |
3645 | { | 3597 | { |
3646 | struct inode *inode = dentry->d_inode; | 3598 | struct inode *inode = dentry->d_inode; |
3599 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
3647 | int err; | 3600 | int err; |
3648 | 3601 | ||
3602 | if (btrfs_root_readonly(root)) | ||
3603 | return -EROFS; | ||
3604 | |||
3649 | err = inode_change_ok(inode, attr); | 3605 | err = inode_change_ok(inode, attr); |
3650 | if (err) | 3606 | if (err) |
3651 | return err; | 3607 | return err; |
3652 | 3608 | ||
3653 | if (S_ISREG(inode->i_mode) && (attr->ia_valid & ATTR_SIZE)) { | 3609 | if (S_ISREG(inode->i_mode) && (attr->ia_valid & ATTR_SIZE)) { |
3654 | err = btrfs_setattr_size(inode, attr); | 3610 | err = btrfs_setsize(inode, attr->ia_size); |
3655 | if (err) | 3611 | if (err) |
3656 | return err; | 3612 | return err; |
3657 | } | 3613 | } |
@@ -3674,8 +3630,11 @@ void btrfs_evict_inode(struct inode *inode) | |||
3674 | unsigned long nr; | 3630 | unsigned long nr; |
3675 | int ret; | 3631 | int ret; |
3676 | 3632 | ||
3633 | trace_btrfs_inode_evict(inode); | ||
3634 | |||
3677 | truncate_inode_pages(&inode->i_data, 0); | 3635 | truncate_inode_pages(&inode->i_data, 0); |
3678 | if (inode->i_nlink && btrfs_root_refs(&root->root_item) != 0) | 3636 | if (inode->i_nlink && (btrfs_root_refs(&root->root_item) != 0 || |
3637 | is_free_space_inode(root, inode))) | ||
3679 | goto no_delete; | 3638 | goto no_delete; |
3680 | 3639 | ||
3681 | if (is_bad_inode(inode)) { | 3640 | if (is_bad_inode(inode)) { |
@@ -3698,9 +3657,8 @@ void btrfs_evict_inode(struct inode *inode) | |||
3698 | btrfs_i_size_write(inode, 0); | 3657 | btrfs_i_size_write(inode, 0); |
3699 | 3658 | ||
3700 | while (1) { | 3659 | while (1) { |
3701 | trans = btrfs_start_transaction(root, 0); | 3660 | trans = btrfs_join_transaction(root); |
3702 | BUG_ON(IS_ERR(trans)); | 3661 | BUG_ON(IS_ERR(trans)); |
3703 | btrfs_set_trans_block_group(trans, inode); | ||
3704 | trans->block_rsv = root->orphan_block_rsv; | 3662 | trans->block_rsv = root->orphan_block_rsv; |
3705 | 3663 | ||
3706 | ret = btrfs_block_rsv_check(trans, root, | 3664 | ret = btrfs_block_rsv_check(trans, root, |
@@ -3728,6 +3686,10 @@ void btrfs_evict_inode(struct inode *inode) | |||
3728 | BUG_ON(ret); | 3686 | BUG_ON(ret); |
3729 | } | 3687 | } |
3730 | 3688 | ||
3689 | if (!(root == root->fs_info->tree_root || | ||
3690 | root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID)) | ||
3691 | btrfs_return_ino(root, btrfs_ino(inode)); | ||
3692 | |||
3731 | nr = trans->blocks_used; | 3693 | nr = trans->blocks_used; |
3732 | btrfs_end_transaction(trans, root); | 3694 | btrfs_end_transaction(trans, root); |
3733 | btrfs_btree_balance_dirty(root, nr); | 3695 | btrfs_btree_balance_dirty(root, nr); |
@@ -3753,12 +3715,12 @@ static int btrfs_inode_by_name(struct inode *dir, struct dentry *dentry, | |||
3753 | path = btrfs_alloc_path(); | 3715 | path = btrfs_alloc_path(); |
3754 | BUG_ON(!path); | 3716 | BUG_ON(!path); |
3755 | 3717 | ||
3756 | di = btrfs_lookup_dir_item(NULL, root, path, dir->i_ino, name, | 3718 | di = btrfs_lookup_dir_item(NULL, root, path, btrfs_ino(dir), name, |
3757 | namelen, 0); | 3719 | namelen, 0); |
3758 | if (IS_ERR(di)) | 3720 | if (IS_ERR(di)) |
3759 | ret = PTR_ERR(di); | 3721 | ret = PTR_ERR(di); |
3760 | 3722 | ||
3761 | if (!di || IS_ERR(di)) | 3723 | if (IS_ERR_OR_NULL(di)) |
3762 | goto out_err; | 3724 | goto out_err; |
3763 | 3725 | ||
3764 | btrfs_dir_item_key_to_cpu(path->nodes[0], di, location); | 3726 | btrfs_dir_item_key_to_cpu(path->nodes[0], di, location); |
@@ -3806,7 +3768,7 @@ static int fixup_tree_root_location(struct btrfs_root *root, | |||
3806 | 3768 | ||
3807 | leaf = path->nodes[0]; | 3769 | leaf = path->nodes[0]; |
3808 | ref = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_root_ref); | 3770 | ref = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_root_ref); |
3809 | if (btrfs_root_ref_dirid(leaf, ref) != dir->i_ino || | 3771 | if (btrfs_root_ref_dirid(leaf, ref) != btrfs_ino(dir) || |
3810 | btrfs_root_ref_name_len(leaf, ref) != dentry->d_name.len) | 3772 | btrfs_root_ref_name_len(leaf, ref) != dentry->d_name.len) |
3811 | goto out; | 3773 | goto out; |
3812 | 3774 | ||
@@ -3816,7 +3778,7 @@ static int fixup_tree_root_location(struct btrfs_root *root, | |||
3816 | if (ret) | 3778 | if (ret) |
3817 | goto out; | 3779 | goto out; |
3818 | 3780 | ||
3819 | btrfs_release_path(root->fs_info->tree_root, path); | 3781 | btrfs_release_path(path); |
3820 | 3782 | ||
3821 | new_root = btrfs_read_fs_root_no_name(root->fs_info, location); | 3783 | new_root = btrfs_read_fs_root_no_name(root->fs_info, location); |
3822 | if (IS_ERR(new_root)) { | 3784 | if (IS_ERR(new_root)) { |
@@ -3845,11 +3807,12 @@ static void inode_tree_add(struct inode *inode) | |||
3845 | struct btrfs_inode *entry; | 3807 | struct btrfs_inode *entry; |
3846 | struct rb_node **p; | 3808 | struct rb_node **p; |
3847 | struct rb_node *parent; | 3809 | struct rb_node *parent; |
3810 | u64 ino = btrfs_ino(inode); | ||
3848 | again: | 3811 | again: |
3849 | p = &root->inode_tree.rb_node; | 3812 | p = &root->inode_tree.rb_node; |
3850 | parent = NULL; | 3813 | parent = NULL; |
3851 | 3814 | ||
3852 | if (hlist_unhashed(&inode->i_hash)) | 3815 | if (inode_unhashed(inode)) |
3853 | return; | 3816 | return; |
3854 | 3817 | ||
3855 | spin_lock(&root->inode_lock); | 3818 | spin_lock(&root->inode_lock); |
@@ -3857,9 +3820,9 @@ again: | |||
3857 | parent = *p; | 3820 | parent = *p; |
3858 | entry = rb_entry(parent, struct btrfs_inode, rb_node); | 3821 | entry = rb_entry(parent, struct btrfs_inode, rb_node); |
3859 | 3822 | ||
3860 | if (inode->i_ino < entry->vfs_inode.i_ino) | 3823 | if (ino < btrfs_ino(&entry->vfs_inode)) |
3861 | p = &parent->rb_left; | 3824 | p = &parent->rb_left; |
3862 | else if (inode->i_ino > entry->vfs_inode.i_ino) | 3825 | else if (ino > btrfs_ino(&entry->vfs_inode)) |
3863 | p = &parent->rb_right; | 3826 | p = &parent->rb_right; |
3864 | else { | 3827 | else { |
3865 | WARN_ON(!(entry->vfs_inode.i_state & | 3828 | WARN_ON(!(entry->vfs_inode.i_state & |
@@ -3888,7 +3851,14 @@ static void inode_tree_del(struct inode *inode) | |||
3888 | } | 3851 | } |
3889 | spin_unlock(&root->inode_lock); | 3852 | spin_unlock(&root->inode_lock); |
3890 | 3853 | ||
3891 | if (empty && btrfs_root_refs(&root->root_item) == 0) { | 3854 | /* |
3855 | * Free space cache has inodes in the tree root, but the tree root has a | ||
3856 | * root_refs of 0, so this could end up dropping the tree root as a | ||
3857 | * snapshot, so we need the extra !root->fs_info->tree_root check to | ||
3858 | * make sure we don't drop it. | ||
3859 | */ | ||
3860 | if (empty && btrfs_root_refs(&root->root_item) == 0 && | ||
3861 | root != root->fs_info->tree_root) { | ||
3892 | synchronize_srcu(&root->fs_info->subvol_srcu); | 3862 | synchronize_srcu(&root->fs_info->subvol_srcu); |
3893 | spin_lock(&root->inode_lock); | 3863 | spin_lock(&root->inode_lock); |
3894 | empty = RB_EMPTY_ROOT(&root->inode_tree); | 3864 | empty = RB_EMPTY_ROOT(&root->inode_tree); |
@@ -3916,9 +3886,9 @@ again: | |||
3916 | prev = node; | 3886 | prev = node; |
3917 | entry = rb_entry(node, struct btrfs_inode, rb_node); | 3887 | entry = rb_entry(node, struct btrfs_inode, rb_node); |
3918 | 3888 | ||
3919 | if (objectid < entry->vfs_inode.i_ino) | 3889 | if (objectid < btrfs_ino(&entry->vfs_inode)) |
3920 | node = node->rb_left; | 3890 | node = node->rb_left; |
3921 | else if (objectid > entry->vfs_inode.i_ino) | 3891 | else if (objectid > btrfs_ino(&entry->vfs_inode)) |
3922 | node = node->rb_right; | 3892 | node = node->rb_right; |
3923 | else | 3893 | else |
3924 | break; | 3894 | break; |
@@ -3926,7 +3896,7 @@ again: | |||
3926 | if (!node) { | 3896 | if (!node) { |
3927 | while (prev) { | 3897 | while (prev) { |
3928 | entry = rb_entry(prev, struct btrfs_inode, rb_node); | 3898 | entry = rb_entry(prev, struct btrfs_inode, rb_node); |
3929 | if (objectid <= entry->vfs_inode.i_ino) { | 3899 | if (objectid <= btrfs_ino(&entry->vfs_inode)) { |
3930 | node = prev; | 3900 | node = prev; |
3931 | break; | 3901 | break; |
3932 | } | 3902 | } |
@@ -3935,7 +3905,7 @@ again: | |||
3935 | } | 3905 | } |
3936 | while (node) { | 3906 | while (node) { |
3937 | entry = rb_entry(node, struct btrfs_inode, rb_node); | 3907 | entry = rb_entry(node, struct btrfs_inode, rb_node); |
3938 | objectid = entry->vfs_inode.i_ino + 1; | 3908 | objectid = btrfs_ino(&entry->vfs_inode) + 1; |
3939 | inode = igrab(&entry->vfs_inode); | 3909 | inode = igrab(&entry->vfs_inode); |
3940 | if (inode) { | 3910 | if (inode) { |
3941 | spin_unlock(&root->inode_lock); | 3911 | spin_unlock(&root->inode_lock); |
@@ -3973,7 +3943,7 @@ static int btrfs_init_locked_inode(struct inode *inode, void *p) | |||
3973 | static int btrfs_find_actor(struct inode *inode, void *opaque) | 3943 | static int btrfs_find_actor(struct inode *inode, void *opaque) |
3974 | { | 3944 | { |
3975 | struct btrfs_iget_args *args = opaque; | 3945 | struct btrfs_iget_args *args = opaque; |
3976 | return args->ino == inode->i_ino && | 3946 | return args->ino == btrfs_ino(inode) && |
3977 | args->root == BTRFS_I(inode)->root; | 3947 | args->root == BTRFS_I(inode)->root; |
3978 | } | 3948 | } |
3979 | 3949 | ||
@@ -4008,7 +3978,6 @@ struct inode *btrfs_iget(struct super_block *s, struct btrfs_key *location, | |||
4008 | BTRFS_I(inode)->root = root; | 3978 | BTRFS_I(inode)->root = root; |
4009 | memcpy(&BTRFS_I(inode)->location, location, sizeof(*location)); | 3979 | memcpy(&BTRFS_I(inode)->location, location, sizeof(*location)); |
4010 | btrfs_read_locked_inode(inode); | 3980 | btrfs_read_locked_inode(inode); |
4011 | |||
4012 | inode_tree_add(inode); | 3981 | inode_tree_add(inode); |
4013 | unlock_new_inode(inode); | 3982 | unlock_new_inode(inode); |
4014 | if (new) | 3983 | if (new) |
@@ -4049,8 +4018,6 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) | |||
4049 | int index; | 4018 | int index; |
4050 | int ret; | 4019 | int ret; |
4051 | 4020 | ||
4052 | dentry->d_op = &btrfs_dentry_operations; | ||
4053 | |||
4054 | if (dentry->d_name.len > BTRFS_NAME_LEN) | 4021 | if (dentry->d_name.len > BTRFS_NAME_LEN) |
4055 | return ERR_PTR(-ENAMETOOLONG); | 4022 | return ERR_PTR(-ENAMETOOLONG); |
4056 | 4023 | ||
@@ -4082,17 +4049,19 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) | |||
4082 | } | 4049 | } |
4083 | srcu_read_unlock(&root->fs_info->subvol_srcu, index); | 4050 | srcu_read_unlock(&root->fs_info->subvol_srcu, index); |
4084 | 4051 | ||
4085 | if (root != sub_root) { | 4052 | if (!IS_ERR(inode) && root != sub_root) { |
4086 | down_read(&root->fs_info->cleanup_work_sem); | 4053 | down_read(&root->fs_info->cleanup_work_sem); |
4087 | if (!(inode->i_sb->s_flags & MS_RDONLY)) | 4054 | if (!(inode->i_sb->s_flags & MS_RDONLY)) |
4088 | btrfs_orphan_cleanup(sub_root); | 4055 | ret = btrfs_orphan_cleanup(sub_root); |
4089 | up_read(&root->fs_info->cleanup_work_sem); | 4056 | up_read(&root->fs_info->cleanup_work_sem); |
4057 | if (ret) | ||
4058 | inode = ERR_PTR(ret); | ||
4090 | } | 4059 | } |
4091 | 4060 | ||
4092 | return inode; | 4061 | return inode; |
4093 | } | 4062 | } |
4094 | 4063 | ||
4095 | static int btrfs_dentry_delete(struct dentry *dentry) | 4064 | static int btrfs_dentry_delete(const struct dentry *dentry) |
4096 | { | 4065 | { |
4097 | struct btrfs_root *root; | 4066 | struct btrfs_root *root; |
4098 | 4067 | ||
@@ -4119,7 +4088,7 @@ static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry, | |||
4119 | return d_splice_alias(inode, dentry); | 4088 | return d_splice_alias(inode, dentry); |
4120 | } | 4089 | } |
4121 | 4090 | ||
4122 | static unsigned char btrfs_filetype_table[] = { | 4091 | unsigned char btrfs_filetype_table[] = { |
4123 | DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, DT_BLK, DT_FIFO, DT_SOCK, DT_LNK | 4092 | DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, DT_BLK, DT_FIFO, DT_SOCK, DT_LNK |
4124 | }; | 4093 | }; |
4125 | 4094 | ||
@@ -4133,11 +4102,11 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4133 | struct btrfs_key key; | 4102 | struct btrfs_key key; |
4134 | struct btrfs_key found_key; | 4103 | struct btrfs_key found_key; |
4135 | struct btrfs_path *path; | 4104 | struct btrfs_path *path; |
4105 | struct list_head ins_list; | ||
4106 | struct list_head del_list; | ||
4136 | int ret; | 4107 | int ret; |
4137 | u32 nritems; | ||
4138 | struct extent_buffer *leaf; | 4108 | struct extent_buffer *leaf; |
4139 | int slot; | 4109 | int slot; |
4140 | int advance; | ||
4141 | unsigned char d_type; | 4110 | unsigned char d_type; |
4142 | int over = 0; | 4111 | int over = 0; |
4143 | u32 di_cur; | 4112 | u32 di_cur; |
@@ -4147,6 +4116,7 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4147 | char tmp_name[32]; | 4116 | char tmp_name[32]; |
4148 | char *name_ptr; | 4117 | char *name_ptr; |
4149 | int name_len; | 4118 | int name_len; |
4119 | int is_curr = 0; /* filp->f_pos points to the current index? */ | ||
4150 | 4120 | ||
4151 | /* FIXME, use a real flag for deciding about the key type */ | 4121 | /* FIXME, use a real flag for deciding about the key type */ |
4152 | if (root->fs_info->tree_root == root) | 4122 | if (root->fs_info->tree_root == root) |
@@ -4154,9 +4124,7 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4154 | 4124 | ||
4155 | /* special case for "." */ | 4125 | /* special case for "." */ |
4156 | if (filp->f_pos == 0) { | 4126 | if (filp->f_pos == 0) { |
4157 | over = filldir(dirent, ".", 1, | 4127 | over = filldir(dirent, ".", 1, 1, btrfs_ino(inode), DT_DIR); |
4158 | 1, inode->i_ino, | ||
4159 | DT_DIR); | ||
4160 | if (over) | 4128 | if (over) |
4161 | return 0; | 4129 | return 0; |
4162 | filp->f_pos = 1; | 4130 | filp->f_pos = 1; |
@@ -4171,36 +4139,37 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4171 | filp->f_pos = 2; | 4139 | filp->f_pos = 2; |
4172 | } | 4140 | } |
4173 | path = btrfs_alloc_path(); | 4141 | path = btrfs_alloc_path(); |
4174 | path->reada = 2; | 4142 | if (!path) |
4143 | return -ENOMEM; | ||
4144 | |||
4145 | path->reada = 1; | ||
4146 | |||
4147 | if (key_type == BTRFS_DIR_INDEX_KEY) { | ||
4148 | INIT_LIST_HEAD(&ins_list); | ||
4149 | INIT_LIST_HEAD(&del_list); | ||
4150 | btrfs_get_delayed_items(inode, &ins_list, &del_list); | ||
4151 | } | ||
4175 | 4152 | ||
4176 | btrfs_set_key_type(&key, key_type); | 4153 | btrfs_set_key_type(&key, key_type); |
4177 | key.offset = filp->f_pos; | 4154 | key.offset = filp->f_pos; |
4178 | key.objectid = inode->i_ino; | 4155 | key.objectid = btrfs_ino(inode); |
4179 | 4156 | ||
4180 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | 4157 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); |
4181 | if (ret < 0) | 4158 | if (ret < 0) |
4182 | goto err; | 4159 | goto err; |
4183 | advance = 0; | ||
4184 | 4160 | ||
4185 | while (1) { | 4161 | while (1) { |
4186 | leaf = path->nodes[0]; | 4162 | leaf = path->nodes[0]; |
4187 | nritems = btrfs_header_nritems(leaf); | ||
4188 | slot = path->slots[0]; | 4163 | slot = path->slots[0]; |
4189 | if (advance || slot >= nritems) { | 4164 | if (slot >= btrfs_header_nritems(leaf)) { |
4190 | if (slot >= nritems - 1) { | 4165 | ret = btrfs_next_leaf(root, path); |
4191 | ret = btrfs_next_leaf(root, path); | 4166 | if (ret < 0) |
4192 | if (ret) | 4167 | goto err; |
4193 | break; | 4168 | else if (ret > 0) |
4194 | leaf = path->nodes[0]; | 4169 | break; |
4195 | nritems = btrfs_header_nritems(leaf); | 4170 | continue; |
4196 | slot = path->slots[0]; | ||
4197 | } else { | ||
4198 | slot++; | ||
4199 | path->slots[0]++; | ||
4200 | } | ||
4201 | } | 4171 | } |
4202 | 4172 | ||
4203 | advance = 1; | ||
4204 | item = btrfs_item_nr(leaf, slot); | 4173 | item = btrfs_item_nr(leaf, slot); |
4205 | btrfs_item_key_to_cpu(leaf, &found_key, slot); | 4174 | btrfs_item_key_to_cpu(leaf, &found_key, slot); |
4206 | 4175 | ||
@@ -4209,9 +4178,14 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4209 | if (btrfs_key_type(&found_key) != key_type) | 4178 | if (btrfs_key_type(&found_key) != key_type) |
4210 | break; | 4179 | break; |
4211 | if (found_key.offset < filp->f_pos) | 4180 | if (found_key.offset < filp->f_pos) |
4212 | continue; | 4181 | goto next; |
4182 | if (key_type == BTRFS_DIR_INDEX_KEY && | ||
4183 | btrfs_should_delete_dir_index(&del_list, | ||
4184 | found_key.offset)) | ||
4185 | goto next; | ||
4213 | 4186 | ||
4214 | filp->f_pos = found_key.offset; | 4187 | filp->f_pos = found_key.offset; |
4188 | is_curr = 1; | ||
4215 | 4189 | ||
4216 | di = btrfs_item_ptr(leaf, slot, struct btrfs_dir_item); | 4190 | di = btrfs_item_ptr(leaf, slot, struct btrfs_dir_item); |
4217 | di_cur = 0; | 4191 | di_cur = 0; |
@@ -4220,6 +4194,9 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4220 | while (di_cur < di_total) { | 4194 | while (di_cur < di_total) { |
4221 | struct btrfs_key location; | 4195 | struct btrfs_key location; |
4222 | 4196 | ||
4197 | if (verify_dir_item(root, leaf, di)) | ||
4198 | break; | ||
4199 | |||
4223 | name_len = btrfs_dir_name_len(leaf, di); | 4200 | name_len = btrfs_dir_name_len(leaf, di); |
4224 | if (name_len <= sizeof(tmp_name)) { | 4201 | if (name_len <= sizeof(tmp_name)) { |
4225 | name_ptr = tmp_name; | 4202 | name_ptr = tmp_name; |
@@ -4259,6 +4236,17 @@ skip: | |||
4259 | di_cur += di_len; | 4236 | di_cur += di_len; |
4260 | di = (struct btrfs_dir_item *)((char *)di + di_len); | 4237 | di = (struct btrfs_dir_item *)((char *)di + di_len); |
4261 | } | 4238 | } |
4239 | next: | ||
4240 | path->slots[0]++; | ||
4241 | } | ||
4242 | |||
4243 | if (key_type == BTRFS_DIR_INDEX_KEY) { | ||
4244 | if (is_curr) | ||
4245 | filp->f_pos++; | ||
4246 | ret = btrfs_readdir_delayed_dir_index(filp, dirent, filldir, | ||
4247 | &ins_list); | ||
4248 | if (ret) | ||
4249 | goto nopos; | ||
4262 | } | 4250 | } |
4263 | 4251 | ||
4264 | /* Reached end of directory/root. Bump pos past the last item. */ | 4252 | /* Reached end of directory/root. Bump pos past the last item. */ |
@@ -4273,6 +4261,8 @@ skip: | |||
4273 | nopos: | 4261 | nopos: |
4274 | ret = 0; | 4262 | ret = 0; |
4275 | err: | 4263 | err: |
4264 | if (key_type == BTRFS_DIR_INDEX_KEY) | ||
4265 | btrfs_put_delayed_items(&ins_list, &del_list); | ||
4276 | btrfs_free_path(path); | 4266 | btrfs_free_path(path); |
4277 | return ret; | 4267 | return ret; |
4278 | } | 4268 | } |
@@ -4282,14 +4272,25 @@ int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
4282 | struct btrfs_root *root = BTRFS_I(inode)->root; | 4272 | struct btrfs_root *root = BTRFS_I(inode)->root; |
4283 | struct btrfs_trans_handle *trans; | 4273 | struct btrfs_trans_handle *trans; |
4284 | int ret = 0; | 4274 | int ret = 0; |
4275 | bool nolock = false; | ||
4285 | 4276 | ||
4286 | if (BTRFS_I(inode)->dummy_inode) | 4277 | if (BTRFS_I(inode)->dummy_inode) |
4287 | return 0; | 4278 | return 0; |
4288 | 4279 | ||
4280 | if (btrfs_fs_closing(root->fs_info) && is_free_space_inode(root, inode)) | ||
4281 | nolock = true; | ||
4282 | |||
4289 | if (wbc->sync_mode == WB_SYNC_ALL) { | 4283 | if (wbc->sync_mode == WB_SYNC_ALL) { |
4290 | trans = btrfs_join_transaction(root, 1); | 4284 | if (nolock) |
4291 | btrfs_set_trans_block_group(trans, inode); | 4285 | trans = btrfs_join_transaction_nolock(root); |
4292 | ret = btrfs_commit_transaction(trans, root); | 4286 | else |
4287 | trans = btrfs_join_transaction(root); | ||
4288 | if (IS_ERR(trans)) | ||
4289 | return PTR_ERR(trans); | ||
4290 | if (nolock) | ||
4291 | ret = btrfs_end_transaction_nolock(trans, root); | ||
4292 | else | ||
4293 | ret = btrfs_commit_transaction(trans, root); | ||
4293 | } | 4294 | } |
4294 | return ret; | 4295 | return ret; |
4295 | } | 4296 | } |
@@ -4300,7 +4301,7 @@ int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
4300 | * FIXME, needs more benchmarking...there are no reasons other than performance | 4301 | * FIXME, needs more benchmarking...there are no reasons other than performance |
4301 | * to keep or drop this code. | 4302 | * to keep or drop this code. |
4302 | */ | 4303 | */ |
4303 | void btrfs_dirty_inode(struct inode *inode) | 4304 | void btrfs_dirty_inode(struct inode *inode, int flags) |
4304 | { | 4305 | { |
4305 | struct btrfs_root *root = BTRFS_I(inode)->root; | 4306 | struct btrfs_root *root = BTRFS_I(inode)->root; |
4306 | struct btrfs_trans_handle *trans; | 4307 | struct btrfs_trans_handle *trans; |
@@ -4309,8 +4310,8 @@ void btrfs_dirty_inode(struct inode *inode) | |||
4309 | if (BTRFS_I(inode)->dummy_inode) | 4310 | if (BTRFS_I(inode)->dummy_inode) |
4310 | return; | 4311 | return; |
4311 | 4312 | ||
4312 | trans = btrfs_join_transaction(root, 1); | 4313 | trans = btrfs_join_transaction(root); |
4313 | btrfs_set_trans_block_group(trans, inode); | 4314 | BUG_ON(IS_ERR(trans)); |
4314 | 4315 | ||
4315 | ret = btrfs_update_inode(trans, root, inode); | 4316 | ret = btrfs_update_inode(trans, root, inode); |
4316 | if (ret && ret == -ENOSPC) { | 4317 | if (ret && ret == -ENOSPC) { |
@@ -4318,25 +4319,24 @@ void btrfs_dirty_inode(struct inode *inode) | |||
4318 | btrfs_end_transaction(trans, root); | 4319 | btrfs_end_transaction(trans, root); |
4319 | trans = btrfs_start_transaction(root, 1); | 4320 | trans = btrfs_start_transaction(root, 1); |
4320 | if (IS_ERR(trans)) { | 4321 | if (IS_ERR(trans)) { |
4321 | if (printk_ratelimit()) { | 4322 | printk_ratelimited(KERN_ERR "btrfs: fail to " |
4322 | printk(KERN_ERR "btrfs: fail to " | 4323 | "dirty inode %llu error %ld\n", |
4323 | "dirty inode %lu error %ld\n", | 4324 | (unsigned long long)btrfs_ino(inode), |
4324 | inode->i_ino, PTR_ERR(trans)); | 4325 | PTR_ERR(trans)); |
4325 | } | ||
4326 | return; | 4326 | return; |
4327 | } | 4327 | } |
4328 | btrfs_set_trans_block_group(trans, inode); | ||
4329 | 4328 | ||
4330 | ret = btrfs_update_inode(trans, root, inode); | 4329 | ret = btrfs_update_inode(trans, root, inode); |
4331 | if (ret) { | 4330 | if (ret) { |
4332 | if (printk_ratelimit()) { | 4331 | printk_ratelimited(KERN_ERR "btrfs: fail to " |
4333 | printk(KERN_ERR "btrfs: fail to " | 4332 | "dirty inode %llu error %d\n", |
4334 | "dirty inode %lu error %d\n", | 4333 | (unsigned long long)btrfs_ino(inode), |
4335 | inode->i_ino, ret); | 4334 | ret); |
4336 | } | ||
4337 | } | 4335 | } |
4338 | } | 4336 | } |
4339 | btrfs_end_transaction(trans, root); | 4337 | btrfs_end_transaction(trans, root); |
4338 | if (BTRFS_I(inode)->delayed_node) | ||
4339 | btrfs_balance_delayed_items(root); | ||
4340 | } | 4340 | } |
4341 | 4341 | ||
4342 | /* | 4342 | /* |
@@ -4352,7 +4352,7 @@ static int btrfs_set_inode_index_count(struct inode *inode) | |||
4352 | struct extent_buffer *leaf; | 4352 | struct extent_buffer *leaf; |
4353 | int ret; | 4353 | int ret; |
4354 | 4354 | ||
4355 | key.objectid = inode->i_ino; | 4355 | key.objectid = btrfs_ino(inode); |
4356 | btrfs_set_key_type(&key, BTRFS_DIR_INDEX_KEY); | 4356 | btrfs_set_key_type(&key, BTRFS_DIR_INDEX_KEY); |
4357 | key.offset = (u64)-1; | 4357 | key.offset = (u64)-1; |
4358 | 4358 | ||
@@ -4384,7 +4384,7 @@ static int btrfs_set_inode_index_count(struct inode *inode) | |||
4384 | leaf = path->nodes[0]; | 4384 | leaf = path->nodes[0]; |
4385 | btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); | 4385 | btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); |
4386 | 4386 | ||
4387 | if (found_key.objectid != inode->i_ino || | 4387 | if (found_key.objectid != btrfs_ino(inode) || |
4388 | btrfs_key_type(&found_key) != BTRFS_DIR_INDEX_KEY) { | 4388 | btrfs_key_type(&found_key) != BTRFS_DIR_INDEX_KEY) { |
4389 | BTRFS_I(inode)->index_cnt = 2; | 4389 | BTRFS_I(inode)->index_cnt = 2; |
4390 | goto out; | 4390 | goto out; |
@@ -4405,9 +4405,12 @@ int btrfs_set_inode_index(struct inode *dir, u64 *index) | |||
4405 | int ret = 0; | 4405 | int ret = 0; |
4406 | 4406 | ||
4407 | if (BTRFS_I(dir)->index_cnt == (u64)-1) { | 4407 | if (BTRFS_I(dir)->index_cnt == (u64)-1) { |
4408 | ret = btrfs_set_inode_index_count(dir); | 4408 | ret = btrfs_inode_delayed_dir_index_count(dir); |
4409 | if (ret) | 4409 | if (ret) { |
4410 | return ret; | 4410 | ret = btrfs_set_inode_index_count(dir); |
4411 | if (ret) | ||
4412 | return ret; | ||
4413 | } | ||
4411 | } | 4414 | } |
4412 | 4415 | ||
4413 | *index = BTRFS_I(dir)->index_cnt; | 4416 | *index = BTRFS_I(dir)->index_cnt; |
@@ -4420,8 +4423,8 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4420 | struct btrfs_root *root, | 4423 | struct btrfs_root *root, |
4421 | struct inode *dir, | 4424 | struct inode *dir, |
4422 | const char *name, int name_len, | 4425 | const char *name, int name_len, |
4423 | u64 ref_objectid, u64 objectid, | 4426 | u64 ref_objectid, u64 objectid, int mode, |
4424 | u64 alloc_hint, int mode, u64 *index) | 4427 | u64 *index) |
4425 | { | 4428 | { |
4426 | struct inode *inode; | 4429 | struct inode *inode; |
4427 | struct btrfs_inode_item *inode_item; | 4430 | struct btrfs_inode_item *inode_item; |
@@ -4438,12 +4441,23 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4438 | BUG_ON(!path); | 4441 | BUG_ON(!path); |
4439 | 4442 | ||
4440 | inode = new_inode(root->fs_info->sb); | 4443 | inode = new_inode(root->fs_info->sb); |
4441 | if (!inode) | 4444 | if (!inode) { |
4445 | btrfs_free_path(path); | ||
4442 | return ERR_PTR(-ENOMEM); | 4446 | return ERR_PTR(-ENOMEM); |
4447 | } | ||
4448 | |||
4449 | /* | ||
4450 | * we have to initialize this early, so we can reclaim the inode | ||
4451 | * number if we fail afterwards in this function. | ||
4452 | */ | ||
4453 | inode->i_ino = objectid; | ||
4443 | 4454 | ||
4444 | if (dir) { | 4455 | if (dir) { |
4456 | trace_btrfs_inode_request(dir); | ||
4457 | |||
4445 | ret = btrfs_set_inode_index(dir, index); | 4458 | ret = btrfs_set_inode_index(dir, index); |
4446 | if (ret) { | 4459 | if (ret) { |
4460 | btrfs_free_path(path); | ||
4447 | iput(inode); | 4461 | iput(inode); |
4448 | return ERR_PTR(ret); | 4462 | return ERR_PTR(ret); |
4449 | } | 4463 | } |
@@ -4456,14 +4470,13 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4456 | BTRFS_I(inode)->index_cnt = 2; | 4470 | BTRFS_I(inode)->index_cnt = 2; |
4457 | BTRFS_I(inode)->root = root; | 4471 | BTRFS_I(inode)->root = root; |
4458 | BTRFS_I(inode)->generation = trans->transid; | 4472 | BTRFS_I(inode)->generation = trans->transid; |
4473 | inode->i_generation = BTRFS_I(inode)->generation; | ||
4459 | btrfs_set_inode_space_info(root, inode); | 4474 | btrfs_set_inode_space_info(root, inode); |
4460 | 4475 | ||
4461 | if (mode & S_IFDIR) | 4476 | if (mode & S_IFDIR) |
4462 | owner = 0; | 4477 | owner = 0; |
4463 | else | 4478 | else |
4464 | owner = 1; | 4479 | owner = 1; |
4465 | BTRFS_I(inode)->block_group = | ||
4466 | btrfs_find_block_group(root, 0, alloc_hint, owner); | ||
4467 | 4480 | ||
4468 | key[0].objectid = objectid; | 4481 | key[0].objectid = objectid; |
4469 | btrfs_set_key_type(&key[0], BTRFS_INODE_ITEM_KEY); | 4482 | btrfs_set_key_type(&key[0], BTRFS_INODE_ITEM_KEY); |
@@ -4482,7 +4495,6 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4482 | goto fail; | 4495 | goto fail; |
4483 | 4496 | ||
4484 | inode_init_owner(inode, dir, mode); | 4497 | inode_init_owner(inode, dir, mode); |
4485 | inode->i_ino = objectid; | ||
4486 | inode_set_bytes(inode, 0); | 4498 | inode_set_bytes(inode, 0); |
4487 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; | 4499 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; |
4488 | inode_item = btrfs_item_ptr(path->nodes[0], path->slots[0], | 4500 | inode_item = btrfs_item_ptr(path->nodes[0], path->slots[0], |
@@ -4509,12 +4521,17 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4509 | if ((mode & S_IFREG)) { | 4521 | if ((mode & S_IFREG)) { |
4510 | if (btrfs_test_opt(root, NODATASUM)) | 4522 | if (btrfs_test_opt(root, NODATASUM)) |
4511 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM; | 4523 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM; |
4512 | if (btrfs_test_opt(root, NODATACOW)) | 4524 | if (btrfs_test_opt(root, NODATACOW) || |
4525 | (BTRFS_I(dir)->flags & BTRFS_INODE_NODATACOW)) | ||
4513 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW; | 4526 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW; |
4514 | } | 4527 | } |
4515 | 4528 | ||
4516 | insert_inode_hash(inode); | 4529 | insert_inode_hash(inode); |
4517 | inode_tree_add(inode); | 4530 | inode_tree_add(inode); |
4531 | |||
4532 | trace_btrfs_inode_new(inode); | ||
4533 | btrfs_set_inode_last_trans(trans, inode); | ||
4534 | |||
4518 | return inode; | 4535 | return inode; |
4519 | fail: | 4536 | fail: |
4520 | if (dir) | 4537 | if (dir) |
@@ -4542,29 +4559,29 @@ int btrfs_add_link(struct btrfs_trans_handle *trans, | |||
4542 | int ret = 0; | 4559 | int ret = 0; |
4543 | struct btrfs_key key; | 4560 | struct btrfs_key key; |
4544 | struct btrfs_root *root = BTRFS_I(parent_inode)->root; | 4561 | struct btrfs_root *root = BTRFS_I(parent_inode)->root; |
4562 | u64 ino = btrfs_ino(inode); | ||
4563 | u64 parent_ino = btrfs_ino(parent_inode); | ||
4545 | 4564 | ||
4546 | if (unlikely(inode->i_ino == BTRFS_FIRST_FREE_OBJECTID)) { | 4565 | if (unlikely(ino == BTRFS_FIRST_FREE_OBJECTID)) { |
4547 | memcpy(&key, &BTRFS_I(inode)->root->root_key, sizeof(key)); | 4566 | memcpy(&key, &BTRFS_I(inode)->root->root_key, sizeof(key)); |
4548 | } else { | 4567 | } else { |
4549 | key.objectid = inode->i_ino; | 4568 | key.objectid = ino; |
4550 | btrfs_set_key_type(&key, BTRFS_INODE_ITEM_KEY); | 4569 | btrfs_set_key_type(&key, BTRFS_INODE_ITEM_KEY); |
4551 | key.offset = 0; | 4570 | key.offset = 0; |
4552 | } | 4571 | } |
4553 | 4572 | ||
4554 | if (unlikely(inode->i_ino == BTRFS_FIRST_FREE_OBJECTID)) { | 4573 | if (unlikely(ino == BTRFS_FIRST_FREE_OBJECTID)) { |
4555 | ret = btrfs_add_root_ref(trans, root->fs_info->tree_root, | 4574 | ret = btrfs_add_root_ref(trans, root->fs_info->tree_root, |
4556 | key.objectid, root->root_key.objectid, | 4575 | key.objectid, root->root_key.objectid, |
4557 | parent_inode->i_ino, | 4576 | parent_ino, index, name, name_len); |
4558 | index, name, name_len); | ||
4559 | } else if (add_backref) { | 4577 | } else if (add_backref) { |
4560 | ret = btrfs_insert_inode_ref(trans, root, | 4578 | ret = btrfs_insert_inode_ref(trans, root, name, name_len, ino, |
4561 | name, name_len, inode->i_ino, | 4579 | parent_ino, index); |
4562 | parent_inode->i_ino, index); | ||
4563 | } | 4580 | } |
4564 | 4581 | ||
4565 | if (ret == 0) { | 4582 | if (ret == 0) { |
4566 | ret = btrfs_insert_dir_item(trans, root, name, name_len, | 4583 | ret = btrfs_insert_dir_item(trans, root, name, name_len, |
4567 | parent_inode->i_ino, &key, | 4584 | parent_inode, &key, |
4568 | btrfs_inode_type(inode), index); | 4585 | btrfs_inode_type(inode), index); |
4569 | BUG_ON(ret); | 4586 | BUG_ON(ret); |
4570 | 4587 | ||
@@ -4577,12 +4594,12 @@ int btrfs_add_link(struct btrfs_trans_handle *trans, | |||
4577 | } | 4594 | } |
4578 | 4595 | ||
4579 | static int btrfs_add_nondir(struct btrfs_trans_handle *trans, | 4596 | static int btrfs_add_nondir(struct btrfs_trans_handle *trans, |
4580 | struct dentry *dentry, struct inode *inode, | 4597 | struct inode *dir, struct dentry *dentry, |
4581 | int backref, u64 index) | 4598 | struct inode *inode, int backref, u64 index) |
4582 | { | 4599 | { |
4583 | int err = btrfs_add_link(trans, dentry->d_parent->d_inode, | 4600 | int err = btrfs_add_link(trans, dir, inode, |
4584 | inode, dentry->d_name.name, | 4601 | dentry->d_name.name, dentry->d_name.len, |
4585 | dentry->d_name.len, backref, index); | 4602 | backref, index); |
4586 | if (!err) { | 4603 | if (!err) { |
4587 | d_instantiate(dentry, inode); | 4604 | d_instantiate(dentry, inode); |
4588 | return 0; | 4605 | return 0; |
@@ -4607,10 +4624,6 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4607 | if (!new_valid_dev(rdev)) | 4624 | if (!new_valid_dev(rdev)) |
4608 | return -EINVAL; | 4625 | return -EINVAL; |
4609 | 4626 | ||
4610 | err = btrfs_find_free_objectid(NULL, root, dir->i_ino, &objectid); | ||
4611 | if (err) | ||
4612 | return err; | ||
4613 | |||
4614 | /* | 4627 | /* |
4615 | * 2 for inode item and ref | 4628 | * 2 for inode item and ref |
4616 | * 2 for dir items | 4629 | * 2 for dir items |
@@ -4620,24 +4633,25 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4620 | if (IS_ERR(trans)) | 4633 | if (IS_ERR(trans)) |
4621 | return PTR_ERR(trans); | 4634 | return PTR_ERR(trans); |
4622 | 4635 | ||
4623 | btrfs_set_trans_block_group(trans, dir); | 4636 | err = btrfs_find_free_ino(root, &objectid); |
4637 | if (err) | ||
4638 | goto out_unlock; | ||
4624 | 4639 | ||
4625 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, | 4640 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, |
4626 | dentry->d_name.len, | 4641 | dentry->d_name.len, btrfs_ino(dir), objectid, |
4627 | dentry->d_parent->d_inode->i_ino, objectid, | 4642 | mode, &index); |
4628 | BTRFS_I(dir)->block_group, mode, &index); | 4643 | if (IS_ERR(inode)) { |
4629 | err = PTR_ERR(inode); | 4644 | err = PTR_ERR(inode); |
4630 | if (IS_ERR(inode)) | ||
4631 | goto out_unlock; | 4645 | goto out_unlock; |
4646 | } | ||
4632 | 4647 | ||
4633 | err = btrfs_init_inode_security(trans, inode, dir); | 4648 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); |
4634 | if (err) { | 4649 | if (err) { |
4635 | drop_inode = 1; | 4650 | drop_inode = 1; |
4636 | goto out_unlock; | 4651 | goto out_unlock; |
4637 | } | 4652 | } |
4638 | 4653 | ||
4639 | btrfs_set_trans_block_group(trans, inode); | 4654 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); |
4640 | err = btrfs_add_nondir(trans, dentry, inode, 0, index); | ||
4641 | if (err) | 4655 | if (err) |
4642 | drop_inode = 1; | 4656 | drop_inode = 1; |
4643 | else { | 4657 | else { |
@@ -4645,8 +4659,6 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4645 | init_special_inode(inode, inode->i_mode, rdev); | 4659 | init_special_inode(inode, inode->i_mode, rdev); |
4646 | btrfs_update_inode(trans, root, inode); | 4660 | btrfs_update_inode(trans, root, inode); |
4647 | } | 4661 | } |
4648 | btrfs_update_inode_block_group(trans, inode); | ||
4649 | btrfs_update_inode_block_group(trans, dir); | ||
4650 | out_unlock: | 4662 | out_unlock: |
4651 | nr = trans->blocks_used; | 4663 | nr = trans->blocks_used; |
4652 | btrfs_end_transaction_throttle(trans, root); | 4664 | btrfs_end_transaction_throttle(trans, root); |
@@ -4670,9 +4682,6 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4670 | u64 objectid; | 4682 | u64 objectid; |
4671 | u64 index = 0; | 4683 | u64 index = 0; |
4672 | 4684 | ||
4673 | err = btrfs_find_free_objectid(NULL, root, dir->i_ino, &objectid); | ||
4674 | if (err) | ||
4675 | return err; | ||
4676 | /* | 4685 | /* |
4677 | * 2 for inode item and ref | 4686 | * 2 for inode item and ref |
4678 | * 2 for dir items | 4687 | * 2 for dir items |
@@ -4682,25 +4691,25 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4682 | if (IS_ERR(trans)) | 4691 | if (IS_ERR(trans)) |
4683 | return PTR_ERR(trans); | 4692 | return PTR_ERR(trans); |
4684 | 4693 | ||
4685 | btrfs_set_trans_block_group(trans, dir); | 4694 | err = btrfs_find_free_ino(root, &objectid); |
4695 | if (err) | ||
4696 | goto out_unlock; | ||
4686 | 4697 | ||
4687 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, | 4698 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, |
4688 | dentry->d_name.len, | 4699 | dentry->d_name.len, btrfs_ino(dir), objectid, |
4689 | dentry->d_parent->d_inode->i_ino, | 4700 | mode, &index); |
4690 | objectid, BTRFS_I(dir)->block_group, mode, | 4701 | if (IS_ERR(inode)) { |
4691 | &index); | 4702 | err = PTR_ERR(inode); |
4692 | err = PTR_ERR(inode); | ||
4693 | if (IS_ERR(inode)) | ||
4694 | goto out_unlock; | 4703 | goto out_unlock; |
4704 | } | ||
4695 | 4705 | ||
4696 | err = btrfs_init_inode_security(trans, inode, dir); | 4706 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); |
4697 | if (err) { | 4707 | if (err) { |
4698 | drop_inode = 1; | 4708 | drop_inode = 1; |
4699 | goto out_unlock; | 4709 | goto out_unlock; |
4700 | } | 4710 | } |
4701 | 4711 | ||
4702 | btrfs_set_trans_block_group(trans, inode); | 4712 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); |
4703 | err = btrfs_add_nondir(trans, dentry, inode, 0, index); | ||
4704 | if (err) | 4713 | if (err) |
4705 | drop_inode = 1; | 4714 | drop_inode = 1; |
4706 | else { | 4715 | else { |
@@ -4710,8 +4719,6 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4710 | inode->i_op = &btrfs_file_inode_operations; | 4719 | inode->i_op = &btrfs_file_inode_operations; |
4711 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; | 4720 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; |
4712 | } | 4721 | } |
4713 | btrfs_update_inode_block_group(trans, inode); | ||
4714 | btrfs_update_inode_block_group(trans, dir); | ||
4715 | out_unlock: | 4722 | out_unlock: |
4716 | nr = trans->blocks_used; | 4723 | nr = trans->blocks_used; |
4717 | btrfs_end_transaction_throttle(trans, root); | 4724 | btrfs_end_transaction_throttle(trans, root); |
@@ -4734,41 +4741,42 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
4734 | int err; | 4741 | int err; |
4735 | int drop_inode = 0; | 4742 | int drop_inode = 0; |
4736 | 4743 | ||
4737 | if (inode->i_nlink == 0) | ||
4738 | return -ENOENT; | ||
4739 | |||
4740 | /* do not allow sys_link's with other subvols of the same device */ | 4744 | /* do not allow sys_link's with other subvols of the same device */ |
4741 | if (root->objectid != BTRFS_I(inode)->root->objectid) | 4745 | if (root->objectid != BTRFS_I(inode)->root->objectid) |
4742 | return -EPERM; | 4746 | return -EXDEV; |
4743 | 4747 | ||
4744 | btrfs_inc_nlink(inode); | 4748 | if (inode->i_nlink == ~0U) |
4749 | return -EMLINK; | ||
4745 | 4750 | ||
4746 | err = btrfs_set_inode_index(dir, &index); | 4751 | err = btrfs_set_inode_index(dir, &index); |
4747 | if (err) | 4752 | if (err) |
4748 | goto fail; | 4753 | goto fail; |
4749 | 4754 | ||
4750 | /* | 4755 | /* |
4751 | * 1 item for inode ref | 4756 | * 2 items for inode and inode ref |
4752 | * 2 items for dir items | 4757 | * 2 items for dir items |
4758 | * 1 item for parent inode | ||
4753 | */ | 4759 | */ |
4754 | trans = btrfs_start_transaction(root, 3); | 4760 | trans = btrfs_start_transaction(root, 5); |
4755 | if (IS_ERR(trans)) { | 4761 | if (IS_ERR(trans)) { |
4756 | err = PTR_ERR(trans); | 4762 | err = PTR_ERR(trans); |
4757 | goto fail; | 4763 | goto fail; |
4758 | } | 4764 | } |
4759 | 4765 | ||
4760 | btrfs_set_trans_block_group(trans, dir); | 4766 | btrfs_inc_nlink(inode); |
4761 | atomic_inc(&inode->i_count); | 4767 | inode->i_ctime = CURRENT_TIME; |
4768 | ihold(inode); | ||
4762 | 4769 | ||
4763 | err = btrfs_add_nondir(trans, dentry, inode, 1, index); | 4770 | err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index); |
4764 | 4771 | ||
4765 | if (err) { | 4772 | if (err) { |
4766 | drop_inode = 1; | 4773 | drop_inode = 1; |
4767 | } else { | 4774 | } else { |
4768 | btrfs_update_inode_block_group(trans, dir); | 4775 | struct dentry *parent = dget_parent(dentry); |
4769 | err = btrfs_update_inode(trans, root, inode); | 4776 | err = btrfs_update_inode(trans, root, inode); |
4770 | BUG_ON(err); | 4777 | BUG_ON(err); |
4771 | btrfs_log_new_name(trans, inode, NULL, dentry->d_parent); | 4778 | btrfs_log_new_name(trans, inode, NULL, parent); |
4779 | dput(parent); | ||
4772 | } | 4780 | } |
4773 | 4781 | ||
4774 | nr = trans->blocks_used; | 4782 | nr = trans->blocks_used; |
@@ -4793,10 +4801,6 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
4793 | u64 index = 0; | 4801 | u64 index = 0; |
4794 | unsigned long nr = 1; | 4802 | unsigned long nr = 1; |
4795 | 4803 | ||
4796 | err = btrfs_find_free_objectid(NULL, root, dir->i_ino, &objectid); | ||
4797 | if (err) | ||
4798 | return err; | ||
4799 | |||
4800 | /* | 4804 | /* |
4801 | * 2 items for inode and ref | 4805 | * 2 items for inode and ref |
4802 | * 2 items for dir items | 4806 | * 2 items for dir items |
@@ -4805,13 +4809,14 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
4805 | trans = btrfs_start_transaction(root, 5); | 4809 | trans = btrfs_start_transaction(root, 5); |
4806 | if (IS_ERR(trans)) | 4810 | if (IS_ERR(trans)) |
4807 | return PTR_ERR(trans); | 4811 | return PTR_ERR(trans); |
4808 | btrfs_set_trans_block_group(trans, dir); | 4812 | |
4813 | err = btrfs_find_free_ino(root, &objectid); | ||
4814 | if (err) | ||
4815 | goto out_fail; | ||
4809 | 4816 | ||
4810 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, | 4817 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, |
4811 | dentry->d_name.len, | 4818 | dentry->d_name.len, btrfs_ino(dir), objectid, |
4812 | dentry->d_parent->d_inode->i_ino, objectid, | 4819 | S_IFDIR | mode, &index); |
4813 | BTRFS_I(dir)->block_group, S_IFDIR | mode, | ||
4814 | &index); | ||
4815 | if (IS_ERR(inode)) { | 4820 | if (IS_ERR(inode)) { |
4816 | err = PTR_ERR(inode); | 4821 | err = PTR_ERR(inode); |
4817 | goto out_fail; | 4822 | goto out_fail; |
@@ -4819,29 +4824,25 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
4819 | 4824 | ||
4820 | drop_on_err = 1; | 4825 | drop_on_err = 1; |
4821 | 4826 | ||
4822 | err = btrfs_init_inode_security(trans, inode, dir); | 4827 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); |
4823 | if (err) | 4828 | if (err) |
4824 | goto out_fail; | 4829 | goto out_fail; |
4825 | 4830 | ||
4826 | inode->i_op = &btrfs_dir_inode_operations; | 4831 | inode->i_op = &btrfs_dir_inode_operations; |
4827 | inode->i_fop = &btrfs_dir_file_operations; | 4832 | inode->i_fop = &btrfs_dir_file_operations; |
4828 | btrfs_set_trans_block_group(trans, inode); | ||
4829 | 4833 | ||
4830 | btrfs_i_size_write(inode, 0); | 4834 | btrfs_i_size_write(inode, 0); |
4831 | err = btrfs_update_inode(trans, root, inode); | 4835 | err = btrfs_update_inode(trans, root, inode); |
4832 | if (err) | 4836 | if (err) |
4833 | goto out_fail; | 4837 | goto out_fail; |
4834 | 4838 | ||
4835 | err = btrfs_add_link(trans, dentry->d_parent->d_inode, | 4839 | err = btrfs_add_link(trans, dir, inode, dentry->d_name.name, |
4836 | inode, dentry->d_name.name, | 4840 | dentry->d_name.len, 0, index); |
4837 | dentry->d_name.len, 0, index); | ||
4838 | if (err) | 4841 | if (err) |
4839 | goto out_fail; | 4842 | goto out_fail; |
4840 | 4843 | ||
4841 | d_instantiate(dentry, inode); | 4844 | d_instantiate(dentry, inode); |
4842 | drop_on_err = 0; | 4845 | drop_on_err = 0; |
4843 | btrfs_update_inode_block_group(trans, inode); | ||
4844 | btrfs_update_inode_block_group(trans, dir); | ||
4845 | 4846 | ||
4846 | out_fail: | 4847 | out_fail: |
4847 | nr = trans->blocks_used; | 4848 | nr = trans->blocks_used; |
@@ -4886,19 +4887,23 @@ static noinline int uncompress_inline(struct btrfs_path *path, | |||
4886 | size_t max_size; | 4887 | size_t max_size; |
4887 | unsigned long inline_size; | 4888 | unsigned long inline_size; |
4888 | unsigned long ptr; | 4889 | unsigned long ptr; |
4890 | int compress_type; | ||
4889 | 4891 | ||
4890 | WARN_ON(pg_offset != 0); | 4892 | WARN_ON(pg_offset != 0); |
4893 | compress_type = btrfs_file_extent_compression(leaf, item); | ||
4891 | max_size = btrfs_file_extent_ram_bytes(leaf, item); | 4894 | max_size = btrfs_file_extent_ram_bytes(leaf, item); |
4892 | inline_size = btrfs_file_extent_inline_item_len(leaf, | 4895 | inline_size = btrfs_file_extent_inline_item_len(leaf, |
4893 | btrfs_item_nr(leaf, path->slots[0])); | 4896 | btrfs_item_nr(leaf, path->slots[0])); |
4894 | tmp = kmalloc(inline_size, GFP_NOFS); | 4897 | tmp = kmalloc(inline_size, GFP_NOFS); |
4898 | if (!tmp) | ||
4899 | return -ENOMEM; | ||
4895 | ptr = btrfs_file_extent_inline_start(item); | 4900 | ptr = btrfs_file_extent_inline_start(item); |
4896 | 4901 | ||
4897 | read_extent_buffer(leaf, tmp, ptr, inline_size); | 4902 | read_extent_buffer(leaf, tmp, ptr, inline_size); |
4898 | 4903 | ||
4899 | max_size = min_t(unsigned long, PAGE_CACHE_SIZE, max_size); | 4904 | max_size = min_t(unsigned long, PAGE_CACHE_SIZE, max_size); |
4900 | ret = btrfs_zlib_decompress(tmp, page, extent_offset, | 4905 | ret = btrfs_decompress(compress_type, tmp, page, |
4901 | inline_size, max_size); | 4906 | extent_offset, inline_size, max_size); |
4902 | if (ret) { | 4907 | if (ret) { |
4903 | char *kaddr = kmap_atomic(page, KM_USER0); | 4908 | char *kaddr = kmap_atomic(page, KM_USER0); |
4904 | unsigned long copy_size = min_t(u64, | 4909 | unsigned long copy_size = min_t(u64, |
@@ -4929,7 +4934,7 @@ struct extent_map *btrfs_get_extent(struct inode *inode, struct page *page, | |||
4929 | u64 bytenr; | 4934 | u64 bytenr; |
4930 | u64 extent_start = 0; | 4935 | u64 extent_start = 0; |
4931 | u64 extent_end = 0; | 4936 | u64 extent_end = 0; |
4932 | u64 objectid = inode->i_ino; | 4937 | u64 objectid = btrfs_ino(inode); |
4933 | u32 found_type; | 4938 | u32 found_type; |
4934 | struct btrfs_path *path = NULL; | 4939 | struct btrfs_path *path = NULL; |
4935 | struct btrfs_root *root = BTRFS_I(inode)->root; | 4940 | struct btrfs_root *root = BTRFS_I(inode)->root; |
@@ -4940,7 +4945,7 @@ struct extent_map *btrfs_get_extent(struct inode *inode, struct page *page, | |||
4940 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; | 4945 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; |
4941 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; | 4946 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; |
4942 | struct btrfs_trans_handle *trans = NULL; | 4947 | struct btrfs_trans_handle *trans = NULL; |
4943 | int compressed; | 4948 | int compress_type; |
4944 | 4949 | ||
4945 | again: | 4950 | again: |
4946 | read_lock(&em_tree->lock); | 4951 | read_lock(&em_tree->lock); |
@@ -4957,7 +4962,7 @@ again: | |||
4957 | else | 4962 | else |
4958 | goto out; | 4963 | goto out; |
4959 | } | 4964 | } |
4960 | em = alloc_extent_map(GFP_NOFS); | 4965 | em = alloc_extent_map(); |
4961 | if (!em) { | 4966 | if (!em) { |
4962 | err = -ENOMEM; | 4967 | err = -ENOMEM; |
4963 | goto out; | 4968 | goto out; |
@@ -4970,7 +4975,15 @@ again: | |||
4970 | 4975 | ||
4971 | if (!path) { | 4976 | if (!path) { |
4972 | path = btrfs_alloc_path(); | 4977 | path = btrfs_alloc_path(); |
4973 | BUG_ON(!path); | 4978 | if (!path) { |
4979 | err = -ENOMEM; | ||
4980 | goto out; | ||
4981 | } | ||
4982 | /* | ||
4983 | * Chances are we'll be called again, so go ahead and do | ||
4984 | * readahead | ||
4985 | */ | ||
4986 | path->reada = 1; | ||
4974 | } | 4987 | } |
4975 | 4988 | ||
4976 | ret = btrfs_lookup_file_extent(trans, root, path, | 4989 | ret = btrfs_lookup_file_extent(trans, root, path, |
@@ -4999,7 +5012,7 @@ again: | |||
4999 | 5012 | ||
5000 | found_type = btrfs_file_extent_type(leaf, item); | 5013 | found_type = btrfs_file_extent_type(leaf, item); |
5001 | extent_start = found_key.offset; | 5014 | extent_start = found_key.offset; |
5002 | compressed = btrfs_file_extent_compression(leaf, item); | 5015 | compress_type = btrfs_file_extent_compression(leaf, item); |
5003 | if (found_type == BTRFS_FILE_EXTENT_REG || | 5016 | if (found_type == BTRFS_FILE_EXTENT_REG || |
5004 | found_type == BTRFS_FILE_EXTENT_PREALLOC) { | 5017 | found_type == BTRFS_FILE_EXTENT_PREALLOC) { |
5005 | extent_end = extent_start + | 5018 | extent_end = extent_start + |
@@ -5045,8 +5058,9 @@ again: | |||
5045 | em->block_start = EXTENT_MAP_HOLE; | 5058 | em->block_start = EXTENT_MAP_HOLE; |
5046 | goto insert; | 5059 | goto insert; |
5047 | } | 5060 | } |
5048 | if (compressed) { | 5061 | if (compress_type != BTRFS_COMPRESS_NONE) { |
5049 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); | 5062 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); |
5063 | em->compress_type = compress_type; | ||
5050 | em->block_start = bytenr; | 5064 | em->block_start = bytenr; |
5051 | em->block_len = btrfs_file_extent_disk_num_bytes(leaf, | 5065 | em->block_len = btrfs_file_extent_disk_num_bytes(leaf, |
5052 | item); | 5066 | item); |
@@ -5080,12 +5094,14 @@ again: | |||
5080 | em->len = (copy_size + root->sectorsize - 1) & | 5094 | em->len = (copy_size + root->sectorsize - 1) & |
5081 | ~((u64)root->sectorsize - 1); | 5095 | ~((u64)root->sectorsize - 1); |
5082 | em->orig_start = EXTENT_MAP_INLINE; | 5096 | em->orig_start = EXTENT_MAP_INLINE; |
5083 | if (compressed) | 5097 | if (compress_type) { |
5084 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); | 5098 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); |
5099 | em->compress_type = compress_type; | ||
5100 | } | ||
5085 | ptr = btrfs_file_extent_inline_start(item) + extent_offset; | 5101 | ptr = btrfs_file_extent_inline_start(item) + extent_offset; |
5086 | if (create == 0 && !PageUptodate(page)) { | 5102 | if (create == 0 && !PageUptodate(page)) { |
5087 | if (btrfs_file_extent_compression(leaf, item) == | 5103 | if (btrfs_file_extent_compression(leaf, item) != |
5088 | BTRFS_COMPRESS_ZLIB) { | 5104 | BTRFS_COMPRESS_NONE) { |
5089 | ret = uncompress_inline(path, inode, page, | 5105 | ret = uncompress_inline(path, inode, page, |
5090 | pg_offset, | 5106 | pg_offset, |
5091 | extent_offset, item); | 5107 | extent_offset, item); |
@@ -5108,8 +5124,12 @@ again: | |||
5108 | kunmap(page); | 5124 | kunmap(page); |
5109 | free_extent_map(em); | 5125 | free_extent_map(em); |
5110 | em = NULL; | 5126 | em = NULL; |
5111 | btrfs_release_path(root, path); | 5127 | |
5112 | trans = btrfs_join_transaction(root, 1); | 5128 | btrfs_release_path(path); |
5129 | trans = btrfs_join_transaction(root); | ||
5130 | |||
5131 | if (IS_ERR(trans)) | ||
5132 | return ERR_CAST(trans); | ||
5113 | goto again; | 5133 | goto again; |
5114 | } | 5134 | } |
5115 | map = kmap(page); | 5135 | map = kmap(page); |
@@ -5119,7 +5139,7 @@ again: | |||
5119 | btrfs_mark_buffer_dirty(leaf); | 5139 | btrfs_mark_buffer_dirty(leaf); |
5120 | } | 5140 | } |
5121 | set_extent_uptodate(io_tree, em->start, | 5141 | set_extent_uptodate(io_tree, em->start, |
5122 | extent_map_end(em) - 1, GFP_NOFS); | 5142 | extent_map_end(em) - 1, NULL, GFP_NOFS); |
5123 | goto insert; | 5143 | goto insert; |
5124 | } else { | 5144 | } else { |
5125 | printk(KERN_ERR "btrfs unknown found_type %d\n", found_type); | 5145 | printk(KERN_ERR "btrfs unknown found_type %d\n", found_type); |
@@ -5132,7 +5152,7 @@ not_found_em: | |||
5132 | em->block_start = EXTENT_MAP_HOLE; | 5152 | em->block_start = EXTENT_MAP_HOLE; |
5133 | set_bit(EXTENT_FLAG_VACANCY, &em->flags); | 5153 | set_bit(EXTENT_FLAG_VACANCY, &em->flags); |
5134 | insert: | 5154 | insert: |
5135 | btrfs_release_path(root, path); | 5155 | btrfs_release_path(path); |
5136 | if (em->start > start || extent_map_end(em) <= start) { | 5156 | if (em->start > start || extent_map_end(em) <= start) { |
5137 | printk(KERN_ERR "Btrfs: bad extent! em: [%llu %llu] passed " | 5157 | printk(KERN_ERR "Btrfs: bad extent! em: [%llu %llu] passed " |
5138 | "[%llu %llu]\n", (unsigned long long)em->start, | 5158 | "[%llu %llu]\n", (unsigned long long)em->start, |
@@ -5186,6 +5206,9 @@ insert: | |||
5186 | } | 5206 | } |
5187 | write_unlock(&em_tree->lock); | 5207 | write_unlock(&em_tree->lock); |
5188 | out: | 5208 | out: |
5209 | |||
5210 | trace_btrfs_get_extent(root, em); | ||
5211 | |||
5189 | if (path) | 5212 | if (path) |
5190 | btrfs_free_path(path); | 5213 | btrfs_free_path(path); |
5191 | if (trans) { | 5214 | if (trans) { |
@@ -5200,22 +5223,160 @@ out: | |||
5200 | return em; | 5223 | return em; |
5201 | } | 5224 | } |
5202 | 5225 | ||
5226 | struct extent_map *btrfs_get_extent_fiemap(struct inode *inode, struct page *page, | ||
5227 | size_t pg_offset, u64 start, u64 len, | ||
5228 | int create) | ||
5229 | { | ||
5230 | struct extent_map *em; | ||
5231 | struct extent_map *hole_em = NULL; | ||
5232 | u64 range_start = start; | ||
5233 | u64 end; | ||
5234 | u64 found; | ||
5235 | u64 found_end; | ||
5236 | int err = 0; | ||
5237 | |||
5238 | em = btrfs_get_extent(inode, page, pg_offset, start, len, create); | ||
5239 | if (IS_ERR(em)) | ||
5240 | return em; | ||
5241 | if (em) { | ||
5242 | /* | ||
5243 | * if our em maps to a hole, there might | ||
5244 | * actually be delalloc bytes behind it | ||
5245 | */ | ||
5246 | if (em->block_start != EXTENT_MAP_HOLE) | ||
5247 | return em; | ||
5248 | else | ||
5249 | hole_em = em; | ||
5250 | } | ||
5251 | |||
5252 | /* check to see if we've wrapped (len == -1 or similar) */ | ||
5253 | end = start + len; | ||
5254 | if (end < start) | ||
5255 | end = (u64)-1; | ||
5256 | else | ||
5257 | end -= 1; | ||
5258 | |||
5259 | em = NULL; | ||
5260 | |||
5261 | /* ok, we didn't find anything, lets look for delalloc */ | ||
5262 | found = count_range_bits(&BTRFS_I(inode)->io_tree, &range_start, | ||
5263 | end, len, EXTENT_DELALLOC, 1); | ||
5264 | found_end = range_start + found; | ||
5265 | if (found_end < range_start) | ||
5266 | found_end = (u64)-1; | ||
5267 | |||
5268 | /* | ||
5269 | * we didn't find anything useful, return | ||
5270 | * the original results from get_extent() | ||
5271 | */ | ||
5272 | if (range_start > end || found_end <= start) { | ||
5273 | em = hole_em; | ||
5274 | hole_em = NULL; | ||
5275 | goto out; | ||
5276 | } | ||
5277 | |||
5278 | /* adjust the range_start to make sure it doesn't | ||
5279 | * go backwards from the start they passed in | ||
5280 | */ | ||
5281 | range_start = max(start,range_start); | ||
5282 | found = found_end - range_start; | ||
5283 | |||
5284 | if (found > 0) { | ||
5285 | u64 hole_start = start; | ||
5286 | u64 hole_len = len; | ||
5287 | |||
5288 | em = alloc_extent_map(); | ||
5289 | if (!em) { | ||
5290 | err = -ENOMEM; | ||
5291 | goto out; | ||
5292 | } | ||
5293 | /* | ||
5294 | * when btrfs_get_extent can't find anything it | ||
5295 | * returns one huge hole | ||
5296 | * | ||
5297 | * make sure what it found really fits our range, and | ||
5298 | * adjust to make sure it is based on the start from | ||
5299 | * the caller | ||
5300 | */ | ||
5301 | if (hole_em) { | ||
5302 | u64 calc_end = extent_map_end(hole_em); | ||
5303 | |||
5304 | if (calc_end <= start || (hole_em->start > end)) { | ||
5305 | free_extent_map(hole_em); | ||
5306 | hole_em = NULL; | ||
5307 | } else { | ||
5308 | hole_start = max(hole_em->start, start); | ||
5309 | hole_len = calc_end - hole_start; | ||
5310 | } | ||
5311 | } | ||
5312 | em->bdev = NULL; | ||
5313 | if (hole_em && range_start > hole_start) { | ||
5314 | /* our hole starts before our delalloc, so we | ||
5315 | * have to return just the parts of the hole | ||
5316 | * that go until the delalloc starts | ||
5317 | */ | ||
5318 | em->len = min(hole_len, | ||
5319 | range_start - hole_start); | ||
5320 | em->start = hole_start; | ||
5321 | em->orig_start = hole_start; | ||
5322 | /* | ||
5323 | * don't adjust block start at all, | ||
5324 | * it is fixed at EXTENT_MAP_HOLE | ||
5325 | */ | ||
5326 | em->block_start = hole_em->block_start; | ||
5327 | em->block_len = hole_len; | ||
5328 | } else { | ||
5329 | em->start = range_start; | ||
5330 | em->len = found; | ||
5331 | em->orig_start = range_start; | ||
5332 | em->block_start = EXTENT_MAP_DELALLOC; | ||
5333 | em->block_len = found; | ||
5334 | } | ||
5335 | } else if (hole_em) { | ||
5336 | return hole_em; | ||
5337 | } | ||
5338 | out: | ||
5339 | |||
5340 | free_extent_map(hole_em); | ||
5341 | if (err) { | ||
5342 | free_extent_map(em); | ||
5343 | return ERR_PTR(err); | ||
5344 | } | ||
5345 | return em; | ||
5346 | } | ||
5347 | |||
5203 | static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | 5348 | static struct extent_map *btrfs_new_extent_direct(struct inode *inode, |
5349 | struct extent_map *em, | ||
5204 | u64 start, u64 len) | 5350 | u64 start, u64 len) |
5205 | { | 5351 | { |
5206 | struct btrfs_root *root = BTRFS_I(inode)->root; | 5352 | struct btrfs_root *root = BTRFS_I(inode)->root; |
5207 | struct btrfs_trans_handle *trans; | 5353 | struct btrfs_trans_handle *trans; |
5208 | struct extent_map *em; | ||
5209 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; | 5354 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; |
5210 | struct btrfs_key ins; | 5355 | struct btrfs_key ins; |
5211 | u64 alloc_hint; | 5356 | u64 alloc_hint; |
5212 | int ret; | 5357 | int ret; |
5358 | bool insert = false; | ||
5213 | 5359 | ||
5214 | btrfs_drop_extent_cache(inode, start, start + len - 1, 0); | 5360 | /* |
5361 | * Ok if the extent map we looked up is a hole and is for the exact | ||
5362 | * range we want, there is no reason to allocate a new one, however if | ||
5363 | * it is not right then we need to free this one and drop the cache for | ||
5364 | * our range. | ||
5365 | */ | ||
5366 | if (em->block_start != EXTENT_MAP_HOLE || em->start != start || | ||
5367 | em->len != len) { | ||
5368 | free_extent_map(em); | ||
5369 | em = NULL; | ||
5370 | insert = true; | ||
5371 | btrfs_drop_extent_cache(inode, start, start + len - 1, 0); | ||
5372 | } | ||
5215 | 5373 | ||
5216 | trans = btrfs_join_transaction(root, 0); | 5374 | trans = btrfs_join_transaction(root); |
5217 | if (!trans) | 5375 | if (IS_ERR(trans)) |
5218 | return ERR_PTR(-ENOMEM); | 5376 | return ERR_CAST(trans); |
5377 | |||
5378 | if (start <= BTRFS_I(inode)->disk_i_size && len < 64 * 1024) | ||
5379 | btrfs_add_inode_defrag(trans, inode); | ||
5219 | 5380 | ||
5220 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 5381 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
5221 | 5382 | ||
@@ -5227,10 +5388,12 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | |||
5227 | goto out; | 5388 | goto out; |
5228 | } | 5389 | } |
5229 | 5390 | ||
5230 | em = alloc_extent_map(GFP_NOFS); | ||
5231 | if (!em) { | 5391 | if (!em) { |
5232 | em = ERR_PTR(-ENOMEM); | 5392 | em = alloc_extent_map(); |
5233 | goto out; | 5393 | if (!em) { |
5394 | em = ERR_PTR(-ENOMEM); | ||
5395 | goto out; | ||
5396 | } | ||
5234 | } | 5397 | } |
5235 | 5398 | ||
5236 | em->start = start; | 5399 | em->start = start; |
@@ -5240,9 +5403,15 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | |||
5240 | em->block_start = ins.objectid; | 5403 | em->block_start = ins.objectid; |
5241 | em->block_len = ins.offset; | 5404 | em->block_len = ins.offset; |
5242 | em->bdev = root->fs_info->fs_devices->latest_bdev; | 5405 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
5406 | |||
5407 | /* | ||
5408 | * We need to do this because if we're using the original em we searched | ||
5409 | * for, we could have EXTENT_FLAG_VACANCY set, and we don't want that. | ||
5410 | */ | ||
5411 | em->flags = 0; | ||
5243 | set_bit(EXTENT_FLAG_PINNED, &em->flags); | 5412 | set_bit(EXTENT_FLAG_PINNED, &em->flags); |
5244 | 5413 | ||
5245 | while (1) { | 5414 | while (insert) { |
5246 | write_lock(&em_tree->lock); | 5415 | write_lock(&em_tree->lock); |
5247 | ret = add_extent_mapping(em_tree, em); | 5416 | ret = add_extent_mapping(em_tree, em); |
5248 | write_unlock(&em_tree->lock); | 5417 | write_unlock(&em_tree->lock); |
@@ -5286,7 +5455,7 @@ static noinline int can_nocow_odirect(struct btrfs_trans_handle *trans, | |||
5286 | if (!path) | 5455 | if (!path) |
5287 | return -ENOMEM; | 5456 | return -ENOMEM; |
5288 | 5457 | ||
5289 | ret = btrfs_lookup_file_extent(trans, root, path, inode->i_ino, | 5458 | ret = btrfs_lookup_file_extent(trans, root, path, btrfs_ino(inode), |
5290 | offset, 0); | 5459 | offset, 0); |
5291 | if (ret < 0) | 5460 | if (ret < 0) |
5292 | goto out; | 5461 | goto out; |
@@ -5303,7 +5472,7 @@ static noinline int can_nocow_odirect(struct btrfs_trans_handle *trans, | |||
5303 | ret = 0; | 5472 | ret = 0; |
5304 | leaf = path->nodes[0]; | 5473 | leaf = path->nodes[0]; |
5305 | btrfs_item_key_to_cpu(leaf, &key, slot); | 5474 | btrfs_item_key_to_cpu(leaf, &key, slot); |
5306 | if (key.objectid != inode->i_ino || | 5475 | if (key.objectid != btrfs_ino(inode) || |
5307 | key.type != BTRFS_EXTENT_DATA_KEY) { | 5476 | key.type != BTRFS_EXTENT_DATA_KEY) { |
5308 | /* not our file or wrong item type, must cow */ | 5477 | /* not our file or wrong item type, must cow */ |
5309 | goto out; | 5478 | goto out; |
@@ -5337,7 +5506,7 @@ static noinline int can_nocow_odirect(struct btrfs_trans_handle *trans, | |||
5337 | * look for other files referencing this extent, if we | 5506 | * look for other files referencing this extent, if we |
5338 | * find any we must cow | 5507 | * find any we must cow |
5339 | */ | 5508 | */ |
5340 | if (btrfs_cross_ref_exist(trans, root, inode->i_ino, | 5509 | if (btrfs_cross_ref_exist(trans, root, btrfs_ino(inode), |
5341 | key.offset - backref_offset, disk_bytenr)) | 5510 | key.offset - backref_offset, disk_bytenr)) |
5342 | goto out; | 5511 | goto out; |
5343 | 5512 | ||
@@ -5438,8 +5607,8 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, | |||
5438 | * to make sure the current transaction stays open | 5607 | * to make sure the current transaction stays open |
5439 | * while we look for nocow cross refs | 5608 | * while we look for nocow cross refs |
5440 | */ | 5609 | */ |
5441 | trans = btrfs_join_transaction(root, 0); | 5610 | trans = btrfs_join_transaction(root); |
5442 | if (!trans) | 5611 | if (IS_ERR(trans)) |
5443 | goto must_cow; | 5612 | goto must_cow; |
5444 | 5613 | ||
5445 | if (can_nocow_odirect(trans, inode, start, len) == 1) { | 5614 | if (can_nocow_odirect(trans, inode, start, len) == 1) { |
@@ -5460,8 +5629,7 @@ must_cow: | |||
5460 | * it above | 5629 | * it above |
5461 | */ | 5630 | */ |
5462 | len = bh_result->b_size; | 5631 | len = bh_result->b_size; |
5463 | free_extent_map(em); | 5632 | em = btrfs_new_extent_direct(inode, em, start, len); |
5464 | em = btrfs_new_extent_direct(inode, start, len); | ||
5465 | if (IS_ERR(em)) | 5633 | if (IS_ERR(em)) |
5466 | return PTR_ERR(em); | 5634 | return PTR_ERR(em); |
5467 | len = min(len, em->len - (start - em->start)); | 5635 | len = min(len, em->len - (start - em->start)); |
@@ -5490,13 +5658,21 @@ struct btrfs_dio_private { | |||
5490 | u64 bytes; | 5658 | u64 bytes; |
5491 | u32 *csums; | 5659 | u32 *csums; |
5492 | void *private; | 5660 | void *private; |
5661 | |||
5662 | /* number of bios pending for this dio */ | ||
5663 | atomic_t pending_bios; | ||
5664 | |||
5665 | /* IO errors */ | ||
5666 | int errors; | ||
5667 | |||
5668 | struct bio *orig_bio; | ||
5493 | }; | 5669 | }; |
5494 | 5670 | ||
5495 | static void btrfs_endio_direct_read(struct bio *bio, int err) | 5671 | static void btrfs_endio_direct_read(struct bio *bio, int err) |
5496 | { | 5672 | { |
5673 | struct btrfs_dio_private *dip = bio->bi_private; | ||
5497 | struct bio_vec *bvec_end = bio->bi_io_vec + bio->bi_vcnt - 1; | 5674 | struct bio_vec *bvec_end = bio->bi_io_vec + bio->bi_vcnt - 1; |
5498 | struct bio_vec *bvec = bio->bi_io_vec; | 5675 | struct bio_vec *bvec = bio->bi_io_vec; |
5499 | struct btrfs_dio_private *dip = bio->bi_private; | ||
5500 | struct inode *inode = dip->inode; | 5676 | struct inode *inode = dip->inode; |
5501 | struct btrfs_root *root = BTRFS_I(inode)->root; | 5677 | struct btrfs_root *root = BTRFS_I(inode)->root; |
5502 | u64 start; | 5678 | u64 start; |
@@ -5520,9 +5696,10 @@ static void btrfs_endio_direct_read(struct bio *bio, int err) | |||
5520 | 5696 | ||
5521 | flush_dcache_page(bvec->bv_page); | 5697 | flush_dcache_page(bvec->bv_page); |
5522 | if (csum != *private) { | 5698 | if (csum != *private) { |
5523 | printk(KERN_ERR "btrfs csum failed ino %lu off" | 5699 | printk(KERN_ERR "btrfs csum failed ino %llu off" |
5524 | " %llu csum %u private %u\n", | 5700 | " %llu csum %u private %u\n", |
5525 | inode->i_ino, (unsigned long long)start, | 5701 | (unsigned long long)btrfs_ino(inode), |
5702 | (unsigned long long)start, | ||
5526 | csum, *private); | 5703 | csum, *private); |
5527 | err = -EIO; | 5704 | err = -EIO; |
5528 | } | 5705 | } |
@@ -5539,6 +5716,10 @@ static void btrfs_endio_direct_read(struct bio *bio, int err) | |||
5539 | 5716 | ||
5540 | kfree(dip->csums); | 5717 | kfree(dip->csums); |
5541 | kfree(dip); | 5718 | kfree(dip); |
5719 | |||
5720 | /* If we had a csum failure make sure to clear the uptodate flag */ | ||
5721 | if (err) | ||
5722 | clear_bit(BIO_UPTODATE, &bio->bi_flags); | ||
5542 | dio_end_io(bio, err); | 5723 | dio_end_io(bio, err); |
5543 | } | 5724 | } |
5544 | 5725 | ||
@@ -5550,20 +5731,23 @@ static void btrfs_endio_direct_write(struct bio *bio, int err) | |||
5550 | struct btrfs_trans_handle *trans; | 5731 | struct btrfs_trans_handle *trans; |
5551 | struct btrfs_ordered_extent *ordered = NULL; | 5732 | struct btrfs_ordered_extent *ordered = NULL; |
5552 | struct extent_state *cached_state = NULL; | 5733 | struct extent_state *cached_state = NULL; |
5734 | u64 ordered_offset = dip->logical_offset; | ||
5735 | u64 ordered_bytes = dip->bytes; | ||
5553 | int ret; | 5736 | int ret; |
5554 | 5737 | ||
5555 | if (err) | 5738 | if (err) |
5556 | goto out_done; | 5739 | goto out_done; |
5557 | 5740 | again: | |
5558 | ret = btrfs_dec_test_ordered_pending(inode, &ordered, | 5741 | ret = btrfs_dec_test_first_ordered_pending(inode, &ordered, |
5559 | dip->logical_offset, dip->bytes); | 5742 | &ordered_offset, |
5743 | ordered_bytes); | ||
5560 | if (!ret) | 5744 | if (!ret) |
5561 | goto out_done; | 5745 | goto out_test; |
5562 | 5746 | ||
5563 | BUG_ON(!ordered); | 5747 | BUG_ON(!ordered); |
5564 | 5748 | ||
5565 | trans = btrfs_join_transaction(root, 1); | 5749 | trans = btrfs_join_transaction(root); |
5566 | if (!trans) { | 5750 | if (IS_ERR(trans)) { |
5567 | err = -ENOMEM; | 5751 | err = -ENOMEM; |
5568 | goto out; | 5752 | goto out; |
5569 | } | 5753 | } |
@@ -5609,8 +5793,10 @@ static void btrfs_endio_direct_write(struct bio *bio, int err) | |||
5609 | } | 5793 | } |
5610 | 5794 | ||
5611 | add_pending_csums(trans, inode, ordered->file_offset, &ordered->list); | 5795 | add_pending_csums(trans, inode, ordered->file_offset, &ordered->list); |
5612 | btrfs_ordered_update_i_size(inode, 0, ordered); | 5796 | ret = btrfs_ordered_update_i_size(inode, 0, ordered); |
5613 | btrfs_update_inode(trans, root, inode); | 5797 | if (!ret) |
5798 | btrfs_update_inode(trans, root, inode); | ||
5799 | ret = 0; | ||
5614 | out_unlock: | 5800 | out_unlock: |
5615 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, ordered->file_offset, | 5801 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, ordered->file_offset, |
5616 | ordered->file_offset + ordered->len - 1, | 5802 | ordered->file_offset + ordered->len - 1, |
@@ -5618,13 +5804,29 @@ out_unlock: | |||
5618 | out: | 5804 | out: |
5619 | btrfs_delalloc_release_metadata(inode, ordered->len); | 5805 | btrfs_delalloc_release_metadata(inode, ordered->len); |
5620 | btrfs_end_transaction(trans, root); | 5806 | btrfs_end_transaction(trans, root); |
5807 | ordered_offset = ordered->file_offset + ordered->len; | ||
5621 | btrfs_put_ordered_extent(ordered); | 5808 | btrfs_put_ordered_extent(ordered); |
5622 | btrfs_put_ordered_extent(ordered); | 5809 | btrfs_put_ordered_extent(ordered); |
5810 | |||
5811 | out_test: | ||
5812 | /* | ||
5813 | * our bio might span multiple ordered extents. If we haven't | ||
5814 | * completed the accounting for the whole dio, go back and try again | ||
5815 | */ | ||
5816 | if (ordered_offset < dip->logical_offset + dip->bytes) { | ||
5817 | ordered_bytes = dip->logical_offset + dip->bytes - | ||
5818 | ordered_offset; | ||
5819 | goto again; | ||
5820 | } | ||
5623 | out_done: | 5821 | out_done: |
5624 | bio->bi_private = dip->private; | 5822 | bio->bi_private = dip->private; |
5625 | 5823 | ||
5626 | kfree(dip->csums); | 5824 | kfree(dip->csums); |
5627 | kfree(dip); | 5825 | kfree(dip); |
5826 | |||
5827 | /* If we had an error make sure to clear the uptodate flag */ | ||
5828 | if (err) | ||
5829 | clear_bit(BIO_UPTODATE, &bio->bi_flags); | ||
5628 | dio_end_io(bio, err); | 5830 | dio_end_io(bio, err); |
5629 | } | 5831 | } |
5630 | 5832 | ||
@@ -5639,13 +5841,207 @@ static int __btrfs_submit_bio_start_direct_io(struct inode *inode, int rw, | |||
5639 | return 0; | 5841 | return 0; |
5640 | } | 5842 | } |
5641 | 5843 | ||
5844 | static void btrfs_end_dio_bio(struct bio *bio, int err) | ||
5845 | { | ||
5846 | struct btrfs_dio_private *dip = bio->bi_private; | ||
5847 | |||
5848 | if (err) { | ||
5849 | printk(KERN_ERR "btrfs direct IO failed ino %llu rw %lu " | ||
5850 | "sector %#Lx len %u err no %d\n", | ||
5851 | (unsigned long long)btrfs_ino(dip->inode), bio->bi_rw, | ||
5852 | (unsigned long long)bio->bi_sector, bio->bi_size, err); | ||
5853 | dip->errors = 1; | ||
5854 | |||
5855 | /* | ||
5856 | * before atomic variable goto zero, we must make sure | ||
5857 | * dip->errors is perceived to be set. | ||
5858 | */ | ||
5859 | smp_mb__before_atomic_dec(); | ||
5860 | } | ||
5861 | |||
5862 | /* if there are more bios still pending for this dio, just exit */ | ||
5863 | if (!atomic_dec_and_test(&dip->pending_bios)) | ||
5864 | goto out; | ||
5865 | |||
5866 | if (dip->errors) | ||
5867 | bio_io_error(dip->orig_bio); | ||
5868 | else { | ||
5869 | set_bit(BIO_UPTODATE, &dip->orig_bio->bi_flags); | ||
5870 | bio_endio(dip->orig_bio, 0); | ||
5871 | } | ||
5872 | out: | ||
5873 | bio_put(bio); | ||
5874 | } | ||
5875 | |||
5876 | static struct bio *btrfs_dio_bio_alloc(struct block_device *bdev, | ||
5877 | u64 first_sector, gfp_t gfp_flags) | ||
5878 | { | ||
5879 | int nr_vecs = bio_get_nr_vecs(bdev); | ||
5880 | return btrfs_bio_alloc(bdev, first_sector, nr_vecs, gfp_flags); | ||
5881 | } | ||
5882 | |||
5883 | static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, | ||
5884 | int rw, u64 file_offset, int skip_sum, | ||
5885 | u32 *csums, int async_submit) | ||
5886 | { | ||
5887 | int write = rw & REQ_WRITE; | ||
5888 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
5889 | int ret; | ||
5890 | |||
5891 | bio_get(bio); | ||
5892 | ret = btrfs_bio_wq_end_io(root->fs_info, bio, 0); | ||
5893 | if (ret) | ||
5894 | goto err; | ||
5895 | |||
5896 | if (skip_sum) | ||
5897 | goto map; | ||
5898 | |||
5899 | if (write && async_submit) { | ||
5900 | ret = btrfs_wq_submit_bio(root->fs_info, | ||
5901 | inode, rw, bio, 0, 0, | ||
5902 | file_offset, | ||
5903 | __btrfs_submit_bio_start_direct_io, | ||
5904 | __btrfs_submit_bio_done); | ||
5905 | goto err; | ||
5906 | } else if (write) { | ||
5907 | /* | ||
5908 | * If we aren't doing async submit, calculate the csum of the | ||
5909 | * bio now. | ||
5910 | */ | ||
5911 | ret = btrfs_csum_one_bio(root, inode, bio, file_offset, 1); | ||
5912 | if (ret) | ||
5913 | goto err; | ||
5914 | } else if (!skip_sum) { | ||
5915 | ret = btrfs_lookup_bio_sums_dio(root, inode, bio, | ||
5916 | file_offset, csums); | ||
5917 | if (ret) | ||
5918 | goto err; | ||
5919 | } | ||
5920 | |||
5921 | map: | ||
5922 | ret = btrfs_map_bio(root, rw, bio, 0, async_submit); | ||
5923 | err: | ||
5924 | bio_put(bio); | ||
5925 | return ret; | ||
5926 | } | ||
5927 | |||
5928 | static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | ||
5929 | int skip_sum) | ||
5930 | { | ||
5931 | struct inode *inode = dip->inode; | ||
5932 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
5933 | struct btrfs_mapping_tree *map_tree = &root->fs_info->mapping_tree; | ||
5934 | struct bio *bio; | ||
5935 | struct bio *orig_bio = dip->orig_bio; | ||
5936 | struct bio_vec *bvec = orig_bio->bi_io_vec; | ||
5937 | u64 start_sector = orig_bio->bi_sector; | ||
5938 | u64 file_offset = dip->logical_offset; | ||
5939 | u64 submit_len = 0; | ||
5940 | u64 map_length; | ||
5941 | int nr_pages = 0; | ||
5942 | u32 *csums = dip->csums; | ||
5943 | int ret = 0; | ||
5944 | int async_submit = 0; | ||
5945 | int write = rw & REQ_WRITE; | ||
5946 | |||
5947 | map_length = orig_bio->bi_size; | ||
5948 | ret = btrfs_map_block(map_tree, READ, start_sector << 9, | ||
5949 | &map_length, NULL, 0); | ||
5950 | if (ret) { | ||
5951 | bio_put(orig_bio); | ||
5952 | return -EIO; | ||
5953 | } | ||
5954 | |||
5955 | if (map_length >= orig_bio->bi_size) { | ||
5956 | bio = orig_bio; | ||
5957 | goto submit; | ||
5958 | } | ||
5959 | |||
5960 | async_submit = 1; | ||
5961 | bio = btrfs_dio_bio_alloc(orig_bio->bi_bdev, start_sector, GFP_NOFS); | ||
5962 | if (!bio) | ||
5963 | return -ENOMEM; | ||
5964 | bio->bi_private = dip; | ||
5965 | bio->bi_end_io = btrfs_end_dio_bio; | ||
5966 | atomic_inc(&dip->pending_bios); | ||
5967 | |||
5968 | while (bvec <= (orig_bio->bi_io_vec + orig_bio->bi_vcnt - 1)) { | ||
5969 | if (unlikely(map_length < submit_len + bvec->bv_len || | ||
5970 | bio_add_page(bio, bvec->bv_page, bvec->bv_len, | ||
5971 | bvec->bv_offset) < bvec->bv_len)) { | ||
5972 | /* | ||
5973 | * inc the count before we submit the bio so | ||
5974 | * we know the end IO handler won't happen before | ||
5975 | * we inc the count. Otherwise, the dip might get freed | ||
5976 | * before we're done setting it up | ||
5977 | */ | ||
5978 | atomic_inc(&dip->pending_bios); | ||
5979 | ret = __btrfs_submit_dio_bio(bio, inode, rw, | ||
5980 | file_offset, skip_sum, | ||
5981 | csums, async_submit); | ||
5982 | if (ret) { | ||
5983 | bio_put(bio); | ||
5984 | atomic_dec(&dip->pending_bios); | ||
5985 | goto out_err; | ||
5986 | } | ||
5987 | |||
5988 | /* Write's use the ordered csums */ | ||
5989 | if (!write && !skip_sum) | ||
5990 | csums = csums + nr_pages; | ||
5991 | start_sector += submit_len >> 9; | ||
5992 | file_offset += submit_len; | ||
5993 | |||
5994 | submit_len = 0; | ||
5995 | nr_pages = 0; | ||
5996 | |||
5997 | bio = btrfs_dio_bio_alloc(orig_bio->bi_bdev, | ||
5998 | start_sector, GFP_NOFS); | ||
5999 | if (!bio) | ||
6000 | goto out_err; | ||
6001 | bio->bi_private = dip; | ||
6002 | bio->bi_end_io = btrfs_end_dio_bio; | ||
6003 | |||
6004 | map_length = orig_bio->bi_size; | ||
6005 | ret = btrfs_map_block(map_tree, READ, start_sector << 9, | ||
6006 | &map_length, NULL, 0); | ||
6007 | if (ret) { | ||
6008 | bio_put(bio); | ||
6009 | goto out_err; | ||
6010 | } | ||
6011 | } else { | ||
6012 | submit_len += bvec->bv_len; | ||
6013 | nr_pages ++; | ||
6014 | bvec++; | ||
6015 | } | ||
6016 | } | ||
6017 | |||
6018 | submit: | ||
6019 | ret = __btrfs_submit_dio_bio(bio, inode, rw, file_offset, skip_sum, | ||
6020 | csums, async_submit); | ||
6021 | if (!ret) | ||
6022 | return 0; | ||
6023 | |||
6024 | bio_put(bio); | ||
6025 | out_err: | ||
6026 | dip->errors = 1; | ||
6027 | /* | ||
6028 | * before atomic variable goto zero, we must | ||
6029 | * make sure dip->errors is perceived to be set. | ||
6030 | */ | ||
6031 | smp_mb__before_atomic_dec(); | ||
6032 | if (atomic_dec_and_test(&dip->pending_bios)) | ||
6033 | bio_io_error(dip->orig_bio); | ||
6034 | |||
6035 | /* bio_end_io() will handle error, so we needn't return it */ | ||
6036 | return 0; | ||
6037 | } | ||
6038 | |||
5642 | static void btrfs_submit_direct(int rw, struct bio *bio, struct inode *inode, | 6039 | static void btrfs_submit_direct(int rw, struct bio *bio, struct inode *inode, |
5643 | loff_t file_offset) | 6040 | loff_t file_offset) |
5644 | { | 6041 | { |
5645 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6042 | struct btrfs_root *root = BTRFS_I(inode)->root; |
5646 | struct btrfs_dio_private *dip; | 6043 | struct btrfs_dio_private *dip; |
5647 | struct bio_vec *bvec = bio->bi_io_vec; | 6044 | struct bio_vec *bvec = bio->bi_io_vec; |
5648 | u64 start; | ||
5649 | int skip_sum; | 6045 | int skip_sum; |
5650 | int write = rw & REQ_WRITE; | 6046 | int write = rw & REQ_WRITE; |
5651 | int ret = 0; | 6047 | int ret = 0; |
@@ -5659,9 +6055,11 @@ static void btrfs_submit_direct(int rw, struct bio *bio, struct inode *inode, | |||
5659 | } | 6055 | } |
5660 | dip->csums = NULL; | 6056 | dip->csums = NULL; |
5661 | 6057 | ||
5662 | if (!skip_sum) { | 6058 | /* Write's use the ordered csum stuff, so we don't need dip->csums */ |
6059 | if (!write && !skip_sum) { | ||
5663 | dip->csums = kmalloc(sizeof(u32) * bio->bi_vcnt, GFP_NOFS); | 6060 | dip->csums = kmalloc(sizeof(u32) * bio->bi_vcnt, GFP_NOFS); |
5664 | if (!dip->csums) { | 6061 | if (!dip->csums) { |
6062 | kfree(dip); | ||
5665 | ret = -ENOMEM; | 6063 | ret = -ENOMEM; |
5666 | goto free_ordered; | 6064 | goto free_ordered; |
5667 | } | 6065 | } |
@@ -5671,7 +6069,6 @@ static void btrfs_submit_direct(int rw, struct bio *bio, struct inode *inode, | |||
5671 | dip->inode = inode; | 6069 | dip->inode = inode; |
5672 | dip->logical_offset = file_offset; | 6070 | dip->logical_offset = file_offset; |
5673 | 6071 | ||
5674 | start = dip->logical_offset; | ||
5675 | dip->bytes = 0; | 6072 | dip->bytes = 0; |
5676 | do { | 6073 | do { |
5677 | dip->bytes += bvec->bv_len; | 6074 | dip->bytes += bvec->bv_len; |
@@ -5680,36 +6077,18 @@ static void btrfs_submit_direct(int rw, struct bio *bio, struct inode *inode, | |||
5680 | 6077 | ||
5681 | dip->disk_bytenr = (u64)bio->bi_sector << 9; | 6078 | dip->disk_bytenr = (u64)bio->bi_sector << 9; |
5682 | bio->bi_private = dip; | 6079 | bio->bi_private = dip; |
6080 | dip->errors = 0; | ||
6081 | dip->orig_bio = bio; | ||
6082 | atomic_set(&dip->pending_bios, 0); | ||
5683 | 6083 | ||
5684 | if (write) | 6084 | if (write) |
5685 | bio->bi_end_io = btrfs_endio_direct_write; | 6085 | bio->bi_end_io = btrfs_endio_direct_write; |
5686 | else | 6086 | else |
5687 | bio->bi_end_io = btrfs_endio_direct_read; | 6087 | bio->bi_end_io = btrfs_endio_direct_read; |
5688 | 6088 | ||
5689 | ret = btrfs_bio_wq_end_io(root->fs_info, bio, 0); | 6089 | ret = btrfs_submit_direct_hook(rw, dip, skip_sum); |
5690 | if (ret) | 6090 | if (!ret) |
5691 | goto out_err; | ||
5692 | |||
5693 | if (write && !skip_sum) { | ||
5694 | ret = btrfs_wq_submit_bio(BTRFS_I(inode)->root->fs_info, | ||
5695 | inode, rw, bio, 0, 0, | ||
5696 | dip->logical_offset, | ||
5697 | __btrfs_submit_bio_start_direct_io, | ||
5698 | __btrfs_submit_bio_done); | ||
5699 | if (ret) | ||
5700 | goto out_err; | ||
5701 | return; | 6091 | return; |
5702 | } else if (!skip_sum) | ||
5703 | btrfs_lookup_bio_sums_dio(root, inode, bio, | ||
5704 | dip->logical_offset, dip->csums); | ||
5705 | |||
5706 | ret = btrfs_map_bio(root, rw, bio, 0, 1); | ||
5707 | if (ret) | ||
5708 | goto out_err; | ||
5709 | return; | ||
5710 | out_err: | ||
5711 | kfree(dip->csums); | ||
5712 | kfree(dip); | ||
5713 | free_ordered: | 6092 | free_ordered: |
5714 | /* | 6093 | /* |
5715 | * If this is a write, we need to clean up the reserved space and kill | 6094 | * If this is a write, we need to clean up the reserved space and kill |
@@ -5717,8 +6096,7 @@ free_ordered: | |||
5717 | */ | 6096 | */ |
5718 | if (write) { | 6097 | if (write) { |
5719 | struct btrfs_ordered_extent *ordered; | 6098 | struct btrfs_ordered_extent *ordered; |
5720 | ordered = btrfs_lookup_ordered_extent(inode, | 6099 | ordered = btrfs_lookup_ordered_extent(inode, file_offset); |
5721 | dip->logical_offset); | ||
5722 | if (!test_bit(BTRFS_ORDERED_PREALLOC, &ordered->flags) && | 6100 | if (!test_bit(BTRFS_ORDERED_PREALLOC, &ordered->flags) && |
5723 | !test_bit(BTRFS_ORDERED_NOCOW, &ordered->flags)) | 6101 | !test_bit(BTRFS_ORDERED_NOCOW, &ordered->flags)) |
5724 | btrfs_free_reserved_extent(root, ordered->start, | 6102 | btrfs_free_reserved_extent(root, ordered->start, |
@@ -5734,6 +6112,7 @@ static ssize_t check_direct_IO(struct btrfs_root *root, int rw, struct kiocb *io | |||
5734 | unsigned long nr_segs) | 6112 | unsigned long nr_segs) |
5735 | { | 6113 | { |
5736 | int seg; | 6114 | int seg; |
6115 | int i; | ||
5737 | size_t size; | 6116 | size_t size; |
5738 | unsigned long addr; | 6117 | unsigned long addr; |
5739 | unsigned blocksize_mask = root->sectorsize - 1; | 6118 | unsigned blocksize_mask = root->sectorsize - 1; |
@@ -5748,8 +6127,22 @@ static ssize_t check_direct_IO(struct btrfs_root *root, int rw, struct kiocb *io | |||
5748 | addr = (unsigned long)iov[seg].iov_base; | 6127 | addr = (unsigned long)iov[seg].iov_base; |
5749 | size = iov[seg].iov_len; | 6128 | size = iov[seg].iov_len; |
5750 | end += size; | 6129 | end += size; |
5751 | if ((addr & blocksize_mask) || (size & blocksize_mask)) | 6130 | if ((addr & blocksize_mask) || (size & blocksize_mask)) |
5752 | goto out; | 6131 | goto out; |
6132 | |||
6133 | /* If this is a write we don't need to check anymore */ | ||
6134 | if (rw & WRITE) | ||
6135 | continue; | ||
6136 | |||
6137 | /* | ||
6138 | * Check to make sure we don't have duplicate iov_base's in this | ||
6139 | * iovec, if so return EINVAL, otherwise we'll get csum errors | ||
6140 | * when reading back. | ||
6141 | */ | ||
6142 | for (i = seg + 1; i < nr_segs; i++) { | ||
6143 | if (iov[seg].iov_base == iov[i].iov_base) | ||
6144 | goto out; | ||
6145 | } | ||
5753 | } | 6146 | } |
5754 | retval = 0; | 6147 | retval = 0; |
5755 | out: | 6148 | out: |
@@ -5850,7 +6243,7 @@ out: | |||
5850 | static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | 6243 | static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, |
5851 | __u64 start, __u64 len) | 6244 | __u64 start, __u64 len) |
5852 | { | 6245 | { |
5853 | return extent_fiemap(inode, fieinfo, start, len, btrfs_get_extent); | 6246 | return extent_fiemap(inode, fieinfo, start, len, btrfs_get_extent_fiemap); |
5854 | } | 6247 | } |
5855 | 6248 | ||
5856 | int btrfs_readpage(struct file *file, struct page *page) | 6249 | int btrfs_readpage(struct file *file, struct page *page) |
@@ -6100,30 +6493,97 @@ out: | |||
6100 | return ret; | 6493 | return ret; |
6101 | } | 6494 | } |
6102 | 6495 | ||
6103 | static void btrfs_truncate(struct inode *inode) | 6496 | static int btrfs_truncate(struct inode *inode) |
6104 | { | 6497 | { |
6105 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6498 | struct btrfs_root *root = BTRFS_I(inode)->root; |
6499 | struct btrfs_block_rsv *rsv; | ||
6106 | int ret; | 6500 | int ret; |
6501 | int err = 0; | ||
6107 | struct btrfs_trans_handle *trans; | 6502 | struct btrfs_trans_handle *trans; |
6108 | unsigned long nr; | 6503 | unsigned long nr; |
6109 | u64 mask = root->sectorsize - 1; | 6504 | u64 mask = root->sectorsize - 1; |
6110 | 6505 | ||
6111 | if (!S_ISREG(inode->i_mode)) { | ||
6112 | WARN_ON(1); | ||
6113 | return; | ||
6114 | } | ||
6115 | |||
6116 | ret = btrfs_truncate_page(inode->i_mapping, inode->i_size); | 6506 | ret = btrfs_truncate_page(inode->i_mapping, inode->i_size); |
6117 | if (ret) | 6507 | if (ret) |
6118 | return; | 6508 | return ret; |
6119 | 6509 | ||
6120 | btrfs_wait_ordered_range(inode, inode->i_size & (~mask), (u64)-1); | 6510 | btrfs_wait_ordered_range(inode, inode->i_size & (~mask), (u64)-1); |
6121 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); | 6511 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); |
6122 | 6512 | ||
6123 | trans = btrfs_start_transaction(root, 0); | 6513 | /* |
6124 | BUG_ON(IS_ERR(trans)); | 6514 | * Yes ladies and gentelment, this is indeed ugly. The fact is we have |
6125 | btrfs_set_trans_block_group(trans, inode); | 6515 | * 3 things going on here |
6126 | trans->block_rsv = root->orphan_block_rsv; | 6516 | * |
6517 | * 1) We need to reserve space for our orphan item and the space to | ||
6518 | * delete our orphan item. Lord knows we don't want to have a dangling | ||
6519 | * orphan item because we didn't reserve space to remove it. | ||
6520 | * | ||
6521 | * 2) We need to reserve space to update our inode. | ||
6522 | * | ||
6523 | * 3) We need to have something to cache all the space that is going to | ||
6524 | * be free'd up by the truncate operation, but also have some slack | ||
6525 | * space reserved in case it uses space during the truncate (thank you | ||
6526 | * very much snapshotting). | ||
6527 | * | ||
6528 | * And we need these to all be seperate. The fact is we can use alot of | ||
6529 | * space doing the truncate, and we have no earthly idea how much space | ||
6530 | * we will use, so we need the truncate reservation to be seperate so it | ||
6531 | * doesn't end up using space reserved for updating the inode or | ||
6532 | * removing the orphan item. We also need to be able to stop the | ||
6533 | * transaction and start a new one, which means we need to be able to | ||
6534 | * update the inode several times, and we have no idea of knowing how | ||
6535 | * many times that will be, so we can't just reserve 1 item for the | ||
6536 | * entirety of the opration, so that has to be done seperately as well. | ||
6537 | * Then there is the orphan item, which does indeed need to be held on | ||
6538 | * to for the whole operation, and we need nobody to touch this reserved | ||
6539 | * space except the orphan code. | ||
6540 | * | ||
6541 | * So that leaves us with | ||
6542 | * | ||
6543 | * 1) root->orphan_block_rsv - for the orphan deletion. | ||
6544 | * 2) rsv - for the truncate reservation, which we will steal from the | ||
6545 | * transaction reservation. | ||
6546 | * 3) fs_info->trans_block_rsv - this will have 1 items worth left for | ||
6547 | * updating the inode. | ||
6548 | */ | ||
6549 | rsv = btrfs_alloc_block_rsv(root); | ||
6550 | if (!rsv) | ||
6551 | return -ENOMEM; | ||
6552 | btrfs_add_durable_block_rsv(root->fs_info, rsv); | ||
6553 | |||
6554 | trans = btrfs_start_transaction(root, 4); | ||
6555 | if (IS_ERR(trans)) { | ||
6556 | err = PTR_ERR(trans); | ||
6557 | goto out; | ||
6558 | } | ||
6559 | |||
6560 | /* | ||
6561 | * Reserve space for the truncate process. Truncate should be adding | ||
6562 | * space, but if there are snapshots it may end up using space. | ||
6563 | */ | ||
6564 | ret = btrfs_truncate_reserve_metadata(trans, root, rsv); | ||
6565 | BUG_ON(ret); | ||
6566 | |||
6567 | ret = btrfs_orphan_add(trans, inode); | ||
6568 | if (ret) { | ||
6569 | btrfs_end_transaction(trans, root); | ||
6570 | goto out; | ||
6571 | } | ||
6572 | |||
6573 | nr = trans->blocks_used; | ||
6574 | btrfs_end_transaction(trans, root); | ||
6575 | btrfs_btree_balance_dirty(root, nr); | ||
6576 | |||
6577 | /* | ||
6578 | * Ok so we've already migrated our bytes over for the truncate, so here | ||
6579 | * just reserve the one slot we need for updating the inode. | ||
6580 | */ | ||
6581 | trans = btrfs_start_transaction(root, 1); | ||
6582 | if (IS_ERR(trans)) { | ||
6583 | err = PTR_ERR(trans); | ||
6584 | goto out; | ||
6585 | } | ||
6586 | trans->block_rsv = rsv; | ||
6127 | 6587 | ||
6128 | /* | 6588 | /* |
6129 | * setattr is responsible for setting the ordered_data_close flag, | 6589 | * setattr is responsible for setting the ordered_data_close flag, |
@@ -6147,30 +6607,33 @@ static void btrfs_truncate(struct inode *inode) | |||
6147 | 6607 | ||
6148 | while (1) { | 6608 | while (1) { |
6149 | if (!trans) { | 6609 | if (!trans) { |
6150 | trans = btrfs_start_transaction(root, 0); | 6610 | trans = btrfs_start_transaction(root, 3); |
6151 | BUG_ON(IS_ERR(trans)); | 6611 | if (IS_ERR(trans)) { |
6152 | btrfs_set_trans_block_group(trans, inode); | 6612 | err = PTR_ERR(trans); |
6153 | trans->block_rsv = root->orphan_block_rsv; | 6613 | goto out; |
6154 | } | 6614 | } |
6155 | 6615 | ||
6156 | ret = btrfs_block_rsv_check(trans, root, | 6616 | ret = btrfs_truncate_reserve_metadata(trans, root, |
6157 | root->orphan_block_rsv, 0, 5); | 6617 | rsv); |
6158 | if (ret) { | ||
6159 | BUG_ON(ret != -EAGAIN); | ||
6160 | ret = btrfs_commit_transaction(trans, root); | ||
6161 | BUG_ON(ret); | 6618 | BUG_ON(ret); |
6162 | trans = NULL; | 6619 | |
6163 | continue; | 6620 | trans->block_rsv = rsv; |
6164 | } | 6621 | } |
6165 | 6622 | ||
6166 | ret = btrfs_truncate_inode_items(trans, root, inode, | 6623 | ret = btrfs_truncate_inode_items(trans, root, inode, |
6167 | inode->i_size, | 6624 | inode->i_size, |
6168 | BTRFS_EXTENT_DATA_KEY); | 6625 | BTRFS_EXTENT_DATA_KEY); |
6169 | if (ret != -EAGAIN) | 6626 | if (ret != -EAGAIN) { |
6627 | err = ret; | ||
6170 | break; | 6628 | break; |
6629 | } | ||
6171 | 6630 | ||
6631 | trans->block_rsv = &root->fs_info->trans_block_rsv; | ||
6172 | ret = btrfs_update_inode(trans, root, inode); | 6632 | ret = btrfs_update_inode(trans, root, inode); |
6173 | BUG_ON(ret); | 6633 | if (ret) { |
6634 | err = ret; | ||
6635 | break; | ||
6636 | } | ||
6174 | 6637 | ||
6175 | nr = trans->blocks_used; | 6638 | nr = trans->blocks_used; |
6176 | btrfs_end_transaction(trans, root); | 6639 | btrfs_end_transaction(trans, root); |
@@ -6179,32 +6642,48 @@ static void btrfs_truncate(struct inode *inode) | |||
6179 | } | 6642 | } |
6180 | 6643 | ||
6181 | if (ret == 0 && inode->i_nlink > 0) { | 6644 | if (ret == 0 && inode->i_nlink > 0) { |
6645 | trans->block_rsv = root->orphan_block_rsv; | ||
6182 | ret = btrfs_orphan_del(trans, inode); | 6646 | ret = btrfs_orphan_del(trans, inode); |
6183 | BUG_ON(ret); | 6647 | if (ret) |
6648 | err = ret; | ||
6649 | } else if (ret && inode->i_nlink > 0) { | ||
6650 | /* | ||
6651 | * Failed to do the truncate, remove us from the in memory | ||
6652 | * orphan list. | ||
6653 | */ | ||
6654 | ret = btrfs_orphan_del(NULL, inode); | ||
6184 | } | 6655 | } |
6185 | 6656 | ||
6657 | trans->block_rsv = &root->fs_info->trans_block_rsv; | ||
6186 | ret = btrfs_update_inode(trans, root, inode); | 6658 | ret = btrfs_update_inode(trans, root, inode); |
6187 | BUG_ON(ret); | 6659 | if (ret && !err) |
6660 | err = ret; | ||
6188 | 6661 | ||
6189 | nr = trans->blocks_used; | 6662 | nr = trans->blocks_used; |
6190 | ret = btrfs_end_transaction_throttle(trans, root); | 6663 | ret = btrfs_end_transaction_throttle(trans, root); |
6191 | BUG_ON(ret); | ||
6192 | btrfs_btree_balance_dirty(root, nr); | 6664 | btrfs_btree_balance_dirty(root, nr); |
6665 | |||
6666 | out: | ||
6667 | btrfs_free_block_rsv(root, rsv); | ||
6668 | |||
6669 | if (ret && !err) | ||
6670 | err = ret; | ||
6671 | |||
6672 | return err; | ||
6193 | } | 6673 | } |
6194 | 6674 | ||
6195 | /* | 6675 | /* |
6196 | * create a new subvolume directory/inode (helper for the ioctl). | 6676 | * create a new subvolume directory/inode (helper for the ioctl). |
6197 | */ | 6677 | */ |
6198 | int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, | 6678 | int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, |
6199 | struct btrfs_root *new_root, | 6679 | struct btrfs_root *new_root, u64 new_dirid) |
6200 | u64 new_dirid, u64 alloc_hint) | ||
6201 | { | 6680 | { |
6202 | struct inode *inode; | 6681 | struct inode *inode; |
6203 | int err; | 6682 | int err; |
6204 | u64 index = 0; | 6683 | u64 index = 0; |
6205 | 6684 | ||
6206 | inode = btrfs_new_inode(trans, new_root, NULL, "..", 2, new_dirid, | 6685 | inode = btrfs_new_inode(trans, new_root, NULL, "..", 2, new_dirid, |
6207 | new_dirid, alloc_hint, S_IFDIR | 0700, &index); | 6686 | new_dirid, S_IFDIR | 0700, &index); |
6208 | if (IS_ERR(inode)) | 6687 | if (IS_ERR(inode)) |
6209 | return PTR_ERR(inode); | 6688 | return PTR_ERR(inode); |
6210 | inode->i_op = &btrfs_dir_inode_operations; | 6689 | inode->i_op = &btrfs_dir_inode_operations; |
@@ -6256,19 +6735,21 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) | |||
6256 | ei->index_cnt = (u64)-1; | 6735 | ei->index_cnt = (u64)-1; |
6257 | ei->last_unlink_trans = 0; | 6736 | ei->last_unlink_trans = 0; |
6258 | 6737 | ||
6259 | spin_lock_init(&ei->accounting_lock); | ||
6260 | atomic_set(&ei->outstanding_extents, 0); | 6738 | atomic_set(&ei->outstanding_extents, 0); |
6261 | ei->reserved_extents = 0; | 6739 | atomic_set(&ei->reserved_extents, 0); |
6262 | 6740 | ||
6263 | ei->ordered_data_close = 0; | 6741 | ei->ordered_data_close = 0; |
6264 | ei->orphan_meta_reserved = 0; | 6742 | ei->orphan_meta_reserved = 0; |
6265 | ei->dummy_inode = 0; | 6743 | ei->dummy_inode = 0; |
6266 | ei->force_compress = 0; | 6744 | ei->in_defrag = 0; |
6745 | ei->force_compress = BTRFS_COMPRESS_NONE; | ||
6746 | |||
6747 | ei->delayed_node = NULL; | ||
6267 | 6748 | ||
6268 | inode = &ei->vfs_inode; | 6749 | inode = &ei->vfs_inode; |
6269 | extent_map_tree_init(&ei->extent_tree, GFP_NOFS); | 6750 | extent_map_tree_init(&ei->extent_tree); |
6270 | extent_io_tree_init(&ei->io_tree, &inode->i_data, GFP_NOFS); | 6751 | extent_io_tree_init(&ei->io_tree, &inode->i_data); |
6271 | extent_io_tree_init(&ei->io_failure_tree, &inode->i_data, GFP_NOFS); | 6752 | extent_io_tree_init(&ei->io_failure_tree, &inode->i_data); |
6272 | mutex_init(&ei->log_mutex); | 6753 | mutex_init(&ei->log_mutex); |
6273 | btrfs_ordered_inode_tree_init(&ei->ordered_tree); | 6754 | btrfs_ordered_inode_tree_init(&ei->ordered_tree); |
6274 | INIT_LIST_HEAD(&ei->i_orphan); | 6755 | INIT_LIST_HEAD(&ei->i_orphan); |
@@ -6279,6 +6760,13 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) | |||
6279 | return inode; | 6760 | return inode; |
6280 | } | 6761 | } |
6281 | 6762 | ||
6763 | static void btrfs_i_callback(struct rcu_head *head) | ||
6764 | { | ||
6765 | struct inode *inode = container_of(head, struct inode, i_rcu); | ||
6766 | INIT_LIST_HEAD(&inode->i_dentry); | ||
6767 | kmem_cache_free(btrfs_inode_cachep, BTRFS_I(inode)); | ||
6768 | } | ||
6769 | |||
6282 | void btrfs_destroy_inode(struct inode *inode) | 6770 | void btrfs_destroy_inode(struct inode *inode) |
6283 | { | 6771 | { |
6284 | struct btrfs_ordered_extent *ordered; | 6772 | struct btrfs_ordered_extent *ordered; |
@@ -6287,7 +6775,7 @@ void btrfs_destroy_inode(struct inode *inode) | |||
6287 | WARN_ON(!list_empty(&inode->i_dentry)); | 6775 | WARN_ON(!list_empty(&inode->i_dentry)); |
6288 | WARN_ON(inode->i_data.nrpages); | 6776 | WARN_ON(inode->i_data.nrpages); |
6289 | WARN_ON(atomic_read(&BTRFS_I(inode)->outstanding_extents)); | 6777 | WARN_ON(atomic_read(&BTRFS_I(inode)->outstanding_extents)); |
6290 | WARN_ON(BTRFS_I(inode)->reserved_extents); | 6778 | WARN_ON(atomic_read(&BTRFS_I(inode)->reserved_extents)); |
6291 | 6779 | ||
6292 | /* | 6780 | /* |
6293 | * This can happen where we create an inode, but somebody else also | 6781 | * This can happen where we create an inode, but somebody else also |
@@ -6310,8 +6798,8 @@ void btrfs_destroy_inode(struct inode *inode) | |||
6310 | 6798 | ||
6311 | spin_lock(&root->orphan_lock); | 6799 | spin_lock(&root->orphan_lock); |
6312 | if (!list_empty(&BTRFS_I(inode)->i_orphan)) { | 6800 | if (!list_empty(&BTRFS_I(inode)->i_orphan)) { |
6313 | printk(KERN_INFO "BTRFS: inode %lu still on the orphan list\n", | 6801 | printk(KERN_INFO "BTRFS: inode %llu still on the orphan list\n", |
6314 | inode->i_ino); | 6802 | (unsigned long long)btrfs_ino(inode)); |
6315 | list_del_init(&BTRFS_I(inode)->i_orphan); | 6803 | list_del_init(&BTRFS_I(inode)->i_orphan); |
6316 | } | 6804 | } |
6317 | spin_unlock(&root->orphan_lock); | 6805 | spin_unlock(&root->orphan_lock); |
@@ -6333,14 +6821,16 @@ void btrfs_destroy_inode(struct inode *inode) | |||
6333 | inode_tree_del(inode); | 6821 | inode_tree_del(inode); |
6334 | btrfs_drop_extent_cache(inode, 0, (u64)-1, 0); | 6822 | btrfs_drop_extent_cache(inode, 0, (u64)-1, 0); |
6335 | free: | 6823 | free: |
6336 | kmem_cache_free(btrfs_inode_cachep, BTRFS_I(inode)); | 6824 | btrfs_remove_delayed_node(inode); |
6825 | call_rcu(&inode->i_rcu, btrfs_i_callback); | ||
6337 | } | 6826 | } |
6338 | 6827 | ||
6339 | int btrfs_drop_inode(struct inode *inode) | 6828 | int btrfs_drop_inode(struct inode *inode) |
6340 | { | 6829 | { |
6341 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6830 | struct btrfs_root *root = BTRFS_I(inode)->root; |
6342 | 6831 | ||
6343 | if (btrfs_root_refs(&root->root_item) == 0) | 6832 | if (btrfs_root_refs(&root->root_item) == 0 && |
6833 | !is_free_space_inode(root, inode)) | ||
6344 | return 1; | 6834 | return 1; |
6345 | else | 6835 | else |
6346 | return generic_drop_inode(inode); | 6836 | return generic_drop_inode(inode); |
@@ -6363,6 +6853,8 @@ void btrfs_destroy_cachep(void) | |||
6363 | kmem_cache_destroy(btrfs_transaction_cachep); | 6853 | kmem_cache_destroy(btrfs_transaction_cachep); |
6364 | if (btrfs_path_cachep) | 6854 | if (btrfs_path_cachep) |
6365 | kmem_cache_destroy(btrfs_path_cachep); | 6855 | kmem_cache_destroy(btrfs_path_cachep); |
6856 | if (btrfs_free_space_cachep) | ||
6857 | kmem_cache_destroy(btrfs_free_space_cachep); | ||
6366 | } | 6858 | } |
6367 | 6859 | ||
6368 | int btrfs_init_cachep(void) | 6860 | int btrfs_init_cachep(void) |
@@ -6391,6 +6883,12 @@ int btrfs_init_cachep(void) | |||
6391 | if (!btrfs_path_cachep) | 6883 | if (!btrfs_path_cachep) |
6392 | goto fail; | 6884 | goto fail; |
6393 | 6885 | ||
6886 | btrfs_free_space_cachep = kmem_cache_create("btrfs_free_space_cache", | ||
6887 | sizeof(struct btrfs_free_space), 0, | ||
6888 | SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, NULL); | ||
6889 | if (!btrfs_free_space_cachep) | ||
6890 | goto fail; | ||
6891 | |||
6394 | return 0; | 6892 | return 0; |
6395 | fail: | 6893 | fail: |
6396 | btrfs_destroy_cachep(); | 6894 | btrfs_destroy_cachep(); |
@@ -6409,6 +6907,26 @@ static int btrfs_getattr(struct vfsmount *mnt, | |||
6409 | return 0; | 6907 | return 0; |
6410 | } | 6908 | } |
6411 | 6909 | ||
6910 | /* | ||
6911 | * If a file is moved, it will inherit the cow and compression flags of the new | ||
6912 | * directory. | ||
6913 | */ | ||
6914 | static void fixup_inode_flags(struct inode *dir, struct inode *inode) | ||
6915 | { | ||
6916 | struct btrfs_inode *b_dir = BTRFS_I(dir); | ||
6917 | struct btrfs_inode *b_inode = BTRFS_I(inode); | ||
6918 | |||
6919 | if (b_dir->flags & BTRFS_INODE_NODATACOW) | ||
6920 | b_inode->flags |= BTRFS_INODE_NODATACOW; | ||
6921 | else | ||
6922 | b_inode->flags &= ~BTRFS_INODE_NODATACOW; | ||
6923 | |||
6924 | if (b_dir->flags & BTRFS_INODE_COMPRESS) | ||
6925 | b_inode->flags |= BTRFS_INODE_COMPRESS; | ||
6926 | else | ||
6927 | b_inode->flags &= ~BTRFS_INODE_COMPRESS; | ||
6928 | } | ||
6929 | |||
6412 | static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | 6930 | static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, |
6413 | struct inode *new_dir, struct dentry *new_dentry) | 6931 | struct inode *new_dir, struct dentry *new_dentry) |
6414 | { | 6932 | { |
@@ -6421,16 +6939,17 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6421 | u64 index = 0; | 6939 | u64 index = 0; |
6422 | u64 root_objectid; | 6940 | u64 root_objectid; |
6423 | int ret; | 6941 | int ret; |
6942 | u64 old_ino = btrfs_ino(old_inode); | ||
6424 | 6943 | ||
6425 | if (new_dir->i_ino == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID) | 6944 | if (btrfs_ino(new_dir) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID) |
6426 | return -EPERM; | 6945 | return -EPERM; |
6427 | 6946 | ||
6428 | /* we only allow rename subvolume link between subvolumes */ | 6947 | /* we only allow rename subvolume link between subvolumes */ |
6429 | if (old_inode->i_ino != BTRFS_FIRST_FREE_OBJECTID && root != dest) | 6948 | if (old_ino != BTRFS_FIRST_FREE_OBJECTID && root != dest) |
6430 | return -EXDEV; | 6949 | return -EXDEV; |
6431 | 6950 | ||
6432 | if (old_inode->i_ino == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID || | 6951 | if (old_ino == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID || |
6433 | (new_inode && new_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID)) | 6952 | (new_inode && btrfs_ino(new_inode) == BTRFS_FIRST_FREE_OBJECTID)) |
6434 | return -ENOTEMPTY; | 6953 | return -ENOTEMPTY; |
6435 | 6954 | ||
6436 | if (S_ISDIR(old_inode->i_mode) && new_inode && | 6955 | if (S_ISDIR(old_inode->i_mode) && new_inode && |
@@ -6446,7 +6965,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6446 | filemap_flush(old_inode->i_mapping); | 6965 | filemap_flush(old_inode->i_mapping); |
6447 | 6966 | ||
6448 | /* close the racy window with snapshot create/destroy ioctl */ | 6967 | /* close the racy window with snapshot create/destroy ioctl */ |
6449 | if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) | 6968 | if (old_ino == BTRFS_FIRST_FREE_OBJECTID) |
6450 | down_read(&root->fs_info->subvol_sem); | 6969 | down_read(&root->fs_info->subvol_sem); |
6451 | /* | 6970 | /* |
6452 | * We want to reserve the absolute worst case amount of items. So if | 6971 | * We want to reserve the absolute worst case amount of items. So if |
@@ -6457,10 +6976,10 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6457 | * should cover the worst case number of items we'll modify. | 6976 | * should cover the worst case number of items we'll modify. |
6458 | */ | 6977 | */ |
6459 | trans = btrfs_start_transaction(root, 20); | 6978 | trans = btrfs_start_transaction(root, 20); |
6460 | if (IS_ERR(trans)) | 6979 | if (IS_ERR(trans)) { |
6461 | return PTR_ERR(trans); | 6980 | ret = PTR_ERR(trans); |
6462 | 6981 | goto out_notrans; | |
6463 | btrfs_set_trans_block_group(trans, new_dir); | 6982 | } |
6464 | 6983 | ||
6465 | if (dest != root) | 6984 | if (dest != root) |
6466 | btrfs_record_root_in_trans(trans, dest); | 6985 | btrfs_record_root_in_trans(trans, dest); |
@@ -6469,15 +6988,15 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6469 | if (ret) | 6988 | if (ret) |
6470 | goto out_fail; | 6989 | goto out_fail; |
6471 | 6990 | ||
6472 | if (unlikely(old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID)) { | 6991 | if (unlikely(old_ino == BTRFS_FIRST_FREE_OBJECTID)) { |
6473 | /* force full log commit if subvolume involved. */ | 6992 | /* force full log commit if subvolume involved. */ |
6474 | root->fs_info->last_trans_log_full_commit = trans->transid; | 6993 | root->fs_info->last_trans_log_full_commit = trans->transid; |
6475 | } else { | 6994 | } else { |
6476 | ret = btrfs_insert_inode_ref(trans, dest, | 6995 | ret = btrfs_insert_inode_ref(trans, dest, |
6477 | new_dentry->d_name.name, | 6996 | new_dentry->d_name.name, |
6478 | new_dentry->d_name.len, | 6997 | new_dentry->d_name.len, |
6479 | old_inode->i_ino, | 6998 | old_ino, |
6480 | new_dir->i_ino, index); | 6999 | btrfs_ino(new_dir), index); |
6481 | if (ret) | 7000 | if (ret) |
6482 | goto out_fail; | 7001 | goto out_fail; |
6483 | /* | 7002 | /* |
@@ -6493,10 +7012,8 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6493 | * make sure the inode gets flushed if it is replacing | 7012 | * make sure the inode gets flushed if it is replacing |
6494 | * something. | 7013 | * something. |
6495 | */ | 7014 | */ |
6496 | if (new_inode && new_inode->i_size && | 7015 | if (new_inode && new_inode->i_size && S_ISREG(old_inode->i_mode)) |
6497 | old_inode && S_ISREG(old_inode->i_mode)) { | ||
6498 | btrfs_add_ordered_operation(trans, root, old_inode); | 7016 | btrfs_add_ordered_operation(trans, root, old_inode); |
6499 | } | ||
6500 | 7017 | ||
6501 | old_dir->i_ctime = old_dir->i_mtime = ctime; | 7018 | old_dir->i_ctime = old_dir->i_mtime = ctime; |
6502 | new_dir->i_ctime = new_dir->i_mtime = ctime; | 7019 | new_dir->i_ctime = new_dir->i_mtime = ctime; |
@@ -6505,23 +7022,24 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6505 | if (old_dentry->d_parent != new_dentry->d_parent) | 7022 | if (old_dentry->d_parent != new_dentry->d_parent) |
6506 | btrfs_record_unlink_dir(trans, old_dir, old_inode, 1); | 7023 | btrfs_record_unlink_dir(trans, old_dir, old_inode, 1); |
6507 | 7024 | ||
6508 | if (unlikely(old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID)) { | 7025 | if (unlikely(old_ino == BTRFS_FIRST_FREE_OBJECTID)) { |
6509 | root_objectid = BTRFS_I(old_inode)->root->root_key.objectid; | 7026 | root_objectid = BTRFS_I(old_inode)->root->root_key.objectid; |
6510 | ret = btrfs_unlink_subvol(trans, root, old_dir, root_objectid, | 7027 | ret = btrfs_unlink_subvol(trans, root, old_dir, root_objectid, |
6511 | old_dentry->d_name.name, | 7028 | old_dentry->d_name.name, |
6512 | old_dentry->d_name.len); | 7029 | old_dentry->d_name.len); |
6513 | } else { | 7030 | } else { |
6514 | btrfs_inc_nlink(old_dentry->d_inode); | 7031 | ret = __btrfs_unlink_inode(trans, root, old_dir, |
6515 | ret = btrfs_unlink_inode(trans, root, old_dir, | 7032 | old_dentry->d_inode, |
6516 | old_dentry->d_inode, | 7033 | old_dentry->d_name.name, |
6517 | old_dentry->d_name.name, | 7034 | old_dentry->d_name.len); |
6518 | old_dentry->d_name.len); | 7035 | if (!ret) |
7036 | ret = btrfs_update_inode(trans, root, old_inode); | ||
6519 | } | 7037 | } |
6520 | BUG_ON(ret); | 7038 | BUG_ON(ret); |
6521 | 7039 | ||
6522 | if (new_inode) { | 7040 | if (new_inode) { |
6523 | new_inode->i_ctime = CURRENT_TIME; | 7041 | new_inode->i_ctime = CURRENT_TIME; |
6524 | if (unlikely(new_inode->i_ino == | 7042 | if (unlikely(btrfs_ino(new_inode) == |
6525 | BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) { | 7043 | BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) { |
6526 | root_objectid = BTRFS_I(new_inode)->location.objectid; | 7044 | root_objectid = BTRFS_I(new_inode)->location.objectid; |
6527 | ret = btrfs_unlink_subvol(trans, dest, new_dir, | 7045 | ret = btrfs_unlink_subvol(trans, dest, new_dir, |
@@ -6542,20 +7060,23 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6542 | } | 7060 | } |
6543 | } | 7061 | } |
6544 | 7062 | ||
7063 | fixup_inode_flags(new_dir, old_inode); | ||
7064 | |||
6545 | ret = btrfs_add_link(trans, new_dir, old_inode, | 7065 | ret = btrfs_add_link(trans, new_dir, old_inode, |
6546 | new_dentry->d_name.name, | 7066 | new_dentry->d_name.name, |
6547 | new_dentry->d_name.len, 0, index); | 7067 | new_dentry->d_name.len, 0, index); |
6548 | BUG_ON(ret); | 7068 | BUG_ON(ret); |
6549 | 7069 | ||
6550 | if (old_inode->i_ino != BTRFS_FIRST_FREE_OBJECTID) { | 7070 | if (old_ino != BTRFS_FIRST_FREE_OBJECTID) { |
6551 | btrfs_log_new_name(trans, old_inode, old_dir, | 7071 | struct dentry *parent = dget_parent(new_dentry); |
6552 | new_dentry->d_parent); | 7072 | btrfs_log_new_name(trans, old_inode, old_dir, parent); |
7073 | dput(parent); | ||
6553 | btrfs_end_log_trans(root); | 7074 | btrfs_end_log_trans(root); |
6554 | } | 7075 | } |
6555 | out_fail: | 7076 | out_fail: |
6556 | btrfs_end_transaction_throttle(trans, root); | 7077 | btrfs_end_transaction_throttle(trans, root); |
6557 | 7078 | out_notrans: | |
6558 | if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) | 7079 | if (old_ino == BTRFS_FIRST_FREE_OBJECTID) |
6559 | up_read(&root->fs_info->subvol_sem); | 7080 | up_read(&root->fs_info->subvol_sem); |
6560 | 7081 | ||
6561 | return ret; | 7082 | return ret; |
@@ -6609,38 +7130,6 @@ int btrfs_start_delalloc_inodes(struct btrfs_root *root, int delay_iput) | |||
6609 | return 0; | 7130 | return 0; |
6610 | } | 7131 | } |
6611 | 7132 | ||
6612 | int btrfs_start_one_delalloc_inode(struct btrfs_root *root, int delay_iput) | ||
6613 | { | ||
6614 | struct btrfs_inode *binode; | ||
6615 | struct inode *inode = NULL; | ||
6616 | |||
6617 | spin_lock(&root->fs_info->delalloc_lock); | ||
6618 | while (!list_empty(&root->fs_info->delalloc_inodes)) { | ||
6619 | binode = list_entry(root->fs_info->delalloc_inodes.next, | ||
6620 | struct btrfs_inode, delalloc_inodes); | ||
6621 | inode = igrab(&binode->vfs_inode); | ||
6622 | if (inode) { | ||
6623 | list_move_tail(&binode->delalloc_inodes, | ||
6624 | &root->fs_info->delalloc_inodes); | ||
6625 | break; | ||
6626 | } | ||
6627 | |||
6628 | list_del_init(&binode->delalloc_inodes); | ||
6629 | cond_resched_lock(&root->fs_info->delalloc_lock); | ||
6630 | } | ||
6631 | spin_unlock(&root->fs_info->delalloc_lock); | ||
6632 | |||
6633 | if (inode) { | ||
6634 | write_inode_now(inode, 0); | ||
6635 | if (delay_iput) | ||
6636 | btrfs_add_delayed_iput(inode); | ||
6637 | else | ||
6638 | iput(inode); | ||
6639 | return 1; | ||
6640 | } | ||
6641 | return 0; | ||
6642 | } | ||
6643 | |||
6644 | static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | 7133 | static int btrfs_symlink(struct inode *dir, struct dentry *dentry, |
6645 | const char *symname) | 7134 | const char *symname) |
6646 | { | 7135 | { |
@@ -6664,9 +7153,6 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
6664 | if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(root)) | 7153 | if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(root)) |
6665 | return -ENAMETOOLONG; | 7154 | return -ENAMETOOLONG; |
6666 | 7155 | ||
6667 | err = btrfs_find_free_objectid(NULL, root, dir->i_ino, &objectid); | ||
6668 | if (err) | ||
6669 | return err; | ||
6670 | /* | 7156 | /* |
6671 | * 2 items for inode item and ref | 7157 | * 2 items for inode item and ref |
6672 | * 2 items for dir items | 7158 | * 2 items for dir items |
@@ -6676,25 +7162,25 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
6676 | if (IS_ERR(trans)) | 7162 | if (IS_ERR(trans)) |
6677 | return PTR_ERR(trans); | 7163 | return PTR_ERR(trans); |
6678 | 7164 | ||
6679 | btrfs_set_trans_block_group(trans, dir); | 7165 | err = btrfs_find_free_ino(root, &objectid); |
7166 | if (err) | ||
7167 | goto out_unlock; | ||
6680 | 7168 | ||
6681 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, | 7169 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, |
6682 | dentry->d_name.len, | 7170 | dentry->d_name.len, btrfs_ino(dir), objectid, |
6683 | dentry->d_parent->d_inode->i_ino, objectid, | 7171 | S_IFLNK|S_IRWXUGO, &index); |
6684 | BTRFS_I(dir)->block_group, S_IFLNK|S_IRWXUGO, | 7172 | if (IS_ERR(inode)) { |
6685 | &index); | 7173 | err = PTR_ERR(inode); |
6686 | err = PTR_ERR(inode); | ||
6687 | if (IS_ERR(inode)) | ||
6688 | goto out_unlock; | 7174 | goto out_unlock; |
7175 | } | ||
6689 | 7176 | ||
6690 | err = btrfs_init_inode_security(trans, inode, dir); | 7177 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); |
6691 | if (err) { | 7178 | if (err) { |
6692 | drop_inode = 1; | 7179 | drop_inode = 1; |
6693 | goto out_unlock; | 7180 | goto out_unlock; |
6694 | } | 7181 | } |
6695 | 7182 | ||
6696 | btrfs_set_trans_block_group(trans, inode); | 7183 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); |
6697 | err = btrfs_add_nondir(trans, dentry, inode, 0, index); | ||
6698 | if (err) | 7184 | if (err) |
6699 | drop_inode = 1; | 7185 | drop_inode = 1; |
6700 | else { | 7186 | else { |
@@ -6704,14 +7190,12 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
6704 | inode->i_op = &btrfs_file_inode_operations; | 7190 | inode->i_op = &btrfs_file_inode_operations; |
6705 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; | 7191 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; |
6706 | } | 7192 | } |
6707 | btrfs_update_inode_block_group(trans, inode); | ||
6708 | btrfs_update_inode_block_group(trans, dir); | ||
6709 | if (drop_inode) | 7193 | if (drop_inode) |
6710 | goto out_unlock; | 7194 | goto out_unlock; |
6711 | 7195 | ||
6712 | path = btrfs_alloc_path(); | 7196 | path = btrfs_alloc_path(); |
6713 | BUG_ON(!path); | 7197 | BUG_ON(!path); |
6714 | key.objectid = inode->i_ino; | 7198 | key.objectid = btrfs_ino(inode); |
6715 | key.offset = 0; | 7199 | key.offset = 0; |
6716 | btrfs_set_key_type(&key, BTRFS_EXTENT_DATA_KEY); | 7200 | btrfs_set_key_type(&key, BTRFS_EXTENT_DATA_KEY); |
6717 | datasize = btrfs_file_extent_calc_inline_size(name_len); | 7201 | datasize = btrfs_file_extent_calc_inline_size(name_len); |
@@ -6719,6 +7203,7 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
6719 | datasize); | 7203 | datasize); |
6720 | if (err) { | 7204 | if (err) { |
6721 | drop_inode = 1; | 7205 | drop_inode = 1; |
7206 | btrfs_free_path(path); | ||
6722 | goto out_unlock; | 7207 | goto out_unlock; |
6723 | } | 7208 | } |
6724 | leaf = path->nodes[0]; | 7209 | leaf = path->nodes[0]; |
@@ -6757,27 +7242,34 @@ out_unlock: | |||
6757 | return err; | 7242 | return err; |
6758 | } | 7243 | } |
6759 | 7244 | ||
6760 | int btrfs_prealloc_file_range(struct inode *inode, int mode, | 7245 | static int __btrfs_prealloc_file_range(struct inode *inode, int mode, |
6761 | u64 start, u64 num_bytes, u64 min_size, | 7246 | u64 start, u64 num_bytes, u64 min_size, |
6762 | loff_t actual_len, u64 *alloc_hint) | 7247 | loff_t actual_len, u64 *alloc_hint, |
7248 | struct btrfs_trans_handle *trans) | ||
6763 | { | 7249 | { |
6764 | struct btrfs_trans_handle *trans; | ||
6765 | struct btrfs_root *root = BTRFS_I(inode)->root; | 7250 | struct btrfs_root *root = BTRFS_I(inode)->root; |
6766 | struct btrfs_key ins; | 7251 | struct btrfs_key ins; |
6767 | u64 cur_offset = start; | 7252 | u64 cur_offset = start; |
7253 | u64 i_size; | ||
6768 | int ret = 0; | 7254 | int ret = 0; |
7255 | bool own_trans = true; | ||
6769 | 7256 | ||
7257 | if (trans) | ||
7258 | own_trans = false; | ||
6770 | while (num_bytes > 0) { | 7259 | while (num_bytes > 0) { |
6771 | trans = btrfs_start_transaction(root, 3); | 7260 | if (own_trans) { |
6772 | if (IS_ERR(trans)) { | 7261 | trans = btrfs_start_transaction(root, 3); |
6773 | ret = PTR_ERR(trans); | 7262 | if (IS_ERR(trans)) { |
6774 | break; | 7263 | ret = PTR_ERR(trans); |
7264 | break; | ||
7265 | } | ||
6775 | } | 7266 | } |
6776 | 7267 | ||
6777 | ret = btrfs_reserve_extent(trans, root, num_bytes, min_size, | 7268 | ret = btrfs_reserve_extent(trans, root, num_bytes, min_size, |
6778 | 0, *alloc_hint, (u64)-1, &ins, 1); | 7269 | 0, *alloc_hint, (u64)-1, &ins, 1); |
6779 | if (ret) { | 7270 | if (ret) { |
6780 | btrfs_end_transaction(trans, root); | 7271 | if (own_trans) |
7272 | btrfs_end_transaction(trans, root); | ||
6781 | break; | 7273 | break; |
6782 | } | 7274 | } |
6783 | 7275 | ||
@@ -6800,121 +7292,38 @@ int btrfs_prealloc_file_range(struct inode *inode, int mode, | |||
6800 | (actual_len > inode->i_size) && | 7292 | (actual_len > inode->i_size) && |
6801 | (cur_offset > inode->i_size)) { | 7293 | (cur_offset > inode->i_size)) { |
6802 | if (cur_offset > actual_len) | 7294 | if (cur_offset > actual_len) |
6803 | i_size_write(inode, actual_len); | 7295 | i_size = actual_len; |
6804 | else | 7296 | else |
6805 | i_size_write(inode, cur_offset); | 7297 | i_size = cur_offset; |
6806 | i_size_write(inode, cur_offset); | 7298 | i_size_write(inode, i_size); |
6807 | btrfs_ordered_update_i_size(inode, cur_offset, NULL); | 7299 | btrfs_ordered_update_i_size(inode, i_size, NULL); |
6808 | } | 7300 | } |
6809 | 7301 | ||
6810 | ret = btrfs_update_inode(trans, root, inode); | 7302 | ret = btrfs_update_inode(trans, root, inode); |
6811 | BUG_ON(ret); | 7303 | BUG_ON(ret); |
6812 | 7304 | ||
6813 | btrfs_end_transaction(trans, root); | 7305 | if (own_trans) |
7306 | btrfs_end_transaction(trans, root); | ||
6814 | } | 7307 | } |
6815 | return ret; | 7308 | return ret; |
6816 | } | 7309 | } |
6817 | 7310 | ||
6818 | static long btrfs_fallocate(struct inode *inode, int mode, | 7311 | int btrfs_prealloc_file_range(struct inode *inode, int mode, |
6819 | loff_t offset, loff_t len) | 7312 | u64 start, u64 num_bytes, u64 min_size, |
7313 | loff_t actual_len, u64 *alloc_hint) | ||
6820 | { | 7314 | { |
6821 | struct extent_state *cached_state = NULL; | 7315 | return __btrfs_prealloc_file_range(inode, mode, start, num_bytes, |
6822 | u64 cur_offset; | 7316 | min_size, actual_len, alloc_hint, |
6823 | u64 last_byte; | 7317 | NULL); |
6824 | u64 alloc_start; | 7318 | } |
6825 | u64 alloc_end; | ||
6826 | u64 alloc_hint = 0; | ||
6827 | u64 locked_end; | ||
6828 | u64 mask = BTRFS_I(inode)->root->sectorsize - 1; | ||
6829 | struct extent_map *em; | ||
6830 | int ret; | ||
6831 | |||
6832 | alloc_start = offset & ~mask; | ||
6833 | alloc_end = (offset + len + mask) & ~mask; | ||
6834 | |||
6835 | /* | ||
6836 | * wait for ordered IO before we have any locks. We'll loop again | ||
6837 | * below with the locks held. | ||
6838 | */ | ||
6839 | btrfs_wait_ordered_range(inode, alloc_start, alloc_end - alloc_start); | ||
6840 | |||
6841 | mutex_lock(&inode->i_mutex); | ||
6842 | if (alloc_start > inode->i_size) { | ||
6843 | ret = btrfs_cont_expand(inode, alloc_start); | ||
6844 | if (ret) | ||
6845 | goto out; | ||
6846 | } | ||
6847 | |||
6848 | ret = btrfs_check_data_free_space(inode, alloc_end - alloc_start); | ||
6849 | if (ret) | ||
6850 | goto out; | ||
6851 | |||
6852 | locked_end = alloc_end - 1; | ||
6853 | while (1) { | ||
6854 | struct btrfs_ordered_extent *ordered; | ||
6855 | |||
6856 | /* the extent lock is ordered inside the running | ||
6857 | * transaction | ||
6858 | */ | ||
6859 | lock_extent_bits(&BTRFS_I(inode)->io_tree, alloc_start, | ||
6860 | locked_end, 0, &cached_state, GFP_NOFS); | ||
6861 | ordered = btrfs_lookup_first_ordered_extent(inode, | ||
6862 | alloc_end - 1); | ||
6863 | if (ordered && | ||
6864 | ordered->file_offset + ordered->len > alloc_start && | ||
6865 | ordered->file_offset < alloc_end) { | ||
6866 | btrfs_put_ordered_extent(ordered); | ||
6867 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, | ||
6868 | alloc_start, locked_end, | ||
6869 | &cached_state, GFP_NOFS); | ||
6870 | /* | ||
6871 | * we can't wait on the range with the transaction | ||
6872 | * running or with the extent lock held | ||
6873 | */ | ||
6874 | btrfs_wait_ordered_range(inode, alloc_start, | ||
6875 | alloc_end - alloc_start); | ||
6876 | } else { | ||
6877 | if (ordered) | ||
6878 | btrfs_put_ordered_extent(ordered); | ||
6879 | break; | ||
6880 | } | ||
6881 | } | ||
6882 | |||
6883 | cur_offset = alloc_start; | ||
6884 | while (1) { | ||
6885 | em = btrfs_get_extent(inode, NULL, 0, cur_offset, | ||
6886 | alloc_end - cur_offset, 0); | ||
6887 | BUG_ON(IS_ERR(em) || !em); | ||
6888 | last_byte = min(extent_map_end(em), alloc_end); | ||
6889 | last_byte = (last_byte + mask) & ~mask; | ||
6890 | if (em->block_start == EXTENT_MAP_HOLE || | ||
6891 | (cur_offset >= inode->i_size && | ||
6892 | !test_bit(EXTENT_FLAG_PREALLOC, &em->flags))) { | ||
6893 | ret = btrfs_prealloc_file_range(inode, mode, cur_offset, | ||
6894 | last_byte - cur_offset, | ||
6895 | 1 << inode->i_blkbits, | ||
6896 | offset + len, | ||
6897 | &alloc_hint); | ||
6898 | if (ret < 0) { | ||
6899 | free_extent_map(em); | ||
6900 | break; | ||
6901 | } | ||
6902 | } | ||
6903 | free_extent_map(em); | ||
6904 | |||
6905 | cur_offset = last_byte; | ||
6906 | if (cur_offset >= alloc_end) { | ||
6907 | ret = 0; | ||
6908 | break; | ||
6909 | } | ||
6910 | } | ||
6911 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, alloc_start, locked_end, | ||
6912 | &cached_state, GFP_NOFS); | ||
6913 | 7319 | ||
6914 | btrfs_free_reserved_data_space(inode, alloc_end - alloc_start); | 7320 | int btrfs_prealloc_file_range_trans(struct inode *inode, |
6915 | out: | 7321 | struct btrfs_trans_handle *trans, int mode, |
6916 | mutex_unlock(&inode->i_mutex); | 7322 | u64 start, u64 num_bytes, u64 min_size, |
6917 | return ret; | 7323 | loff_t actual_len, u64 *alloc_hint) |
7324 | { | ||
7325 | return __btrfs_prealloc_file_range(inode, mode, start, num_bytes, | ||
7326 | min_size, actual_len, alloc_hint, trans); | ||
6918 | } | 7327 | } |
6919 | 7328 | ||
6920 | static int btrfs_set_page_dirty(struct page *page) | 7329 | static int btrfs_set_page_dirty(struct page *page) |
@@ -6922,11 +7331,15 @@ static int btrfs_set_page_dirty(struct page *page) | |||
6922 | return __set_page_dirty_nobuffers(page); | 7331 | return __set_page_dirty_nobuffers(page); |
6923 | } | 7332 | } |
6924 | 7333 | ||
6925 | static int btrfs_permission(struct inode *inode, int mask) | 7334 | static int btrfs_permission(struct inode *inode, int mask, unsigned int flags) |
6926 | { | 7335 | { |
7336 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
7337 | |||
7338 | if (btrfs_root_readonly(root) && (mask & MAY_WRITE)) | ||
7339 | return -EROFS; | ||
6927 | if ((BTRFS_I(inode)->flags & BTRFS_INODE_READONLY) && (mask & MAY_WRITE)) | 7340 | if ((BTRFS_I(inode)->flags & BTRFS_INODE_READONLY) && (mask & MAY_WRITE)) |
6928 | return -EACCES; | 7341 | return -EACCES; |
6929 | return generic_permission(inode, mask, btrfs_check_acl); | 7342 | return generic_permission(inode, mask, flags, btrfs_check_acl); |
6930 | } | 7343 | } |
6931 | 7344 | ||
6932 | static const struct inode_operations btrfs_dir_inode_operations = { | 7345 | static const struct inode_operations btrfs_dir_inode_operations = { |
@@ -6995,7 +7408,6 @@ static const struct address_space_operations btrfs_aops = { | |||
6995 | .writepage = btrfs_writepage, | 7408 | .writepage = btrfs_writepage, |
6996 | .writepages = btrfs_writepages, | 7409 | .writepages = btrfs_writepages, |
6997 | .readpages = btrfs_readpages, | 7410 | .readpages = btrfs_readpages, |
6998 | .sync_page = block_sync_page, | ||
6999 | .direct_IO = btrfs_direct_IO, | 7411 | .direct_IO = btrfs_direct_IO, |
7000 | .invalidatepage = btrfs_invalidatepage, | 7412 | .invalidatepage = btrfs_invalidatepage, |
7001 | .releasepage = btrfs_releasepage, | 7413 | .releasepage = btrfs_releasepage, |
@@ -7011,7 +7423,6 @@ static const struct address_space_operations btrfs_symlink_aops = { | |||
7011 | }; | 7423 | }; |
7012 | 7424 | ||
7013 | static const struct inode_operations btrfs_file_inode_operations = { | 7425 | static const struct inode_operations btrfs_file_inode_operations = { |
7014 | .truncate = btrfs_truncate, | ||
7015 | .getattr = btrfs_getattr, | 7426 | .getattr = btrfs_getattr, |
7016 | .setattr = btrfs_setattr, | 7427 | .setattr = btrfs_setattr, |
7017 | .setxattr = btrfs_setxattr, | 7428 | .setxattr = btrfs_setxattr, |
@@ -7019,7 +7430,6 @@ static const struct inode_operations btrfs_file_inode_operations = { | |||
7019 | .listxattr = btrfs_listxattr, | 7430 | .listxattr = btrfs_listxattr, |
7020 | .removexattr = btrfs_removexattr, | 7431 | .removexattr = btrfs_removexattr, |
7021 | .permission = btrfs_permission, | 7432 | .permission = btrfs_permission, |
7022 | .fallocate = btrfs_fallocate, | ||
7023 | .fiemap = btrfs_fiemap, | 7433 | .fiemap = btrfs_fiemap, |
7024 | }; | 7434 | }; |
7025 | static const struct inode_operations btrfs_special_inode_operations = { | 7435 | static const struct inode_operations btrfs_special_inode_operations = { |
@@ -7035,6 +7445,7 @@ static const struct inode_operations btrfs_symlink_inode_operations = { | |||
7035 | .readlink = generic_readlink, | 7445 | .readlink = generic_readlink, |
7036 | .follow_link = page_follow_link_light, | 7446 | .follow_link = page_follow_link_light, |
7037 | .put_link = page_put_link, | 7447 | .put_link = page_put_link, |
7448 | .getattr = btrfs_getattr, | ||
7038 | .permission = btrfs_permission, | 7449 | .permission = btrfs_permission, |
7039 | .setxattr = btrfs_setxattr, | 7450 | .setxattr = btrfs_setxattr, |
7040 | .getxattr = btrfs_getxattr, | 7451 | .getxattr = btrfs_getxattr, |