diff options
Diffstat (limited to 'fs/btrfs/transaction.c')
-rw-r--r-- | fs/btrfs/transaction.c | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 295a135c9c24..a605d4e2f2bc 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
@@ -1938,13 +1938,10 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, | |||
1938 | } | 1938 | } |
1939 | 1939 | ||
1940 | /* | 1940 | /* |
1941 | * Since the transaction is done, we should set the inode map cache flag | 1941 | * Since the transaction is done, we can apply the pending changes |
1942 | * before any other comming transaction. | 1942 | * before the next transaction. |
1943 | */ | 1943 | */ |
1944 | if (btrfs_test_opt(root, CHANGE_INODE_CACHE)) | 1944 | btrfs_apply_pending_changes(root->fs_info); |
1945 | btrfs_set_opt(root->fs_info->mount_opt, INODE_MAP_CACHE); | ||
1946 | else | ||
1947 | btrfs_clear_opt(root->fs_info->mount_opt, INODE_MAP_CACHE); | ||
1948 | 1945 | ||
1949 | /* commit_fs_roots gets rid of all the tree log roots, it is now | 1946 | /* commit_fs_roots gets rid of all the tree log roots, it is now |
1950 | * safe to free the root of tree log roots | 1947 | * safe to free the root of tree log roots |
@@ -2115,3 +2112,32 @@ int btrfs_clean_one_deleted_snapshot(struct btrfs_root *root) | |||
2115 | 2112 | ||
2116 | return (ret < 0) ? 0 : 1; | 2113 | return (ret < 0) ? 0 : 1; |
2117 | } | 2114 | } |
2115 | |||
2116 | void btrfs_apply_pending_changes(struct btrfs_fs_info *fs_info) | ||
2117 | { | ||
2118 | unsigned long prev; | ||
2119 | unsigned long bit; | ||
2120 | |||
2121 | prev = cmpxchg(&fs_info->pending_changes, 0, 0); | ||
2122 | if (!prev) | ||
2123 | return; | ||
2124 | |||
2125 | bit = 1 << BTRFS_PENDING_SET_INODE_MAP_CACHE; | ||
2126 | if (prev & bit) | ||
2127 | btrfs_set_opt(fs_info->mount_opt, INODE_MAP_CACHE); | ||
2128 | prev &= ~bit; | ||
2129 | |||
2130 | bit = 1 << BTRFS_PENDING_CLEAR_INODE_MAP_CACHE; | ||
2131 | if (prev & bit) | ||
2132 | btrfs_clear_opt(fs_info->mount_opt, INODE_MAP_CACHE); | ||
2133 | prev &= ~bit; | ||
2134 | |||
2135 | bit = 1 << BTRFS_PENDING_COMMIT; | ||
2136 | if (prev & bit) | ||
2137 | btrfs_debug(fs_info, "pending commit done"); | ||
2138 | prev &= ~bit; | ||
2139 | |||
2140 | if (prev) | ||
2141 | btrfs_warn(fs_info, | ||
2142 | "unknown pending changes left 0x%lx, ignoring", prev); | ||
2143 | } | ||