Bläddra i källkod

btrfs: fix return value check of btrfs_start_transaction()

The error check of btrfs_start_transaction() is added, and the mistake
of the error check on several places is corrected.

Signed-off-by: Tsutomu Itoh <t-itoh@jp.fujitsu.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Tsutomu Itoh 14 år sedan
förälder
incheckning
98d5dc13e7
7 ändrade filer med 37 tillägg och 6 borttagningar
  1. 5 2
      fs/btrfs/extent-tree.c
  2. 1 0
      fs/btrfs/inode.c
  3. 8 2
      fs/btrfs/ioctl.c
  4. 3 0
      fs/btrfs/relocation.c
  5. 2 0
      fs/btrfs/super.c
  6. 1 0
      fs/btrfs/tree-log.c
  7. 17 2
      fs/btrfs/volumes.c

+ 5 - 2
fs/btrfs/extent-tree.c

@@ -6271,6 +6271,8 @@ int btrfs_drop_snapshot(struct btrfs_root *root,
 	BUG_ON(!wc);
 	BUG_ON(!wc);
 
 
 	trans = btrfs_start_transaction(tree_root, 0);
 	trans = btrfs_start_transaction(tree_root, 0);
+	BUG_ON(IS_ERR(trans));
+
 	if (block_rsv)
 	if (block_rsv)
 		trans->block_rsv = block_rsv;
 		trans->block_rsv = block_rsv;
 
 
@@ -6368,6 +6370,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root,
 
 
 			btrfs_end_transaction_throttle(trans, tree_root);
 			btrfs_end_transaction_throttle(trans, tree_root);
 			trans = btrfs_start_transaction(tree_root, 0);
 			trans = btrfs_start_transaction(tree_root, 0);
+			BUG_ON(IS_ERR(trans));
 			if (block_rsv)
 			if (block_rsv)
 				trans->block_rsv = block_rsv;
 				trans->block_rsv = block_rsv;
 		}
 		}
@@ -7587,7 +7590,7 @@ int btrfs_cleanup_reloc_trees(struct btrfs_root *root)
 
 
 	if (found) {
 	if (found) {
 		trans = btrfs_start_transaction(root, 1);
 		trans = btrfs_start_transaction(root, 1);
-		BUG_ON(!trans);
+		BUG_ON(IS_ERR(trans));
 		ret = btrfs_commit_transaction(trans, root);
 		ret = btrfs_commit_transaction(trans, root);
 		BUG_ON(ret);
 		BUG_ON(ret);
 	}
 	}
