62 lines
2.1 KiB
Diff
62 lines
2.1 KiB
Diff
|
From: Li Zefan <lizf@cn.fujitsu.com>
|
||
|
Date: Wed, 7 Dec 2011 13:12:59 +0800
|
||
|
Patch-mainline: pending
|
||
|
References: FATE#306586
|
||
|
Subject: [PATCH] Btrfs: update global block_rsv when creating a new block
|
||
|
group
|
||
|
|
||
|
A bug was triggered while using seed device:
|
||
|
|
||
|
# mkfs.btrfs /dev/loop1
|
||
|
# btrfstune -S 1 /dev/loop1
|
||
|
# mount -o /dev/loop1 /mnt
|
||
|
# btrfs dev add /dev/loop2 /mnt
|
||
|
|
||
|
btrfs: block rsv returned -28
|
||
|
------------[ cut here ]------------
|
||
|
WARNING: at fs/btrfs/extent-tree.c:5969 btrfs_alloc_free_block+0x166/0x396 [btrfs]()
|
||
|
...
|
||
|
Call Trace:
|
||
|
...
|
||
|
[<f7b7c31c>] btrfs_cow_block+0x101/0x147 [btrfs]
|
||
|
[<f7b7eaa6>] btrfs_search_slot+0x1b8/0x55f [btrfs]
|
||
|
[<f7b7f844>] btrfs_insert_empty_items+0x42/0x7f [btrfs]
|
||
|
[<f7b7f8c1>] btrfs_insert_item+0x40/0x7e [btrfs]
|
||
|
[<f7b8ac02>] btrfs_make_block_group+0x243/0x2aa [btrfs]
|
||
|
[<f7bb3f53>] __btrfs_alloc_chunk+0x672/0x70e [btrfs]
|
||
|
[<f7bb41ff>] init_first_rw_device+0x77/0x13c [btrfs]
|
||
|
[<f7bb5a62>] btrfs_init_new_device+0x664/0x9fd [btrfs]
|
||
|
[<f7bbb65a>] btrfs_ioctl+0x694/0xdbe [btrfs]
|
||
|
[<c04f55f7>] do_vfs_ioctl+0x496/0x4cc
|
||
|
[<c04f5660>] sys_ioctl+0x33/0x4f
|
||
|
[<c07b9edf>] sysenter_do_call+0x12/0x38
|
||
|
---[ end trace 906adac595facc7d ]---
|
||
|
|
||
|
Since seed device is readonly, there's no usable space in the filesystem.
|
||
|
Afterwards we add a sprout device to it, and the kernel creates a METADATA
|
||
|
block group and a SYSTEM block group where comes free space we can reserve,
|
||
|
but we still get revervation failure because the global block_rsv hasn't
|
||
|
been updated accordingly.
|
||
|
|
||
|
Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
|
||
|
Signed-off-by: David Sterba <dsterba@suse.cz>
|
||
|
---
|
||
|
fs/btrfs/extent-tree.c | 1 +
|
||
|
1 files changed, 1 insertions(+), 0 deletions(-)
|
||
|
|
||
|
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
|
||
|
index 8861572..a80efb5 100644
|
||
|
--- a/fs/btrfs/extent-tree.c
|
||
|
+++ b/fs/btrfs/extent-tree.c
|
||
|
@@ -7476,6 +7476,7 @@ int btrfs_make_block_group(struct btrfs_trans_handle *trans,
|
||
|
ret = update_space_info(root->fs_info, cache->flags, size, bytes_used,
|
||
|
&cache->space_info);
|
||
|
BUG_ON(ret);
|
||
|
+ update_global_block_rsv(root->fs_info);
|
||
|
|
||
|
spin_lock(&cache->space_info->lock);
|
||
|
cache->space_info->bytes_readonly += cache->bytes_super;
|
||
|
--
|
||
|
1.7.6.233.gd79bc
|
||
|
|