|
@@ -3460,7 +3460,7 @@ static int __btrfs_balance(struct btrfs_fs_info *fs_info)
|
|
|
u64 size_to_free;
|
|
|
u64 chunk_type;
|
|
|
struct btrfs_chunk *chunk;
|
|
|
- struct btrfs_path *path;
|
|
|
+ struct btrfs_path *path = NULL;
|
|
|
struct btrfs_key key;
|
|
|
struct btrfs_key found_key;
|
|
|
struct btrfs_trans_handle *trans;
|
|
@@ -3494,13 +3494,33 @@ static int __btrfs_balance(struct btrfs_fs_info *fs_info)
|
|
|
ret = btrfs_shrink_device(device, old_size - size_to_free);
|
|
|
if (ret == -ENOSPC)
|
|
|
break;
|
|
|
- BUG_ON(ret);
|
|
|
+ if (ret) {
|
|
|
+ /* btrfs_shrink_device never returns ret > 0 */
|
|
|
+ WARN_ON(ret > 0);
|
|
|
+ goto error;
|
|
|
+ }
|
|
|
|
|
|
trans = btrfs_start_transaction(dev_root, 0);
|
|
|
- BUG_ON(IS_ERR(trans));
|
|
|
+ if (IS_ERR(trans)) {
|
|
|
+ ret = PTR_ERR(trans);
|
|
|
+ btrfs_info_in_rcu(fs_info,
|
|
|
+ "resize: unable to start transaction after shrinking device %s (error %d), old size %llu, new size %llu",
|
|
|
+ rcu_str_deref(device->name), ret,
|
|
|
+ old_size, old_size - size_to_free);
|
|
|
+ goto error;
|
|
|
+ }
|
|
|
|
|
|
ret = btrfs_grow_device(trans, device, old_size);
|
|
|
- BUG_ON(ret);
|
|
|
+ if (ret) {
|
|
|
+ btrfs_end_transaction(trans, dev_root);
|
|
|
+ /* btrfs_grow_device never returns ret > 0 */
|
|
|
+ WARN_ON(ret > 0);
|
|
|
+ btrfs_info_in_rcu(fs_info,
|
|
|
+ "resize: unable to grow device after shrinking device %s (error %d), old size %llu, new size %llu",
|
|
|
+ rcu_str_deref(device->name), ret,
|
|
|
+ old_size, old_size - size_to_free);
|
|
|
+ goto error;
|
|
|
+ }
|
|
|
|
|
|
btrfs_end_transaction(trans, dev_root);
|
|
|
}
|