diff options
Diffstat (limited to 'fs/btrfs')
-rw-r--r-- | fs/btrfs/inode.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 85fd86ea9830..619742d37166 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -1951,12 +1951,28 @@ enum btrfs_orphan_cleanup_state { | |||
1951 | void btrfs_orphan_commit_root(struct btrfs_trans_handle *trans, | 1951 | void btrfs_orphan_commit_root(struct btrfs_trans_handle *trans, |
1952 | struct btrfs_root *root) | 1952 | struct btrfs_root *root) |
1953 | { | 1953 | { |
1954 | struct btrfs_block_rsv *block_rsv; | ||
1954 | int ret; | 1955 | int ret; |
1955 | 1956 | ||
1956 | if (!list_empty(&root->orphan_list) || | 1957 | if (!list_empty(&root->orphan_list) || |
1957 | root->orphan_cleanup_state != ORPHAN_CLEANUP_DONE) | 1958 | root->orphan_cleanup_state != ORPHAN_CLEANUP_DONE) |
1958 | return; | 1959 | return; |
1959 | 1960 | ||
1961 | spin_lock(&root->orphan_lock); | ||
1962 | if (!list_empty(&root->orphan_list)) { | ||
1963 | spin_unlock(&root->orphan_lock); | ||
1964 | return; | ||
1965 | } | ||
1966 | |||
1967 | if (root->orphan_cleanup_state != ORPHAN_CLEANUP_DONE) { | ||
1968 | spin_unlock(&root->orphan_lock); | ||
1969 | return; | ||
1970 | } | ||
1971 | |||
1972 | block_rsv = root->orphan_block_rsv; | ||
1973 | root->orphan_block_rsv = NULL; | ||
1974 | spin_unlock(&root->orphan_lock); | ||
1975 | |||
1960 | if (root->orphan_item_inserted && | 1976 | if (root->orphan_item_inserted && |
1961 | btrfs_root_refs(&root->root_item) > 0) { | 1977 | btrfs_root_refs(&root->root_item) > 0) { |
1962 | ret = btrfs_del_orphan_item(trans, root->fs_info->tree_root, | 1978 | ret = btrfs_del_orphan_item(trans, root->fs_info->tree_root, |
@@ -1965,10 +1981,9 @@ void btrfs_orphan_commit_root(struct btrfs_trans_handle *trans, | |||
1965 | root->orphan_item_inserted = 0; | 1981 | root->orphan_item_inserted = 0; |
1966 | } | 1982 | } |
1967 | 1983 | ||
1968 | if (root->orphan_block_rsv) { | 1984 | if (block_rsv) { |
1969 | WARN_ON(root->orphan_block_rsv->size > 0); | 1985 | WARN_ON(block_rsv->size > 0); |
1970 | btrfs_free_block_rsv(root, root->orphan_block_rsv); | 1986 | btrfs_free_block_rsv(root, block_rsv); |
1971 | root->orphan_block_rsv = NULL; | ||
1972 | } | 1987 | } |
1973 | } | 1988 | } |
1974 | 1989 | ||