[ +cc Heinz, Mikulas ] > > On Tue, 5 Dec 2023, Joe Thornber wrote: > > > Hi Eric, > > > > > > I just released v1.0.8 of the thinp tools: > > > > > > https://github.com/jthornber/thin-provisioning-tools > > > > Interesting, so do these tools play a role in the kernel somehow (ie, > > kernel rust), or is this just userspace testing? > > The tools issue IO. LVM runs thin_check during one of the lvcreate > calls in your reproducer script. The way the tools were issuing io was > triggering the dm-integrity error. The fact that it then hung we > currently believe is an md kernel bug. Mikulas and Heinz are looking > into it. Hi Mikulas and Heinz, Joe mentioned that you were looking into this. Have you been able to figure out what might be causing the strange md<=>dm-integrity interaction in the kernel? -Eric > On Fri, 1 Dec 2023, David Teigland wrote: > > On Thu, Nov 30, 2023 at 04:40:00PM -0800, Eric Wheeler wrote: > > > integritysetup format $idev0 --integrity xxhash64 --batch-mode > > > integritysetup format $idev1 --integrity xxhash64 --batch-mode > > > > > > integritysetup open --integrity xxhash64 --allow-discards $idev0 dm-integrity0 > > > integritysetup open --integrity xxhash64 --allow-discards $idev1 dm-integrity1 > > > > > > mdadm --create $MD_DEV --metadata=1.2 --assume-clean --level=1 --raid-devices=2 /dev/mapper/dm-integrity[01] > > > > > > # 1. This should be enough to trigger it: > > > SSD_DEV=$MD_DEV > > > > > > # 2. If not, then wrap /dev/md9 in a linear target: > > > #linear_add ssd $MD_DEV > > > #SSD_DEV=/dev/mapper/ssd > > > > Interesting that just adding a linear layer there would have some effect. > > Its seemed (sometimes) to be the difference between triggering on the > first instead of the second iteration. Without the linear wrap, it would > sometimes not crash until the second loop, typically on `lvchange -an > testvg`. Maybe the extra linear hop delayed the IO just enough to help > with the race, but that is only speculation. > > > > # Create a writable header for the PV meta: > > > dd if=/dev/zero bs=1M count=16 oflag=direct of=/tmp/pvheader > > > loop=`losetup -f --show /tmp/pvheader` > > > linear_add pv $loop /dev/nullb0 > > > > > > # Create the VG > > > lvmdevices --adddev $SSD_DEV > > > lvmdevices --adddev /dev/mapper/pv > > > vgcreate $VGNAME /dev/mapper/pv $SSD_DEV > > > > > > # Create the pool: > > > lvcreate -n pool0 -L 1T $VGNAME /dev/mapper/pv > > > lvcreate -n meta0 -L 512m $VGNAME $SSD_DEV > > > > > > # Make sure the meta volume is on the SSD (it should be already from above): > > > pvmove -n meta0 /dev/mapper/pv > > > > I'd omit that pvmove if possible just in case it makes some unexpected > > change. You have more than enough layers to complicate things as it is > > without pvmove adding dm-mirror to the mix. > > Good point. Since we specify the PV with `lvcreate ... $SSD_DEV`, the > pvmove isn't necessary at all. (Specifying the PV on lvcreate was added > later, pvmove was leftover from earlier testing.) > > > > > > lvconvert -y --force --force --chunksize 64k --type thin-pool --poolmetadata $VGNAME/meta0 $VGNAME/pool0 > > > > It's not a bad idea to use mdraid over dm-integrity, but it would be > > interesting to know if doing raid+integrity in lvm would have the same > > problems. e.g. > > > > > > lvcreate --type raid1 --raidintegrity y -m1 -L 512m -n meta0 $vg /dev/ram[01] > > lvcreate -n pool0 -L 1T $vg /dev/nullb0 > > lvconvert --type thin-pool --poolmetadata meta0 $vg/pool0 > > Good idea! As it turns out, that crashes just as easily. Here is the > script with LVM based RAID1, which is somewhat simpler: > > -------------------------------------------------------------------- > #!/bin/bash > > # Notice: /dev/ram0 and /dev/ram1 will be wiped unconditionally. > > # Configure these if you need to: > VGNAME=testvg > LVNAME=thin > LVSIZE=$((10 * 1024*1024*1024/512)) > > echo "NOTICE: THIS MAY BE UNSAFE. ONLY RUN THIS IN A TEST ENVIRONMENT!" > echo "Press enter twice to continue or CTRL-C to abort." > > read > read > > set -x > > > # append disks into a linear target > linear_add() > { > name=$1 > shift > > prevsize=0 > for vol in "$@"; do > size=`blockdev --getsize $vol` > echo "$prevsize $size linear $vol 0" > prevsize=$size > done \ > | dmsetup create $name > > echo /dev/mapper/$name > } > > lvthin_add() > { > id=$1 > lvcreate -An -V $LVSIZE -n $LVNAME$id --thinpool pool0 $VGNAME >&2 > echo /dev/$VGNAME/$LVNAME$id > } > > lvthin_snapshot() > { > origin=$1 > id=$2 > > lvcreate -An -s $VGNAME/$LVNAME$origin -n $LVNAME$id >&2 > echo /dev/$VGNAME/$LVNAME$id > } > > fio() > { > dev=$1 > /bin/fio --name=$dev --rw=randrw --direct=1 --bs=512 --numjobs=1 --filename=$dev --time_based --runtime=$FIOTIME --ioengine=libaio --iodepth=1 &> /dev/null > } > > do_reset() > { > killall -9 fio > lvchange -an $VGNAME > rmdir /dev/$VGNAME > dmsetup remove pv > lvmdevices --deldev /dev/mapper/pv > losetup -d /dev/loop? > rmmod brd > rmmod null_blk > echo ==== reset done > sleep 1 > } > > do_init() > { > modprobe null_blk gb=30000 bs=512 > > ramsize_gb=1 > modprobe brd rd_size=$(($ramsize_gb * 1024*1024)) rd_nr=2 > > # Create a writable header for the PV meta: > dd if=/dev/zero bs=1M count=16 oflag=direct of=/tmp/pvheader > loop=`losetup -f --show /tmp/pvheader` > linear_add pv $loop /dev/nullb0 > > # Create the VG > lvmdevices --adddev /dev/ram0 > lvmdevices --adddev /dev/ram1 > lvmdevices --adddev /dev/mapper/pv > vgcreate $VGNAME /dev/mapper/pv /dev/ram[01] > > # Create the pool: > lvcreate -n pool0 -L 1T $VGNAME /dev/mapper/pv > lvcreate --type raid1 --raidintegrity y -m1 -L 512m -n meta0 $VGNAME /dev/ram[01] > > lvconvert -y --force --force --chunksize 64k --type thin-pool --poolmetadata $VGNAME/meta0 $VGNAME/pool0 > } > > > while true; do > do_reset > do_init > > thin1=`lvthin_add 1` > fio $thin1 & > > thin2=`lvthin_snapshot 1 2` > fio $thin2 & > > wait > > done > > >