diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 936 |
1 files changed, 580 insertions, 356 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index a3798a3aa0d2..fcd66b6a8086 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -50,6 +50,7 @@ | |||
50 | #include "tree-log.h" | 50 | #include "tree-log.h" |
51 | #include "compression.h" | 51 | #include "compression.h" |
52 | #include "locking.h" | 52 | #include "locking.h" |
53 | #include "free-space-cache.h" | ||
53 | 54 | ||
54 | struct btrfs_iget_args { | 55 | struct btrfs_iget_args { |
55 | u64 ino; | 56 | u64 ino; |
@@ -70,6 +71,7 @@ static struct kmem_cache *btrfs_inode_cachep; | |||
70 | struct kmem_cache *btrfs_trans_handle_cachep; | 71 | struct kmem_cache *btrfs_trans_handle_cachep; |
71 | struct kmem_cache *btrfs_transaction_cachep; | 72 | struct kmem_cache *btrfs_transaction_cachep; |
72 | struct kmem_cache *btrfs_path_cachep; | 73 | struct kmem_cache *btrfs_path_cachep; |
74 | struct kmem_cache *btrfs_free_space_cachep; | ||
73 | 75 | ||
74 | #define S_SHIFT 12 | 76 | #define S_SHIFT 12 |
75 | static unsigned char btrfs_type_by_mode[S_IFMT >> S_SHIFT] = { | 77 | static unsigned char btrfs_type_by_mode[S_IFMT >> S_SHIFT] = { |
@@ -82,7 +84,8 @@ static unsigned char btrfs_type_by_mode[S_IFMT >> S_SHIFT] = { | |||
82 | [S_IFLNK >> S_SHIFT] = BTRFS_FT_SYMLINK, | 84 | [S_IFLNK >> S_SHIFT] = BTRFS_FT_SYMLINK, |
83 | }; | 85 | }; |
84 | 86 | ||
85 | static void btrfs_truncate(struct inode *inode); | 87 | static int btrfs_setsize(struct inode *inode, loff_t newsize); |
88 | static int btrfs_truncate(struct inode *inode); | ||
86 | static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end); | 89 | static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end); |
87 | static noinline int cow_file_range(struct inode *inode, | 90 | static noinline int cow_file_range(struct inode *inode, |
88 | struct page *locked_page, | 91 | struct page *locked_page, |
@@ -90,13 +93,14 @@ static noinline int cow_file_range(struct inode *inode, | |||
90 | unsigned long *nr_written, int unlock); | 93 | unsigned long *nr_written, int unlock); |
91 | 94 | ||
92 | static int btrfs_init_inode_security(struct btrfs_trans_handle *trans, | 95 | static int btrfs_init_inode_security(struct btrfs_trans_handle *trans, |
93 | struct inode *inode, struct inode *dir) | 96 | struct inode *inode, struct inode *dir, |
97 | const struct qstr *qstr) | ||
94 | { | 98 | { |
95 | int err; | 99 | int err; |
96 | 100 | ||
97 | err = btrfs_init_acl(trans, inode, dir); | 101 | err = btrfs_init_acl(trans, inode, dir); |
98 | if (!err) | 102 | if (!err) |
99 | err = btrfs_xattr_security_init(trans, inode, dir); | 103 | err = btrfs_xattr_security_init(trans, inode, dir, qstr); |
100 | return err; | 104 | return err; |
101 | } | 105 | } |
102 | 106 | ||
@@ -108,6 +112,7 @@ static int btrfs_init_inode_security(struct btrfs_trans_handle *trans, | |||
108 | static noinline int insert_inline_extent(struct btrfs_trans_handle *trans, | 112 | static noinline int insert_inline_extent(struct btrfs_trans_handle *trans, |
109 | struct btrfs_root *root, struct inode *inode, | 113 | struct btrfs_root *root, struct inode *inode, |
110 | u64 start, size_t size, size_t compressed_size, | 114 | u64 start, size_t size, size_t compressed_size, |
115 | int compress_type, | ||
111 | struct page **compressed_pages) | 116 | struct page **compressed_pages) |
112 | { | 117 | { |
113 | struct btrfs_key key; | 118 | struct btrfs_key key; |
@@ -122,12 +127,9 @@ static noinline int insert_inline_extent(struct btrfs_trans_handle *trans, | |||
122 | size_t cur_size = size; | 127 | size_t cur_size = size; |
123 | size_t datasize; | 128 | size_t datasize; |
124 | unsigned long offset; | 129 | unsigned long offset; |
125 | int use_compress = 0; | ||
126 | 130 | ||
127 | if (compressed_size && compressed_pages) { | 131 | if (compressed_size && compressed_pages) |
128 | use_compress = 1; | ||
129 | cur_size = compressed_size; | 132 | cur_size = compressed_size; |
130 | } | ||
131 | 133 | ||
132 | path = btrfs_alloc_path(); | 134 | path = btrfs_alloc_path(); |
133 | if (!path) | 135 | if (!path) |
@@ -159,7 +161,7 @@ static noinline int insert_inline_extent(struct btrfs_trans_handle *trans, | |||
159 | btrfs_set_file_extent_ram_bytes(leaf, ei, size); | 161 | btrfs_set_file_extent_ram_bytes(leaf, ei, size); |
160 | ptr = btrfs_file_extent_inline_start(ei); | 162 | ptr = btrfs_file_extent_inline_start(ei); |
161 | 163 | ||
162 | if (use_compress) { | 164 | if (compress_type != BTRFS_COMPRESS_NONE) { |
163 | struct page *cpage; | 165 | struct page *cpage; |
164 | int i = 0; | 166 | int i = 0; |
165 | while (compressed_size > 0) { | 167 | while (compressed_size > 0) { |
@@ -176,7 +178,7 @@ static noinline int insert_inline_extent(struct btrfs_trans_handle *trans, | |||
176 | compressed_size -= cur_size; | 178 | compressed_size -= cur_size; |
177 | } | 179 | } |
178 | btrfs_set_file_extent_compression(leaf, ei, | 180 | btrfs_set_file_extent_compression(leaf, ei, |
179 | BTRFS_COMPRESS_ZLIB); | 181 | compress_type); |
180 | } else { | 182 | } else { |
181 | page = find_get_page(inode->i_mapping, | 183 | page = find_get_page(inode->i_mapping, |
182 | start >> PAGE_CACHE_SHIFT); | 184 | start >> PAGE_CACHE_SHIFT); |
@@ -217,7 +219,7 @@ fail: | |||
217 | static noinline int cow_file_range_inline(struct btrfs_trans_handle *trans, | 219 | static noinline int cow_file_range_inline(struct btrfs_trans_handle *trans, |
218 | struct btrfs_root *root, | 220 | struct btrfs_root *root, |
219 | struct inode *inode, u64 start, u64 end, | 221 | struct inode *inode, u64 start, u64 end, |
220 | size_t compressed_size, | 222 | size_t compressed_size, int compress_type, |
221 | struct page **compressed_pages) | 223 | struct page **compressed_pages) |
222 | { | 224 | { |
223 | u64 isize = i_size_read(inode); | 225 | u64 isize = i_size_read(inode); |
@@ -250,7 +252,7 @@ static noinline int cow_file_range_inline(struct btrfs_trans_handle *trans, | |||
250 | inline_len = min_t(u64, isize, actual_end); | 252 | inline_len = min_t(u64, isize, actual_end); |
251 | ret = insert_inline_extent(trans, root, inode, start, | 253 | ret = insert_inline_extent(trans, root, inode, start, |
252 | inline_len, compressed_size, | 254 | inline_len, compressed_size, |
253 | compressed_pages); | 255 | compress_type, compressed_pages); |
254 | BUG_ON(ret); | 256 | BUG_ON(ret); |
255 | btrfs_delalloc_release_metadata(inode, end + 1 - start); | 257 | btrfs_delalloc_release_metadata(inode, end + 1 - start); |
256 | btrfs_drop_extent_cache(inode, start, aligned_end - 1, 0); | 258 | btrfs_drop_extent_cache(inode, start, aligned_end - 1, 0); |
@@ -263,6 +265,7 @@ struct async_extent { | |||
263 | u64 compressed_size; | 265 | u64 compressed_size; |
264 | struct page **pages; | 266 | struct page **pages; |
265 | unsigned long nr_pages; | 267 | unsigned long nr_pages; |
268 | int compress_type; | ||
266 | struct list_head list; | 269 | struct list_head list; |
267 | }; | 270 | }; |
268 | 271 | ||
@@ -280,16 +283,19 @@ static noinline int add_async_extent(struct async_cow *cow, | |||
280 | u64 start, u64 ram_size, | 283 | u64 start, u64 ram_size, |
281 | u64 compressed_size, | 284 | u64 compressed_size, |
282 | struct page **pages, | 285 | struct page **pages, |
283 | unsigned long nr_pages) | 286 | unsigned long nr_pages, |
287 | int compress_type) | ||
284 | { | 288 | { |
285 | struct async_extent *async_extent; | 289 | struct async_extent *async_extent; |
286 | 290 | ||
287 | async_extent = kmalloc(sizeof(*async_extent), GFP_NOFS); | 291 | async_extent = kmalloc(sizeof(*async_extent), GFP_NOFS); |
292 | BUG_ON(!async_extent); | ||
288 | async_extent->start = start; | 293 | async_extent->start = start; |
289 | async_extent->ram_size = ram_size; | 294 | async_extent->ram_size = ram_size; |
290 | async_extent->compressed_size = compressed_size; | 295 | async_extent->compressed_size = compressed_size; |
291 | async_extent->pages = pages; | 296 | async_extent->pages = pages; |
292 | async_extent->nr_pages = nr_pages; | 297 | async_extent->nr_pages = nr_pages; |
298 | async_extent->compress_type = compress_type; | ||
293 | list_add_tail(&async_extent->list, &cow->extents); | 299 | list_add_tail(&async_extent->list, &cow->extents); |
294 | return 0; | 300 | return 0; |
295 | } | 301 | } |
@@ -332,6 +338,7 @@ static noinline int compress_file_range(struct inode *inode, | |||
332 | unsigned long max_uncompressed = 128 * 1024; | 338 | unsigned long max_uncompressed = 128 * 1024; |
333 | int i; | 339 | int i; |
334 | int will_compress; | 340 | int will_compress; |
341 | int compress_type = root->fs_info->compress_type; | ||
335 | 342 | ||
336 | actual_end = min_t(u64, isize, end + 1); | 343 | actual_end = min_t(u64, isize, end + 1); |
337 | again: | 344 | again: |
@@ -377,16 +384,22 @@ again: | |||
377 | */ | 384 | */ |
378 | if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NOCOMPRESS) && | 385 | if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NOCOMPRESS) && |
379 | (btrfs_test_opt(root, COMPRESS) || | 386 | (btrfs_test_opt(root, COMPRESS) || |
380 | (BTRFS_I(inode)->force_compress))) { | 387 | (BTRFS_I(inode)->force_compress) || |
388 | (BTRFS_I(inode)->flags & BTRFS_INODE_COMPRESS))) { | ||
381 | WARN_ON(pages); | 389 | WARN_ON(pages); |
382 | pages = kzalloc(sizeof(struct page *) * nr_pages, GFP_NOFS); | 390 | pages = kzalloc(sizeof(struct page *) * nr_pages, GFP_NOFS); |
391 | BUG_ON(!pages); | ||
392 | |||
393 | if (BTRFS_I(inode)->force_compress) | ||
394 | compress_type = BTRFS_I(inode)->force_compress; | ||
383 | 395 | ||
384 | ret = btrfs_zlib_compress_pages(inode->i_mapping, start, | 396 | ret = btrfs_compress_pages(compress_type, |
385 | total_compressed, pages, | 397 | inode->i_mapping, start, |
386 | nr_pages, &nr_pages_ret, | 398 | total_compressed, pages, |
387 | &total_in, | 399 | nr_pages, &nr_pages_ret, |
388 | &total_compressed, | 400 | &total_in, |
389 | max_compressed); | 401 | &total_compressed, |
402 | max_compressed); | ||
390 | 403 | ||
391 | if (!ret) { | 404 | if (!ret) { |
392 | unsigned long offset = total_compressed & | 405 | unsigned long offset = total_compressed & |
@@ -408,7 +421,7 @@ again: | |||
408 | } | 421 | } |
409 | if (start == 0) { | 422 | if (start == 0) { |
410 | trans = btrfs_join_transaction(root, 1); | 423 | trans = btrfs_join_transaction(root, 1); |
411 | BUG_ON(!trans); | 424 | BUG_ON(IS_ERR(trans)); |
412 | btrfs_set_trans_block_group(trans, inode); | 425 | btrfs_set_trans_block_group(trans, inode); |
413 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 426 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
414 | 427 | ||
@@ -418,12 +431,13 @@ again: | |||
418 | * to make an uncompressed inline extent. | 431 | * to make an uncompressed inline extent. |
419 | */ | 432 | */ |
420 | ret = cow_file_range_inline(trans, root, inode, | 433 | ret = cow_file_range_inline(trans, root, inode, |
421 | start, end, 0, NULL); | 434 | start, end, 0, 0, NULL); |
422 | } else { | 435 | } else { |
423 | /* try making a compressed inline extent */ | 436 | /* try making a compressed inline extent */ |
424 | ret = cow_file_range_inline(trans, root, inode, | 437 | ret = cow_file_range_inline(trans, root, inode, |
425 | start, end, | 438 | start, end, |
426 | total_compressed, pages); | 439 | total_compressed, |
440 | compress_type, pages); | ||
427 | } | 441 | } |
428 | if (ret == 0) { | 442 | if (ret == 0) { |
429 | /* | 443 | /* |
@@ -493,7 +507,8 @@ again: | |||
493 | * and will submit them to the elevator. | 507 | * and will submit them to the elevator. |
494 | */ | 508 | */ |
495 | add_async_extent(async_cow, start, num_bytes, | 509 | add_async_extent(async_cow, start, num_bytes, |
496 | total_compressed, pages, nr_pages_ret); | 510 | total_compressed, pages, nr_pages_ret, |
511 | compress_type); | ||
497 | 512 | ||
498 | if (start + num_bytes < end) { | 513 | if (start + num_bytes < end) { |
499 | start += num_bytes; | 514 | start += num_bytes; |
@@ -515,7 +530,8 @@ cleanup_and_bail_uncompressed: | |||
515 | __set_page_dirty_nobuffers(locked_page); | 530 | __set_page_dirty_nobuffers(locked_page); |
516 | /* unlocked later on in the async handlers */ | 531 | /* unlocked later on in the async handlers */ |
517 | } | 532 | } |
518 | add_async_extent(async_cow, start, end - start + 1, 0, NULL, 0); | 533 | add_async_extent(async_cow, start, end - start + 1, |
534 | 0, NULL, 0, BTRFS_COMPRESS_NONE); | ||
519 | *num_added += 1; | 535 | *num_added += 1; |
520 | } | 536 | } |
521 | 537 | ||
@@ -602,6 +618,7 @@ retry: | |||
602 | GFP_NOFS); | 618 | GFP_NOFS); |
603 | 619 | ||
604 | trans = btrfs_join_transaction(root, 1); | 620 | trans = btrfs_join_transaction(root, 1); |
621 | BUG_ON(IS_ERR(trans)); | ||
605 | ret = btrfs_reserve_extent(trans, root, | 622 | ret = btrfs_reserve_extent(trans, root, |
606 | async_extent->compressed_size, | 623 | async_extent->compressed_size, |
607 | async_extent->compressed_size, | 624 | async_extent->compressed_size, |
@@ -633,6 +650,7 @@ retry: | |||
633 | async_extent->ram_size - 1, 0); | 650 | async_extent->ram_size - 1, 0); |
634 | 651 | ||
635 | em = alloc_extent_map(GFP_NOFS); | 652 | em = alloc_extent_map(GFP_NOFS); |
653 | BUG_ON(!em); | ||
636 | em->start = async_extent->start; | 654 | em->start = async_extent->start; |
637 | em->len = async_extent->ram_size; | 655 | em->len = async_extent->ram_size; |
638 | em->orig_start = em->start; | 656 | em->orig_start = em->start; |
@@ -640,6 +658,7 @@ retry: | |||
640 | em->block_start = ins.objectid; | 658 | em->block_start = ins.objectid; |
641 | em->block_len = ins.offset; | 659 | em->block_len = ins.offset; |
642 | em->bdev = root->fs_info->fs_devices->latest_bdev; | 660 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
661 | em->compress_type = async_extent->compress_type; | ||
643 | set_bit(EXTENT_FLAG_PINNED, &em->flags); | 662 | set_bit(EXTENT_FLAG_PINNED, &em->flags); |
644 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); | 663 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); |
645 | 664 | ||
@@ -656,11 +675,13 @@ retry: | |||
656 | async_extent->ram_size - 1, 0); | 675 | async_extent->ram_size - 1, 0); |
657 | } | 676 | } |
658 | 677 | ||
659 | ret = btrfs_add_ordered_extent(inode, async_extent->start, | 678 | ret = btrfs_add_ordered_extent_compress(inode, |
660 | ins.objectid, | 679 | async_extent->start, |
661 | async_extent->ram_size, | 680 | ins.objectid, |
662 | ins.offset, | 681 | async_extent->ram_size, |
663 | BTRFS_ORDERED_COMPRESSED); | 682 | ins.offset, |
683 | BTRFS_ORDERED_COMPRESSED, | ||
684 | async_extent->compress_type); | ||
664 | BUG_ON(ret); | 685 | BUG_ON(ret); |
665 | 686 | ||
666 | /* | 687 | /* |
@@ -758,7 +779,7 @@ static noinline int cow_file_range(struct inode *inode, | |||
758 | 779 | ||
759 | BUG_ON(root == root->fs_info->tree_root); | 780 | BUG_ON(root == root->fs_info->tree_root); |
760 | trans = btrfs_join_transaction(root, 1); | 781 | trans = btrfs_join_transaction(root, 1); |
761 | BUG_ON(!trans); | 782 | BUG_ON(IS_ERR(trans)); |
762 | btrfs_set_trans_block_group(trans, inode); | 783 | btrfs_set_trans_block_group(trans, inode); |
763 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 784 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
764 | 785 | ||
@@ -770,7 +791,7 @@ static noinline int cow_file_range(struct inode *inode, | |||
770 | if (start == 0) { | 791 | if (start == 0) { |
771 | /* lets try to make an inline extent */ | 792 | /* lets try to make an inline extent */ |
772 | ret = cow_file_range_inline(trans, root, inode, | 793 | ret = cow_file_range_inline(trans, root, inode, |
773 | start, end, 0, NULL); | 794 | start, end, 0, 0, NULL); |
774 | if (ret == 0) { | 795 | if (ret == 0) { |
775 | extent_clear_unlock_delalloc(inode, | 796 | extent_clear_unlock_delalloc(inode, |
776 | &BTRFS_I(inode)->io_tree, | 797 | &BTRFS_I(inode)->io_tree, |
@@ -806,6 +827,7 @@ static noinline int cow_file_range(struct inode *inode, | |||
806 | BUG_ON(ret); | 827 | BUG_ON(ret); |
807 | 828 | ||
808 | em = alloc_extent_map(GFP_NOFS); | 829 | em = alloc_extent_map(GFP_NOFS); |
830 | BUG_ON(!em); | ||
809 | em->start = start; | 831 | em->start = start; |
810 | em->orig_start = em->start; | 832 | em->orig_start = em->start; |
811 | ram_size = ins.offset; | 833 | ram_size = ins.offset; |
@@ -1036,7 +1058,7 @@ static noinline int run_delalloc_nocow(struct inode *inode, | |||
1036 | } else { | 1058 | } else { |
1037 | trans = btrfs_join_transaction(root, 1); | 1059 | trans = btrfs_join_transaction(root, 1); |
1038 | } | 1060 | } |
1039 | BUG_ON(!trans); | 1061 | BUG_ON(IS_ERR(trans)); |
1040 | 1062 | ||
1041 | cow_start = (u64)-1; | 1063 | cow_start = (u64)-1; |
1042 | cur_offset = start; | 1064 | cur_offset = start; |
@@ -1155,6 +1177,7 @@ out_check: | |||
1155 | struct extent_map_tree *em_tree; | 1177 | struct extent_map_tree *em_tree; |
1156 | em_tree = &BTRFS_I(inode)->extent_tree; | 1178 | em_tree = &BTRFS_I(inode)->extent_tree; |
1157 | em = alloc_extent_map(GFP_NOFS); | 1179 | em = alloc_extent_map(GFP_NOFS); |
1180 | BUG_ON(!em); | ||
1158 | em->start = cur_offset; | 1181 | em->start = cur_offset; |
1159 | em->orig_start = em->start; | 1182 | em->orig_start = em->start; |
1160 | em->len = num_bytes; | 1183 | em->len = num_bytes; |
@@ -1236,7 +1259,8 @@ static int run_delalloc_range(struct inode *inode, struct page *locked_page, | |||
1236 | ret = run_delalloc_nocow(inode, locked_page, start, end, | 1259 | ret = run_delalloc_nocow(inode, locked_page, start, end, |
1237 | page_started, 0, nr_written); | 1260 | page_started, 0, nr_written); |
1238 | else if (!btrfs_test_opt(root, COMPRESS) && | 1261 | else if (!btrfs_test_opt(root, COMPRESS) && |
1239 | !(BTRFS_I(inode)->force_compress)) | 1262 | !(BTRFS_I(inode)->force_compress) && |
1263 | !(BTRFS_I(inode)->flags & BTRFS_INODE_COMPRESS)) | ||
1240 | ret = cow_file_range(inode, locked_page, start, end, | 1264 | ret = cow_file_range(inode, locked_page, start, end, |
1241 | page_started, nr_written, 1); | 1265 | page_started, nr_written, 1); |
1242 | else | 1266 | else |
@@ -1443,8 +1467,11 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, | |||
1443 | if (bio_flags & EXTENT_BIO_COMPRESSED) { | 1467 | if (bio_flags & EXTENT_BIO_COMPRESSED) { |
1444 | return btrfs_submit_compressed_read(inode, bio, | 1468 | return btrfs_submit_compressed_read(inode, bio, |
1445 | mirror_num, bio_flags); | 1469 | mirror_num, bio_flags); |
1446 | } else if (!skip_sum) | 1470 | } else if (!skip_sum) { |
1447 | btrfs_lookup_bio_sums(root, inode, bio, NULL); | 1471 | ret = btrfs_lookup_bio_sums(root, inode, bio, NULL); |
1472 | if (ret) | ||
1473 | return ret; | ||
1474 | } | ||
1448 | goto mapit; | 1475 | goto mapit; |
1449 | } else if (!skip_sum) { | 1476 | } else if (!skip_sum) { |
1450 | /* csum items have already been cloned */ | 1477 | /* csum items have already been cloned */ |
@@ -1544,6 +1571,7 @@ out: | |||
1544 | out_page: | 1571 | out_page: |
1545 | unlock_page(page); | 1572 | unlock_page(page); |
1546 | page_cache_release(page); | 1573 | page_cache_release(page); |
1574 | kfree(fixup); | ||
1547 | } | 1575 | } |
1548 | 1576 | ||
1549 | /* | 1577 | /* |
@@ -1670,7 +1698,7 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1670 | struct btrfs_ordered_extent *ordered_extent = NULL; | 1698 | struct btrfs_ordered_extent *ordered_extent = NULL; |
1671 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; | 1699 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; |
1672 | struct extent_state *cached_state = NULL; | 1700 | struct extent_state *cached_state = NULL; |
1673 | int compressed = 0; | 1701 | int compress_type = 0; |
1674 | int ret; | 1702 | int ret; |
1675 | bool nolock = false; | 1703 | bool nolock = false; |
1676 | 1704 | ||
@@ -1690,7 +1718,7 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1690 | trans = btrfs_join_transaction_nolock(root, 1); | 1718 | trans = btrfs_join_transaction_nolock(root, 1); |
1691 | else | 1719 | else |
1692 | trans = btrfs_join_transaction(root, 1); | 1720 | trans = btrfs_join_transaction(root, 1); |
1693 | BUG_ON(!trans); | 1721 | BUG_ON(IS_ERR(trans)); |
1694 | btrfs_set_trans_block_group(trans, inode); | 1722 | btrfs_set_trans_block_group(trans, inode); |
1695 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 1723 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
1696 | ret = btrfs_update_inode(trans, root, inode); | 1724 | ret = btrfs_update_inode(trans, root, inode); |
@@ -1707,13 +1735,14 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1707 | trans = btrfs_join_transaction_nolock(root, 1); | 1735 | trans = btrfs_join_transaction_nolock(root, 1); |
1708 | else | 1736 | else |
1709 | trans = btrfs_join_transaction(root, 1); | 1737 | trans = btrfs_join_transaction(root, 1); |
1738 | BUG_ON(IS_ERR(trans)); | ||
1710 | btrfs_set_trans_block_group(trans, inode); | 1739 | btrfs_set_trans_block_group(trans, inode); |
1711 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 1740 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
1712 | 1741 | ||
1713 | if (test_bit(BTRFS_ORDERED_COMPRESSED, &ordered_extent->flags)) | 1742 | if (test_bit(BTRFS_ORDERED_COMPRESSED, &ordered_extent->flags)) |
1714 | compressed = 1; | 1743 | compress_type = ordered_extent->compress_type; |
1715 | if (test_bit(BTRFS_ORDERED_PREALLOC, &ordered_extent->flags)) { | 1744 | if (test_bit(BTRFS_ORDERED_PREALLOC, &ordered_extent->flags)) { |
1716 | BUG_ON(compressed); | 1745 | BUG_ON(compress_type); |
1717 | ret = btrfs_mark_extent_written(trans, inode, | 1746 | ret = btrfs_mark_extent_written(trans, inode, |
1718 | ordered_extent->file_offset, | 1747 | ordered_extent->file_offset, |
1719 | ordered_extent->file_offset + | 1748 | ordered_extent->file_offset + |
@@ -1727,7 +1756,7 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1727 | ordered_extent->disk_len, | 1756 | ordered_extent->disk_len, |
1728 | ordered_extent->len, | 1757 | ordered_extent->len, |
1729 | ordered_extent->len, | 1758 | ordered_extent->len, |
1730 | compressed, 0, 0, | 1759 | compress_type, 0, 0, |
1731 | BTRFS_FILE_EXTENT_REG); | 1760 | BTRFS_FILE_EXTENT_REG); |
1732 | unpin_extent_cache(&BTRFS_I(inode)->extent_tree, | 1761 | unpin_extent_cache(&BTRFS_I(inode)->extent_tree, |
1733 | ordered_extent->file_offset, | 1762 | ordered_extent->file_offset, |
@@ -1741,9 +1770,12 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1741 | add_pending_csums(trans, inode, ordered_extent->file_offset, | 1770 | add_pending_csums(trans, inode, ordered_extent->file_offset, |
1742 | &ordered_extent->list); | 1771 | &ordered_extent->list); |
1743 | 1772 | ||
1744 | btrfs_ordered_update_i_size(inode, 0, ordered_extent); | 1773 | ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); |
1745 | ret = btrfs_update_inode(trans, root, inode); | 1774 | if (!ret) { |
1746 | BUG_ON(ret); | 1775 | ret = btrfs_update_inode(trans, root, inode); |
1776 | BUG_ON(ret); | ||
1777 | } | ||
1778 | ret = 0; | ||
1747 | out: | 1779 | out: |
1748 | if (nolock) { | 1780 | if (nolock) { |
1749 | if (trans) | 1781 | if (trans) |
@@ -1765,6 +1797,8 @@ out: | |||
1765 | static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end, | 1797 | static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end, |
1766 | struct extent_state *state, int uptodate) | 1798 | struct extent_state *state, int uptodate) |
1767 | { | 1799 | { |
1800 | trace_btrfs_writepage_end_io_hook(page, start, end, uptodate); | ||
1801 | |||
1768 | ClearPagePrivate2(page); | 1802 | ClearPagePrivate2(page); |
1769 | return btrfs_finish_ordered_io(page->mapping->host, start, end); | 1803 | return btrfs_finish_ordered_io(page->mapping->host, start, end); |
1770 | } | 1804 | } |
@@ -1829,6 +1863,8 @@ static int btrfs_io_failed_hook(struct bio *failed_bio, | |||
1829 | if (test_bit(EXTENT_FLAG_COMPRESSED, &em->flags)) { | 1863 | if (test_bit(EXTENT_FLAG_COMPRESSED, &em->flags)) { |
1830 | logical = em->block_start; | 1864 | logical = em->block_start; |
1831 | failrec->bio_flags = EXTENT_BIO_COMPRESSED; | 1865 | failrec->bio_flags = EXTENT_BIO_COMPRESSED; |
1866 | extent_set_compress_type(&failrec->bio_flags, | ||
1867 | em->compress_type); | ||
1832 | } | 1868 | } |
1833 | failrec->logical = logical; | 1869 | failrec->logical = logical; |
1834 | free_extent_map(em); | 1870 | free_extent_map(em); |
@@ -1873,10 +1909,10 @@ static int btrfs_io_failed_hook(struct bio *failed_bio, | |||
1873 | else | 1909 | else |
1874 | rw = READ; | 1910 | rw = READ; |
1875 | 1911 | ||
1876 | BTRFS_I(inode)->io_tree.ops->submit_bio_hook(inode, rw, bio, | 1912 | ret = BTRFS_I(inode)->io_tree.ops->submit_bio_hook(inode, rw, bio, |
1877 | failrec->last_mirror, | 1913 | failrec->last_mirror, |
1878 | failrec->bio_flags, 0); | 1914 | failrec->bio_flags, 0); |
1879 | return 0; | 1915 | return ret; |
1880 | } | 1916 | } |
1881 | 1917 | ||
1882 | /* | 1918 | /* |
@@ -1892,7 +1928,7 @@ static int btrfs_clean_io_failures(struct inode *inode, u64 start) | |||
1892 | 1928 | ||
1893 | private = 0; | 1929 | private = 0; |
1894 | if (count_range_bits(&BTRFS_I(inode)->io_failure_tree, &private, | 1930 | if (count_range_bits(&BTRFS_I(inode)->io_failure_tree, &private, |
1895 | (u64)-1, 1, EXTENT_DIRTY)) { | 1931 | (u64)-1, 1, EXTENT_DIRTY, 0)) { |
1896 | ret = get_state_private(&BTRFS_I(inode)->io_failure_tree, | 1932 | ret = get_state_private(&BTRFS_I(inode)->io_failure_tree, |
1897 | start, &private_failure); | 1933 | start, &private_failure); |
1898 | if (ret == 0) { | 1934 | if (ret == 0) { |
@@ -2188,8 +2224,6 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode) | |||
2188 | insert = 1; | 2224 | insert = 1; |
2189 | #endif | 2225 | #endif |
2190 | insert = 1; | 2226 | insert = 1; |
2191 | } else { | ||
2192 | WARN_ON(!BTRFS_I(inode)->orphan_meta_reserved); | ||
2193 | } | 2227 | } |
2194 | 2228 | ||
2195 | if (!BTRFS_I(inode)->orphan_meta_reserved) { | 2229 | if (!BTRFS_I(inode)->orphan_meta_reserved) { |
@@ -2260,7 +2294,7 @@ int btrfs_orphan_del(struct btrfs_trans_handle *trans, struct inode *inode) | |||
2260 | * this cleans up any orphans that may be left on the list from the last use | 2294 | * this cleans up any orphans that may be left on the list from the last use |
2261 | * of this root. | 2295 | * of this root. |
2262 | */ | 2296 | */ |
2263 | void btrfs_orphan_cleanup(struct btrfs_root *root) | 2297 | int btrfs_orphan_cleanup(struct btrfs_root *root) |
2264 | { | 2298 | { |
2265 | struct btrfs_path *path; | 2299 | struct btrfs_path *path; |
2266 | struct extent_buffer *leaf; | 2300 | struct extent_buffer *leaf; |
@@ -2270,10 +2304,13 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2270 | int ret = 0, nr_unlink = 0, nr_truncate = 0; | 2304 | int ret = 0, nr_unlink = 0, nr_truncate = 0; |
2271 | 2305 | ||
2272 | if (cmpxchg(&root->orphan_cleanup_state, 0, ORPHAN_CLEANUP_STARTED)) | 2306 | if (cmpxchg(&root->orphan_cleanup_state, 0, ORPHAN_CLEANUP_STARTED)) |
2273 | return; | 2307 | return 0; |
2274 | 2308 | ||
2275 | path = btrfs_alloc_path(); | 2309 | path = btrfs_alloc_path(); |
2276 | BUG_ON(!path); | 2310 | if (!path) { |
2311 | ret = -ENOMEM; | ||
2312 | goto out; | ||
2313 | } | ||
2277 | path->reada = -1; | 2314 | path->reada = -1; |
2278 | 2315 | ||
2279 | key.objectid = BTRFS_ORPHAN_OBJECTID; | 2316 | key.objectid = BTRFS_ORPHAN_OBJECTID; |
@@ -2282,18 +2319,16 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2282 | 2319 | ||
2283 | while (1) { | 2320 | while (1) { |
2284 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | 2321 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); |
2285 | if (ret < 0) { | 2322 | if (ret < 0) |
2286 | printk(KERN_ERR "Error searching slot for orphan: %d" | 2323 | goto out; |
2287 | "\n", ret); | ||
2288 | break; | ||
2289 | } | ||
2290 | 2324 | ||
2291 | /* | 2325 | /* |
2292 | * if ret == 0 means we found what we were searching for, which | 2326 | * if ret == 0 means we found what we were searching for, which |
2293 | * is weird, but possible, so only screw with path if we didnt | 2327 | * is weird, but possible, so only screw with path if we didn't |
2294 | * find the key and see if we have stuff that matches | 2328 | * find the key and see if we have stuff that matches |
2295 | */ | 2329 | */ |
2296 | if (ret > 0) { | 2330 | if (ret > 0) { |
2331 | ret = 0; | ||
2297 | if (path->slots[0] == 0) | 2332 | if (path->slots[0] == 0) |
2298 | break; | 2333 | break; |
2299 | path->slots[0]--; | 2334 | path->slots[0]--; |
@@ -2321,7 +2356,10 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2321 | found_key.type = BTRFS_INODE_ITEM_KEY; | 2356 | found_key.type = BTRFS_INODE_ITEM_KEY; |
2322 | found_key.offset = 0; | 2357 | found_key.offset = 0; |
2323 | inode = btrfs_iget(root->fs_info->sb, &found_key, root, NULL); | 2358 | inode = btrfs_iget(root->fs_info->sb, &found_key, root, NULL); |
2324 | BUG_ON(IS_ERR(inode)); | 2359 | if (IS_ERR(inode)) { |
2360 | ret = PTR_ERR(inode); | ||
2361 | goto out; | ||
2362 | } | ||
2325 | 2363 | ||
2326 | /* | 2364 | /* |
2327 | * add this inode to the orphan list so btrfs_orphan_del does | 2365 | * add this inode to the orphan list so btrfs_orphan_del does |
@@ -2339,6 +2377,10 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2339 | */ | 2377 | */ |
2340 | if (is_bad_inode(inode)) { | 2378 | if (is_bad_inode(inode)) { |
2341 | trans = btrfs_start_transaction(root, 0); | 2379 | trans = btrfs_start_transaction(root, 0); |
2380 | if (IS_ERR(trans)) { | ||
2381 | ret = PTR_ERR(trans); | ||
2382 | goto out; | ||
2383 | } | ||
2342 | btrfs_orphan_del(trans, inode); | 2384 | btrfs_orphan_del(trans, inode); |
2343 | btrfs_end_transaction(trans, root); | 2385 | btrfs_end_transaction(trans, root); |
2344 | iput(inode); | 2386 | iput(inode); |
@@ -2347,17 +2389,22 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2347 | 2389 | ||
2348 | /* if we have links, this was a truncate, lets do that */ | 2390 | /* if we have links, this was a truncate, lets do that */ |
2349 | if (inode->i_nlink) { | 2391 | if (inode->i_nlink) { |
2392 | if (!S_ISREG(inode->i_mode)) { | ||
2393 | WARN_ON(1); | ||
2394 | iput(inode); | ||
2395 | continue; | ||
2396 | } | ||
2350 | nr_truncate++; | 2397 | nr_truncate++; |
2351 | btrfs_truncate(inode); | 2398 | ret = btrfs_truncate(inode); |
2352 | } else { | 2399 | } else { |
2353 | nr_unlink++; | 2400 | nr_unlink++; |
2354 | } | 2401 | } |
2355 | 2402 | ||
2356 | /* this will do delete_inode and everything for us */ | 2403 | /* this will do delete_inode and everything for us */ |
2357 | iput(inode); | 2404 | iput(inode); |
2405 | if (ret) | ||
2406 | goto out; | ||
2358 | } | 2407 | } |
2359 | btrfs_free_path(path); | ||
2360 | |||
2361 | root->orphan_cleanup_state = ORPHAN_CLEANUP_DONE; | 2408 | root->orphan_cleanup_state = ORPHAN_CLEANUP_DONE; |
2362 | 2409 | ||
2363 | if (root->orphan_block_rsv) | 2410 | if (root->orphan_block_rsv) |
@@ -2366,13 +2413,20 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2366 | 2413 | ||
2367 | if (root->orphan_block_rsv || root->orphan_item_inserted) { | 2414 | if (root->orphan_block_rsv || root->orphan_item_inserted) { |
2368 | trans = btrfs_join_transaction(root, 1); | 2415 | trans = btrfs_join_transaction(root, 1); |
2369 | btrfs_end_transaction(trans, root); | 2416 | if (!IS_ERR(trans)) |
2417 | btrfs_end_transaction(trans, root); | ||
2370 | } | 2418 | } |
2371 | 2419 | ||
2372 | if (nr_unlink) | 2420 | if (nr_unlink) |
2373 | printk(KERN_INFO "btrfs: unlinked %d orphans\n", nr_unlink); | 2421 | printk(KERN_INFO "btrfs: unlinked %d orphans\n", nr_unlink); |
2374 | if (nr_truncate) | 2422 | if (nr_truncate) |
2375 | printk(KERN_INFO "btrfs: truncated %d orphans\n", nr_truncate); | 2423 | printk(KERN_INFO "btrfs: truncated %d orphans\n", nr_truncate); |
2424 | |||
2425 | out: | ||
2426 | if (ret) | ||
2427 | printk(KERN_CRIT "btrfs: could not do orphan cleanup %d\n", ret); | ||
2428 | btrfs_free_path(path); | ||
2429 | return ret; | ||
2376 | } | 2430 | } |
2377 | 2431 | ||
2378 | /* | 2432 | /* |
@@ -2539,6 +2593,13 @@ static void fill_inode_item(struct btrfs_trans_handle *trans, | |||
2539 | struct btrfs_inode_item *item, | 2593 | struct btrfs_inode_item *item, |
2540 | struct inode *inode) | 2594 | struct inode *inode) |
2541 | { | 2595 | { |
2596 | if (!leaf->map_token) | ||
2597 | map_private_extent_buffer(leaf, (unsigned long)item, | ||
2598 | sizeof(struct btrfs_inode_item), | ||
2599 | &leaf->map_token, &leaf->kaddr, | ||
2600 | &leaf->map_start, &leaf->map_len, | ||
2601 | KM_USER1); | ||
2602 | |||
2542 | btrfs_set_inode_uid(leaf, item, inode->i_uid); | 2603 | btrfs_set_inode_uid(leaf, item, inode->i_uid); |
2543 | btrfs_set_inode_gid(leaf, item, inode->i_gid); | 2604 | btrfs_set_inode_gid(leaf, item, inode->i_gid); |
2544 | btrfs_set_inode_size(leaf, item, BTRFS_I(inode)->disk_i_size); | 2605 | btrfs_set_inode_size(leaf, item, BTRFS_I(inode)->disk_i_size); |
@@ -2567,6 +2628,11 @@ static void fill_inode_item(struct btrfs_trans_handle *trans, | |||
2567 | btrfs_set_inode_rdev(leaf, item, inode->i_rdev); | 2628 | btrfs_set_inode_rdev(leaf, item, inode->i_rdev); |
2568 | btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags); | 2629 | btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags); |
2569 | btrfs_set_inode_block_group(leaf, item, BTRFS_I(inode)->block_group); | 2630 | btrfs_set_inode_block_group(leaf, item, BTRFS_I(inode)->block_group); |
2631 | |||
2632 | if (leaf->map_token) { | ||
2633 | unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); | ||
2634 | leaf->map_token = NULL; | ||
2635 | } | ||
2570 | } | 2636 | } |
2571 | 2637 | ||
2572 | /* | 2638 | /* |
@@ -2611,10 +2677,10 @@ failed: | |||
2611 | * recovery code. It remove a link in a directory with a given name, and | 2677 | * recovery code. It remove a link in a directory with a given name, and |
2612 | * also drops the back refs in the inode to the directory | 2678 | * also drops the back refs in the inode to the directory |
2613 | */ | 2679 | */ |
2614 | int btrfs_unlink_inode(struct btrfs_trans_handle *trans, | 2680 | static int __btrfs_unlink_inode(struct btrfs_trans_handle *trans, |
2615 | struct btrfs_root *root, | 2681 | struct btrfs_root *root, |
2616 | struct inode *dir, struct inode *inode, | 2682 | struct inode *dir, struct inode *inode, |
2617 | const char *name, int name_len) | 2683 | const char *name, int name_len) |
2618 | { | 2684 | { |
2619 | struct btrfs_path *path; | 2685 | struct btrfs_path *path; |
2620 | int ret = 0; | 2686 | int ret = 0; |
@@ -2626,7 +2692,7 @@ int btrfs_unlink_inode(struct btrfs_trans_handle *trans, | |||
2626 | path = btrfs_alloc_path(); | 2692 | path = btrfs_alloc_path(); |
2627 | if (!path) { | 2693 | if (!path) { |
2628 | ret = -ENOMEM; | 2694 | ret = -ENOMEM; |
2629 | goto err; | 2695 | goto out; |
2630 | } | 2696 | } |
2631 | 2697 | ||
2632 | path->leave_spinning = 1; | 2698 | path->leave_spinning = 1; |
@@ -2686,12 +2752,25 @@ err: | |||
2686 | btrfs_i_size_write(dir, dir->i_size - name_len * 2); | 2752 | btrfs_i_size_write(dir, dir->i_size - name_len * 2); |
2687 | inode->i_ctime = dir->i_mtime = dir->i_ctime = CURRENT_TIME; | 2753 | inode->i_ctime = dir->i_mtime = dir->i_ctime = CURRENT_TIME; |
2688 | btrfs_update_inode(trans, root, dir); | 2754 | btrfs_update_inode(trans, root, dir); |
2689 | btrfs_drop_nlink(inode); | ||
2690 | ret = btrfs_update_inode(trans, root, inode); | ||
2691 | out: | 2755 | out: |
2692 | return ret; | 2756 | return ret; |
2693 | } | 2757 | } |
2694 | 2758 | ||
2759 | int btrfs_unlink_inode(struct btrfs_trans_handle *trans, | ||
2760 | struct btrfs_root *root, | ||
2761 | struct inode *dir, struct inode *inode, | ||
2762 | const char *name, int name_len) | ||
2763 | { | ||
2764 | int ret; | ||
2765 | ret = __btrfs_unlink_inode(trans, root, dir, inode, name, name_len); | ||
2766 | if (!ret) { | ||
2767 | btrfs_drop_nlink(inode); | ||
2768 | ret = btrfs_update_inode(trans, root, inode); | ||
2769 | } | ||
2770 | return ret; | ||
2771 | } | ||
2772 | |||
2773 | |||
2695 | /* helper to check if there is any shared block in the path */ | 2774 | /* helper to check if there is any shared block in the path */ |
2696 | static int check_path_shared(struct btrfs_root *root, | 2775 | static int check_path_shared(struct btrfs_root *root, |
2697 | struct btrfs_path *path) | 2776 | struct btrfs_path *path) |
@@ -2699,9 +2778,10 @@ static int check_path_shared(struct btrfs_root *root, | |||
2699 | struct extent_buffer *eb; | 2778 | struct extent_buffer *eb; |
2700 | int level; | 2779 | int level; |
2701 | u64 refs = 1; | 2780 | u64 refs = 1; |
2702 | int uninitialized_var(ret); | ||
2703 | 2781 | ||
2704 | for (level = 0; level < BTRFS_MAX_LEVEL; level++) { | 2782 | for (level = 0; level < BTRFS_MAX_LEVEL; level++) { |
2783 | int ret; | ||
2784 | |||
2705 | if (!path->nodes[level]) | 2785 | if (!path->nodes[level]) |
2706 | break; | 2786 | break; |
2707 | eb = path->nodes[level]; | 2787 | eb = path->nodes[level]; |
@@ -2712,7 +2792,7 @@ static int check_path_shared(struct btrfs_root *root, | |||
2712 | if (refs > 1) | 2792 | if (refs > 1) |
2713 | return 1; | 2793 | return 1; |
2714 | } | 2794 | } |
2715 | return ret; /* XXX callers? */ | 2795 | return 0; |
2716 | } | 2796 | } |
2717 | 2797 | ||
2718 | /* | 2798 | /* |
@@ -3512,7 +3592,13 @@ out: | |||
3512 | return ret; | 3592 | return ret; |
3513 | } | 3593 | } |
3514 | 3594 | ||
3515 | int btrfs_cont_expand(struct inode *inode, loff_t size) | 3595 | /* |
3596 | * This function puts in dummy file extents for the area we're creating a hole | ||
3597 | * for. So if we are truncating this file to a larger size we need to insert | ||
3598 | * these file extents so that btrfs_get_extent will return a EXTENT_MAP_HOLE for | ||
3599 | * the range between oldsize and size | ||
3600 | */ | ||
3601 | int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size) | ||
3516 | { | 3602 | { |
3517 | struct btrfs_trans_handle *trans; | 3603 | struct btrfs_trans_handle *trans; |
3518 | struct btrfs_root *root = BTRFS_I(inode)->root; | 3604 | struct btrfs_root *root = BTRFS_I(inode)->root; |
@@ -3520,7 +3606,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3520 | struct extent_map *em = NULL; | 3606 | struct extent_map *em = NULL; |
3521 | struct extent_state *cached_state = NULL; | 3607 | struct extent_state *cached_state = NULL; |
3522 | u64 mask = root->sectorsize - 1; | 3608 | u64 mask = root->sectorsize - 1; |
3523 | u64 hole_start = (inode->i_size + mask) & ~mask; | 3609 | u64 hole_start = (oldsize + mask) & ~mask; |
3524 | u64 block_end = (size + mask) & ~mask; | 3610 | u64 block_end = (size + mask) & ~mask; |
3525 | u64 last_byte; | 3611 | u64 last_byte; |
3526 | u64 cur_offset; | 3612 | u64 cur_offset; |
@@ -3565,13 +3651,15 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3565 | err = btrfs_drop_extents(trans, inode, cur_offset, | 3651 | err = btrfs_drop_extents(trans, inode, cur_offset, |
3566 | cur_offset + hole_size, | 3652 | cur_offset + hole_size, |
3567 | &hint_byte, 1); | 3653 | &hint_byte, 1); |
3568 | BUG_ON(err); | 3654 | if (err) |
3655 | break; | ||
3569 | 3656 | ||
3570 | err = btrfs_insert_file_extent(trans, root, | 3657 | err = btrfs_insert_file_extent(trans, root, |
3571 | inode->i_ino, cur_offset, 0, | 3658 | inode->i_ino, cur_offset, 0, |
3572 | 0, hole_size, 0, hole_size, | 3659 | 0, hole_size, 0, hole_size, |
3573 | 0, 0, 0); | 3660 | 0, 0, 0); |
3574 | BUG_ON(err); | 3661 | if (err) |
3662 | break; | ||
3575 | 3663 | ||
3576 | btrfs_drop_extent_cache(inode, hole_start, | 3664 | btrfs_drop_extent_cache(inode, hole_start, |
3577 | last_byte - 1, 0); | 3665 | last_byte - 1, 0); |
@@ -3591,94 +3679,58 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3591 | return err; | 3679 | return err; |
3592 | } | 3680 | } |
3593 | 3681 | ||
3594 | static int btrfs_setattr_size(struct inode *inode, struct iattr *attr) | 3682 | static int btrfs_setsize(struct inode *inode, loff_t newsize) |
3595 | { | 3683 | { |
3596 | struct btrfs_root *root = BTRFS_I(inode)->root; | 3684 | loff_t oldsize = i_size_read(inode); |
3597 | struct btrfs_trans_handle *trans; | ||
3598 | unsigned long nr; | ||
3599 | int ret; | 3685 | int ret; |
3600 | 3686 | ||
3601 | if (attr->ia_size == inode->i_size) | 3687 | if (newsize == oldsize) |
3602 | return 0; | 3688 | return 0; |
3603 | 3689 | ||
3604 | if (attr->ia_size > inode->i_size) { | 3690 | if (newsize > oldsize) { |
3605 | unsigned long limit; | 3691 | i_size_write(inode, newsize); |
3606 | limit = current->signal->rlim[RLIMIT_FSIZE].rlim_cur; | 3692 | btrfs_ordered_update_i_size(inode, i_size_read(inode), NULL); |
3607 | if (attr->ia_size > inode->i_sb->s_maxbytes) | 3693 | truncate_pagecache(inode, oldsize, newsize); |
3608 | return -EFBIG; | 3694 | ret = btrfs_cont_expand(inode, oldsize, newsize); |
3609 | if (limit != RLIM_INFINITY && attr->ia_size > limit) { | ||
3610 | send_sig(SIGXFSZ, current, 0); | ||
3611 | return -EFBIG; | ||
3612 | } | ||
3613 | } | ||
3614 | |||
3615 | trans = btrfs_start_transaction(root, 5); | ||
3616 | if (IS_ERR(trans)) | ||
3617 | return PTR_ERR(trans); | ||
3618 | |||
3619 | btrfs_set_trans_block_group(trans, inode); | ||
3620 | |||
3621 | ret = btrfs_orphan_add(trans, inode); | ||
3622 | BUG_ON(ret); | ||
3623 | |||
3624 | nr = trans->blocks_used; | ||
3625 | btrfs_end_transaction(trans, root); | ||
3626 | btrfs_btree_balance_dirty(root, nr); | ||
3627 | |||
3628 | if (attr->ia_size > inode->i_size) { | ||
3629 | ret = btrfs_cont_expand(inode, attr->ia_size); | ||
3630 | if (ret) { | 3695 | if (ret) { |
3631 | btrfs_truncate(inode); | 3696 | btrfs_setsize(inode, oldsize); |
3632 | return ret; | 3697 | return ret; |
3633 | } | 3698 | } |
3634 | 3699 | ||
3635 | i_size_write(inode, attr->ia_size); | 3700 | mark_inode_dirty(inode); |
3636 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); | 3701 | } else { |
3637 | 3702 | ||
3638 | trans = btrfs_start_transaction(root, 0); | 3703 | /* |
3639 | BUG_ON(IS_ERR(trans)); | 3704 | * We're truncating a file that used to have good data down to |
3640 | btrfs_set_trans_block_group(trans, inode); | 3705 | * zero. Make sure it gets into the ordered flush list so that |
3641 | trans->block_rsv = root->orphan_block_rsv; | 3706 | * any new writes get down to disk quickly. |
3642 | BUG_ON(!trans->block_rsv); | 3707 | */ |
3708 | if (newsize == 0) | ||
3709 | BTRFS_I(inode)->ordered_data_close = 1; | ||
3643 | 3710 | ||
3644 | ret = btrfs_update_inode(trans, root, inode); | 3711 | /* we don't support swapfiles, so vmtruncate shouldn't fail */ |
3645 | BUG_ON(ret); | 3712 | truncate_setsize(inode, newsize); |
3646 | if (inode->i_nlink > 0) { | 3713 | ret = btrfs_truncate(inode); |
3647 | ret = btrfs_orphan_del(trans, inode); | ||
3648 | BUG_ON(ret); | ||
3649 | } | ||
3650 | nr = trans->blocks_used; | ||
3651 | btrfs_end_transaction(trans, root); | ||
3652 | btrfs_btree_balance_dirty(root, nr); | ||
3653 | return 0; | ||
3654 | } | 3714 | } |
3655 | 3715 | ||
3656 | /* | 3716 | return ret; |
3657 | * We're truncating a file that used to have good data down to | ||
3658 | * zero. Make sure it gets into the ordered flush list so that | ||
3659 | * any new writes get down to disk quickly. | ||
3660 | */ | ||
3661 | if (attr->ia_size == 0) | ||
3662 | BTRFS_I(inode)->ordered_data_close = 1; | ||
3663 | |||
3664 | /* we don't support swapfiles, so vmtruncate shouldn't fail */ | ||
3665 | ret = vmtruncate(inode, attr->ia_size); | ||
3666 | BUG_ON(ret); | ||
3667 | |||
3668 | return 0; | ||
3669 | } | 3717 | } |
3670 | 3718 | ||
3671 | static int btrfs_setattr(struct dentry *dentry, struct iattr *attr) | 3719 | static int btrfs_setattr(struct dentry *dentry, struct iattr *attr) |
3672 | { | 3720 | { |
3673 | struct inode *inode = dentry->d_inode; | 3721 | struct inode *inode = dentry->d_inode; |
3722 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
3674 | int err; | 3723 | int err; |
3675 | 3724 | ||
3725 | if (btrfs_root_readonly(root)) | ||
3726 | return -EROFS; | ||
3727 | |||
3676 | err = inode_change_ok(inode, attr); | 3728 | err = inode_change_ok(inode, attr); |
3677 | if (err) | 3729 | if (err) |
3678 | return err; | 3730 | return err; |
3679 | 3731 | ||
3680 | if (S_ISREG(inode->i_mode) && (attr->ia_valid & ATTR_SIZE)) { | 3732 | if (S_ISREG(inode->i_mode) && (attr->ia_valid & ATTR_SIZE)) { |
3681 | err = btrfs_setattr_size(inode, attr); | 3733 | err = btrfs_setsize(inode, attr->ia_size); |
3682 | if (err) | 3734 | if (err) |
3683 | return err; | 3735 | return err; |
3684 | } | 3736 | } |
@@ -3701,6 +3753,8 @@ void btrfs_evict_inode(struct inode *inode) | |||
3701 | unsigned long nr; | 3753 | unsigned long nr; |
3702 | int ret; | 3754 | int ret; |
3703 | 3755 | ||
3756 | trace_btrfs_inode_evict(inode); | ||
3757 | |||
3704 | truncate_inode_pages(&inode->i_data, 0); | 3758 | truncate_inode_pages(&inode->i_data, 0); |
3705 | if (inode->i_nlink && (btrfs_root_refs(&root->root_item) != 0 || | 3759 | if (inode->i_nlink && (btrfs_root_refs(&root->root_item) != 0 || |
3706 | root == root->fs_info->tree_root)) | 3760 | root == root->fs_info->tree_root)) |
@@ -4043,7 +4097,6 @@ struct inode *btrfs_iget(struct super_block *s, struct btrfs_key *location, | |||
4043 | BTRFS_I(inode)->root = root; | 4097 | BTRFS_I(inode)->root = root; |
4044 | memcpy(&BTRFS_I(inode)->location, location, sizeof(*location)); | 4098 | memcpy(&BTRFS_I(inode)->location, location, sizeof(*location)); |
4045 | btrfs_read_locked_inode(inode); | 4099 | btrfs_read_locked_inode(inode); |
4046 | |||
4047 | inode_tree_add(inode); | 4100 | inode_tree_add(inode); |
4048 | unlock_new_inode(inode); | 4101 | unlock_new_inode(inode); |
4049 | if (new) | 4102 | if (new) |
@@ -4115,11 +4168,13 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) | |||
4115 | } | 4168 | } |
4116 | srcu_read_unlock(&root->fs_info->subvol_srcu, index); | 4169 | srcu_read_unlock(&root->fs_info->subvol_srcu, index); |
4117 | 4170 | ||
4118 | if (root != sub_root) { | 4171 | if (!IS_ERR(inode) && root != sub_root) { |
4119 | down_read(&root->fs_info->cleanup_work_sem); | 4172 | down_read(&root->fs_info->cleanup_work_sem); |
4120 | if (!(inode->i_sb->s_flags & MS_RDONLY)) | 4173 | if (!(inode->i_sb->s_flags & MS_RDONLY)) |
4121 | btrfs_orphan_cleanup(sub_root); | 4174 | ret = btrfs_orphan_cleanup(sub_root); |
4122 | up_read(&root->fs_info->cleanup_work_sem); | 4175 | up_read(&root->fs_info->cleanup_work_sem); |
4176 | if (ret) | ||
4177 | inode = ERR_PTR(ret); | ||
4123 | } | 4178 | } |
4124 | 4179 | ||
4125 | return inode; | 4180 | return inode; |
@@ -4167,10 +4222,8 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4167 | struct btrfs_key found_key; | 4222 | struct btrfs_key found_key; |
4168 | struct btrfs_path *path; | 4223 | struct btrfs_path *path; |
4169 | int ret; | 4224 | int ret; |
4170 | u32 nritems; | ||
4171 | struct extent_buffer *leaf; | 4225 | struct extent_buffer *leaf; |
4172 | int slot; | 4226 | int slot; |
4173 | int advance; | ||
4174 | unsigned char d_type; | 4227 | unsigned char d_type; |
4175 | int over = 0; | 4228 | int over = 0; |
4176 | u32 di_cur; | 4229 | u32 di_cur; |
@@ -4213,27 +4266,19 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4213 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | 4266 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); |
4214 | if (ret < 0) | 4267 | if (ret < 0) |
4215 | goto err; | 4268 | goto err; |
4216 | advance = 0; | ||
4217 | 4269 | ||
4218 | while (1) { | 4270 | while (1) { |
4219 | leaf = path->nodes[0]; | 4271 | leaf = path->nodes[0]; |
4220 | nritems = btrfs_header_nritems(leaf); | ||
4221 | slot = path->slots[0]; | 4272 | slot = path->slots[0]; |
4222 | if (advance || slot >= nritems) { | 4273 | if (slot >= btrfs_header_nritems(leaf)) { |
4223 | if (slot >= nritems - 1) { | 4274 | ret = btrfs_next_leaf(root, path); |
4224 | ret = btrfs_next_leaf(root, path); | 4275 | if (ret < 0) |
4225 | if (ret) | 4276 | goto err; |
4226 | break; | 4277 | else if (ret > 0) |
4227 | leaf = path->nodes[0]; | 4278 | break; |
4228 | nritems = btrfs_header_nritems(leaf); | 4279 | continue; |
4229 | slot = path->slots[0]; | ||
4230 | } else { | ||
4231 | slot++; | ||
4232 | path->slots[0]++; | ||
4233 | } | ||
4234 | } | 4280 | } |
4235 | 4281 | ||
4236 | advance = 1; | ||
4237 | item = btrfs_item_nr(leaf, slot); | 4282 | item = btrfs_item_nr(leaf, slot); |
4238 | btrfs_item_key_to_cpu(leaf, &found_key, slot); | 4283 | btrfs_item_key_to_cpu(leaf, &found_key, slot); |
4239 | 4284 | ||
@@ -4242,7 +4287,7 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4242 | if (btrfs_key_type(&found_key) != key_type) | 4287 | if (btrfs_key_type(&found_key) != key_type) |
4243 | break; | 4288 | break; |
4244 | if (found_key.offset < filp->f_pos) | 4289 | if (found_key.offset < filp->f_pos) |
4245 | continue; | 4290 | goto next; |
4246 | 4291 | ||
4247 | filp->f_pos = found_key.offset; | 4292 | filp->f_pos = found_key.offset; |
4248 | 4293 | ||
@@ -4253,6 +4298,9 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4253 | while (di_cur < di_total) { | 4298 | while (di_cur < di_total) { |
4254 | struct btrfs_key location; | 4299 | struct btrfs_key location; |
4255 | 4300 | ||
4301 | if (verify_dir_item(root, leaf, di)) | ||
4302 | break; | ||
4303 | |||
4256 | name_len = btrfs_dir_name_len(leaf, di); | 4304 | name_len = btrfs_dir_name_len(leaf, di); |
4257 | if (name_len <= sizeof(tmp_name)) { | 4305 | if (name_len <= sizeof(tmp_name)) { |
4258 | name_ptr = tmp_name; | 4306 | name_ptr = tmp_name; |
@@ -4292,6 +4340,8 @@ skip: | |||
4292 | di_cur += di_len; | 4340 | di_cur += di_len; |
4293 | di = (struct btrfs_dir_item *)((char *)di + di_len); | 4341 | di = (struct btrfs_dir_item *)((char *)di + di_len); |
4294 | } | 4342 | } |
4343 | next: | ||
4344 | path->slots[0]++; | ||
4295 | } | 4345 | } |
4296 | 4346 | ||
4297 | /* Reached end of directory/root. Bump pos past the last item. */ | 4347 | /* Reached end of directory/root. Bump pos past the last item. */ |
@@ -4328,6 +4378,8 @@ int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
4328 | trans = btrfs_join_transaction_nolock(root, 1); | 4378 | trans = btrfs_join_transaction_nolock(root, 1); |
4329 | else | 4379 | else |
4330 | trans = btrfs_join_transaction(root, 1); | 4380 | trans = btrfs_join_transaction(root, 1); |
4381 | if (IS_ERR(trans)) | ||
4382 | return PTR_ERR(trans); | ||
4331 | btrfs_set_trans_block_group(trans, inode); | 4383 | btrfs_set_trans_block_group(trans, inode); |
4332 | if (nolock) | 4384 | if (nolock) |
4333 | ret = btrfs_end_transaction_nolock(trans, root); | 4385 | ret = btrfs_end_transaction_nolock(trans, root); |
@@ -4353,6 +4405,7 @@ void btrfs_dirty_inode(struct inode *inode) | |||
4353 | return; | 4405 | return; |
4354 | 4406 | ||
4355 | trans = btrfs_join_transaction(root, 1); | 4407 | trans = btrfs_join_transaction(root, 1); |
4408 | BUG_ON(IS_ERR(trans)); | ||
4356 | btrfs_set_trans_block_group(trans, inode); | 4409 | btrfs_set_trans_block_group(trans, inode); |
4357 | 4410 | ||
4358 | ret = btrfs_update_inode(trans, root, inode); | 4411 | ret = btrfs_update_inode(trans, root, inode); |
@@ -4481,12 +4534,17 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4481 | BUG_ON(!path); | 4534 | BUG_ON(!path); |
4482 | 4535 | ||
4483 | inode = new_inode(root->fs_info->sb); | 4536 | inode = new_inode(root->fs_info->sb); |
4484 | if (!inode) | 4537 | if (!inode) { |
4538 | btrfs_free_path(path); | ||
4485 | return ERR_PTR(-ENOMEM); | 4539 | return ERR_PTR(-ENOMEM); |
4540 | } | ||
4486 | 4541 | ||
4487 | if (dir) { | 4542 | if (dir) { |
4543 | trace_btrfs_inode_request(dir); | ||
4544 | |||
4488 | ret = btrfs_set_inode_index(dir, index); | 4545 | ret = btrfs_set_inode_index(dir, index); |
4489 | if (ret) { | 4546 | if (ret) { |
4547 | btrfs_free_path(path); | ||
4490 | iput(inode); | 4548 | iput(inode); |
4491 | return ERR_PTR(ret); | 4549 | return ERR_PTR(ret); |
4492 | } | 4550 | } |
@@ -4553,12 +4611,16 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4553 | if ((mode & S_IFREG)) { | 4611 | if ((mode & S_IFREG)) { |
4554 | if (btrfs_test_opt(root, NODATASUM)) | 4612 | if (btrfs_test_opt(root, NODATASUM)) |
4555 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM; | 4613 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM; |
4556 | if (btrfs_test_opt(root, NODATACOW)) | 4614 | if (btrfs_test_opt(root, NODATACOW) || |
4615 | (BTRFS_I(dir)->flags & BTRFS_INODE_NODATACOW)) | ||
4557 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW; | 4616 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW; |
4558 | } | 4617 | } |
4559 | 4618 | ||
4560 | insert_inode_hash(inode); | 4619 | insert_inode_hash(inode); |
4561 | inode_tree_add(inode); | 4620 | inode_tree_add(inode); |
4621 | |||
4622 | trace_btrfs_inode_new(inode); | ||
4623 | |||
4562 | return inode; | 4624 | return inode; |
4563 | fail: | 4625 | fail: |
4564 | if (dir) | 4626 | if (dir) |
@@ -4673,7 +4735,7 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4673 | if (IS_ERR(inode)) | 4735 | if (IS_ERR(inode)) |
4674 | goto out_unlock; | 4736 | goto out_unlock; |
4675 | 4737 | ||
4676 | err = btrfs_init_inode_security(trans, inode, dir); | 4738 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); |
4677 | if (err) { | 4739 | if (err) { |
4678 | drop_inode = 1; | 4740 | drop_inode = 1; |
4679 | goto out_unlock; | 4741 | goto out_unlock; |
@@ -4734,7 +4796,7 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4734 | if (IS_ERR(inode)) | 4796 | if (IS_ERR(inode)) |
4735 | goto out_unlock; | 4797 | goto out_unlock; |
4736 | 4798 | ||
4737 | err = btrfs_init_inode_security(trans, inode, dir); | 4799 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); |
4738 | if (err) { | 4800 | if (err) { |
4739 | drop_inode = 1; | 4801 | drop_inode = 1; |
4740 | goto out_unlock; | 4802 | goto out_unlock; |
@@ -4775,30 +4837,31 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
4775 | int err; | 4837 | int err; |
4776 | int drop_inode = 0; | 4838 | int drop_inode = 0; |
4777 | 4839 | ||
4778 | if (inode->i_nlink == 0) | ||
4779 | return -ENOENT; | ||
4780 | |||
4781 | /* do not allow sys_link's with other subvols of the same device */ | 4840 | /* do not allow sys_link's with other subvols of the same device */ |
4782 | if (root->objectid != BTRFS_I(inode)->root->objectid) | 4841 | if (root->objectid != BTRFS_I(inode)->root->objectid) |
4783 | return -EPERM; | 4842 | return -EXDEV; |
4784 | 4843 | ||
4785 | btrfs_inc_nlink(inode); | 4844 | if (inode->i_nlink == ~0U) |
4786 | inode->i_ctime = CURRENT_TIME; | 4845 | return -EMLINK; |
4787 | 4846 | ||
4788 | err = btrfs_set_inode_index(dir, &index); | 4847 | err = btrfs_set_inode_index(dir, &index); |
4789 | if (err) | 4848 | if (err) |
4790 | goto fail; | 4849 | goto fail; |
4791 | 4850 | ||
4792 | /* | 4851 | /* |
4793 | * 1 item for inode ref | 4852 | * 2 items for inode and inode ref |
4794 | * 2 items for dir items | 4853 | * 2 items for dir items |
4854 | * 1 item for parent inode | ||
4795 | */ | 4855 | */ |
4796 | trans = btrfs_start_transaction(root, 3); | 4856 | trans = btrfs_start_transaction(root, 5); |
4797 | if (IS_ERR(trans)) { | 4857 | if (IS_ERR(trans)) { |
4798 | err = PTR_ERR(trans); | 4858 | err = PTR_ERR(trans); |
4799 | goto fail; | 4859 | goto fail; |
4800 | } | 4860 | } |
4801 | 4861 | ||
4862 | btrfs_inc_nlink(inode); | ||
4863 | inode->i_ctime = CURRENT_TIME; | ||
4864 | |||
4802 | btrfs_set_trans_block_group(trans, dir); | 4865 | btrfs_set_trans_block_group(trans, dir); |
4803 | ihold(inode); | 4866 | ihold(inode); |
4804 | 4867 | ||
@@ -4862,7 +4925,7 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
4862 | 4925 | ||
4863 | drop_on_err = 1; | 4926 | drop_on_err = 1; |
4864 | 4927 | ||
4865 | err = btrfs_init_inode_security(trans, inode, dir); | 4928 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); |
4866 | if (err) | 4929 | if (err) |
4867 | goto out_fail; | 4930 | goto out_fail; |
4868 | 4931 | ||
@@ -4928,8 +4991,10 @@ static noinline int uncompress_inline(struct btrfs_path *path, | |||
4928 | size_t max_size; | 4991 | size_t max_size; |
4929 | unsigned long inline_size; | 4992 | unsigned long inline_size; |
4930 | unsigned long ptr; | 4993 | unsigned long ptr; |
4994 | int compress_type; | ||
4931 | 4995 | ||
4932 | WARN_ON(pg_offset != 0); | 4996 | WARN_ON(pg_offset != 0); |
4997 | compress_type = btrfs_file_extent_compression(leaf, item); | ||
4933 | max_size = btrfs_file_extent_ram_bytes(leaf, item); | 4998 | max_size = btrfs_file_extent_ram_bytes(leaf, item); |
4934 | inline_size = btrfs_file_extent_inline_item_len(leaf, | 4999 | inline_size = btrfs_file_extent_inline_item_len(leaf, |
4935 | btrfs_item_nr(leaf, path->slots[0])); | 5000 | btrfs_item_nr(leaf, path->slots[0])); |
@@ -4939,8 +5004,8 @@ static noinline int uncompress_inline(struct btrfs_path *path, | |||
4939 | read_extent_buffer(leaf, tmp, ptr, inline_size); | 5004 | read_extent_buffer(leaf, tmp, ptr, inline_size); |
4940 | 5005 | ||
4941 | max_size = min_t(unsigned long, PAGE_CACHE_SIZE, max_size); | 5006 | max_size = min_t(unsigned long, PAGE_CACHE_SIZE, max_size); |
4942 | ret = btrfs_zlib_decompress(tmp, page, extent_offset, | 5007 | ret = btrfs_decompress(compress_type, tmp, page, |
4943 | inline_size, max_size); | 5008 | extent_offset, inline_size, max_size); |
4944 | if (ret) { | 5009 | if (ret) { |
4945 | char *kaddr = kmap_atomic(page, KM_USER0); | 5010 | char *kaddr = kmap_atomic(page, KM_USER0); |
4946 | unsigned long copy_size = min_t(u64, | 5011 | unsigned long copy_size = min_t(u64, |
@@ -4982,7 +5047,7 @@ struct extent_map *btrfs_get_extent(struct inode *inode, struct page *page, | |||
4982 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; | 5047 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; |
4983 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; | 5048 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; |
4984 | struct btrfs_trans_handle *trans = NULL; | 5049 | struct btrfs_trans_handle *trans = NULL; |
4985 | int compressed; | 5050 | int compress_type; |
4986 | 5051 | ||
4987 | again: | 5052 | again: |
4988 | read_lock(&em_tree->lock); | 5053 | read_lock(&em_tree->lock); |
@@ -5041,7 +5106,7 @@ again: | |||
5041 | 5106 | ||
5042 | found_type = btrfs_file_extent_type(leaf, item); | 5107 | found_type = btrfs_file_extent_type(leaf, item); |
5043 | extent_start = found_key.offset; | 5108 | extent_start = found_key.offset; |
5044 | compressed = btrfs_file_extent_compression(leaf, item); | 5109 | compress_type = btrfs_file_extent_compression(leaf, item); |
5045 | if (found_type == BTRFS_FILE_EXTENT_REG || | 5110 | if (found_type == BTRFS_FILE_EXTENT_REG || |
5046 | found_type == BTRFS_FILE_EXTENT_PREALLOC) { | 5111 | found_type == BTRFS_FILE_EXTENT_PREALLOC) { |
5047 | extent_end = extent_start + | 5112 | extent_end = extent_start + |
@@ -5087,8 +5152,9 @@ again: | |||
5087 | em->block_start = EXTENT_MAP_HOLE; | 5152 | em->block_start = EXTENT_MAP_HOLE; |
5088 | goto insert; | 5153 | goto insert; |
5089 | } | 5154 | } |
5090 | if (compressed) { | 5155 | if (compress_type != BTRFS_COMPRESS_NONE) { |
5091 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); | 5156 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); |
5157 | em->compress_type = compress_type; | ||
5092 | em->block_start = bytenr; | 5158 | em->block_start = bytenr; |
5093 | em->block_len = btrfs_file_extent_disk_num_bytes(leaf, | 5159 | em->block_len = btrfs_file_extent_disk_num_bytes(leaf, |
5094 | item); | 5160 | item); |
@@ -5122,12 +5188,14 @@ again: | |||
5122 | em->len = (copy_size + root->sectorsize - 1) & | 5188 | em->len = (copy_size + root->sectorsize - 1) & |
5123 | ~((u64)root->sectorsize - 1); | 5189 | ~((u64)root->sectorsize - 1); |
5124 | em->orig_start = EXTENT_MAP_INLINE; | 5190 | em->orig_start = EXTENT_MAP_INLINE; |
5125 | if (compressed) | 5191 | if (compress_type) { |
5126 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); | 5192 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); |
5193 | em->compress_type = compress_type; | ||
5194 | } | ||
5127 | ptr = btrfs_file_extent_inline_start(item) + extent_offset; | 5195 | ptr = btrfs_file_extent_inline_start(item) + extent_offset; |
5128 | if (create == 0 && !PageUptodate(page)) { | 5196 | if (create == 0 && !PageUptodate(page)) { |
5129 | if (btrfs_file_extent_compression(leaf, item) == | 5197 | if (btrfs_file_extent_compression(leaf, item) != |
5130 | BTRFS_COMPRESS_ZLIB) { | 5198 | BTRFS_COMPRESS_NONE) { |
5131 | ret = uncompress_inline(path, inode, page, | 5199 | ret = uncompress_inline(path, inode, page, |
5132 | pg_offset, | 5200 | pg_offset, |
5133 | extent_offset, item); | 5201 | extent_offset, item); |
@@ -5152,6 +5220,8 @@ again: | |||
5152 | em = NULL; | 5220 | em = NULL; |
5153 | btrfs_release_path(root, path); | 5221 | btrfs_release_path(root, path); |
5154 | trans = btrfs_join_transaction(root, 1); | 5222 | trans = btrfs_join_transaction(root, 1); |
5223 | if (IS_ERR(trans)) | ||
5224 | return ERR_CAST(trans); | ||
5155 | goto again; | 5225 | goto again; |
5156 | } | 5226 | } |
5157 | map = kmap(page); | 5227 | map = kmap(page); |
@@ -5161,7 +5231,7 @@ again: | |||
5161 | btrfs_mark_buffer_dirty(leaf); | 5231 | btrfs_mark_buffer_dirty(leaf); |
5162 | } | 5232 | } |
5163 | set_extent_uptodate(io_tree, em->start, | 5233 | set_extent_uptodate(io_tree, em->start, |
5164 | extent_map_end(em) - 1, GFP_NOFS); | 5234 | extent_map_end(em) - 1, NULL, GFP_NOFS); |
5165 | goto insert; | 5235 | goto insert; |
5166 | } else { | 5236 | } else { |
5167 | printk(KERN_ERR "btrfs unknown found_type %d\n", found_type); | 5237 | printk(KERN_ERR "btrfs unknown found_type %d\n", found_type); |
@@ -5228,6 +5298,9 @@ insert: | |||
5228 | } | 5298 | } |
5229 | write_unlock(&em_tree->lock); | 5299 | write_unlock(&em_tree->lock); |
5230 | out: | 5300 | out: |
5301 | |||
5302 | trace_btrfs_get_extent(root, em); | ||
5303 | |||
5231 | if (path) | 5304 | if (path) |
5232 | btrfs_free_path(path); | 5305 | btrfs_free_path(path); |
5233 | if (trans) { | 5306 | if (trans) { |
@@ -5242,22 +5315,157 @@ out: | |||
5242 | return em; | 5315 | return em; |
5243 | } | 5316 | } |
5244 | 5317 | ||
5318 | struct extent_map *btrfs_get_extent_fiemap(struct inode *inode, struct page *page, | ||
5319 | size_t pg_offset, u64 start, u64 len, | ||
5320 | int create) | ||
5321 | { | ||
5322 | struct extent_map *em; | ||
5323 | struct extent_map *hole_em = NULL; | ||
5324 | u64 range_start = start; | ||
5325 | u64 end; | ||
5326 | u64 found; | ||
5327 | u64 found_end; | ||
5328 | int err = 0; | ||
5329 | |||
5330 | em = btrfs_get_extent(inode, page, pg_offset, start, len, create); | ||
5331 | if (IS_ERR(em)) | ||
5332 | return em; | ||
5333 | if (em) { | ||
5334 | /* | ||
5335 | * if our em maps to a hole, there might | ||
5336 | * actually be delalloc bytes behind it | ||
5337 | */ | ||
5338 | if (em->block_start != EXTENT_MAP_HOLE) | ||
5339 | return em; | ||
5340 | else | ||
5341 | hole_em = em; | ||
5342 | } | ||
5343 | |||
5344 | /* check to see if we've wrapped (len == -1 or similar) */ | ||
5345 | end = start + len; | ||
5346 | if (end < start) | ||
5347 | end = (u64)-1; | ||
5348 | else | ||
5349 | end -= 1; | ||
5350 | |||
5351 | em = NULL; | ||
5352 | |||
5353 | /* ok, we didn't find anything, lets look for delalloc */ | ||
5354 | found = count_range_bits(&BTRFS_I(inode)->io_tree, &range_start, | ||
5355 | end, len, EXTENT_DELALLOC, 1); | ||
5356 | found_end = range_start + found; | ||
5357 | if (found_end < range_start) | ||
5358 | found_end = (u64)-1; | ||
5359 | |||
5360 | /* | ||
5361 | * we didn't find anything useful, return | ||
5362 | * the original results from get_extent() | ||
5363 | */ | ||
5364 | if (range_start > end || found_end <= start) { | ||
5365 | em = hole_em; | ||
5366 | hole_em = NULL; | ||
5367 | goto out; | ||
5368 | } | ||
5369 | |||
5370 | /* adjust the range_start to make sure it doesn't | ||
5371 | * go backwards from the start they passed in | ||
5372 | */ | ||
5373 | range_start = max(start,range_start); | ||
5374 | found = found_end - range_start; | ||
5375 | |||
5376 | if (found > 0) { | ||
5377 | u64 hole_start = start; | ||
5378 | u64 hole_len = len; | ||
5379 | |||
5380 | em = alloc_extent_map(GFP_NOFS); | ||
5381 | if (!em) { | ||
5382 | err = -ENOMEM; | ||
5383 | goto out; | ||
5384 | } | ||
5385 | /* | ||
5386 | * when btrfs_get_extent can't find anything it | ||
5387 | * returns one huge hole | ||
5388 | * | ||
5389 | * make sure what it found really fits our range, and | ||
5390 | * adjust to make sure it is based on the start from | ||
5391 | * the caller | ||
5392 | */ | ||
5393 | if (hole_em) { | ||
5394 | u64 calc_end = extent_map_end(hole_em); | ||
5395 | |||
5396 | if (calc_end <= start || (hole_em->start > end)) { | ||
5397 | free_extent_map(hole_em); | ||
5398 | hole_em = NULL; | ||
5399 | } else { | ||
5400 | hole_start = max(hole_em->start, start); | ||
5401 | hole_len = calc_end - hole_start; | ||
5402 | } | ||
5403 | } | ||
5404 | em->bdev = NULL; | ||
5405 | if (hole_em && range_start > hole_start) { | ||
5406 | /* our hole starts before our delalloc, so we | ||
5407 | * have to return just the parts of the hole | ||
5408 | * that go until the delalloc starts | ||
5409 | */ | ||
5410 | em->len = min(hole_len, | ||
5411 | range_start - hole_start); | ||
5412 | em->start = hole_start; | ||
5413 | em->orig_start = hole_start; | ||
5414 | /* | ||
5415 | * don't adjust block start at all, | ||
5416 | * it is fixed at EXTENT_MAP_HOLE | ||
5417 | */ | ||
5418 | em->block_start = hole_em->block_start; | ||
5419 | em->block_len = hole_len; | ||
5420 | } else { | ||
5421 | em->start = range_start; | ||
5422 | em->len = found; | ||
5423 | em->orig_start = range_start; | ||
5424 | em->block_start = EXTENT_MAP_DELALLOC; | ||
5425 | em->block_len = found; | ||
5426 | } | ||
5427 | } else if (hole_em) { | ||
5428 | return hole_em; | ||
5429 | } | ||
5430 | out: | ||
5431 | |||
5432 | free_extent_map(hole_em); | ||
5433 | if (err) { | ||
5434 | free_extent_map(em); | ||
5435 | return ERR_PTR(err); | ||
5436 | } | ||
5437 | return em; | ||
5438 | } | ||
5439 | |||
5245 | static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | 5440 | static struct extent_map *btrfs_new_extent_direct(struct inode *inode, |
5441 | struct extent_map *em, | ||
5246 | u64 start, u64 len) | 5442 | u64 start, u64 len) |
5247 | { | 5443 | { |
5248 | struct btrfs_root *root = BTRFS_I(inode)->root; | 5444 | struct btrfs_root *root = BTRFS_I(inode)->root; |
5249 | struct btrfs_trans_handle *trans; | 5445 | struct btrfs_trans_handle *trans; |
5250 | struct extent_map *em; | ||
5251 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; | 5446 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; |
5252 | struct btrfs_key ins; | 5447 | struct btrfs_key ins; |
5253 | u64 alloc_hint; | 5448 | u64 alloc_hint; |
5254 | int ret; | 5449 | int ret; |
5450 | bool insert = false; | ||
5255 | 5451 | ||
5256 | btrfs_drop_extent_cache(inode, start, start + len - 1, 0); | 5452 | /* |
5453 | * Ok if the extent map we looked up is a hole and is for the exact | ||
5454 | * range we want, there is no reason to allocate a new one, however if | ||
5455 | * it is not right then we need to free this one and drop the cache for | ||
5456 | * our range. | ||
5457 | */ | ||
5458 | if (em->block_start != EXTENT_MAP_HOLE || em->start != start || | ||
5459 | em->len != len) { | ||
5460 | free_extent_map(em); | ||
5461 | em = NULL; | ||
5462 | insert = true; | ||
5463 | btrfs_drop_extent_cache(inode, start, start + len - 1, 0); | ||
5464 | } | ||
5257 | 5465 | ||
5258 | trans = btrfs_join_transaction(root, 0); | 5466 | trans = btrfs_join_transaction(root, 0); |
5259 | if (!trans) | 5467 | if (IS_ERR(trans)) |
5260 | return ERR_PTR(-ENOMEM); | 5468 | return ERR_CAST(trans); |
5261 | 5469 | ||
5262 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 5470 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
5263 | 5471 | ||
@@ -5269,10 +5477,12 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | |||
5269 | goto out; | 5477 | goto out; |
5270 | } | 5478 | } |
5271 | 5479 | ||
5272 | em = alloc_extent_map(GFP_NOFS); | ||
5273 | if (!em) { | 5480 | if (!em) { |
5274 | em = ERR_PTR(-ENOMEM); | 5481 | em = alloc_extent_map(GFP_NOFS); |
5275 | goto out; | 5482 | if (!em) { |
5483 | em = ERR_PTR(-ENOMEM); | ||
5484 | goto out; | ||
5485 | } | ||
5276 | } | 5486 | } |
5277 | 5487 | ||
5278 | em->start = start; | 5488 | em->start = start; |
@@ -5282,9 +5492,15 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | |||
5282 | em->block_start = ins.objectid; | 5492 | em->block_start = ins.objectid; |
5283 | em->block_len = ins.offset; | 5493 | em->block_len = ins.offset; |
5284 | em->bdev = root->fs_info->fs_devices->latest_bdev; | 5494 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
5495 | |||
5496 | /* | ||
5497 | * We need to do this because if we're using the original em we searched | ||
5498 | * for, we could have EXTENT_FLAG_VACANCY set, and we don't want that. | ||
5499 | */ | ||
5500 | em->flags = 0; | ||
5285 | set_bit(EXTENT_FLAG_PINNED, &em->flags); | 5501 | set_bit(EXTENT_FLAG_PINNED, &em->flags); |
5286 | 5502 | ||
5287 | while (1) { | 5503 | while (insert) { |
5288 | write_lock(&em_tree->lock); | 5504 | write_lock(&em_tree->lock); |
5289 | ret = add_extent_mapping(em_tree, em); | 5505 | ret = add_extent_mapping(em_tree, em); |
5290 | write_unlock(&em_tree->lock); | 5506 | write_unlock(&em_tree->lock); |
@@ -5481,7 +5697,7 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, | |||
5481 | * while we look for nocow cross refs | 5697 | * while we look for nocow cross refs |
5482 | */ | 5698 | */ |
5483 | trans = btrfs_join_transaction(root, 0); | 5699 | trans = btrfs_join_transaction(root, 0); |
5484 | if (!trans) | 5700 | if (IS_ERR(trans)) |
5485 | goto must_cow; | 5701 | goto must_cow; |
5486 | 5702 | ||
5487 | if (can_nocow_odirect(trans, inode, start, len) == 1) { | 5703 | if (can_nocow_odirect(trans, inode, start, len) == 1) { |
@@ -5502,8 +5718,7 @@ must_cow: | |||
5502 | * it above | 5718 | * it above |
5503 | */ | 5719 | */ |
5504 | len = bh_result->b_size; | 5720 | len = bh_result->b_size; |
5505 | free_extent_map(em); | 5721 | em = btrfs_new_extent_direct(inode, em, start, len); |
5506 | em = btrfs_new_extent_direct(inode, start, len); | ||
5507 | if (IS_ERR(em)) | 5722 | if (IS_ERR(em)) |
5508 | return PTR_ERR(em); | 5723 | return PTR_ERR(em); |
5509 | len = min(len, em->len - (start - em->start)); | 5724 | len = min(len, em->len - (start - em->start)); |
@@ -5589,6 +5804,10 @@ static void btrfs_endio_direct_read(struct bio *bio, int err) | |||
5589 | 5804 | ||
5590 | kfree(dip->csums); | 5805 | kfree(dip->csums); |
5591 | kfree(dip); | 5806 | kfree(dip); |
5807 | |||
5808 | /* If we had a csum failure make sure to clear the uptodate flag */ | ||
5809 | if (err) | ||
5810 | clear_bit(BIO_UPTODATE, &bio->bi_flags); | ||
5592 | dio_end_io(bio, err); | 5811 | dio_end_io(bio, err); |
5593 | } | 5812 | } |
5594 | 5813 | ||
@@ -5616,7 +5835,7 @@ again: | |||
5616 | BUG_ON(!ordered); | 5835 | BUG_ON(!ordered); |
5617 | 5836 | ||
5618 | trans = btrfs_join_transaction(root, 1); | 5837 | trans = btrfs_join_transaction(root, 1); |
5619 | if (!trans) { | 5838 | if (IS_ERR(trans)) { |
5620 | err = -ENOMEM; | 5839 | err = -ENOMEM; |
5621 | goto out; | 5840 | goto out; |
5622 | } | 5841 | } |
@@ -5662,8 +5881,10 @@ again: | |||
5662 | } | 5881 | } |
5663 | 5882 | ||
5664 | add_pending_csums(trans, inode, ordered->file_offset, &ordered->list); | 5883 | add_pending_csums(trans, inode, ordered->file_offset, &ordered->list); |
5665 | btrfs_ordered_update_i_size(inode, 0, ordered); | 5884 | ret = btrfs_ordered_update_i_size(inode, 0, ordered); |
5666 | btrfs_update_inode(trans, root, inode); | 5885 | if (!ret) |
5886 | btrfs_update_inode(trans, root, inode); | ||
5887 | ret = 0; | ||
5667 | out_unlock: | 5888 | out_unlock: |
5668 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, ordered->file_offset, | 5889 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, ordered->file_offset, |
5669 | ordered->file_offset + ordered->len - 1, | 5890 | ordered->file_offset + ordered->len - 1, |
@@ -5690,6 +5911,10 @@ out_done: | |||
5690 | 5911 | ||
5691 | kfree(dip->csums); | 5912 | kfree(dip->csums); |
5692 | kfree(dip); | 5913 | kfree(dip); |
5914 | |||
5915 | /* If we had an error make sure to clear the uptodate flag */ | ||
5916 | if (err) | ||
5917 | clear_bit(BIO_UPTODATE, &bio->bi_flags); | ||
5693 | dio_end_io(bio, err); | 5918 | dio_end_io(bio, err); |
5694 | } | 5919 | } |
5695 | 5920 | ||
@@ -5745,7 +5970,7 @@ static struct bio *btrfs_dio_bio_alloc(struct block_device *bdev, | |||
5745 | 5970 | ||
5746 | static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, | 5971 | static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, |
5747 | int rw, u64 file_offset, int skip_sum, | 5972 | int rw, u64 file_offset, int skip_sum, |
5748 | u32 *csums) | 5973 | u32 *csums, int async_submit) |
5749 | { | 5974 | { |
5750 | int write = rw & REQ_WRITE; | 5975 | int write = rw & REQ_WRITE; |
5751 | struct btrfs_root *root = BTRFS_I(inode)->root; | 5976 | struct btrfs_root *root = BTRFS_I(inode)->root; |
@@ -5756,18 +5981,33 @@ static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, | |||
5756 | if (ret) | 5981 | if (ret) |
5757 | goto err; | 5982 | goto err; |
5758 | 5983 | ||
5759 | if (write && !skip_sum) { | 5984 | if (skip_sum) |
5985 | goto map; | ||
5986 | |||
5987 | if (write && async_submit) { | ||
5760 | ret = btrfs_wq_submit_bio(root->fs_info, | 5988 | ret = btrfs_wq_submit_bio(root->fs_info, |
5761 | inode, rw, bio, 0, 0, | 5989 | inode, rw, bio, 0, 0, |
5762 | file_offset, | 5990 | file_offset, |
5763 | __btrfs_submit_bio_start_direct_io, | 5991 | __btrfs_submit_bio_start_direct_io, |
5764 | __btrfs_submit_bio_done); | 5992 | __btrfs_submit_bio_done); |
5765 | goto err; | 5993 | goto err; |
5766 | } else if (!skip_sum) | 5994 | } else if (write) { |
5767 | btrfs_lookup_bio_sums_dio(root, inode, bio, | 5995 | /* |
5996 | * If we aren't doing async submit, calculate the csum of the | ||
5997 | * bio now. | ||
5998 | */ | ||
5999 | ret = btrfs_csum_one_bio(root, inode, bio, file_offset, 1); | ||
6000 | if (ret) | ||
6001 | goto err; | ||
6002 | } else if (!skip_sum) { | ||
6003 | ret = btrfs_lookup_bio_sums_dio(root, inode, bio, | ||
5768 | file_offset, csums); | 6004 | file_offset, csums); |
6005 | if (ret) | ||
6006 | goto err; | ||
6007 | } | ||
5769 | 6008 | ||
5770 | ret = btrfs_map_bio(root, rw, bio, 0, 1); | 6009 | map: |
6010 | ret = btrfs_map_bio(root, rw, bio, 0, async_submit); | ||
5771 | err: | 6011 | err: |
5772 | bio_put(bio); | 6012 | bio_put(bio); |
5773 | return ret; | 6013 | return ret; |
@@ -5789,13 +6029,8 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
5789 | int nr_pages = 0; | 6029 | int nr_pages = 0; |
5790 | u32 *csums = dip->csums; | 6030 | u32 *csums = dip->csums; |
5791 | int ret = 0; | 6031 | int ret = 0; |
5792 | 6032 | int async_submit = 0; | |
5793 | bio = btrfs_dio_bio_alloc(orig_bio->bi_bdev, start_sector, GFP_NOFS); | 6033 | int write = rw & REQ_WRITE; |
5794 | if (!bio) | ||
5795 | return -ENOMEM; | ||
5796 | bio->bi_private = dip; | ||
5797 | bio->bi_end_io = btrfs_end_dio_bio; | ||
5798 | atomic_inc(&dip->pending_bios); | ||
5799 | 6034 | ||
5800 | map_length = orig_bio->bi_size; | 6035 | map_length = orig_bio->bi_size; |
5801 | ret = btrfs_map_block(map_tree, READ, start_sector << 9, | 6036 | ret = btrfs_map_block(map_tree, READ, start_sector << 9, |
@@ -5805,6 +6040,19 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
5805 | return -EIO; | 6040 | return -EIO; |
5806 | } | 6041 | } |
5807 | 6042 | ||
6043 | if (map_length >= orig_bio->bi_size) { | ||
6044 | bio = orig_bio; | ||
6045 | goto submit; | ||
6046 | } | ||
6047 | |||
6048 | async_submit = 1; | ||
6049 | bio = btrfs_dio_bio_alloc(orig_bio->bi_bdev, start_sector, GFP_NOFS); | ||
6050 | if (!bio) | ||
6051 | return -ENOMEM; | ||
6052 | bio->bi_private = dip; | ||
6053 | bio->bi_end_io = btrfs_end_dio_bio; | ||
6054 | atomic_inc(&dip->pending_bios); | ||
6055 | |||
5808 | while (bvec <= (orig_bio->bi_io_vec + orig_bio->bi_vcnt - 1)) { | 6056 | while (bvec <= (orig_bio->bi_io_vec + orig_bio->bi_vcnt - 1)) { |
5809 | if (unlikely(map_length < submit_len + bvec->bv_len || | 6057 | if (unlikely(map_length < submit_len + bvec->bv_len || |
5810 | bio_add_page(bio, bvec->bv_page, bvec->bv_len, | 6058 | bio_add_page(bio, bvec->bv_page, bvec->bv_len, |
@@ -5818,14 +6066,15 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
5818 | atomic_inc(&dip->pending_bios); | 6066 | atomic_inc(&dip->pending_bios); |
5819 | ret = __btrfs_submit_dio_bio(bio, inode, rw, | 6067 | ret = __btrfs_submit_dio_bio(bio, inode, rw, |
5820 | file_offset, skip_sum, | 6068 | file_offset, skip_sum, |
5821 | csums); | 6069 | csums, async_submit); |
5822 | if (ret) { | 6070 | if (ret) { |
5823 | bio_put(bio); | 6071 | bio_put(bio); |
5824 | atomic_dec(&dip->pending_bios); | 6072 | atomic_dec(&dip->pending_bios); |
5825 | goto out_err; | 6073 | goto out_err; |
5826 | } | 6074 | } |
5827 | 6075 | ||
5828 | if (!skip_sum) | 6076 | /* Write's use the ordered csums */ |
6077 | if (!write && !skip_sum) | ||
5829 | csums = csums + nr_pages; | 6078 | csums = csums + nr_pages; |
5830 | start_sector += submit_len >> 9; | 6079 | start_sector += submit_len >> 9; |
5831 | file_offset += submit_len; | 6080 | file_offset += submit_len; |
@@ -5854,8 +6103,9 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
5854 | } | 6103 | } |
5855 | } | 6104 | } |
5856 | 6105 | ||
6106 | submit: | ||
5857 | ret = __btrfs_submit_dio_bio(bio, inode, rw, file_offset, skip_sum, | 6107 | ret = __btrfs_submit_dio_bio(bio, inode, rw, file_offset, skip_sum, |
5858 | csums); | 6108 | csums, async_submit); |
5859 | if (!ret) | 6109 | if (!ret) |
5860 | return 0; | 6110 | return 0; |
5861 | 6111 | ||
@@ -5893,9 +6143,11 @@ static void btrfs_submit_direct(int rw, struct bio *bio, struct inode *inode, | |||
5893 | } | 6143 | } |
5894 | dip->csums = NULL; | 6144 | dip->csums = NULL; |
5895 | 6145 | ||
5896 | if (!skip_sum) { | 6146 | /* Write's use the ordered csum stuff, so we don't need dip->csums */ |
6147 | if (!write && !skip_sum) { | ||
5897 | dip->csums = kmalloc(sizeof(u32) * bio->bi_vcnt, GFP_NOFS); | 6148 | dip->csums = kmalloc(sizeof(u32) * bio->bi_vcnt, GFP_NOFS); |
5898 | if (!dip->csums) { | 6149 | if (!dip->csums) { |
6150 | kfree(dip); | ||
5899 | ret = -ENOMEM; | 6151 | ret = -ENOMEM; |
5900 | goto free_ordered; | 6152 | goto free_ordered; |
5901 | } | 6153 | } |
@@ -5948,6 +6200,7 @@ static ssize_t check_direct_IO(struct btrfs_root *root, int rw, struct kiocb *io | |||
5948 | unsigned long nr_segs) | 6200 | unsigned long nr_segs) |
5949 | { | 6201 | { |
5950 | int seg; | 6202 | int seg; |
6203 | int i; | ||
5951 | size_t size; | 6204 | size_t size; |
5952 | unsigned long addr; | 6205 | unsigned long addr; |
5953 | unsigned blocksize_mask = root->sectorsize - 1; | 6206 | unsigned blocksize_mask = root->sectorsize - 1; |
@@ -5962,8 +6215,22 @@ static ssize_t check_direct_IO(struct btrfs_root *root, int rw, struct kiocb *io | |||
5962 | addr = (unsigned long)iov[seg].iov_base; | 6215 | addr = (unsigned long)iov[seg].iov_base; |
5963 | size = iov[seg].iov_len; | 6216 | size = iov[seg].iov_len; |
5964 | end += size; | 6217 | end += size; |
5965 | if ((addr & blocksize_mask) || (size & blocksize_mask)) | 6218 | if ((addr & blocksize_mask) || (size & blocksize_mask)) |
5966 | goto out; | 6219 | goto out; |
6220 | |||
6221 | /* If this is a write we don't need to check anymore */ | ||
6222 | if (rw & WRITE) | ||
6223 | continue; | ||
6224 | |||
6225 | /* | ||
6226 | * Check to make sure we don't have duplicate iov_base's in this | ||
6227 | * iovec, if so return EINVAL, otherwise we'll get csum errors | ||
6228 | * when reading back. | ||
6229 | */ | ||
6230 | for (i = seg + 1; i < nr_segs; i++) { | ||
6231 | if (iov[seg].iov_base == iov[i].iov_base) | ||
6232 | goto out; | ||
6233 | } | ||
5967 | } | 6234 | } |
5968 | retval = 0; | 6235 | retval = 0; |
5969 | out: | 6236 | out: |
@@ -6064,7 +6331,7 @@ out: | |||
6064 | static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | 6331 | static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, |
6065 | __u64 start, __u64 len) | 6332 | __u64 start, __u64 len) |
6066 | { | 6333 | { |
6067 | return extent_fiemap(inode, fieinfo, start, len, btrfs_get_extent); | 6334 | return extent_fiemap(inode, fieinfo, start, len, btrfs_get_extent_fiemap); |
6068 | } | 6335 | } |
6069 | 6336 | ||
6070 | int btrfs_readpage(struct file *file, struct page *page) | 6337 | int btrfs_readpage(struct file *file, struct page *page) |
@@ -6314,28 +6581,42 @@ out: | |||
6314 | return ret; | 6581 | return ret; |
6315 | } | 6582 | } |
6316 | 6583 | ||
6317 | static void btrfs_truncate(struct inode *inode) | 6584 | static int btrfs_truncate(struct inode *inode) |
6318 | { | 6585 | { |
6319 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6586 | struct btrfs_root *root = BTRFS_I(inode)->root; |
6320 | int ret; | 6587 | int ret; |
6588 | int err = 0; | ||
6321 | struct btrfs_trans_handle *trans; | 6589 | struct btrfs_trans_handle *trans; |
6322 | unsigned long nr; | 6590 | unsigned long nr; |
6323 | u64 mask = root->sectorsize - 1; | 6591 | u64 mask = root->sectorsize - 1; |
6324 | 6592 | ||
6325 | if (!S_ISREG(inode->i_mode)) { | ||
6326 | WARN_ON(1); | ||
6327 | return; | ||
6328 | } | ||
6329 | |||
6330 | ret = btrfs_truncate_page(inode->i_mapping, inode->i_size); | 6593 | ret = btrfs_truncate_page(inode->i_mapping, inode->i_size); |
6331 | if (ret) | 6594 | if (ret) |
6332 | return; | 6595 | return ret; |
6333 | 6596 | ||
6334 | btrfs_wait_ordered_range(inode, inode->i_size & (~mask), (u64)-1); | 6597 | btrfs_wait_ordered_range(inode, inode->i_size & (~mask), (u64)-1); |
6335 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); | 6598 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); |
6336 | 6599 | ||
6600 | trans = btrfs_start_transaction(root, 5); | ||
6601 | if (IS_ERR(trans)) | ||
6602 | return PTR_ERR(trans); | ||
6603 | |||
6604 | btrfs_set_trans_block_group(trans, inode); | ||
6605 | |||
6606 | ret = btrfs_orphan_add(trans, inode); | ||
6607 | if (ret) { | ||
6608 | btrfs_end_transaction(trans, root); | ||
6609 | return ret; | ||
6610 | } | ||
6611 | |||
6612 | nr = trans->blocks_used; | ||
6613 | btrfs_end_transaction(trans, root); | ||
6614 | btrfs_btree_balance_dirty(root, nr); | ||
6615 | |||
6616 | /* Now start a transaction for the truncate */ | ||
6337 | trans = btrfs_start_transaction(root, 0); | 6617 | trans = btrfs_start_transaction(root, 0); |
6338 | BUG_ON(IS_ERR(trans)); | 6618 | if (IS_ERR(trans)) |
6619 | return PTR_ERR(trans); | ||
6339 | btrfs_set_trans_block_group(trans, inode); | 6620 | btrfs_set_trans_block_group(trans, inode); |
6340 | trans->block_rsv = root->orphan_block_rsv; | 6621 | trans->block_rsv = root->orphan_block_rsv; |
6341 | 6622 | ||
@@ -6362,29 +6643,38 @@ static void btrfs_truncate(struct inode *inode) | |||
6362 | while (1) { | 6643 | while (1) { |
6363 | if (!trans) { | 6644 | if (!trans) { |
6364 | trans = btrfs_start_transaction(root, 0); | 6645 | trans = btrfs_start_transaction(root, 0); |
6365 | BUG_ON(IS_ERR(trans)); | 6646 | if (IS_ERR(trans)) |
6647 | return PTR_ERR(trans); | ||
6366 | btrfs_set_trans_block_group(trans, inode); | 6648 | btrfs_set_trans_block_group(trans, inode); |
6367 | trans->block_rsv = root->orphan_block_rsv; | 6649 | trans->block_rsv = root->orphan_block_rsv; |
6368 | } | 6650 | } |
6369 | 6651 | ||
6370 | ret = btrfs_block_rsv_check(trans, root, | 6652 | ret = btrfs_block_rsv_check(trans, root, |
6371 | root->orphan_block_rsv, 0, 5); | 6653 | root->orphan_block_rsv, 0, 5); |
6372 | if (ret) { | 6654 | if (ret == -EAGAIN) { |
6373 | BUG_ON(ret != -EAGAIN); | ||
6374 | ret = btrfs_commit_transaction(trans, root); | 6655 | ret = btrfs_commit_transaction(trans, root); |
6375 | BUG_ON(ret); | 6656 | if (ret) |
6657 | return ret; | ||
6376 | trans = NULL; | 6658 | trans = NULL; |
6377 | continue; | 6659 | continue; |
6660 | } else if (ret) { | ||
6661 | err = ret; | ||
6662 | break; | ||
6378 | } | 6663 | } |
6379 | 6664 | ||
6380 | ret = btrfs_truncate_inode_items(trans, root, inode, | 6665 | ret = btrfs_truncate_inode_items(trans, root, inode, |
6381 | inode->i_size, | 6666 | inode->i_size, |
6382 | BTRFS_EXTENT_DATA_KEY); | 6667 | BTRFS_EXTENT_DATA_KEY); |
6383 | if (ret != -EAGAIN) | 6668 | if (ret != -EAGAIN) { |
6669 | err = ret; | ||
6384 | break; | 6670 | break; |
6671 | } | ||
6385 | 6672 | ||
6386 | ret = btrfs_update_inode(trans, root, inode); | 6673 | ret = btrfs_update_inode(trans, root, inode); |
6387 | BUG_ON(ret); | 6674 | if (ret) { |
6675 | err = ret; | ||
6676 | break; | ||
6677 | } | ||
6388 | 6678 | ||
6389 | nr = trans->blocks_used; | 6679 | nr = trans->blocks_used; |
6390 | btrfs_end_transaction(trans, root); | 6680 | btrfs_end_transaction(trans, root); |
@@ -6394,16 +6684,27 @@ static void btrfs_truncate(struct inode *inode) | |||
6394 | 6684 | ||
6395 | if (ret == 0 && inode->i_nlink > 0) { | 6685 | if (ret == 0 && inode->i_nlink > 0) { |
6396 | ret = btrfs_orphan_del(trans, inode); | 6686 | ret = btrfs_orphan_del(trans, inode); |
6397 | BUG_ON(ret); | 6687 | if (ret) |
6688 | err = ret; | ||
6689 | } else if (ret && inode->i_nlink > 0) { | ||
6690 | /* | ||
6691 | * Failed to do the truncate, remove us from the in memory | ||
6692 | * orphan list. | ||
6693 | */ | ||
6694 | ret = btrfs_orphan_del(NULL, inode); | ||
6398 | } | 6695 | } |
6399 | 6696 | ||
6400 | ret = btrfs_update_inode(trans, root, inode); | 6697 | ret = btrfs_update_inode(trans, root, inode); |
6401 | BUG_ON(ret); | 6698 | if (ret && !err) |
6699 | err = ret; | ||
6402 | 6700 | ||
6403 | nr = trans->blocks_used; | 6701 | nr = trans->blocks_used; |
6404 | ret = btrfs_end_transaction_throttle(trans, root); | 6702 | ret = btrfs_end_transaction_throttle(trans, root); |
6405 | BUG_ON(ret); | 6703 | if (ret && !err) |
6704 | err = ret; | ||
6406 | btrfs_btree_balance_dirty(root, nr); | 6705 | btrfs_btree_balance_dirty(root, nr); |
6706 | |||
6707 | return err; | ||
6407 | } | 6708 | } |
6408 | 6709 | ||
6409 | /* | 6710 | /* |
@@ -6470,14 +6771,13 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) | |||
6470 | ei->index_cnt = (u64)-1; | 6771 | ei->index_cnt = (u64)-1; |
6471 | ei->last_unlink_trans = 0; | 6772 | ei->last_unlink_trans = 0; |
6472 | 6773 | ||
6473 | spin_lock_init(&ei->accounting_lock); | ||
6474 | atomic_set(&ei->outstanding_extents, 0); | 6774 | atomic_set(&ei->outstanding_extents, 0); |
6475 | ei->reserved_extents = 0; | 6775 | atomic_set(&ei->reserved_extents, 0); |
6476 | 6776 | ||
6477 | ei->ordered_data_close = 0; | 6777 | ei->ordered_data_close = 0; |
6478 | ei->orphan_meta_reserved = 0; | 6778 | ei->orphan_meta_reserved = 0; |
6479 | ei->dummy_inode = 0; | 6779 | ei->dummy_inode = 0; |
6480 | ei->force_compress = 0; | 6780 | ei->force_compress = BTRFS_COMPRESS_NONE; |
6481 | 6781 | ||
6482 | inode = &ei->vfs_inode; | 6782 | inode = &ei->vfs_inode; |
6483 | extent_map_tree_init(&ei->extent_tree, GFP_NOFS); | 6783 | extent_map_tree_init(&ei->extent_tree, GFP_NOFS); |
@@ -6508,7 +6808,7 @@ void btrfs_destroy_inode(struct inode *inode) | |||
6508 | WARN_ON(!list_empty(&inode->i_dentry)); | 6808 | WARN_ON(!list_empty(&inode->i_dentry)); |
6509 | WARN_ON(inode->i_data.nrpages); | 6809 | WARN_ON(inode->i_data.nrpages); |
6510 | WARN_ON(atomic_read(&BTRFS_I(inode)->outstanding_extents)); | 6810 | WARN_ON(atomic_read(&BTRFS_I(inode)->outstanding_extents)); |
6511 | WARN_ON(BTRFS_I(inode)->reserved_extents); | 6811 | WARN_ON(atomic_read(&BTRFS_I(inode)->reserved_extents)); |
6512 | 6812 | ||
6513 | /* | 6813 | /* |
6514 | * This can happen where we create an inode, but somebody else also | 6814 | * This can happen where we create an inode, but somebody else also |
@@ -6600,6 +6900,8 @@ void btrfs_destroy_cachep(void) | |||
6600 | kmem_cache_destroy(btrfs_transaction_cachep); | 6900 | kmem_cache_destroy(btrfs_transaction_cachep); |
6601 | if (btrfs_path_cachep) | 6901 | if (btrfs_path_cachep) |
6602 | kmem_cache_destroy(btrfs_path_cachep); | 6902 | kmem_cache_destroy(btrfs_path_cachep); |
6903 | if (btrfs_free_space_cachep) | ||
6904 | kmem_cache_destroy(btrfs_free_space_cachep); | ||
6603 | } | 6905 | } |
6604 | 6906 | ||
6605 | int btrfs_init_cachep(void) | 6907 | int btrfs_init_cachep(void) |
@@ -6628,6 +6930,12 @@ int btrfs_init_cachep(void) | |||
6628 | if (!btrfs_path_cachep) | 6930 | if (!btrfs_path_cachep) |
6629 | goto fail; | 6931 | goto fail; |
6630 | 6932 | ||
6933 | btrfs_free_space_cachep = kmem_cache_create("btrfs_free_space_cache", | ||
6934 | sizeof(struct btrfs_free_space), 0, | ||
6935 | SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, NULL); | ||
6936 | if (!btrfs_free_space_cachep) | ||
6937 | goto fail; | ||
6938 | |||
6631 | return 0; | 6939 | return 0; |
6632 | fail: | 6940 | fail: |
6633 | btrfs_destroy_cachep(); | 6941 | btrfs_destroy_cachep(); |
@@ -6646,6 +6954,26 @@ static int btrfs_getattr(struct vfsmount *mnt, | |||
6646 | return 0; | 6954 | return 0; |
6647 | } | 6955 | } |
6648 | 6956 | ||
6957 | /* | ||
6958 | * If a file is moved, it will inherit the cow and compression flags of the new | ||
6959 | * directory. | ||
6960 | */ | ||
6961 | static void fixup_inode_flags(struct inode *dir, struct inode *inode) | ||
6962 | { | ||
6963 | struct btrfs_inode *b_dir = BTRFS_I(dir); | ||
6964 | struct btrfs_inode *b_inode = BTRFS_I(inode); | ||
6965 | |||
6966 | if (b_dir->flags & BTRFS_INODE_NODATACOW) | ||
6967 | b_inode->flags |= BTRFS_INODE_NODATACOW; | ||
6968 | else | ||
6969 | b_inode->flags &= ~BTRFS_INODE_NODATACOW; | ||
6970 | |||
6971 | if (b_dir->flags & BTRFS_INODE_COMPRESS) | ||
6972 | b_inode->flags |= BTRFS_INODE_COMPRESS; | ||
6973 | else | ||
6974 | b_inode->flags &= ~BTRFS_INODE_COMPRESS; | ||
6975 | } | ||
6976 | |||
6649 | static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | 6977 | static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, |
6650 | struct inode *new_dir, struct dentry *new_dentry) | 6978 | struct inode *new_dir, struct dentry *new_dentry) |
6651 | { | 6979 | { |
@@ -6694,8 +7022,10 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6694 | * should cover the worst case number of items we'll modify. | 7022 | * should cover the worst case number of items we'll modify. |
6695 | */ | 7023 | */ |
6696 | trans = btrfs_start_transaction(root, 20); | 7024 | trans = btrfs_start_transaction(root, 20); |
6697 | if (IS_ERR(trans)) | 7025 | if (IS_ERR(trans)) { |
6698 | return PTR_ERR(trans); | 7026 | ret = PTR_ERR(trans); |
7027 | goto out_notrans; | ||
7028 | } | ||
6699 | 7029 | ||
6700 | btrfs_set_trans_block_group(trans, new_dir); | 7030 | btrfs_set_trans_block_group(trans, new_dir); |
6701 | 7031 | ||
@@ -6748,11 +7078,12 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6748 | old_dentry->d_name.name, | 7078 | old_dentry->d_name.name, |
6749 | old_dentry->d_name.len); | 7079 | old_dentry->d_name.len); |
6750 | } else { | 7080 | } else { |
6751 | btrfs_inc_nlink(old_dentry->d_inode); | 7081 | ret = __btrfs_unlink_inode(trans, root, old_dir, |
6752 | ret = btrfs_unlink_inode(trans, root, old_dir, | 7082 | old_dentry->d_inode, |
6753 | old_dentry->d_inode, | 7083 | old_dentry->d_name.name, |
6754 | old_dentry->d_name.name, | 7084 | old_dentry->d_name.len); |
6755 | old_dentry->d_name.len); | 7085 | if (!ret) |
7086 | ret = btrfs_update_inode(trans, root, old_inode); | ||
6756 | } | 7087 | } |
6757 | BUG_ON(ret); | 7088 | BUG_ON(ret); |
6758 | 7089 | ||
@@ -6779,6 +7110,8 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6779 | } | 7110 | } |
6780 | } | 7111 | } |
6781 | 7112 | ||
7113 | fixup_inode_flags(new_dir, old_inode); | ||
7114 | |||
6782 | ret = btrfs_add_link(trans, new_dir, old_inode, | 7115 | ret = btrfs_add_link(trans, new_dir, old_inode, |
6783 | new_dentry->d_name.name, | 7116 | new_dentry->d_name.name, |
6784 | new_dentry->d_name.len, 0, index); | 7117 | new_dentry->d_name.len, 0, index); |
@@ -6792,7 +7125,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6792 | } | 7125 | } |
6793 | out_fail: | 7126 | out_fail: |
6794 | btrfs_end_transaction_throttle(trans, root); | 7127 | btrfs_end_transaction_throttle(trans, root); |
6795 | 7128 | out_notrans: | |
6796 | if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) | 7129 | if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) |
6797 | up_read(&root->fs_info->subvol_sem); | 7130 | up_read(&root->fs_info->subvol_sem); |
6798 | 7131 | ||
@@ -6944,7 +7277,7 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
6944 | if (IS_ERR(inode)) | 7277 | if (IS_ERR(inode)) |
6945 | goto out_unlock; | 7278 | goto out_unlock; |
6946 | 7279 | ||
6947 | err = btrfs_init_inode_security(trans, inode, dir); | 7280 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); |
6948 | if (err) { | 7281 | if (err) { |
6949 | drop_inode = 1; | 7282 | drop_inode = 1; |
6950 | goto out_unlock; | 7283 | goto out_unlock; |
@@ -7098,116 +7431,6 @@ int btrfs_prealloc_file_range_trans(struct inode *inode, | |||
7098 | min_size, actual_len, alloc_hint, trans); | 7431 | min_size, actual_len, alloc_hint, trans); |
7099 | } | 7432 | } |
7100 | 7433 | ||
7101 | static long btrfs_fallocate(struct inode *inode, int mode, | ||
7102 | loff_t offset, loff_t len) | ||
7103 | { | ||
7104 | struct extent_state *cached_state = NULL; | ||
7105 | u64 cur_offset; | ||
7106 | u64 last_byte; | ||
7107 | u64 alloc_start; | ||
7108 | u64 alloc_end; | ||
7109 | u64 alloc_hint = 0; | ||
7110 | u64 locked_end; | ||
7111 | u64 mask = BTRFS_I(inode)->root->sectorsize - 1; | ||
7112 | struct extent_map *em; | ||
7113 | int ret; | ||
7114 | |||
7115 | alloc_start = offset & ~mask; | ||
7116 | alloc_end = (offset + len + mask) & ~mask; | ||
7117 | |||
7118 | /* We only support the FALLOC_FL_KEEP_SIZE mode */ | ||
7119 | if (mode && (mode != FALLOC_FL_KEEP_SIZE)) | ||
7120 | return -EOPNOTSUPP; | ||
7121 | |||
7122 | /* | ||
7123 | * wait for ordered IO before we have any locks. We'll loop again | ||
7124 | * below with the locks held. | ||
7125 | */ | ||
7126 | btrfs_wait_ordered_range(inode, alloc_start, alloc_end - alloc_start); | ||
7127 | |||
7128 | mutex_lock(&inode->i_mutex); | ||
7129 | ret = inode_newsize_ok(inode, alloc_end); | ||
7130 | if (ret) | ||
7131 | goto out; | ||
7132 | |||
7133 | if (alloc_start > inode->i_size) { | ||
7134 | ret = btrfs_cont_expand(inode, alloc_start); | ||
7135 | if (ret) | ||
7136 | goto out; | ||
7137 | } | ||
7138 | |||
7139 | ret = btrfs_check_data_free_space(inode, alloc_end - alloc_start); | ||
7140 | if (ret) | ||
7141 | goto out; | ||
7142 | |||
7143 | locked_end = alloc_end - 1; | ||
7144 | while (1) { | ||
7145 | struct btrfs_ordered_extent *ordered; | ||
7146 | |||
7147 | /* the extent lock is ordered inside the running | ||
7148 | * transaction | ||
7149 | */ | ||
7150 | lock_extent_bits(&BTRFS_I(inode)->io_tree, alloc_start, | ||
7151 | locked_end, 0, &cached_state, GFP_NOFS); | ||
7152 | ordered = btrfs_lookup_first_ordered_extent(inode, | ||
7153 | alloc_end - 1); | ||
7154 | if (ordered && | ||
7155 | ordered->file_offset + ordered->len > alloc_start && | ||
7156 | ordered->file_offset < alloc_end) { | ||
7157 | btrfs_put_ordered_extent(ordered); | ||
7158 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, | ||
7159 | alloc_start, locked_end, | ||
7160 | &cached_state, GFP_NOFS); | ||
7161 | /* | ||
7162 | * we can't wait on the range with the transaction | ||
7163 | * running or with the extent lock held | ||
7164 | */ | ||
7165 | btrfs_wait_ordered_range(inode, alloc_start, | ||
7166 | alloc_end - alloc_start); | ||
7167 | } else { | ||
7168 | if (ordered) | ||
7169 | btrfs_put_ordered_extent(ordered); | ||
7170 | break; | ||
7171 | } | ||
7172 | } | ||
7173 | |||
7174 | cur_offset = alloc_start; | ||
7175 | while (1) { | ||
7176 | em = btrfs_get_extent(inode, NULL, 0, cur_offset, | ||
7177 | alloc_end - cur_offset, 0); | ||
7178 | BUG_ON(IS_ERR(em) || !em); | ||
7179 | last_byte = min(extent_map_end(em), alloc_end); | ||
7180 | last_byte = (last_byte + mask) & ~mask; | ||
7181 | if (em->block_start == EXTENT_MAP_HOLE || | ||
7182 | (cur_offset >= inode->i_size && | ||
7183 | !test_bit(EXTENT_FLAG_PREALLOC, &em->flags))) { | ||
7184 | ret = btrfs_prealloc_file_range(inode, mode, cur_offset, | ||
7185 | last_byte - cur_offset, | ||
7186 | 1 << inode->i_blkbits, | ||
7187 | offset + len, | ||
7188 | &alloc_hint); | ||
7189 | if (ret < 0) { | ||
7190 | free_extent_map(em); | ||
7191 | break; | ||
7192 | } | ||
7193 | } | ||
7194 | free_extent_map(em); | ||
7195 | |||
7196 | cur_offset = last_byte; | ||
7197 | if (cur_offset >= alloc_end) { | ||
7198 | ret = 0; | ||
7199 | break; | ||
7200 | } | ||
7201 | } | ||
7202 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, alloc_start, locked_end, | ||
7203 | &cached_state, GFP_NOFS); | ||
7204 | |||
7205 | btrfs_free_reserved_data_space(inode, alloc_end - alloc_start); | ||
7206 | out: | ||
7207 | mutex_unlock(&inode->i_mutex); | ||
7208 | return ret; | ||
7209 | } | ||
7210 | |||
7211 | static int btrfs_set_page_dirty(struct page *page) | 7434 | static int btrfs_set_page_dirty(struct page *page) |
7212 | { | 7435 | { |
7213 | return __set_page_dirty_nobuffers(page); | 7436 | return __set_page_dirty_nobuffers(page); |
@@ -7215,6 +7438,10 @@ static int btrfs_set_page_dirty(struct page *page) | |||
7215 | 7438 | ||
7216 | static int btrfs_permission(struct inode *inode, int mask, unsigned int flags) | 7439 | static int btrfs_permission(struct inode *inode, int mask, unsigned int flags) |
7217 | { | 7440 | { |
7441 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
7442 | |||
7443 | if (btrfs_root_readonly(root) && (mask & MAY_WRITE)) | ||
7444 | return -EROFS; | ||
7218 | if ((BTRFS_I(inode)->flags & BTRFS_INODE_READONLY) && (mask & MAY_WRITE)) | 7445 | if ((BTRFS_I(inode)->flags & BTRFS_INODE_READONLY) && (mask & MAY_WRITE)) |
7219 | return -EACCES; | 7446 | return -EACCES; |
7220 | return generic_permission(inode, mask, flags, btrfs_check_acl); | 7447 | return generic_permission(inode, mask, flags, btrfs_check_acl); |
@@ -7286,7 +7513,6 @@ static const struct address_space_operations btrfs_aops = { | |||
7286 | .writepage = btrfs_writepage, | 7513 | .writepage = btrfs_writepage, |
7287 | .writepages = btrfs_writepages, | 7514 | .writepages = btrfs_writepages, |
7288 | .readpages = btrfs_readpages, | 7515 | .readpages = btrfs_readpages, |
7289 | .sync_page = block_sync_page, | ||
7290 | .direct_IO = btrfs_direct_IO, | 7516 | .direct_IO = btrfs_direct_IO, |
7291 | .invalidatepage = btrfs_invalidatepage, | 7517 | .invalidatepage = btrfs_invalidatepage, |
7292 | .releasepage = btrfs_releasepage, | 7518 | .releasepage = btrfs_releasepage, |
@@ -7302,7 +7528,6 @@ static const struct address_space_operations btrfs_symlink_aops = { | |||
7302 | }; | 7528 | }; |
7303 | 7529 | ||
7304 | static const struct inode_operations btrfs_file_inode_operations = { | 7530 | static const struct inode_operations btrfs_file_inode_operations = { |
7305 | .truncate = btrfs_truncate, | ||
7306 | .getattr = btrfs_getattr, | 7531 | .getattr = btrfs_getattr, |
7307 | .setattr = btrfs_setattr, | 7532 | .setattr = btrfs_setattr, |
7308 | .setxattr = btrfs_setxattr, | 7533 | .setxattr = btrfs_setxattr, |
@@ -7310,7 +7535,6 @@ static const struct inode_operations btrfs_file_inode_operations = { | |||
7310 | .listxattr = btrfs_listxattr, | 7535 | .listxattr = btrfs_listxattr, |
7311 | .removexattr = btrfs_removexattr, | 7536 | .removexattr = btrfs_removexattr, |
7312 | .permission = btrfs_permission, | 7537 | .permission = btrfs_permission, |
7313 | .fallocate = btrfs_fallocate, | ||
7314 | .fiemap = btrfs_fiemap, | 7538 | .fiemap = btrfs_fiemap, |
7315 | }; | 7539 | }; |
7316 | static const struct inode_operations btrfs_special_inode_operations = { | 7540 | static const struct inode_operations btrfs_special_inode_operations = { |