aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2011-06-03 09:36:29 -0400
committerChris Mason <chris.mason@oracle.com>2011-06-04 08:03:47 -0400
commit4b9465cb9e3859186eefa1ca3b990a5849386320 (patch)
tree8fc06452fb75e52f6c1c2e2253c2ff6700e622fd /fs/btrfs
parente7786c3ae517b2c433edc91714e86be770e9f1ce (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>
Diffstat (limited to 'fs/btrfs')
-rw-r--r--fs/btrfs/ctree.h1
-rw-r--r--fs/btrfs/free-space-cache.c6
-rw-r--r--fs/btrfs/inode-map.c20
-rw-r--r--fs/btrfs/super.c8
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
179int btrfs_find_free_ino(struct btrfs_root *root, u64 *objectid) 185int 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
181again: 190again:
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
204again: 217again:
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
405again: 425again:
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
166static match_table_t tokens = { 167static 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);