Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit de6e8200 authored by Liu Bo's avatar Liu Bo Committed by Chris Mason
Browse files

Btrfs: release subvolume's block_rsv before transaction commit



We don't have to keep subvolume's block_rsv during transaction commit,
and within transaction commit, we may also need the free space reclaimed
from this block_rsv to process delayed refs.

Signed-off-by: default avatarLiu Bo <bo.li.liu@oracle.com>
Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
Signed-off-by: default avatarChris Mason <clm@fb.com>
parent f1de9683
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -436,7 +436,9 @@ static noinline int create_subvol(struct inode *dir,
	trans = btrfs_start_transaction(root, 0);
	if (IS_ERR(trans)) {
		ret = PTR_ERR(trans);
		goto out;
		btrfs_subvolume_release_metadata(root, &block_rsv,
						 qgroup_reserved);
		return ret;
	}
	trans->block_rsv = &block_rsv;
	trans->bytes_reserved = block_rsv.size;
@@ -561,6 +563,8 @@ static noinline int create_subvol(struct inode *dir,
fail:
	trans->block_rsv = NULL;
	trans->bytes_reserved = 0;
	btrfs_subvolume_release_metadata(root, &block_rsv, qgroup_reserved);

	if (async_transid) {
		*async_transid = trans->transid;
		err = btrfs_commit_transaction_async(trans, root, 1);
@@ -574,14 +578,10 @@ static noinline int create_subvol(struct inode *dir,

	if (!ret) {
		inode = btrfs_lookup_dentry(dir, dentry);
		if (IS_ERR(inode)) {
			ret = PTR_ERR(inode);
			goto out;
		}
		if (IS_ERR(inode))
			return PTR_ERR(inode);
		d_instantiate(dentry, inode);
	}
out:
	btrfs_subvolume_release_metadata(root, &block_rsv, qgroup_reserved);
	return ret;
}