• Zheng Liu's avatar
    bcache: clear BCACHE_DEV_UNLINK_DONE flag when attaching a backing device · 1ebc8501
    Zheng Liu authored
    commit fecaee6f upstream.
    
    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: default avatarZheng Liu <wenqing.lz@taobao.com>
    Tested-by: default avatarJoshua Schmid <jschmid@suse.com>
    Tested-by: default avatarEric Wheeler <bcache@linux.ewheeler.net>
    Cc: Kent Overstreet <kmo@daterainc.com>
    Signed-off-by: default avatarJens Axboe <axboe@fb.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    1ebc8501
super.c 49.5 KB