diff options
author | Yan, Zheng <zheng.yan@oracle.com> | 2010-05-16 10:49:58 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2010-05-25 10:34:52 -0400 |
commit | d68fc57b7e3245cfacf2e3b47acfed1946a11786 (patch) | |
tree | c2572fcd935017440c8370c8a12ceb49a7fc4f1f /fs/btrfs/disk-io.c | |
parent | 8929ecfa50f266163832eeacfbc3642ed5eb83b6 (diff) |
Btrfs: Metadata reservation for orphan inodes
reserve metadata space for handling orphan inodes
Signed-off-by: Yan Zheng <zheng.yan@oracle.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r-- | fs/btrfs/disk-io.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 309d8c08a640..82955b73a962 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -894,7 +894,8 @@ static int __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize, | |||
894 | root->ref_cows = 0; | 894 | root->ref_cows = 0; |
895 | root->track_dirty = 0; | 895 | root->track_dirty = 0; |
896 | root->in_radix = 0; | 896 | root->in_radix = 0; |
897 | root->clean_orphans = 0; | 897 | root->orphan_item_inserted = 0; |
898 | root->orphan_cleanup_state = 0; | ||
898 | 899 | ||
899 | root->fs_info = fs_info; | 900 | root->fs_info = fs_info; |
900 | root->objectid = objectid; | 901 | root->objectid = objectid; |
@@ -904,12 +905,13 @@ static int __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize, | |||
904 | root->in_sysfs = 0; | 905 | root->in_sysfs = 0; |
905 | root->inode_tree = RB_ROOT; | 906 | root->inode_tree = RB_ROOT; |
906 | root->block_rsv = NULL; | 907 | root->block_rsv = NULL; |
908 | root->orphan_block_rsv = NULL; | ||
907 | 909 | ||
908 | INIT_LIST_HEAD(&root->dirty_list); | 910 | INIT_LIST_HEAD(&root->dirty_list); |
909 | INIT_LIST_HEAD(&root->orphan_list); | 911 | INIT_LIST_HEAD(&root->orphan_list); |
910 | INIT_LIST_HEAD(&root->root_list); | 912 | INIT_LIST_HEAD(&root->root_list); |
911 | spin_lock_init(&root->node_lock); | 913 | spin_lock_init(&root->node_lock); |
912 | spin_lock_init(&root->list_lock); | 914 | spin_lock_init(&root->orphan_lock); |
913 | spin_lock_init(&root->inode_lock); | 915 | spin_lock_init(&root->inode_lock); |
914 | spin_lock_init(&root->accounting_lock); | 916 | spin_lock_init(&root->accounting_lock); |
915 | mutex_init(&root->objectid_mutex); | 917 | mutex_init(&root->objectid_mutex); |
@@ -1193,19 +1195,23 @@ again: | |||
1193 | if (root) | 1195 | if (root) |
1194 | return root; | 1196 | return root; |
1195 | 1197 | ||
1196 | ret = btrfs_find_orphan_item(fs_info->tree_root, location->objectid); | ||
1197 | if (ret == 0) | ||
1198 | ret = -ENOENT; | ||
1199 | if (ret < 0) | ||
1200 | return ERR_PTR(ret); | ||
1201 | |||
1202 | root = btrfs_read_fs_root_no_radix(fs_info->tree_root, location); | 1198 | root = btrfs_read_fs_root_no_radix(fs_info->tree_root, location); |
1203 | if (IS_ERR(root)) | 1199 | if (IS_ERR(root)) |
1204 | return root; | 1200 | return root; |
1205 | 1201 | ||
1206 | WARN_ON(btrfs_root_refs(&root->root_item) == 0); | ||
1207 | set_anon_super(&root->anon_super, NULL); | 1202 | set_anon_super(&root->anon_super, NULL); |
1208 | 1203 | ||
1204 | if (btrfs_root_refs(&root->root_item) == 0) { | ||
1205 | ret = -ENOENT; | ||
1206 | goto fail; | ||
1207 | } | ||
1208 | |||
1209 | ret = btrfs_find_orphan_item(fs_info->tree_root, location->objectid); | ||
1210 | if (ret < 0) | ||
1211 | goto fail; | ||
1212 | if (ret == 0) | ||
1213 | root->orphan_item_inserted = 1; | ||
1214 | |||
1209 | ret = radix_tree_preload(GFP_NOFS & ~__GFP_HIGHMEM); | 1215 | ret = radix_tree_preload(GFP_NOFS & ~__GFP_HIGHMEM); |
1210 | if (ret) | 1216 | if (ret) |
1211 | goto fail; | 1217 | goto fail; |
@@ -1214,10 +1220,9 @@ again: | |||
1214 | ret = radix_tree_insert(&fs_info->fs_roots_radix, | 1220 | ret = radix_tree_insert(&fs_info->fs_roots_radix, |
1215 | (unsigned long)root->root_key.objectid, | 1221 | (unsigned long)root->root_key.objectid, |
1216 | root); | 1222 | root); |
1217 | if (ret == 0) { | 1223 | if (ret == 0) |
1218 | root->in_radix = 1; | 1224 | root->in_radix = 1; |
1219 | root->clean_orphans = 1; | 1225 | |
1220 | } | ||
1221 | spin_unlock(&fs_info->fs_roots_radix_lock); | 1226 | spin_unlock(&fs_info->fs_roots_radix_lock); |
1222 | radix_tree_preload_end(); | 1227 | radix_tree_preload_end(); |
1223 | if (ret) { | 1228 | if (ret) { |
@@ -1981,6 +1986,9 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1981 | BUG_ON(ret); | 1986 | BUG_ON(ret); |
1982 | 1987 | ||
1983 | if (!(sb->s_flags & MS_RDONLY)) { | 1988 | if (!(sb->s_flags & MS_RDONLY)) { |
1989 | ret = btrfs_cleanup_fs_roots(fs_info); | ||
1990 | BUG_ON(ret); | ||
1991 | |||
1984 | ret = btrfs_recover_relocation(tree_root); | 1992 | ret = btrfs_recover_relocation(tree_root); |
1985 | if (ret < 0) { | 1993 | if (ret < 0) { |
1986 | printk(KERN_WARNING | 1994 | printk(KERN_WARNING |