linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] fstests: test device reappearance with new maj:min
@ 2025-09-18  0:32 Anand Jain
  2025-09-18  0:32 ` [PATCH 1/2] common/rc: helper functions to handle block devices via sysfs Anand Jain
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Anand Jain @ 2025-09-18  0:32 UTC (permalink / raw)
  To: fstests; +Cc: linux-btrfs

From: Anand Jain <anand.jain@oracle.com>

Tests filesystem behavior when a device reappears with a different
MAJ:MIN after a block layer transport failure.

Anand Jain (2):
  common/rc: helper functions to handle block devices via sysfs
  generic: test case for reappearing device

 common/rc             | 26 ++++++++++++++++
 tests/generic/809     | 72 +++++++++++++++++++++++++++++++++++++++++++
 tests/generic/809.out |  2 ++
 3 files changed, 100 insertions(+)
 create mode 100755 tests/generic/809
 create mode 100644 tests/generic/809.out

-- 
2.51.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/2] common/rc: helper functions to handle block devices via sysfs
  2025-09-18  0:32 [PATCH 0/2] fstests: test device reappearance with new maj:min Anand Jain
@ 2025-09-18  0:32 ` Anand Jain
  2025-09-26 15:57   ` Zorro Lang
  2025-09-18  0:32 ` [PATCH 2/2] generic: test case for reappearing device Anand Jain
  2025-09-18 17:15 ` [PATCH 0/2] fstests: test device reappearance with new maj:min Neal Gompa
  2 siblings, 1 reply; 6+ messages in thread
From: Anand Jain @ 2025-09-18  0:32 UTC (permalink / raw)
  To: fstests; +Cc: linux-btrfs

From: Anand Jain <anand.jain@oracle.com>

_bdev_handle(dev)
	get sysfs handle for a given block device.

_has_bdev_sysfs_delete(dev_path)
	Checks if the block device supports sysfs-based delete.

_require_scratch_bdev_delete()
	Test if the scratch device does not support sysfs delete.

Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
 common/rc | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/common/rc b/common/rc
index 81587dad500c..627ddcc02fb8 100644
--- a/common/rc
+++ b/common/rc
@@ -4388,6 +4388,32 @@ _get_file_extent_sector()
 	echo "$result"
 }
 
+_bdev_handle()
+{
+	local device=$(echo $1 | rev | cut -d"/" -f1 | rev)
+
+	test -e /sys/class/block/${device}/device/scsi_disk/ || \
+			_notrun "Failed to obtain sys block handle"
+
+	ls /sys/class/block/${device}/device/scsi_disk/
+}
+
+_has_bdev_sysfs_delete()
+{
+	local dev_path=$1
+	local device=$(echo $dev_path | rev | cut -d"/" -f1 | rev)
+	local delete_path=/sys/class/block/${device}/device/delete
+
+	test -e $delete_path
+}
+
+_require_scratch_bdev_delete()
+{
+	if ! _has_bdev_sysfs_delete $SCRATCH_DEV; then
+		_notrun "require scratch device sys delete support"
+	fi
+}
+
 # arg 1 is dev to remove and is output of the below eg.
 # ls -l /sys/class/block/sdd | rev | cut -d "/" -f 3 | rev
 _devmgt_remove()
-- 
2.51.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/2] generic: test case for reappearing device
  2025-09-18  0:32 [PATCH 0/2] fstests: test device reappearance with new maj:min Anand Jain
  2025-09-18  0:32 ` [PATCH 1/2] common/rc: helper functions to handle block devices via sysfs Anand Jain
@ 2025-09-18  0:32 ` Anand Jain
  2025-09-18 17:15 ` [PATCH 0/2] fstests: test device reappearance with new maj:min Neal Gompa
  2 siblings, 0 replies; 6+ messages in thread
From: Anand Jain @ 2025-09-18  0:32 UTC (permalink / raw)
  To: fstests; +Cc: linux-btrfs

From: Anand Jain <anand.jain@oracle.com>

Tests how the filesystem handles a device that reappears with a different
MAJ:MIN due to a block layer transport failure.

Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
 tests/generic/809     | 72 +++++++++++++++++++++++++++++++++++++++++++
 tests/generic/809.out |  2 ++
 2 files changed, 74 insertions(+)
 create mode 100755 tests/generic/809
 create mode 100644 tests/generic/809.out

