diff options
author | Chris Mason <chris.mason@oracle.com> | 2011-06-03 09:36:29 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2011-06-04 08:03:47 -0400 |
commit | 4b9465cb9e3859186eefa1ca3b990a5849386320 (patch) | |
tree | 8fc06452fb75e52f6c1c2e2253c2ff6700e622fd | |
parent | e7786c3ae517b2c433edc91714e86be770e9f1ce (diff) |
Btrfs: add mount -o inode_cache
This makes the inode map cache default to off until we
fix the overflow problem when the free space crcs don't fit
inside a single page.
Signed-off-by: Chris Mason <chris.mason@oracle.com>
-rw-r--r-- | fs/btrfs/ctree.h | 1 | ||||
-rw-r--r-- | fs/btrfs/free-space-cache.c | 6 | ||||
-rw-r--r-- | fs/btrfs/inode-map.c | 20 | ||||
-rw-r--r-- | fs/btrfs/super.c | 8 |
4 files changed, 34 insertions, 1 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 8f98c2005715..4958ef5417d6 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -1340,6 +1340,7 @@ struct btrfs_ioctl_defrag_range_args { | |||
1340 | #define BTRFS_MOUNT_USER_SUBVOL_RM_ALLOWED (1 << 14) | 1340 | #define BTRFS_MOUNT_USER_SUBVOL_RM_ALLOWED (1 << 14) |
1341 | #define BTRFS_MOUNT_ENOSPC_DEBUG (1 << 15) | 1341 | #define BTRFS_MOUNT_ENOSPC_DEBUG (1 << 15) |
1342 | #define BTRFS_MOUNT_AUTO_DEFRAG (1 << 16) | 1342 | #define BTRFS_MOUNT_AUTO_DEFRAG (1 << 16) |
1343 | #define BTRFS_MOUNT_INODE_MAP_CACHE (1 << 17) | ||
1343 | 1344 | ||
1344 | #define btrfs_clear_opt(o, opt) ((o) &= ~BTRFS_MOUNT_##opt) | 1345 | #define btrfs_clear_opt(o, opt) ((o) &= ~BTRFS_MOUNT_##opt) |
1345 | #define btrfs_set_opt(o, opt) ((o) |= BTRFS_MOUNT_##opt) | 1346 | #define btrfs_set_opt(o, opt) ((o) |= BTRFS_MOUNT_##opt) |
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index 1cb72394498c..bffa5c4a633b 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c | |||
@@ -2536,6 +2536,9 @@ int load_free_ino_cache(struct btrfs_fs_info *fs_info, struct btrfs_root *root) | |||
2536 | int ret = 0; | 2536 | int ret = 0; |
2537 | u64 root_gen = btrfs_root_generation(&root->root_item); | 2537 | u64 root_gen = btrfs_root_generation(&root->root_item); |
2538 | 2538 | ||
2539 | if (!btrfs_test_opt(root, INODE_MAP_CACHE)) | ||
2540 | return 0; | ||
2541 | |||
2539 | /* | 2542 | /* |
2540 | * If we're unmounting then just return, since this does a search on the | 2543 | * If we're unmounting then just return, since this does a search on the |
2541 | * normal root and not the commit root and we could deadlock. | 2544 | * normal root and not the commit root and we could deadlock. |
@@ -2575,6 +2578,9 @@ int btrfs_write_out_ino_cache(struct btrfs_root *root, | |||
2575 | struct inode *inode; | 2578 | struct inode *inode; |
2576 | int ret; | 2579 | int ret; |
2577 | 2580 | ||
2581 | if (!btrfs_test_opt(root, INODE_MAP_CACHE)) | ||
2582 | return 0; | ||
2583 | |||
2578 | inode = lookup_free_ino_inode(root, path); | 2584 | inode = lookup_free_ino_inode(root, path); |
2579 | if (IS_ERR(inode)) | 2585 | if (IS_ERR(inode)) |
2580 | return 0; | 2586 | return 0; |
diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c index 2d0d50067a7b..cb79b8975c9f 100644 --- a/fs/btrfs/inode-map.c +++ b/fs/btrfs/inode-map.c | |||
@@ -38,6 +38,9 @@ static int caching_kthread(void *data) | |||
38 | int slot; | 38 | int slot; |
39 | int ret; | 39 | int ret; |
40 | 40 | ||
41 | if (!btrfs_test_opt(root, INODE_MAP_CACHE)) | ||
42 | return 0; | ||
43 | |||
41 | path = btrfs_alloc_path(); | 44 | path = btrfs_alloc_path(); |
42 | if (!path) | 45 | if (!path) |
43 | return -ENOMEM; | 46 | return -ENOMEM; |
@@ -141,6 +144,9 @@ static void start_caching(struct btrfs_root *root) | |||
141 | int ret; | 144 | int ret; |
142 | u64 objectid; | 145 | u64 objectid; |
143 | 146 | ||
147 | if (!btrfs_test_opt(root, INODE_MAP_CACHE)) | ||
148 | return; | ||
149 | |||
144 | spin_lock(&root->cache_lock); | 150 | spin_lock(&root->cache_lock); |
145 | if (root->cached != BTRFS_CACHE_NO) { | 151 | if (root->cached != BTRFS_CACHE_NO) { |
146 | spin_unlock(&root->cache_lock); | 152 | spin_unlock(&root->cache_lock); |
@@ -178,6 +184,9 @@ static void start_caching(struct btrfs_root *root) | |||
178 | 184 | ||
179 | int btrfs_find_free_ino(struct btrfs_root *root, u64 *objectid) | 185 | int btrfs_find_free_ino(struct btrfs_root *root, u64 *objectid) |
180 | { | 186 | { |
187 | if (!btrfs_test_opt(root, INODE_MAP_CACHE)) | ||
188 | return btrfs_find_free_objectid(root, objectid); | ||
189 | |||
181 | again: | 190 | again: |
182 | *objectid = btrfs_find_ino_for_alloc(root); | 191 | *objectid = btrfs_find_ino_for_alloc(root); |
183 | 192 | ||
@@ -201,6 +210,10 @@ void btrfs_return_ino(struct btrfs_root *root, u64 objectid) | |||
201 | { | 210 | { |
202 | struct btrfs_free_space_ctl *ctl = root->free_ino_ctl; | 211 | struct btrfs_free_space_ctl *ctl = root->free_ino_ctl; |
203 | struct btrfs_free_space_ctl *pinned = root->free_ino_pinned; | 212 | struct btrfs_free_space_ctl *pinned = root->free_ino_pinned; |
213 | |||
214 | if (!btrfs_test_opt(root, INODE_MAP_CACHE)) | ||
215 | return; | ||
216 | |||
204 | again: | 217 | again: |
205 | if (root->cached == BTRFS_CACHE_FINISHED) { | 218 | if (root->cached == BTRFS_CACHE_FINISHED) { |
206 | __btrfs_add_free_space(ctl, objectid, 1); | 219 | __btrfs_add_free_space(ctl, objectid, 1); |
@@ -250,6 +263,9 @@ void btrfs_unpin_free_ino(struct btrfs_root *root) | |||
250 | struct rb_node *n; | 263 | struct rb_node *n; |
251 | u64 count; | 264 | u64 count; |
252 | 265 | ||
266 | if (!btrfs_test_opt(root, INODE_MAP_CACHE)) | ||
267 | return; | ||
268 | |||
253 | while (1) { | 269 | while (1) { |
254 | n = rb_first(rbroot); | 270 | n = rb_first(rbroot); |
255 | if (!n) | 271 | if (!n) |
@@ -399,9 +415,13 @@ int btrfs_save_ino_cache(struct btrfs_root *root, | |||
399 | root != root->fs_info->tree_root) | 415 | root != root->fs_info->tree_root) |
400 | return 0; | 416 | return 0; |
401 | 417 | ||
418 | if (!btrfs_test_opt(root, INODE_MAP_CACHE)) | ||
419 | return 0; | ||
420 | |||
402 | path = btrfs_alloc_path(); | 421 | path = btrfs_alloc_path(); |
403 | if (!path) | 422 | if (!path) |
404 | return -ENOMEM; | 423 | return -ENOMEM; |
424 | |||
405 | again: | 425 | again: |
406 | inode = lookup_free_ino_inode(root, path); | 426 | inode = lookup_free_ino_inode(root, path); |
407 | if (IS_ERR(inode) && PTR_ERR(inode) != -ENOENT) { | 427 | if (IS_ERR(inode) && PTR_ERR(inode) != -ENOENT) { |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 28e3cb2607ff..3559d0b3518a 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -160,7 +160,8 @@ enum { | |||
160 | Opt_compress_type, Opt_compress_force, Opt_compress_force_type, | 160 | Opt_compress_type, Opt_compress_force, Opt_compress_force_type, |
161 | Opt_notreelog, Opt_ratio, Opt_flushoncommit, Opt_discard, | 161 | Opt_notreelog, Opt_ratio, Opt_flushoncommit, Opt_discard, |
162 | Opt_space_cache, Opt_clear_cache, Opt_user_subvol_rm_allowed, | 162 | Opt_space_cache, Opt_clear_cache, Opt_user_subvol_rm_allowed, |
163 | Opt_enospc_debug, Opt_subvolrootid, Opt_defrag, Opt_err, | 163 | Opt_enospc_debug, Opt_subvolrootid, Opt_defrag, |
164 | Opt_inode_cache, Opt_err, | ||
164 | }; | 165 | }; |
165 | 166 | ||
166 | static match_table_t tokens = { | 167 | static match_table_t tokens = { |
@@ -192,6 +193,7 @@ static match_table_t tokens = { | |||
192 | {Opt_enospc_debug, "enospc_debug"}, | 193 | {Opt_enospc_debug, "enospc_debug"}, |
193 | {Opt_subvolrootid, "subvolrootid=%d"}, | 194 | {Opt_subvolrootid, "subvolrootid=%d"}, |
194 | {Opt_defrag, "autodefrag"}, | 195 | {Opt_defrag, "autodefrag"}, |
196 | {Opt_inode_cache, "inode_cache"}, | ||
195 | {Opt_err, NULL}, | 197 | {Opt_err, NULL}, |
196 | }; | 198 | }; |
197 | 199 | ||
@@ -360,6 +362,10 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
360 | printk(KERN_INFO "btrfs: enabling disk space caching\n"); | 362 | printk(KERN_INFO "btrfs: enabling disk space caching\n"); |
361 | btrfs_set_opt(info->mount_opt, SPACE_CACHE); | 363 | btrfs_set_opt(info->mount_opt, SPACE_CACHE); |
362 | break; | 364 | break; |
365 | case Opt_inode_cache: | ||
366 | printk(KERN_INFO "btrfs: enabling inode map caching\n"); | ||
367 | btrfs_set_opt(info->mount_opt, INODE_MAP_CACHE); | ||
368 | break; | ||
363 | case Opt_clear_cache: | 369 | case Opt_clear_cache: |
364 | printk(KERN_INFO "btrfs: force clearing of disk cache\n"); | 370 | printk(KERN_INFO "btrfs: force clearing of disk cache\n"); |
365 | btrfs_set_opt(info->mount_opt, CLEAR_CACHE); | 371 | btrfs_set_opt(info->mount_opt, CLEAR_CACHE); |