diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-27 16:57:12 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-27 16:57:12 -0400 |
commit | a0c3061093c8b49facef95dc09a618c6e0d17cb5 (patch) | |
tree | 1d6ff7c06134b71a8bd0721395386e82e46e60c8 /fs/btrfs/file-item.c | |
parent | 10799db60cbc4f990dd69eb49883477095c66af7 (diff) | |
parent | 174ba50915b08dcfd07c8b5fb795b46a165fa09a (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable: (58 commits)
Btrfs: use the device_list_mutex during write_dev_supers
Btrfs: setup free ino caching in a more asynchronous way
btrfs scrub: don't coalesce pages that are logically discontiguous
Btrfs: return -ENOMEM in clear_extent_bit
Btrfs: add mount -o auto_defrag
Btrfs: using rcu lock in the reader side of devices list
Btrfs: drop unnecessary device lock
Btrfs: fix the race between remove dev and alloc chunk
Btrfs: fix the race between reading and updating devices
Btrfs: fix bh leak on __btrfs_open_devices path
Btrfs: fix unsafe usage of merge_state
Btrfs: allocate extent state and check the result properly
fs/btrfs: Add missing btrfs_free_path
Btrfs: check return value of btrfs_inc_extent_ref()
Btrfs: return error to caller if read_one_inode() fails
Btrfs: BUG_ON is deleted from the caller of btrfs_truncate_item & btrfs_extend_item
Btrfs: return error code to caller when btrfs_del_item fails
Btrfs: return error code to caller when btrfs_previous_item fails
btrfs: fix typo 'testeing' -> 'testing'
btrfs: typo: 'btrfS' -> 'btrfs'
...
Diffstat (limited to 'fs/btrfs/file-item.c')
-rw-r--r-- | fs/btrfs/file-item.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index a6a9d4e8b491..90d4ee52cd45 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c | |||
@@ -193,7 +193,7 @@ static int __btrfs_lookup_bio_sums(struct btrfs_root *root, | |||
193 | u32 item_size; | 193 | u32 item_size; |
194 | 194 | ||
195 | if (item) | 195 | if (item) |
196 | btrfs_release_path(root, path); | 196 | btrfs_release_path(path); |
197 | item = btrfs_lookup_csum(NULL, root->fs_info->csum_root, | 197 | item = btrfs_lookup_csum(NULL, root->fs_info->csum_root, |
198 | path, disk_bytenr, 0); | 198 | path, disk_bytenr, 0); |
199 | if (IS_ERR(item)) { | 199 | if (IS_ERR(item)) { |
@@ -208,12 +208,13 @@ static int __btrfs_lookup_bio_sums(struct btrfs_root *root, | |||
208 | EXTENT_NODATASUM, GFP_NOFS); | 208 | EXTENT_NODATASUM, GFP_NOFS); |
209 | } else { | 209 | } else { |
210 | printk(KERN_INFO "btrfs no csum found " | 210 | printk(KERN_INFO "btrfs no csum found " |
211 | "for inode %lu start %llu\n", | 211 | "for inode %llu start %llu\n", |
212 | inode->i_ino, | 212 | (unsigned long long) |
213 | btrfs_ino(inode), | ||
213 | (unsigned long long)offset); | 214 | (unsigned long long)offset); |
214 | } | 215 | } |
215 | item = NULL; | 216 | item = NULL; |
216 | btrfs_release_path(root, path); | 217 | btrfs_release_path(path); |
217 | goto found; | 218 | goto found; |
218 | } | 219 | } |
219 | btrfs_item_key_to_cpu(path->nodes[0], &found_key, | 220 | btrfs_item_key_to_cpu(path->nodes[0], &found_key, |
@@ -266,7 +267,7 @@ int btrfs_lookup_bio_sums_dio(struct btrfs_root *root, struct inode *inode, | |||
266 | } | 267 | } |
267 | 268 | ||
268 | int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end, | 269 | int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end, |
269 | struct list_head *list) | 270 | struct list_head *list, int search_commit) |
270 | { | 271 | { |
271 | struct btrfs_key key; | 272 | struct btrfs_key key; |
272 | struct btrfs_path *path; | 273 | struct btrfs_path *path; |
@@ -283,6 +284,12 @@ int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end, | |||
283 | path = btrfs_alloc_path(); | 284 | path = btrfs_alloc_path(); |
284 | BUG_ON(!path); | 285 | BUG_ON(!path); |
285 | 286 | ||
287 | if (search_commit) { | ||
288 | path->skip_locking = 1; | ||
289 | path->reada = 2; | ||
290 | path->search_commit_root = 1; | ||
291 | } | ||
292 | |||
286 | key.objectid = BTRFS_EXTENT_CSUM_OBJECTID; | 293 | key.objectid = BTRFS_EXTENT_CSUM_OBJECTID; |
287 | key.offset = start; | 294 | key.offset = start; |
288 | key.type = BTRFS_EXTENT_CSUM_KEY; | 295 | key.type = BTRFS_EXTENT_CSUM_KEY; |
@@ -495,7 +502,6 @@ static noinline int truncate_one_csum(struct btrfs_trans_handle *trans, | |||
495 | u32 new_size = (bytenr - key->offset) >> blocksize_bits; | 502 | u32 new_size = (bytenr - key->offset) >> blocksize_bits; |
496 | new_size *= csum_size; | 503 | new_size *= csum_size; |
497 | ret = btrfs_truncate_item(trans, root, path, new_size, 1); | 504 | ret = btrfs_truncate_item(trans, root, path, new_size, 1); |
498 | BUG_ON(ret); | ||
499 | } else if (key->offset >= bytenr && csum_end > end_byte && | 505 | } else if (key->offset >= bytenr && csum_end > end_byte && |
500 | end_byte > key->offset) { | 506 | end_byte > key->offset) { |
501 | /* | 507 | /* |
@@ -508,7 +514,6 @@ static noinline int truncate_one_csum(struct btrfs_trans_handle *trans, | |||
508 | new_size *= csum_size; | 514 | new_size *= csum_size; |
509 | 515 | ||
510 | ret = btrfs_truncate_item(trans, root, path, new_size, 0); | 516 | ret = btrfs_truncate_item(trans, root, path, new_size, 0); |
511 | BUG_ON(ret); | ||
512 | 517 | ||
513 | key->offset = end_byte; | 518 | key->offset = end_byte; |
514 | ret = btrfs_set_item_key_safe(trans, root, path, key); | 519 | ret = btrfs_set_item_key_safe(trans, root, path, key); |
@@ -551,10 +556,10 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans, | |||
551 | ret = btrfs_search_slot(trans, root, &key, path, -1, 1); | 556 | ret = btrfs_search_slot(trans, root, &key, path, -1, 1); |
552 | if (ret > 0) { | 557 | if (ret > 0) { |
553 | if (path->slots[0] == 0) | 558 | if (path->slots[0] == 0) |
554 | goto out; | 559 | break; |
555 | path->slots[0]--; | 560 | path->slots[0]--; |
556 | } else if (ret < 0) { | 561 | } else if (ret < 0) { |
557 | goto out; | 562 | break; |
558 | } | 563 | } |
559 | 564 | ||
560 | leaf = path->nodes[0]; | 565 | leaf = path->nodes[0]; |
@@ -579,7 +584,8 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans, | |||
579 | /* delete the entire item, it is inside our range */ | 584 | /* delete the entire item, it is inside our range */ |
580 | if (key.offset >= bytenr && csum_end <= end_byte) { | 585 | if (key.offset >= bytenr && csum_end <= end_byte) { |
581 | ret = btrfs_del_item(trans, root, path); | 586 | ret = btrfs_del_item(trans, root, path); |
582 | BUG_ON(ret); | 587 | if (ret) |
588 | goto out; | ||
583 | if (key.offset == bytenr) | 589 | if (key.offset == bytenr) |
584 | break; | 590 | break; |
585 | } else if (key.offset < bytenr && csum_end > end_byte) { | 591 | } else if (key.offset < bytenr && csum_end > end_byte) { |
@@ -631,11 +637,12 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans, | |||
631 | if (key.offset < bytenr) | 637 | if (key.offset < bytenr) |
632 | break; | 638 | break; |
633 | } | 639 | } |
634 | btrfs_release_path(root, path); | 640 | btrfs_release_path(path); |
635 | } | 641 | } |
642 | ret = 0; | ||
636 | out: | 643 | out: |
637 | btrfs_free_path(path); | 644 | btrfs_free_path(path); |
638 | return 0; | 645 | return ret; |
639 | } | 646 | } |
640 | 647 | ||
641 | int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans, | 648 | int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans, |
@@ -722,7 +729,7 @@ again: | |||
722 | * at this point, we know the tree has an item, but it isn't big | 729 | * at this point, we know the tree has an item, but it isn't big |
723 | * enough yet to put our csum in. Grow it | 730 | * enough yet to put our csum in. Grow it |
724 | */ | 731 | */ |
725 | btrfs_release_path(root, path); | 732 | btrfs_release_path(path); |
726 | ret = btrfs_search_slot(trans, root, &file_key, path, | 733 | ret = btrfs_search_slot(trans, root, &file_key, path, |
727 | csum_size, 1); | 734 | csum_size, 1); |
728 | if (ret < 0) | 735 | if (ret < 0) |
@@ -761,12 +768,11 @@ again: | |||
761 | goto insert; | 768 | goto insert; |
762 | 769 | ||
763 | ret = btrfs_extend_item(trans, root, path, diff); | 770 | ret = btrfs_extend_item(trans, root, path, diff); |
764 | BUG_ON(ret); | ||
765 | goto csum; | 771 | goto csum; |
766 | } | 772 | } |
767 | 773 | ||
768 | insert: | 774 | insert: |
769 | btrfs_release_path(root, path); | 775 | btrfs_release_path(path); |
770 | csum_offset = 0; | 776 | csum_offset = 0; |
771 | if (found_next) { | 777 | if (found_next) { |
772 | u64 tmp = total_bytes + root->sectorsize; | 778 | u64 tmp = total_bytes + root->sectorsize; |
@@ -850,7 +856,7 @@ next_sector: | |||
850 | } | 856 | } |
851 | btrfs_mark_buffer_dirty(path->nodes[0]); | 857 | btrfs_mark_buffer_dirty(path->nodes[0]); |
852 | if (total_bytes < sums->len) { | 858 | if (total_bytes < sums->len) { |
853 | btrfs_release_path(root, path); | 859 | btrfs_release_path(path); |
854 | cond_resched(); | 860 | cond_resched(); |
855 | goto again; | 861 | goto again; |
856 | } | 862 | } |