diff --git a/tests/generic/809 b/tests/generic/809
new file mode 100755
index 000000000000..3e9943f9ac85
--- /dev/null
+++ b/tests/generic/809
@@ -0,0 +1,72 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2024 Oracle.  All Rights Reserved.
+#
+# FS QA Test 809
+#
+# Tests how the filesystem handles a device that reappears with a different
+# MAJ:MIN while the old MAJ:MIN is still mounted and in use, due to a block
+# layer transport failure.
+
+. ./common/preamble
+
+_begin_fstest auto quick tempfsid shutdown
+
+_cleanup()
+{
+	local new_blk_handle
+
+	cd /
+	rm -r -f $tmp.*
+	$UMOUNT_PROG $mnt1 &> /dev/null
+	$UMOUNT_PROG $SCRATCH_MNT &> /dev/null
+
+	if [[ ! -b $new_scratch_dev ]]; then
+		echo "_cleanup: failed to restore the scratch device."
+		return
+	fi
+	new_blk_handle=$(_bdev_handle $new_scratch_dev)
+	_devmgt_remove  $new_blk_handle $new_scratch_dev
+	_devmgt_add $new_blk_handle
+
+	[[ -b $SCRATCH_DEV ]] || \
+		echo "_cleanup: failed to restore scratch device."
+}
+
+_require_test
+_require_scratch
+_require_scratch_bdev_delete
+
+mnt1=$TEST_DIR/$seq/mnt1
+rm -r -f $mnt1
+mkdir -p $mnt1
+
+_scratch_mkfs >> /dev/null
+_scratch_mount
+
+$XFS_IO_PROG -fc 'pwrite -S 0x61 0 9000' $SCRATCH_MNT/foo >> $seqres.full
+_mount $SCRATCH_DEV $mnt1
+$UMOUNT_PROG $mnt1
+
+# Ensure data is flushed to disk before the device disappears
+sync
+
+id1=$(lsblk -ndo MAJ:MIN $SCRATCH_DEV)
+scratch_fsid=$(blkid --probe --match-tag UUID $SCRATCH_DEV | \
+	$AWK_PROG '{print $2}' | sed -e 's/UUID=//g' | sed -e 's/\"//g')
+blk_handle=$(_bdev_handle $SCRATCH_DEV)
+_devmgt_remove  $blk_handle $SCRATCH_DEV
+_devmgt_add $blk_handle
+new_scratch_dev=$(blkid -l -o device -t UUID=$scratch_fsid)
+id2=$(lsblk -ndo MAJ:MIN $new_scratch_dev)
+[[ -b $new_scratch_dev ]] || _fail "Device failed to reappear"
+[[ "$id1" != "$id2" ]] || \
+		_not_run "Device cannot reappear with a different major:minor"
+
+# Mount the reappeared device while the old node is still mounted
+# (not supported on XFS).
+[[ $FSTYP == "xfs" ]] && $UMOUNT_PROG $SCRATCH_MNT
+_mount $new_scratch_dev $mnt1
+echo Silence is golden
+status=0
+exit
diff --git a/tests/generic/809.out b/tests/generic/809.out
new file mode 100644
index 000000000000..e90865ca8f8c
--- /dev/null
+++ b/tests/generic/809.out
@@ -0,0 +1,2 @@
+QA output created by 809
+Silence is golden
-- 
2.51.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/2] fstests: test device reappearance with new maj:min
  2025-09-18  0:32 [PATCH 0/2] fstests: test device reappearance with new maj:min Anand Jain
  2025-09-18  0:32 ` [PATCH 1/2] common/rc: helper functions to handle block devices via sysfs Anand Jain
  2025-09-18  0:32 ` [PATCH 2/2] generic: test case for reappearing device Anand Jain
