Comment 0 for bug 1377142

Revision history for this message
Kick In (kick-d) wrote : Bcache don't allow full unregistering without rebooting

If you create a bcache device, you can't reuse all your disk/partitions without a reboot.

You can reproduce the case this way:

start a vm with 2 disks (caching must be bigger or equal to the backing cf bug :1377130) and an iso of utopic desktop amd64

create the bcache device:

  make-bcache --writeback --discard -C /dev/sda -B /dev/sdb

  UUID: b245150d-cfbe-4f90-836a-343e0e1a4c55
  Set UUID: c990a31a-f531-4231-9603-d40230dc6504
  version: 0
  nbuckets: 16384
  block_size: 1
  bucket_size: 1024
  nr_in_set: 1
  nr_this_dev: 0
  first_bucket: 1
  UUID: cc31e0bb-db29-4115-a1b2-e9ff54e5f127
  Set UUID: c990a31a-f531-4231-9603-d40230dc6504
  version: 1
  block_size: 1
  data_offset: 16

  ******************************
  command:
  lsblk

  result:
  NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  sda 8:0 0 8G 0 disk
  └─bcache0 251:0 0 16G 0 disk
  sdb 8:16 0 16G 0 disk
  └─bcache0 251:0 0 16G 0 disk
  sr0 11:0 1 1,1G 0 rom /cdrom
  loop0 7:0 0 1,1G 1 loop /rofs
  ******************************

All is good

  lsmod | grep bcache:
  bcache 227884 3

format the bcache device:

  ******************************
  command:
  mkfs.ext4 /dev/bcache0

  result:
  Rejet des blocs de périphérique : 4096/4194302 complété
  Creating filesystem with 4194302 4k blocks and 1048576 inodes
  Filesystem UUID: 587d2249-3eaf-4590-a00d-42939f257e99
  Superblocs de secours stockés sur les blocs :
   32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
   4096000

  Allocation des tables de groupe : 0/128 complété
  Écriture des tables d'i-noeuds : 0/128 complété
  Création du journal (32768 blocs) : complété
  Écriture des superblocs et de l'information de comptabilité du système de
  fichiers : 0/128 2/128 complété

  ******************************

Now mount it:
  mount /dev/bcache0 /mnt/
  mkdir /mnt/test_dir
  touch /mnt/test_file

state of: /sys/fs/bcache/
  ls /sys/fs/bcache/

  c990a31a-f531-4231-9603-d40230dc6504
  register
  register_quiet

bcache-super-show /dev/sda
  sb.magic ok
  sb.first_sector 8 [match]
  sb.csum E6A8D9AC496B0B04 [match]
  sb.version 3 [cache device]

  dev.label (empty)
  dev.uuid b245150d-cfbe-4f90-836a-343e0e1a4c55
  dev.sectors_per_block 1
  dev.sectors_per_bucket 1024
  dev.cache.first_sector 1024
  dev.cache.cache_sectors 16776192
  dev.cache.total_sectors 16777216
  dev.cache.ordered yes
  dev.cache.discard yes
  dev.cache.pos 0
  dev.cache.replacement 0 [lru]

  cset.uuid c990a31a-f531-4231-9603-d40230dc6504
  ******************************

bcache-super-show -f /dev/sdb

  sb.magic ok
  sb.first_sector 8 [match]
  sb.csum 9600B159F36A67DD [match]
  sb.version 1 [backing device]

  dev.label (empty)
  dev.uuid cc31e0bb-db29-4115-a1b2-e9ff54e5f127
  dev.sectors_per_block 1
  dev.sectors_per_bucket 1024
  dev.data.first_sector 16
  dev.data.cache_mode 1 [writeback]
  dev.data.cache_state 2 [dirty]

  cset.uuid c990a31a-f531-4231-9603-d40230dc6504
  ******************************

mount:
  /dev/bcache0 on /mnt type ext4 (rw)

we will unregister the bcache:
  echo 1 /sys/fs/bcache/c990a31a-f531-4231-9603-d40230dc6504/unregister

check the content of /sys/fs/bcache
  ls /sys/fs/bcache/

  register
  register_quiet

