diff options
author | Liu Bo <bo.li.liu@oracle.com> | 2014-01-09 01:57:06 -0500 |
---|---|---|
committer | Chris Mason <clm@fb.com> | 2014-01-28 16:20:29 -0500 |
commit | de6e8200669f9b60694ca87eadf0a0a99cbdb6aa (patch) | |
tree | 6ba34667019a48ec0b042d6b4cf0653f3a2518c3 /fs/btrfs/ioctl.c | |
parent | f1de968376340c97ac2d7acd25fa3107c398e0e5 (diff) |
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: Liu Bo <bo.li.liu@oracle.com>
Signed-off-by: Josef Bacik <jbacik@fb.com>
Signed-off-by: Chris Mason <clm@fb.com>
Diffstat (limited to 'fs/btrfs/ioctl.c')
-rw-r--r-- | fs/btrfs/ioctl.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 3970f32b2b80..332b624e25db 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -436,7 +436,9 @@ static noinline int create_subvol(struct inode *dir, | |||
436 | trans = btrfs_start_transaction(root, 0); | 436 | trans = btrfs_start_transaction(root, 0); |
437 | if (IS_ERR(trans)) { | 437 | if (IS_ERR(trans)) { |
438 | ret = PTR_ERR(trans); | 438 | ret = PTR_ERR(trans); |
439 | goto out; | 439 | btrfs_subvolume_release_metadata(root, &block_rsv, |
440 | qgroup_reserved); | ||
441 | return ret; | ||
440 | } | 442 | } |
441 | trans->block_rsv = &block_rsv; | 443 | trans->block_rsv = &block_rsv; |
442 | trans->bytes_reserved = block_rsv.size; | 444 | trans->bytes_reserved = block_rsv.size; |
@@ -561,6 +563,8 @@ static noinline int create_subvol(struct inode *dir, | |||
561 | fail: | 563 | fail: |
562 | trans->block_rsv = NULL; | 564 | trans->block_rsv = NULL; |
563 | trans->bytes_reserved = 0; | 565 | trans->bytes_reserved = 0; |
566 | btrfs_subvolume_release_metadata(root, &block_rsv, qgroup_reserved); | ||
567 | |||
564 | if (async_transid) { | 568 | if (async_transid) { |
565 | *async_transid = trans->transid; | 569 | *async_transid = trans->transid; |
566 | err = btrfs_commit_transaction_async(trans, root, 1); | 570 | err = btrfs_commit_transaction_async(trans, root, 1); |
@@ -574,14 +578,10 @@ fail: | |||
574 | 578 | ||
575 | if (!ret) { | 579 | if (!ret) { |
576 | inode = btrfs_lookup_dentry(dir, dentry); | 580 | inode = btrfs_lookup_dentry(dir, dentry); |
577 | if (IS_ERR(inode)) { | 581 | if (IS_ERR(inode)) |
578 | ret = PTR_ERR(inode); | 582 | return PTR_ERR(inode); |
579 | goto out; | ||
580 | } | ||
581 | d_instantiate(dentry, inode); | 583 | d_instantiate(dentry, inode); |
582 | } | 584 | } |
583 | out: | ||
584 | btrfs_subvolume_release_metadata(root, &block_rsv, qgroup_reserved); | ||
585 | return ret; | 585 | return ret; |
586 | } | 586 | } |
587 | 587 | ||