From 10fbf9364f6050ddbff22e96575af7cb0670e3bf Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Tue, 19 Aug 2008 22:20:17 +0100 Subject: [PATCH] --- yaml --- r: 128915 b: refs/heads/master c: 2d4d9fbd6efa858dfa009518fca1ab85a73fd848 h: refs/heads/master i: 128913: abe3321611c18907f72b3861d2e660f2635e58c8 128911: 7d03e932aef48d81982e4078abfc4898bf669723 v: v3 --- [refs] | 2 +- trunk/fs/btrfs/export.c | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index e595804f007e..f557fba4ecdb 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 615f996fb8185a0bc02812ebd72cb77ded5645f1 +refs/heads/master: 2d4d9fbd6efa858dfa009518fca1ab85a73fd848 diff --git a/trunk/fs/btrfs/export.c b/trunk/fs/btrfs/export.c index a913b9befe68..36cbc6872fd0 100644 --- a/trunk/fs/btrfs/export.c +++ b/trunk/fs/btrfs/export.c @@ -71,11 +71,18 @@ static struct dentry *btrfs_get_dentry(struct super_block *sb, u64 objectid, struct dentry *result; struct btrfs_key key; + key.objectid = root_objectid; + btrfs_set_key_type(&key, BTRFS_ROOT_ITEM_KEY); + key.offset = (u64)-1; + + root = btrfs_read_fs_root_no_name(btrfs_sb(sb)->fs_info, &key); + if (IS_ERR(root)) + return ERR_CAST(root); + key.objectid = objectid; btrfs_set_key_type(&key, BTRFS_INODE_ITEM_KEY); key.offset = 0; - root = btrfs_lookup_fs_root(btrfs_sb(sb)->fs_info, root_objectid); inode = btrfs_iget(sb, &key, root, NULL); if (IS_ERR(inode)) return (void *)inode; @@ -178,6 +185,10 @@ static struct dentry *btrfs_get_parent(struct dentry *child) objectid = key.offset; + /* If we are already at the root of a subvol, return the real root */ + if (objectid == dir->i_ino) + return dget(dir->i_sb->s_root); + /* Build a new key for the inode item */ key.objectid = objectid; btrfs_set_key_type(&key, BTRFS_INODE_ITEM_KEY);