diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-06-18 11:57:59 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-06-18 11:57:59 -0400 |
commit | 4c6459f945c7c64123c4aec0667d196090213d53 (patch) | |
tree | 5d71965fa0530ada3cde6c8e0823ab3218a73505 /fs | |
parent | d9e66146c1da8e771378b078b958057024d8f604 (diff) | |
parent | de18c165509edb36bde42ca6ff930854f85e21ea (diff) |
Merge branch 'for-linus-4.7' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs
Pull btrfs fixes from Chris Mason:
"The most user visible change here is a fix for our recent superblock
validation checks that were causing problems on non-4k pagesized
systems"
* 'for-linus-4.7' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs:
Btrfs: btrfs_check_super_valid: Allow 4096 as stripesize
btrfs: remove build fixup for qgroup_account_snapshot
btrfs: use new error message helper in qgroup_account_snapshot
btrfs: avoid blocking open_ctree from cleaner_kthread
Btrfs: don't BUG_ON() in btrfs_orphan_add
btrfs: account for non-CoW'd blocks in btrfs_abort_transaction
Btrfs: check if extent buffer is aligned to sectorsize
btrfs: Use correct format specifier
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/check-integrity.c | 2 | ||||
-rw-r--r-- | fs/btrfs/ctree.c | 7 | ||||
-rw-r--r-- | fs/btrfs/disk-io.c | 36 | ||||
-rw-r--r-- | fs/btrfs/extent-tree.c | 12 | ||||
-rw-r--r-- | fs/btrfs/extent_io.c | 15 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 11 | ||||
-rw-r--r-- | fs/btrfs/super.c | 4 | ||||
-rw-r--r-- | fs/btrfs/transaction.c | 7 | ||||
-rw-r--r-- | fs/btrfs/transaction.h | 2 | ||||
-rw-r--r-- | fs/btrfs/tree-log.c | 4 | ||||
-rw-r--r-- | fs/btrfs/volumes.c | 4 |
11 files changed, 61 insertions, 43 deletions
diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index b677a6ea6001..7706c8dc5fa6 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c | |||
@@ -2645,7 +2645,7 @@ static void btrfsic_dump_tree_sub(const struct btrfsic_state *state, | |||
2645 | * This algorithm is recursive because the amount of used stack space | 2645 | * This algorithm is recursive because the amount of used stack space |
2646 | * is very small and the max recursion depth is limited. | 2646 | * is very small and the max recursion depth is limited. |
2647 | */ | 2647 | */ |
2648 | indent_add = sprintf(buf, "%c-%llu(%s/%llu/%d)", | 2648 | indent_add = sprintf(buf, "%c-%llu(%s/%llu/%u)", |
2649 | btrfsic_get_block_type(state, block), | 2649 | btrfsic_get_block_type(state, block), |
2650 | block->logical_bytenr, block->dev_state->name, | 2650 | block->logical_bytenr, block->dev_state->name, |
2651 | block->dev_bytenr, block->mirror_num); | 2651 | block->dev_bytenr, block->mirror_num); |
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 46025688f1d0..6276add8538a 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
@@ -1554,6 +1554,7 @@ noinline int btrfs_cow_block(struct btrfs_trans_handle *trans, | |||
1554 | trans->transid, root->fs_info->generation); | 1554 | trans->transid, root->fs_info->generation); |
1555 | 1555 | ||
1556 | if (!should_cow_block(trans, root, buf)) { | 1556 | if (!should_cow_block(trans, root, buf)) { |
1557 | trans->dirty = true; | ||
1557 | *cow_ret = buf; | 1558 | *cow_ret = buf; |
1558 | return 0; | 1559 | return 0; |
1559 | } | 1560 | } |
@@ -2512,6 +2513,8 @@ read_block_for_search(struct btrfs_trans_handle *trans, | |||
2512 | if (!btrfs_buffer_uptodate(tmp, 0, 0)) | 2513 | if (!btrfs_buffer_uptodate(tmp, 0, 0)) |
2513 | ret = -EIO; | 2514 | ret = -EIO; |
2514 | free_extent_buffer(tmp); | 2515 | free_extent_buffer(tmp); |
2516 | } else { | ||
2517 | ret = PTR_ERR(tmp); | ||
2515 | } | 2518 | } |
2516 | return ret; | 2519 | return ret; |
2517 | } | 2520 | } |
@@ -2775,8 +2778,10 @@ again: | |||
2775 | * then we don't want to set the path blocking, | 2778 | * then we don't want to set the path blocking, |
2776 | * so we test it here | 2779 | * so we test it here |
2777 | */ | 2780 | */ |
2778 | if (!should_cow_block(trans, root, b)) | 2781 | if (!should_cow_block(trans, root, b)) { |
2782 | trans->dirty = true; | ||
2779 | goto cow_done; | 2783 | goto cow_done; |
2784 | } | ||
2780 | 2785 | ||
2781 | /* | 2786 | /* |
2782 | * must have write locks on this node and the | 2787 | * must have write locks on this node and the |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 1142127f6e5e..54cca7a1572b 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -1098,7 +1098,7 @@ void readahead_tree_block(struct btrfs_root *root, u64 bytenr) | |||
1098 | struct inode *btree_inode = root->fs_info->btree_inode; | 1098 | struct inode *btree_inode = root->fs_info->btree_inode; |
1099 | 1099 | ||
1100 | buf = btrfs_find_create_tree_block(root, bytenr); | 1100 | buf = btrfs_find_create_tree_block(root, bytenr); |
1101 | if (!buf) | 1101 | if (IS_ERR(buf)) |
1102 | return; | 1102 | return; |
1103 | read_extent_buffer_pages(&BTRFS_I(btree_inode)->io_tree, | 1103 | read_extent_buffer_pages(&BTRFS_I(btree_inode)->io_tree, |
1104 | buf, 0, WAIT_NONE, btree_get_extent, 0); | 1104 | buf, 0, WAIT_NONE, btree_get_extent, 0); |
@@ -1114,7 +1114,7 @@ int reada_tree_block_flagged(struct btrfs_root *root, u64 bytenr, | |||
1114 | int ret; | 1114 | int ret; |
1115 | 1115 | ||
1116 | buf = btrfs_find_create_tree_block(root, bytenr); | 1116 | buf = btrfs_find_create_tree_block(root, bytenr); |
1117 | if (!buf) | 1117 | if (IS_ERR(buf)) |
1118 | return 0; | 1118 | return 0; |
1119 | 1119 | ||
1120 | set_bit(EXTENT_BUFFER_READAHEAD, &buf->bflags); | 1120 | set_bit(EXTENT_BUFFER_READAHEAD, &buf->bflags); |
@@ -1172,8 +1172,8 @@ struct extent_buffer *read_tree_block(struct btrfs_root *root, u64 bytenr, | |||
1172 | int ret; | 1172 | int ret; |
1173 | 1173 | ||
1174 | buf = btrfs_find_create_tree_block(root, bytenr); | 1174 | buf = btrfs_find_create_tree_block(root, bytenr); |
1175 | if (!buf) | 1175 | if (IS_ERR(buf)) |
1176 | return ERR_PTR(-ENOMEM); | 1176 | return buf; |
1177 | 1177 | ||
1178 | ret = btree_read_extent_buffer_pages(root, buf, 0, parent_transid); | 1178 | ret = btree_read_extent_buffer_pages(root, buf, 0, parent_transid); |
1179 | if (ret) { | 1179 | if (ret) { |
@@ -1806,6 +1806,13 @@ static int cleaner_kthread(void *arg) | |||
1806 | if (btrfs_need_cleaner_sleep(root)) | 1806 | if (btrfs_need_cleaner_sleep(root)) |
1807 | goto sleep; | 1807 | goto sleep; |
1808 | 1808 | ||
1809 | /* | ||
1810 | * Do not do anything if we might cause open_ctree() to block | ||
1811 | * before we have finished mounting the filesystem. | ||
1812 | */ | ||
1813 | if (!root->fs_info->open) | ||
1814 | goto sleep; | ||
1815 | |||
1809 | if (!mutex_trylock(&root->fs_info->cleaner_mutex)) | 1816 | if (!mutex_trylock(&root->fs_info->cleaner_mutex)) |
1810 | goto sleep; | 1817 | goto sleep; |
1811 | 1818 | ||
@@ -2520,7 +2527,6 @@ int open_ctree(struct super_block *sb, | |||
2520 | int num_backups_tried = 0; | 2527 | int num_backups_tried = 0; |
2521 | int backup_index = 0; | 2528 | int backup_index = 0; |
2522 | int max_active; | 2529 | int max_active; |
2523 | bool cleaner_mutex_locked = false; | ||
2524 | 2530 | ||
2525 | tree_root = fs_info->tree_root = btrfs_alloc_root(fs_info, GFP_KERNEL); | 2531 | tree_root = fs_info->tree_root = btrfs_alloc_root(fs_info, GFP_KERNEL); |
2526 | chunk_root = fs_info->chunk_root = btrfs_alloc_root(fs_info, GFP_KERNEL); | 2532 | chunk_root = fs_info->chunk_root = btrfs_alloc_root(fs_info, GFP_KERNEL); |
@@ -2999,13 +3005,6 @@ retry_root_backup: | |||
2999 | goto fail_sysfs; | 3005 | goto fail_sysfs; |
3000 | } | 3006 | } |
3001 | 3007 | ||
3002 | /* | ||
3003 | * Hold the cleaner_mutex thread here so that we don't block | ||
3004 | * for a long time on btrfs_recover_relocation. cleaner_kthread | ||
3005 | * will wait for us to finish mounting the filesystem. | ||
3006 | */ | ||
3007 | mutex_lock(&fs_info->cleaner_mutex); | ||
3008 | cleaner_mutex_locked = true; | ||
3009 | fs_info->cleaner_kthread = kthread_run(cleaner_kthread, tree_root, | 3008 | fs_info->cleaner_kthread = kthread_run(cleaner_kthread, tree_root, |
3010 | "btrfs-cleaner"); | 3009 | "btrfs-cleaner"); |
3011 | if (IS_ERR(fs_info->cleaner_kthread)) | 3010 | if (IS_ERR(fs_info->cleaner_kthread)) |
@@ -3065,8 +3064,10 @@ retry_root_backup: | |||
3065 | ret = btrfs_cleanup_fs_roots(fs_info); | 3064 | ret = btrfs_cleanup_fs_roots(fs_info); |
3066 | if (ret) | 3065 | if (ret) |
3067 | goto fail_qgroup; | 3066 | goto fail_qgroup; |
3068 | /* We locked cleaner_mutex before creating cleaner_kthread. */ | 3067 | |
3068 | mutex_lock(&fs_info->cleaner_mutex); | ||
3069 | ret = btrfs_recover_relocation(tree_root); | 3069 | ret = btrfs_recover_relocation(tree_root); |
3070 | mutex_unlock(&fs_info->cleaner_mutex); | ||
3070 | if (ret < 0) { | 3071 | if (ret < 0) { |
3071 | btrfs_warn(fs_info, "failed to recover relocation: %d", | 3072 | btrfs_warn(fs_info, "failed to recover relocation: %d", |
3072 | ret); | 3073 | ret); |
@@ -3074,8 +3075,6 @@ retry_root_backup: | |||
3074 | goto fail_qgroup; | 3075 | goto fail_qgroup; |
3075 | } | 3076 | } |
3076 | } | 3077 | } |
3077 | mutex_unlock(&fs_info->cleaner_mutex); | ||
3078 | cleaner_mutex_locked = false; | ||
3079 | 3078 | ||
3080 | location.objectid = BTRFS_FS_TREE_OBJECTID; | 3079 | location.objectid = BTRFS_FS_TREE_OBJECTID; |
3081 | location.type = BTRFS_ROOT_ITEM_KEY; | 3080 | location.type = BTRFS_ROOT_ITEM_KEY; |
@@ -3189,10 +3188,6 @@ fail_cleaner: | |||
3189 | filemap_write_and_wait(fs_info->btree_inode->i_mapping); | 3188 | filemap_write_and_wait(fs_info->btree_inode->i_mapping); |
3190 | 3189 | ||
3191 | fail_sysfs: | 3190 | fail_sysfs: |
3192 | if (cleaner_mutex_locked) { | ||
3193 | mutex_unlock(&fs_info->cleaner_mutex); | ||
3194 | cleaner_mutex_locked = false; | ||
3195 | } | ||
3196 | btrfs_sysfs_remove_mounted(fs_info); | 3191 | btrfs_sysfs_remove_mounted(fs_info); |
3197 | 3192 | ||
3198 | fail_fsdev_sysfs: | 3193 | fail_fsdev_sysfs: |
@@ -4139,7 +4134,8 @@ static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info, | |||
4139 | ret = -EINVAL; | 4134 | ret = -EINVAL; |
4140 | } | 4135 | } |
4141 | if (!is_power_of_2(btrfs_super_stripesize(sb)) || | 4136 | if (!is_power_of_2(btrfs_super_stripesize(sb)) || |
4142 | btrfs_super_stripesize(sb) != sectorsize) { | 4137 | ((btrfs_super_stripesize(sb) != sectorsize) && |
4138 | (btrfs_super_stripesize(sb) != 4096))) { | ||
4143 | btrfs_err(fs_info, "invalid stripesize %u", | 4139 | btrfs_err(fs_info, "invalid stripesize %u", |
4144 | btrfs_super_stripesize(sb)); | 4140 | btrfs_super_stripesize(sb)); |
4145 | ret = -EINVAL; | 4141 | ret = -EINVAL; |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 689d25ac6a68..29e5d000bbee 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -8016,8 +8016,9 @@ btrfs_init_new_buffer(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
8016 | struct extent_buffer *buf; | 8016 | struct extent_buffer *buf; |
8017 | 8017 | ||
8018 | buf = btrfs_find_create_tree_block(root, bytenr); | 8018 | buf = btrfs_find_create_tree_block(root, bytenr); |
8019 | if (!buf) | 8019 | if (IS_ERR(buf)) |
8020 | return ERR_PTR(-ENOMEM); | 8020 | return buf; |
8021 | |||
8021 | btrfs_set_header_generation(buf, trans->transid); | 8022 | btrfs_set_header_generation(buf, trans->transid); |
8022 | btrfs_set_buffer_lockdep_class(root->root_key.objectid, buf, level); | 8023 | btrfs_set_buffer_lockdep_class(root->root_key.objectid, buf, level); |
8023 | btrfs_tree_lock(buf); | 8024 | btrfs_tree_lock(buf); |
@@ -8044,7 +8045,7 @@ btrfs_init_new_buffer(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
8044 | set_extent_dirty(&trans->transaction->dirty_pages, buf->start, | 8045 | set_extent_dirty(&trans->transaction->dirty_pages, buf->start, |
8045 | buf->start + buf->len - 1, GFP_NOFS); | 8046 | buf->start + buf->len - 1, GFP_NOFS); |
8046 | } | 8047 | } |
8047 | trans->blocks_used++; | 8048 | trans->dirty = true; |
8048 | /* this returns a buffer locked for blocking */ | 8049 | /* this returns a buffer locked for blocking */ |
8049 | return buf; | 8050 | return buf; |
8050 | } | 8051 | } |
@@ -8659,8 +8660,9 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans, | |||
8659 | next = btrfs_find_tree_block(root->fs_info, bytenr); | 8660 | next = btrfs_find_tree_block(root->fs_info, bytenr); |
8660 | if (!next) { | 8661 | if (!next) { |
8661 | next = btrfs_find_create_tree_block(root, bytenr); | 8662 | next = btrfs_find_create_tree_block(root, bytenr); |
8662 | if (!next) | 8663 | if (IS_ERR(next)) |
8663 | return -ENOMEM; | 8664 | return PTR_ERR(next); |
8665 | |||
8664 | btrfs_set_buffer_lockdep_class(root->root_key.objectid, next, | 8666 | btrfs_set_buffer_lockdep_class(root->root_key.objectid, next, |
8665 | level - 1); | 8667 | level - 1); |
8666 | reada = 1; | 8668 | reada = 1; |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index a3412d68ad37..aaee3ef55ed8 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -4892,18 +4892,25 @@ struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info, | |||
4892 | int uptodate = 1; | 4892 | int uptodate = 1; |
4893 | int ret; | 4893 | int ret; |
4894 | 4894 | ||
4895 | if (!IS_ALIGNED(start, fs_info->tree_root->sectorsize)) { | ||
4896 | btrfs_err(fs_info, "bad tree block start %llu", start); | ||
4897 | return ERR_PTR(-EINVAL); | ||
4898 | } | ||
4899 | |||
4895 | eb = find_extent_buffer(fs_info, start); | 4900 | eb = find_extent_buffer(fs_info, start); |
4896 | if (eb) | 4901 | if (eb) |
4897 | return eb; | 4902 | return eb; |
4898 | 4903 | ||
4899 | eb = __alloc_extent_buffer(fs_info, start, len); | 4904 | eb = __alloc_extent_buffer(fs_info, start, len); |
4900 | if (!eb) | 4905 | if (!eb) |
4901 | return NULL; | 4906 | return ERR_PTR(-ENOMEM); |
4902 | 4907 | ||
4903 | for (i = 0; i < num_pages; i++, index++) { | 4908 | for (i = 0; i < num_pages; i++, index++) { |
4904 | p = find_or_create_page(mapping, index, GFP_NOFS|__GFP_NOFAIL); | 4909 | p = find_or_create_page(mapping, index, GFP_NOFS|__GFP_NOFAIL); |
4905 | if (!p) | 4910 | if (!p) { |
4911 | exists = ERR_PTR(-ENOMEM); | ||
4906 | goto free_eb; | 4912 | goto free_eb; |
4913 | } | ||
4907 | 4914 | ||
4908 | spin_lock(&mapping->private_lock); | 4915 | spin_lock(&mapping->private_lock); |
4909 | if (PagePrivate(p)) { | 4916 | if (PagePrivate(p)) { |
@@ -4948,8 +4955,10 @@ struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info, | |||
4948 | set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags); | 4955 | set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags); |
4949 | again: | 4956 | again: |
4950 | ret = radix_tree_preload(GFP_NOFS); | 4957 | ret = radix_tree_preload(GFP_NOFS); |
4951 | if (ret) | 4958 | if (ret) { |
4959 | exists = ERR_PTR(ret); | ||
4952 | goto free_eb; | 4960 | goto free_eb; |
4961 | } | ||
4953 | 4962 | ||
4954 | spin_lock(&fs_info->buffer_lock); | 4963 | spin_lock(&fs_info->buffer_lock); |
4955 | ret = radix_tree_insert(&fs_info->buffer_radix, | 4964 | ret = radix_tree_insert(&fs_info->buffer_radix, |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 8b1212e8f7a8..d2be95cfb6d1 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -3271,7 +3271,16 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode) | |||
3271 | /* grab metadata reservation from transaction handle */ | 3271 | /* grab metadata reservation from transaction handle */ |
3272 | if (reserve) { | 3272 | if (reserve) { |
3273 | ret = btrfs_orphan_reserve_metadata(trans, inode); | 3273 | ret = btrfs_orphan_reserve_metadata(trans, inode); |
3274 | BUG_ON(ret); /* -ENOSPC in reservation; Logic error? JDM */ | 3274 | ASSERT(!ret); |
3275 | if (ret) { | ||
3276 | atomic_dec(&root->orphan_inodes); | ||
3277 | clear_bit(BTRFS_INODE_ORPHAN_META_RESERVED, | ||
3278 | &BTRFS_I(inode)->runtime_flags); | ||
3279 | if (insert) | ||
3280 | clear_bit(BTRFS_INODE_HAS_ORPHAN_ITEM, | ||
3281 | &BTRFS_I(inode)->runtime_flags); | ||
3282 | return ret; | ||
3283 | } | ||
3275 | } | 3284 | } |
3276 | 3285 | ||
3277 | /* insert an orphan item to track this unlinked/truncated file */ | 3286 | /* insert an orphan item to track this unlinked/truncated file */ |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 4339b6613f19..60e7179ed4b7 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -235,7 +235,7 @@ void __btrfs_abort_transaction(struct btrfs_trans_handle *trans, | |||
235 | trans->aborted = errno; | 235 | trans->aborted = errno; |
236 | /* Nothing used. The other threads that have joined this | 236 | /* Nothing used. The other threads that have joined this |
237 | * transaction may be able to continue. */ | 237 | * transaction may be able to continue. */ |
238 | if (!trans->blocks_used && list_empty(&trans->new_bgs)) { | 238 | if (!trans->dirty && list_empty(&trans->new_bgs)) { |
239 | const char *errstr; | 239 | const char *errstr; |
240 | 240 | ||
241 | errstr = btrfs_decode_error(errno); | 241 | errstr = btrfs_decode_error(errno); |
@@ -1807,6 +1807,8 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data) | |||
1807 | } | 1807 | } |
1808 | } | 1808 | } |
1809 | sb->s_flags &= ~MS_RDONLY; | 1809 | sb->s_flags &= ~MS_RDONLY; |
1810 | |||
1811 | fs_info->open = 1; | ||
1810 | } | 1812 | } |
1811 | out: | 1813 | out: |
1812 | wake_up_process(fs_info->transaction_kthread); | 1814 | wake_up_process(fs_info->transaction_kthread); |
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index f6e24cb423ae..765845742fde 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
@@ -1311,11 +1311,6 @@ int btrfs_defrag_root(struct btrfs_root *root) | |||
1311 | return ret; | 1311 | return ret; |
1312 | } | 1312 | } |
1313 | 1313 | ||
1314 | /* Bisesctability fixup, remove in 4.8 */ | ||
1315 | #ifndef btrfs_std_error | ||
1316 | #define btrfs_std_error btrfs_handle_fs_error | ||
1317 | #endif | ||
1318 | |||
1319 | /* | 1314 | /* |
1320 | * Do all special snapshot related qgroup dirty hack. | 1315 | * Do all special snapshot related qgroup dirty hack. |
1321 | * | 1316 | * |
@@ -1385,7 +1380,7 @@ static int qgroup_account_snapshot(struct btrfs_trans_handle *trans, | |||
1385 | switch_commit_roots(trans->transaction, fs_info); | 1380 | switch_commit_roots(trans->transaction, fs_info); |
1386 | ret = btrfs_write_and_wait_transaction(trans, src); | 1381 | ret = btrfs_write_and_wait_transaction(trans, src); |
1387 | if (ret) | 1382 | if (ret) |
1388 | btrfs_std_error(fs_info, ret, | 1383 | btrfs_handle_fs_error(fs_info, ret, |
1389 | "Error while writing out transaction for qgroup"); | 1384 | "Error while writing out transaction for qgroup"); |
1390 | 1385 | ||
1391 | out: | 1386 | out: |
diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h index 9fe0ec2bf0fe..c5abee4f01ad 100644 --- a/fs/btrfs/transaction.h +++ b/fs/btrfs/transaction.h | |||
@@ -110,7 +110,6 @@ struct btrfs_trans_handle { | |||
110 | u64 chunk_bytes_reserved; | 110 | u64 chunk_bytes_reserved; |
111 | unsigned long use_count; | 111 | unsigned long use_count; |
112 | unsigned long blocks_reserved; | 112 | unsigned long blocks_reserved; |
113 | unsigned long blocks_used; | ||
114 | unsigned long delayed_ref_updates; | 113 | unsigned long delayed_ref_updates; |
115 | struct btrfs_transaction *transaction; | 114 | struct btrfs_transaction *transaction; |
116 | struct btrfs_block_rsv *block_rsv; | 115 | struct btrfs_block_rsv *block_rsv; |
@@ -121,6 +120,7 @@ struct btrfs_trans_handle { | |||
121 | bool can_flush_pending_bgs; | 120 | bool can_flush_pending_bgs; |
122 | bool reloc_reserved; | 121 | bool reloc_reserved; |
123 | bool sync; | 122 | bool sync; |
123 | bool dirty; | ||
124 | unsigned int type; | 124 | unsigned int type; |
125 | /* | 125 | /* |
126 | * this root is only needed to validate that the root passed to | 126 | * this root is only needed to validate that the root passed to |
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index b7665af471d8..c05f69a8ec42 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
@@ -2422,8 +2422,8 @@ static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans, | |||
2422 | root_owner = btrfs_header_owner(parent); | 2422 | root_owner = btrfs_header_owner(parent); |
2423 | 2423 | ||
2424 | next = btrfs_find_create_tree_block(root, bytenr); | 2424 | next = btrfs_find_create_tree_block(root, bytenr); |
2425 | if (!next) | 2425 | if (IS_ERR(next)) |
2426 | return -ENOMEM; | 2426 | return PTR_ERR(next); |
2427 | 2427 | ||
2428 | if (*level == 1) { | 2428 | if (*level == 1) { |
2429 | ret = wc->process_func(root, next, wc, ptr_gen); | 2429 | ret = wc->process_func(root, next, wc, ptr_gen); |
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 548faaa9e169..2f631b58ae00 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
@@ -6607,8 +6607,8 @@ int btrfs_read_sys_array(struct btrfs_root *root) | |||
6607 | * overallocate but we can keep it as-is, only the first page is used. | 6607 | * overallocate but we can keep it as-is, only the first page is used. |
6608 | */ | 6608 | */ |
6609 | sb = btrfs_find_create_tree_block(root, BTRFS_SUPER_INFO_OFFSET); | 6609 | sb = btrfs_find_create_tree_block(root, BTRFS_SUPER_INFO_OFFSET); |
6610 | if (!sb) | 6610 | if (IS_ERR(sb)) |
6611 | return -ENOMEM; | 6611 | return PTR_ERR(sb); |
6612 | set_extent_buffer_uptodate(sb); | 6612 | set_extent_buffer_uptodate(sb); |
6613 | btrfs_set_buffer_lockdep_class(root->root_key.objectid, sb, 0); | 6613 | btrfs_set_buffer_lockdep_class(root->root_key.objectid, sb, 0); |
6614 | /* | 6614 | /* |