diff options
author | Mark Fasheh <mfasheh@suse.com> | 2011-08-29 14:17:04 -0700 |
---|---|---|
committer | David Sterba <dsterba@suse.cz> | 2012-03-22 01:45:37 +0100 |
commit | e5df957328b18baa731307c66cfe8e7a4981df65 (patch) | |
tree | 19f092c1e65c639c17a2fc0582d01b0ebfb3e3a7 /fs/btrfs | |
parent | 4ed1d16e944c61cfb8a78159548672e7df168d97 (diff) | |
download | op-kernel-dev-e5df957328b18baa731307c66cfe8e7a4981df65.zip op-kernel-dev-e5df957328b18baa731307c66cfe8e7a4981df65.tar.gz |
btrfs: Go readonly on bad extent refs in update_ref_for_cow()
update_ref_for_cow() will BUG_ON() after it's call to
btrfs_lookup_extent_info() if no existing references are found. Since refs
are computed directly from disk, this should be treated as a corruption
instead of a logic error.
Signed-off-by: Mark Fasheh <mfasheh@suse.de>
Diffstat (limited to 'fs/btrfs')
-rw-r--r-- | fs/btrfs/ctree.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index e2e43c0..3b767d2 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c @@ -333,7 +333,11 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans, buf->len, &refs, &flags); if (ret) return ret; - BUG_ON(refs == 0); + if (refs == 0) { + ret = -EROFS; + btrfs_std_error(root->fs_info, ret); + return ret; + } } else { refs = 1; if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID || |