commit b9790952d463c74d2706f84a3b2b5e035eb3059b Author: Tomohiro Kusumi <kusumi.tomoh...@gmail.com> Date: Sun Nov 15 19:22:47 2015 +0900
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 Summary of changes: share/man/man4/Makefile | 1 + .../man4/{dm_target_delay.4 => dm_target_flakey.4} | 74 +++- sys/conf/files | 1 + sys/config/LINT64 | 1 + sys/dev/disk/dm/dm.h | 1 + sys/dev/disk/dm/targets/Makefile | 2 +- sys/dev/disk/dm/targets/flakey/Makefile | 5 + sys/dev/disk/dm/targets/flakey/dm_target_flakey.c | 411 +++++++++++++++++++++ 8 files changed, 481 insertions(+), 15 deletions(-) copy share/man/man4/{dm_target_delay.4 => dm_target_flakey.4} (50%) create mode 100644 sys/dev/disk/dm/targets/flakey/Makefile create mode 100644 sys/dev/disk/dm/targets/flakey/dm_target_flakey.c http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/b9790952d463c74d2706f84a3b2b5e035eb3059b -- DragonFly BSD source repository