diff options
author | Li Zefan <lizf@cn.fujitsu.com> | 2011-03-27 22:01:25 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2011-04-05 01:20:24 -0400 |
commit | 08fe4db170b4193603d9d31f40ebaf652d07ac9c (patch) | |
tree | 2d0d2abe40b77266600653e399d4973a679716a9 /fs/btrfs/disk-io.c | |
parent | adae52b94e18afa1f84fab67df2a8a872c2f5533 (diff) |
Btrfs: Fix uninitialized root flags for subvolumes
root_item->flags and root_item->byte_limit are not initialized when
a subvolume is created. This bug is not revealed until we added
readonly snapshot support - now you mount a btrfs filesystem and you
may find the subvolumes in it are readonly.
To work around this problem, we steal a bit from root_item->inode_item->flags,
and use it to indicate if those fields have been properly initialized.
When we read a tree root from disk, we check if the bit is set, and if
not we'll set the flag and initialize the two fields of the root item.
Reported-by: Andreas Philipp <philipp.andreas@gmail.com>
Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Tested-by: Andreas Philipp <philipp.andreas@gmail.com>
cc: stable@kernel.org
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 | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 5cf3aa7b125c..a272bfd74ea0 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -1276,8 +1276,10 @@ struct btrfs_root *btrfs_read_fs_root_no_radix(struct btrfs_root *tree_root, | |||
1276 | root->commit_root = btrfs_root_node(root); | 1276 | root->commit_root = btrfs_root_node(root); |
1277 | BUG_ON(!root->node); | 1277 | BUG_ON(!root->node); |
1278 | out: | 1278 | out: |
1279 | if (location->objectid != BTRFS_TREE_LOG_OBJECTID) | 1279 | if (location->objectid != BTRFS_TREE_LOG_OBJECTID) { |
1280 | root->ref_cows = 1; | 1280 | root->ref_cows = 1; |
1281 | btrfs_check_and_init_root_item(&root->root_item); | ||
1282 | } | ||
1281 | 1283 | ||
1282 | return root; | 1284 | return root; |
1283 | } | 1285 | } |