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;
 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);
 
        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;
 }