aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/disk-io.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2008-11-17 20:42:26 -0500
committerChris Mason <chris.mason@oracle.com>2008-11-17 20:42:26 -0500
commit3394e1607eaf870ebba37d303fbd590a4c569908 (patch)
tree7833927ae6137122bea670544147be6a69f804ad /fs/btrfs/disk-io.c
parent3de4586c5278a28107030c336956381f69ff7a9d (diff)
Btrfs: Give each subvol and snapshot their own anonymous devid
Each subvolume has its own private inode number space, and so we need to fill in different device numbers for each subvolume to avoid confusing applications. This commit puts a struct super_block into struct btrfs_root so it can call set_anon_super() and get a different device number generated for each root. btrfs_rename is changed to prevent renames across subvols. Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r--fs/btrfs/disk-io.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 0a5350573f61..8d7866b733d6 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -877,6 +877,12 @@ static int __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize,
877 root->defrag_running = 0; 877 root->defrag_running = 0;
878 root->defrag_level = 0; 878 root->defrag_level = 0;
879 root->root_key.objectid = objectid; 879 root->root_key.objectid = objectid;
880 root->anon_super.s_root = NULL;
881 root->anon_super.s_dev = 0;
882 INIT_LIST_HEAD(&root->anon_super.s_list);
883 INIT_LIST_HEAD(&root->anon_super.s_instances);
884 init_rwsem(&root->anon_super.s_umount);
885
880 return 0; 886 return 0;
881} 887}
882 888
@@ -1083,6 +1089,9 @@ struct btrfs_root *btrfs_read_fs_root_no_name(struct btrfs_fs_info *fs_info,
1083 root = btrfs_read_fs_root_no_radix(fs_info->tree_root, location); 1089 root = btrfs_read_fs_root_no_radix(fs_info->tree_root, location);
1084 if (IS_ERR(root)) 1090 if (IS_ERR(root))
1085 return root; 1091 return root;
1092
1093 set_anon_super(&root->anon_super, NULL);
1094
1086 ret = radix_tree_insert(&fs_info->fs_roots_radix, 1095 ret = radix_tree_insert(&fs_info->fs_roots_radix,
1087 (unsigned long)root->root_key.objectid, 1096 (unsigned long)root->root_key.objectid,
1088 root); 1097 root);
@@ -1950,6 +1959,10 @@ int btrfs_free_fs_root(struct btrfs_fs_info *fs_info, struct btrfs_root *root)
1950{ 1959{
1951 radix_tree_delete(&fs_info->fs_roots_radix, 1960 radix_tree_delete(&fs_info->fs_roots_radix,
1952 (unsigned long)root->root_key.objectid); 1961 (unsigned long)root->root_key.objectid);
1962 if (root->anon_super.s_dev) {
1963 down_write(&root->anon_super.s_umount);
1964 kill_anon_super(&root->anon_super);
1965 }
1953 if (root->in_sysfs) 1966 if (root->in_sysfs)
1954 btrfs_sysfs_del_root(root); 1967 btrfs_sysfs_del_root(root);
1955 if (root->node) 1968 if (root->node)