So bcache is unregistered, but status of /dev/sda:

  bcache-super-show -f /dev/sda
  sb.magic ok
  sb.first_sector 8 [match]
  sb.csum E6A8D9AC496B0B04 [match]
  sb.version 3 [cache device]

  dev.label (empty)
  dev.uuid b245150d-cfbe-4f90-836a-343e0e1a4c55
  dev.sectors_per_block 1
  dev.sectors_per_bucket 1024
  dev.cache.first_sector 1024
  dev.cache.cache_sectors 16776192
  dev.cache.total_sectors 16777216
  dev.cache.ordered yes
  dev.cache.discard yes
  dev.cache.pos 0
  dev.cache.replacement 0 [lru]

  cset.uuid c990a31a-f531-4231-9603-d40230dc6504

  command:
  bcache-super-show -f /dev/sdb

  result:
  sb.magic ok
  sb.first_sector 8 [match]
  sb.csum D41799F794675FA8 [match]
  sb.version 1 [backing device]

  dev.label (empty)
  dev.uuid cc31e0bb-db29-4115-a1b2-e9ff54e5f127
  dev.sectors_per_block 1
  dev.sectors_per_bucket 1024
  dev.data.first_sector 16
  dev.data.cache_mode 1 [writeback]
  dev.data.cache_state 0 [detached]

  cset.uuid 00000000-0000-0000-0000-000000000000
  ******************************

Maybe I'm wrong, but I would expect the cahing device to be 000000000ed not the backing device, as we may still want to use the data on it.

But data is still accessible on the mount point.

  So we wipe /dev/sda now:
  ******************************
  command:
  wipefs -a /dev/sda

  result:
  /dev/sda: 16 bytes were erased at offset 0x00001018 (bcache): c6 85 73 f6 4e 1a 45 ca 82 65 f5 7f 48 ba 6d 81
  ******************************

mount:
  /dev/bcache0 on /mnt type ext4 (rw)

data still there:
  ******************************
  command:
  ls /mnt/

  result:
  lost+found
  test_dir
  test_file
  ******************************

  ******************************
  command:
  lsblk

  result:
  NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  sda 8:0 0 8G 0 disk
  sdb 8:16 0 16G 0 disk
  └─bcache0 251:0 0 16G 0 disk /mnt
  sr0 11:0 1 1,1G 0 rom /cdrom
  loop0 7:0 0 1,1G 1 loop /rofs
  ******************************

Ok now we can backup our data if we need to, next, we will umount:
  umount /mnt/

ok no errors.

  lsblk:
  NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  sda 8:0 0 8G 0 disk
  sdb 8:16 0 16G 0 disk
  └─bcache0 251:0 0 16G 0 disk
  sr0 11:0 1 1,1G 0 rom /cdrom
  loop0 7:0 0 1,1G 1 loop /rofs
  ******************************

bcache0 is still there, ok, but how to delete to unregister it definitively?

  ls /sys/fs/bcache/

  result:
  register
  register_quiet
  **************

  lsmod

  result:
  Module Size Used by
  bcache 227884 1

we can't wipefs -a /dev/sdb, device is in use, so we reboot machine (NOT OK)

  in the vm:
  ls /sys/fs/bcache/

  result:
  register
  register_quiet

update packages and reinstall bcache-tools:

  bcache-super-show -f /dev/sda

  result:
  Invalid superblock (bad magic)
  sb.magic bad magic

  bcache-super-show -f /dev/sdb

  result:
  sb.magic ok
  sb.first_sector 8 [match]
  sb.csum D41799F794675FA8 [match]
  sb.version 1 [backing device]

  dev.label (empty)
  dev.uuid cc31e0bb-db29-4115-a1b2-e9ff54e5f127
  dev.sectors_per_block 1
  dev.sectors_per_bucket 1024
  dev.data.first_sector 16
  dev.data.cache_mode 1 [writeback]
  dev.data.cache_state 0 [detached]

  cset.uuid 00000000-0000-0000-0000-000000000000

Now we can wipe /dev/sdb because we rebooted, and bcache don't use the device anymore:
  wipefs -a /dev/sdb

  result:
  /dev/sdb: 16 bytes were erased at offset 0x00001018 (bcache): c6 85 73 f6 4e 1a 45 ca 82 65 f5 7f 48 ba 6d 81

  **********************************************************

Now I can re-use my device, but I needed a reboot. Maybe we must also have better bcache management tools also.