sys/dev/disk/dm: Add dm-flakey target
authorTomohiro Kusumi <kusumi.tomohiro@gmail.com>
Sun, 15 Nov 2015 10:22:47 +0000 (19:22 +0900)
committerTomohiro Kusumi <kusumi.tomohiro@gmail.com>
Thu, 19 Nov 2015 12:24:22 +0000 (21:24 +0900)
commitb9790952d463c74d2706f84a3b2b5e035eb3059b
treecc09be0cb0b2c5f20d16ada39f7a35549d8cbbae
parentc8e73ea203dc8297237463e8703f5beaa554eb87
sys/dev/disk/dm: Add dm-flakey target

This commit adds a new dm target dm-flakey.

This target simulates failing devices for testing purposes.
See dm_target_flakey(4) for details.

Note that using this dm target may results in some unstable
status including kernel panic. For example hammer is likely
to cause kernel panic by write data corruption by dm-flakey.
Don't use this target over any block device in production.

  ===== Example1 - Error write I/Os
  # kldload dm_target_flakey
  # dmsetup create flakey1 --table "0 234436482 flakey ${DEV} 0 1 1"
  # newfs_hammer -L TEST /dev/mapper/flakey1
  Volume 0 DEVICE /dev/mapper/flakey1 size 111.79GB
  initialize freemap volume 0
  initializing the undo map (504 MB)
  newfs_hammer: Write volume 0 (/dev/mapper/flakey1): Input/output error
  # dmsetup remove /dev/mapper/flakey1

  ===== Example2 - Silently drop write I/Os
  # newfs_hammer -L TEST ${DEV} > /dev/null
  # mount_hammer ${DEV} /HAMMER
  # cd /HAMMER
  # git clone /usr/local/src/dragonfly
  Cloning into 'dragonfly'...
  done.
  Checking out files: 100% (34434/34434), done.
  # cd
  # umount /HAMMER
  # dmsetup create flakey2 --table "0 234436482 flakey ${DEV} 0 1 1 1 drop_writes"
  # mount_hammer /dev/mapper/flakey2 /HAMMER
  # dmesg | tail -3
  HAMMER() Critical error inode=-1 error=5 while flushing meta-data
  HAMMER() Forcing read-only mode
  HAMMER(TEST) mounted clean, no recovery needed
  # hammer volume-list /HAMMER
  /dev/mapper/flakey2
  # mount | grep "/HAMMER"
  TEST on /HAMMER (hammer, local, read-only)
  # cd /HAMMER/dragonfly
  # git log -p > /dev/null; echo $?
  0
  # cd
  # umount /HAMMER
  # dmsetup remove /dev/mapper/flakey2

  ===== Example3 - Corrupt read I/Os
  # dd if=/dev/zero of=${DEV} bs=1024 count=10000 >/dev/null 2>&1
  # dmsetup create flakey3 --table "0 234436482 flakey ${DEV} 0 1 1 5 corrupt_bio_byte 1 r 65 0"
  # od -tx1 /dev/mapper/flakey3 | head -10
  0000000    41  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
  0000020    00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
  *
  0010000    41  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
  0010020    00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
  *
  0020000    41  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
  0020020    00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
  *
  0030000    41  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
  # dmsetup remove /dev/mapper/flakey3
  # kldunload dm_target_flakey
share/man/man4/Makefile
share/man/man4/dm_target_flakey.4 [new file with mode: 0644]
sys/conf/files
sys/config/LINT64
sys/dev/disk/dm/dm.h
sys/dev/disk/dm/targets/Makefile
sys/dev/disk/dm/targets/flakey/Makefile [new file with mode: 0644]
sys/dev/disk/dm/targets/flakey/dm_target_flakey.c [new file with mode: 0644]