Re: [PATCH 3/4] xfs/259: try to force loop device block size

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, May 21, 2025 at 03:41:36PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <djwong@xxxxxxxxxx>
> 
> Starting with 6.15-rc1, loop devices created with directio mode enabled
> will set their logical block size to whatever STATX_DIO_ALIGN on the
> host filesystem reports.  If you happen to be running a kernel that
> always sets up loop devices in directio mode and TEST_DEV is a block
> device with 4k sectors, this will cause conflicts with this test's usage
> of mkfs with different block sizes.  Add a helper to force the loop
> device block size to 512 bytes, which is implied by scenarios such as
> "device size is 4T - 2048 bytes".
> 
> Also fix xfs/078 which simply needs the blocksize to be set.
> 
> Signed-off-by: "Darrick J. Wong" <djwong@xxxxxxxxxx>
> ---
>  common/rc         |   22 ++++++++++++++++++++++
>  tests/generic/563 |    1 +
>  tests/xfs/078     |    2 ++
>  tests/xfs/259     |    1 +
>  tests/xfs/613     |    1 +
>  5 files changed, 27 insertions(+)
> 
> 
> diff --git a/common/rc b/common/rc
> index 657772e73db86b..4e3917a298e072 100644
> --- a/common/rc
> +++ b/common/rc
> @@ -4526,6 +4526,28 @@ _create_loop_device()
>  	echo $dev
>  }
>  
> +# Configure the loop device however needed to support the given block size.
> +_force_loop_device_blocksize()
> +{
> +	local loopdev="$1"
> +	local blksize="$2"
> +	local is_dio
> +	local logsec
> +
> +	if [ ! -b "$loopdev" ] || [ -z "$blksize" ]; then
> +		echo "_force_loop_device_blocksize requires loopdev and blksize" >&2
> +		return 1
> +	fi
> +
> +	curr_blksize="$(losetup --list --output LOG-SEC --noheadings --raw "$loopdev")"
> +	if [ "$curr_blksize" -gt "$blksize" ]; then
> +		losetup --direct-io=off "$loopdev"
> +		losetup --sector-size "$blksize" "$loopdev"
> +	fi
> +
> +	#losetup --raw --list "$loopdev" >> $seqres.full
> +}

I think it would make more sense to use a
_create_loop_device_blocksize() wrapper function and change the call
sites to use it that to add this function that requires error
checking of the parameters even though it is only called directly
after loop device creation.

_create_loop_device_blocksize()
{
	local file=$1
	local blksize=$2

	dev=`losetup -f --show $file --sector-size=$blksize`

	# If the loop device sector size is incompatible with doing
	# direct IO on the backing file, attempting to turn on
	# direct-io will fail with an -EINVAL error. However, the
	# device will still work correctly using buffered IO, so we
	# ignore the error.
	test -b "$dev" && losetup --direct-io=on $dev 2> /dev/null
	echo $dev
}

-Dave.
-- 
Dave Chinner
david@xxxxxxxxxxxxx




[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux