110 lines
5.3 KiB
Diff
110 lines
5.3 KiB
Diff
From: Zheng Liu <wenqing.lz@taobao.com>
|
|
Date: Sun, 29 Nov 2015 17:19:32 -0800
|
|
Subject: [3/8] bcache: clear BCACHE_DEV_UNLINK_DONE flag when attaching a
|
|
backing device
|
|
Origin: https://git.kernel.org/cgit/linux/kernel/git/axboe/linux-block.git/commit?id=fecaee6f20ee122ad75402c53d8278f9bb142ddc
|
|
|
|
This bug can be reproduced by the following script:
|
|
|
|
#!/bin/bash
|
|
|
|
bcache_sysfs="/sys/fs/bcache"
|
|
|
|
function clear_cache()
|
|
{
|
|
if [ ! -e $bcache_sysfs ]; then
|
|
echo "no bcache sysfs"
|
|
exit
|
|
fi
|
|
|
|
cset_uuid=$(ls -l $bcache_sysfs|head -n 2|tail -n 1|awk '{print $9}')
|
|
sudo sh -c "echo $cset_uuid > /sys/block/sdb/sdb1/bcache/detach"
|
|
sleep 5
|
|
sudo sh -c "echo $cset_uuid > /sys/block/sdb/sdb1/bcache/attach"
|
|
}
|
|
|
|
for ((i=0;i<10;i++)); do
|
|
clear_cache
|
|
done
|
|
|
|
The warning messages look like below:
|
|
[ 275.948611] ------------[ cut here ]------------
|
|
[ 275.963840] WARNING: at fs/sysfs/dir.c:512 sysfs_add_one+0xb8/0xd0() (Tainted: P W
|
|
--------------- )
|
|
[ 275.979253] Hardware name: Tecal RH2285
|
|
[ 275.994106] sysfs: cannot create duplicate filename '/devices/pci0000:00/0000:00:09.0/0000:08:00.0/host4/target4:2:1/4:2:1:0/block/sdb/sdb1/bcache/cache'
|
|
[ 276.024105] Modules linked in: bcache tcp_diag inet_diag ipmi_devintf ipmi_si ipmi_msghandler
|
|
bonding 8021q garp stp llc ipv6 ext3 jbd loop sg iomemory_vsl(P) bnx2 microcode serio_raw i2c_i801
|
|
i2c_core iTCO_wdt iTCO_vendor_support i7core_edac edac_core shpchp ext4 jbd2 mbcache megaraid_sas
|
|
pata_acpi ata_generic ata_piix dm_mod [last unloaded: scsi_wait_scan]
|
|
[ 276.072643] Pid: 2765, comm: sh Tainted: P W --------------- 2.6.32 #1
|
|
[ 276.089315] Call Trace:
|
|
[ 276.105801] [<ffffffff81070fe7>] ? warn_slowpath_common+0x87/0xc0
|
|
[ 276.122650] [<ffffffff810710d6>] ? warn_slowpath_fmt+0x46/0x50
|
|
[ 276.139361] [<ffffffff81205c08>] ? sysfs_add_one+0xb8/0xd0
|
|
[ 276.156012] [<ffffffff8120609b>] ? sysfs_do_create_link+0x12b/0x170
|
|
[ 276.172682] [<ffffffff81206113>] ? sysfs_create_link+0x13/0x20
|
|
[ 276.189282] [<ffffffffa03bda21>] ? bcache_device_link+0xc1/0x110 [bcache]
|
|
[ 276.205993] [<ffffffffa03bfa08>] ? bch_cached_dev_attach+0x478/0x4f0 [bcache]
|
|
[ 276.222794] [<ffffffffa03c4a17>] ? bch_cached_dev_store+0x627/0x780 [bcache]
|
|
[ 276.239680] [<ffffffff8116783a>] ? alloc_pages_current+0xaa/0x110
|
|
[ 276.256594] [<ffffffff81203b15>] ? sysfs_write_file+0xe5/0x170
|
|
[ 276.273364] [<ffffffff811887b8>] ? vfs_write+0xb8/0x1a0
|
|
[ 276.290133] [<ffffffff811890b1>] ? sys_write+0x51/0x90
|
|
[ 276.306368] [<ffffffff8100c072>] ? system_call_fastpath+0x16/0x1b
|
|
[ 276.322301] ---[ end trace 9f5d4fcdd0c3edfb ]---
|
|
[ 276.338241] ------------[ cut here ]------------
|
|
[ 276.354109] WARNING: at /home/wenqing.lz/bcache/bcache/super.c:720
|
|
bcache_device_link+0xdf/0x110 [bcache]() (Tainted: P W --------------- )
|
|
[ 276.386017] Hardware name: Tecal RH2285
|
|
[ 276.401430] Couldn't create device <-> cache set symlinks
|
|
[ 276.401759] Modules linked in: bcache tcp_diag inet_diag ipmi_devintf ipmi_si ipmi_msghandler
|
|
bonding 8021q garp stp llc ipv6 ext3 jbd loop sg iomemory_vsl(P) bnx2 microcode serio_raw i2c_i801
|
|
i2c_core iTCO_wdt iTCO_vendor_support i7core_edac edac_core shpchp ext4 jbd2 mbcache megaraid_sas
|
|
pata_acpi ata_generic ata_piix dm_mod [last unloaded: scsi_wait_scan]
|
|
[ 276.465477] Pid: 2765, comm: sh Tainted: P W --------------- 2.6.32 #1
|
|
[ 276.482169] Call Trace:
|
|
[ 276.498610] [<ffffffff81070fe7>] ? warn_slowpath_common+0x87/0xc0
|
|
[ 276.515405] [<ffffffff810710d6>] ? warn_slowpath_fmt+0x46/0x50
|
|
[ 276.532059] [<ffffffffa03bda3f>] ? bcache_device_link+0xdf/0x110 [bcache]
|
|
[ 276.548808] [<ffffffffa03bfa08>] ? bch_cached_dev_attach+0x478/0x4f0 [bcache]
|
|
[ 276.565569] [<ffffffffa03c4a17>] ? bch_cached_dev_store+0x627/0x780 [bcache]
|
|
[ 276.582418] [<ffffffff8116783a>] ? alloc_pages_current+0xaa/0x110
|
|
[ 276.599341] [<ffffffff81203b15>] ? sysfs_write_file+0xe5/0x170
|
|
[ 276.616142] [<ffffffff811887b8>] ? vfs_write+0xb8/0x1a0
|
|
[ 276.632607] [<ffffffff811890b1>] ? sys_write+0x51/0x90
|
|
[ 276.648671] [<ffffffff8100c072>] ? system_call_fastpath+0x16/0x1b
|
|
[ 276.664756] ---[ end trace 9f5d4fcdd0c3edfc ]---
|
|
|
|
We forget to clear BCACHE_DEV_UNLINK_DONE flag in bcache_device_attach()
|
|
function when we attach a backing device first time. After detaching this
|
|
backing device, this flag will be true and sysfs_remove_link() isn't called in
|
|
bcache_device_unlink(). Then when we attach this backing device again,
|
|
sysfs_create_link() will return EEXIST error in bcache_device_link().
|
|
|
|
So the fix is trival and we clear this flag in bcache_device_link().
|
|
|
|
Signed-off-by: Zheng Liu <wenqing.lz@taobao.com>
|
|
Tested-by: Joshua Schmid <jschmid@suse.com>
|
|
Tested-by: Eric Wheeler <bcache@linux.ewheeler.net>
|
|
Cc: Kent Overstreet <kmo@daterainc.com>
|
|
Cc: stable@vger.kernel.org
|
|
Signed-off-by: Jens Axboe <axboe@fb.com>
|
|
---
|
|
drivers/md/bcache/super.c | 2 ++
|
|
1 file changed, 2 insertions(+)
|
|
|
|
diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
|
|
index 679a093..383f060 100644
|
|
--- a/drivers/md/bcache/super.c
|
|
+++ b/drivers/md/bcache/super.c
|
|
@@ -685,6 +685,8 @@ static void bcache_device_link(struct bcache_device *d, struct cache_set *c,
|
|
WARN(sysfs_create_link(&d->kobj, &c->kobj, "cache") ||
|
|
sysfs_create_link(&c->kobj, &d->kobj, d->name),
|
|
"Couldn't create device <-> cache set symlinks");
|
|
+
|
|
+ clear_bit(BCACHE_DEV_UNLINK_DONE, &d->flags);
|
|
}
|
|
|
|
static void bcache_device_detach(struct bcache_device *d)
|