@@ -7831,7 +7834,7 @@ static noinline int relocate_one_extent(struct btrfs_root *extent_root,
 
 
 
 
 	trans = btrfs_start_transaction(extent_root, 1);
 	trans = btrfs_start_transaction(extent_root, 1);
-	BUG_ON(!trans);
+	BUG_ON(IS_ERR(trans));
 
 
 	if (extent_key->objectid == 0) {
 	if (extent_key->objectid == 0) {
 		ret = del_extent_zero(trans, extent_root, path, extent_key);
 		ret = del_extent_zero(trans, extent_root, path, extent_key);

+ 1 - 0
fs/btrfs/inode.c

@@ -2357,6 +2357,7 @@ void btrfs_orphan_cleanup(struct btrfs_root *root)
 		 */
 		 */
 		if (is_bad_inode(inode)) {
 		if (is_bad_inode(inode)) {
 			trans = btrfs_start_transaction(root, 0);
 			trans = btrfs_start_transaction(root, 0);
+			BUG_ON(IS_ERR(trans));
 			btrfs_orphan_del(trans, inode);
 			btrfs_orphan_del(trans, inode);
 			btrfs_end_transaction(trans, root);
 			btrfs_end_transaction(trans, root);
 			iput(inode);
 			iput(inode);

+ 8 - 2
fs/btrfs/ioctl.c

@@ -907,6 +907,10 @@ static noinline int btrfs_ioctl_resize(struct btrfs_root *root,
 
 
 	if (new_size > old_size) {
 	if (new_size > old_size) {
 		trans = btrfs_start_transaction(root, 0);
 		trans = btrfs_start_transaction(root, 0);
+		if (IS_ERR(trans)) {
+			ret = PTR_ERR(trans);
+			goto out_unlock;
+		}
 		ret = btrfs_grow_device(trans, device, new_size);
 		ret = btrfs_grow_device(trans, device, new_size);
 		btrfs_commit_transaction(trans, root);
 		btrfs_commit_transaction(trans, root);
 	} else {
 	} else {
@@ -2141,9 +2145,9 @@ static long btrfs_ioctl_default_subvol(struct file *file, void __user *argp)
 	path->leave_spinning = 1;
 	path->leave_spinning = 1;
 
 
 	trans = btrfs_start_transaction(root, 1);
 	trans = btrfs_start_transaction(root, 1);
-	if (!trans) {
+	if (IS_ERR(trans)) {
 		btrfs_free_path(path);
 		btrfs_free_path(path);
-		return -ENOMEM;
+		return PTR_ERR(trans);
 	}
 	}
 
 
 	dir_id = btrfs_super_root_dir(&root->fs_info->super_copy);
 	dir_id = btrfs_super_root_dir(&root->fs_info->super_copy);
@@ -2337,6 +2341,8 @@ static noinline long btrfs_ioctl_start_sync(struct file *file, void __user *argp
 	u64 transid;
 	u64 transid;
 
 
 	trans = btrfs_start_transaction(root, 0);
 	trans = btrfs_start_transaction(root, 0);
+	if (IS_ERR(trans))
+		return PTR_ERR(trans);
 	transid = trans->transid;
 	transid = trans->transid;
 	btrfs_commit_transaction_async(trans, root, 0);
 	btrfs_commit_transaction_async(trans, root, 0);
 
 

+ 3 - 0
fs/btrfs/relocation.c

@@ -2028,6 +2028,7 @@ static noinline_for_stack int merge_reloc_root(struct reloc_control *rc,
 
 
 	while (1) {
 	while (1) {
 		trans = btrfs_start_transaction(root, 0);
 		trans = btrfs_start_transaction(root, 0);
+		BUG_ON(IS_ERR(trans));
 		trans->block_rsv = rc->block_rsv;
 		trans->block_rsv = rc->block_rsv;
 
 
 		ret = btrfs_block_rsv_check(trans, root, rc->block_rsv,
 		ret = btrfs_block_rsv_check(trans, root, rc->block_rsv,
@@ -3665,6 +3666,7 @@ static noinline_for_stack int relocate_block_group(struct reloc_control *rc)
 
 
 	while (1) {
 	while (1) {
 		trans = btrfs_start_transaction(rc->extent_root, 0);
 		trans = btrfs_start_transaction(rc->extent_root, 0);
+		BUG_ON(IS_ERR(trans));
 
 
 		if (update_backref_cache(trans, &rc->backref_cache)) {
 		if (update_backref_cache(trans, &rc->backref_cache)) {
 			btrfs_end_transaction(trans, rc->extent_root);
 			btrfs_end_transaction(trans, rc->extent_root);
@@ -4033,6 +4035,7 @@ static noinline_for_stack int mark_garbage_root(struct btrfs_root *root)
 	int ret;
 	int ret;
 
 
 	trans = btrfs_start_transaction(root->fs_info->tree_root, 0);
 	trans = btrfs_start_transaction(root->fs_info->tree_root, 0);
+	BUG_ON(IS_ERR(trans));
 
 
 	memset(&root->root_item.drop_progress, 0,
 	memset(&root->root_item.drop_progress, 0,
 		sizeof(root->root_item.drop_progress));
 		sizeof(root->root_item.drop_progress));

+ 2 - 0
fs/btrfs/super.c

@@ -623,6 +623,8 @@ int btrfs_sync_fs(struct super_block *sb, int wait)
 	btrfs_wait_ordered_extents(root, 0, 0);
 	btrfs_wait_ordered_extents(root, 0, 0);
 
 
 	trans = btrfs_start_transaction(root, 0);
 	trans = btrfs_start_transaction(root, 0);
+	if (IS_ERR(trans))
+		return PTR_ERR(trans);
 	ret = btrfs_commit_transaction(trans, root);
 	ret = btrfs_commit_transaction(trans, root);
 	return ret;
 	return ret;
 }
 }

+ 1 - 0
fs/btrfs/tree-log.c

@@ -3112,6 +3112,7 @@ int btrfs_recover_log_trees(struct btrfs_root *log_root_tree)
 	BUG_ON(!path);
 	BUG_ON(!path);
 
 
 	trans = btrfs_start_transaction(fs_info->tree_root, 0);
 	trans = btrfs_start_transaction(fs_info->tree_root, 0);
+	BUG_ON(IS_ERR(trans));
 
 
 	wc.trans = trans;
 	wc.trans = trans;
 	wc.pin = 1;
 	wc.pin = 1;

+ 17 - 2
fs/btrfs/volumes.c

@@ -1212,6 +1212,10 @@ static int btrfs_rm_dev_item(struct btrfs_root *root,
 		return -ENOMEM;
 		return -ENOMEM;
 
 
 	trans = btrfs_start_transaction(root, 0);
 	trans = btrfs_start_transaction(root, 0);
+	if (IS_ERR(trans)) {
+		btrfs_free_path(path);
+		return PTR_ERR(trans);
+	}
 	key.objectid = BTRFS_DEV_ITEMS_OBJECTID;
 	key.objectid = BTRFS_DEV_ITEMS_OBJECTID;
 	key.type = BTRFS_DEV_ITEM_KEY;
 	key.type = BTRFS_DEV_ITEM_KEY;
 	key.offset = device->devid;
 	key.offset = device->devid;
@@ -1604,6 +1608,12 @@ int btrfs_init_new_device(struct btrfs_root *root, char *device_path)
 	}
 	}
 
 
 	trans = btrfs_start_transaction(root, 0);
 	trans = btrfs_start_transaction(root, 0);
+	if (IS_ERR(trans)) {
+		kfree(device);
+		ret = PTR_ERR(trans);
+		goto error;
+	}
+
 	lock_chunks(root);
 	lock_chunks(root);
 
 
 	device->barriers = 1;
 	device->barriers = 1;
@@ -1872,7 +1882,7 @@ static int btrfs_relocate_chunk(struct btrfs_root *root,
 		return ret;
 		return ret;
 
 
 	trans = btrfs_start_transaction(root, 0);
 	trans = btrfs_start_transaction(root, 0);
-	BUG_ON(!trans);
+	BUG_ON(IS_ERR(trans));
 
 
 	lock_chunks(root);
 	lock_chunks(root);
 
 
@@ -2046,7 +2056,7 @@ int btrfs_balance(struct btrfs_root *dev_root)
 		BUG_ON(ret);
 		BUG_ON(ret);
 
 
 		trans = btrfs_start_transaction(dev_root, 0);
 		trans = btrfs_start_transaction(dev_root, 0);
-		BUG_ON(!trans);
+		BUG_ON(IS_ERR(trans));
 
 
 		ret = btrfs_grow_device(trans, device, old_size);
 		ret = btrfs_grow_device(trans, device, old_size);
 		BUG_ON(ret);
 		BUG_ON(ret);
@@ -2212,6 +2222,11 @@ again:
 
 
 	/* Shrinking succeeded, else we would be at "done". */
 	/* Shrinking succeeded, else we would be at "done". */
 	trans = btrfs_start_transaction(root, 0);
 	trans = btrfs_start_transaction(root, 0);
+	if (IS_ERR(trans)) {
+		ret = PTR_ERR(trans);
+		goto done;
+	}
+
 	lock_chunks(root);
 	lock_chunks(root);
 
 
 	device->disk_total_bytes = new_size;
 	device->disk_total_bytes = new_size;