@ 2025-09-18 17:15 ` Neal Gompa
  2 siblings, 0 replies; 6+ messages in thread
From: Neal Gompa @ 2025-09-18 17:15 UTC (permalink / raw)
  To: Anand Jain; +Cc: fstests, linux-btrfs

On Wed, Sep 17, 2025 at 8:33 PM Anand Jain <anajain.sg@gmail.com> wrote:
>
> From: Anand Jain <anand.jain@oracle.com>
>
> Tests filesystem behavior when a device reappears with a different
> MAJ:MIN after a block layer transport failure.
>
> Anand Jain (2):
>   common/rc: helper functions to handle block devices via sysfs
>   generic: test case for reappearing device
>
>  common/rc             | 26 ++++++++++++++++
>  tests/generic/809     | 72 +++++++++++++++++++++++++++++++++++++++++++
>  tests/generic/809.out |  2 ++
>  3 files changed, 100 insertions(+)
>  create mode 100755 tests/generic/809
>  create mode 100644 tests/generic/809.out
>
> --
> 2.51.0
>

This series looks good to me.

Reviewed-by: Neal Gompa <neal@gompa.dev>


-- 
真実はいつも一つ!/ Always, there's only one truth!

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] common/rc: helper functions to handle block devices via sysfs
  2025-09-18  0:32 ` [PATCH 1/2] common/rc: helper functions to handle block devices via sysfs Anand Jain
@ 2025-09-26 15:57   ` Zorro Lang
  2025-09-30  3:47     ` Anand Jain
  0 siblings, 1 reply; 6+ messages in thread
From: Zorro Lang @ 2025-09-26 15:57 UTC (permalink / raw)
  To: Anand Jain; +Cc: fstests, linux-btrfs

On Thu, Sep 18, 2025 at 08:32:46AM +0800, Anand Jain wrote:
> From: Anand Jain <anand.jain@oracle.com>
> 
> _bdev_handle(dev)
> 	get sysfs handle for a given block device.
> 
> _has_bdev_sysfs_delete(dev_path)
> 	Checks if the block device supports sysfs-based delete.
> 
> _require_scratch_bdev_delete()
> 	Test if the scratch device does not support sysfs delete.
> 
> Signed-off-by: Anand Jain <anand.jain@oracle.com>
> ---
>  common/rc | 26 ++++++++++++++++++++++++++
>  1 file changed, 26 insertions(+)
> 
> diff --git a/common/rc b/common/rc
> index 81587dad500c..627ddcc02fb8 100644
> --- a/common/rc
> +++ b/common/rc
> @@ -4388,6 +4388,32 @@ _get_file_extent_sector()
>  	echo "$result"
>  }
>  
> +_bdev_handle()
> +{
> +	local device=$(echo $1 | rev | cut -d"/" -f1 | rev)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

basename $1 ?

if you hope to make sure it's not link, you can

basename $(_real_dev $1)

> +
> +	test -e /sys/class/block/${device}/device/scsi_disk/ || \
> +			_notrun "Failed to obtain sys block handle"
> +
> +	ls /sys/class/block/${device}/device/scsi_disk/
> +}
> +
> +_has_bdev_sysfs_delete()
> +{
> +	local dev_path=$1
> +	local device=$(echo $dev_path | rev | cut -d"/" -f1 | rev)
> +	local delete_path=/sys/class/block/${device}/device/delete
> +
> +	test -e $delete_path
> +}
> +
> +_require_scratch_bdev_delete()
> +{

I'm wondering if it's better to call "_require_block_device" at first, before
checking the /sys ?

> +	if ! _has_bdev_sysfs_delete $SCRATCH_DEV; then
> +		_notrun "require scratch device sys delete support"
> +	fi
> +}
> +
>  # arg 1 is dev to remove and is output of the below eg.
>  # ls -l /sys/class/block/sdd | rev | cut -d "/" -f 3 | rev
>  _devmgt_remove()
> -- 
> 2.51.0
> 
> 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] common/rc: helper functions to handle block devices via sysfs
  2025-09-26 15:57   ` Zorro Lang
@ 2025-09-30  3:47     ` Anand Jain
  0 siblings, 0 replies; 6+ messages in thread
From: Anand Jain @ 2025-09-30  3:47 UTC (permalink / raw)
  To: Zorro Lang; +Cc: fstests, linux-btrfs

On 26/9/25 23:57, Zorro Lang wrote:
> On Thu, Sep 18, 2025 at 08:32:46AM +0800, Anand Jain wrote:
>> From: Anand Jain <anand.jain@oracle.com>
>>
>> _bdev_handle(dev)
>>      get sysfs handle for a given block device.
>>
>> _has_bdev_sysfs_delete(dev_path)
>>      Checks if the block device supports sysfs-based delete.
>>
>> _require_scratch_bdev_delete()
>>      Test if the scratch device does not support sysfs delete.
>>
>> Signed-off-by: Anand Jain <anand.jain@oracle.com>
>> ---
>>   common/rc | 26 ++++++++++++++++++++++++++
>>   1 file changed, 26 insertions(+)
>>
>> diff --git a/common/rc b/common/rc
>> index 81587dad500c..627ddcc02fb8 100644
>> --- a/common/rc
>> +++ b/common/rc
>> @@ -4388,6 +4388,32 @@ _get_file_extent_sector()
>>      echo "$result"
>>   }
>>
>> +_bdev_handle()
>> +{
>> +    local device=$(echo $1 | rev | cut -d"/" -f1 | rev)
>                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>
> basename $1 ?
>
> if you hope to make sure it's not link, you can
>

> basename $(_real_dev $1)

Whoops, not sure what I was thinking. There's actually a helper for
this, _short_dev().
The changes below will fix it. I can send v2 if needed, unless it can
be fixed at merge
time. Let me know what works best.
-----------------------------------
$ git diff
diff --git a/common/rc b/common/rc
index 627ddcc02fb8..085fab6e34f0 100644
--- a/common/rc
+++ b/common/rc
@@ -4390,7 +4390,7 @@ _get_file_extent_sector()

 _bdev_handle()
 {
-       local device=$(echo $1 | rev | cut -d"/" -f1 | rev)
+       local device=$(_short_dev $1)

        test -e /sys/class/block/${device}/device/scsi_disk/ || \
                        _notrun "Failed to obtain sys block handle"
@@ -4401,7 +4401,7 @@ _bdev_handle()
 _has_bdev_sysfs_delete()
 {
        local dev_path=$1
-       local device=$(echo $dev_path | rev | cut -d"/" -f1 | rev)
+       local device=$(_short_dev $1)
        local delete_path=/sys/class/block/${device}/device/delete

        test -e $delete_path
---------------------------------------------


>> +
>> +    test -e /sys/class/block/${device}/device/scsi_disk/ || \
>> +                    _notrun "Failed to obtain sys block handle"
>> +
>> +    ls /sys/class/block/${device}/device/scsi_disk/
>> +}
>> +
>> +_has_bdev_sysfs_delete()
>> +{
>> +    local dev_path=$1
>> +    local device=$(echo $dev_path | rev | cut -d"/" -f1 | rev)
>> +    local delete_path=/sys/class/block/${device}/device/delete
>> +
>> +    test -e $delete_path
>> +}
>> +
>> +_require_scratch_bdev_delete()
>> +{
>
> I'm wondering if it's better to call "_require_block_device" at first, before
> checking the /sys ?

There’s no harm in using _require_block_device() here, but I don’t
think it will help,
a non block device won't reach this place anyway.
config: _check_device() will fail for non-block devices.

Thanks, Anand

>> +    if ! _has_bdev_sysfs_delete $SCRATCH_DEV; then
>> +            _notrun "require scratch device sys delete support"
>> +    fi
>> +}
>> +
>>   # arg 1 is dev to remove and is output of the below eg.
>>   # ls -l /sys/class/block/sdd | rev | cut -d "/" -f 3 | rev
>>   _devmgt_remove()
>> --
>> 2.51.0
>>
>>
>

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2025-09-30  3:47 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-18  0:32 [PATCH 0/2] fstests: test device reappearance with new maj:min Anand Jain
2025-09-18  0:32 ` [PATCH 1/2] common/rc: helper functions to handle block devices via sysfs Anand Jain
2025-09-26 15:57   ` Zorro Lang
2025-09-30  3:47     ` Anand Jain
2025-09-18  0:32 ` [PATCH 2/2] generic: test case for reappearing device Anand Jain
2025-09-18 17:15 ` [PATCH 0/2] fstests: test device reappearance with new maj:min Neal Gompa

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).