From: Anand Suveer Jain <asj@kernel.org>
To: fstests@vger.kernel.org, linux-btrfs@vger.kernel.org,
linux-ext4@vger.kernel.org, linux-xfs@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net, djwong@kernel.org
Subject: Re: [PATCH v8 01/13] fstests: add _loop_image_create_clone() helper
Date: Tue, 1 Sep 2026 21:52:37 +0800 [thread overview]
Message-ID: <345c5451-2d23-4df9-8c2b-ae2a3d29b383@kernel.org> (raw)
In-Reply-To: <apa_4wZ21FydhN8U@zlang-mailbox>
On 1/9/26 20:33, Zorro Lang wrote:
> On Sat, Jul 25, 2026 at 03:38:58PM +0800, Anand Jain wrote:
>> Introduce _loop_image_create_clone() and _loop_image_destroy() to mkfs an
>> image file and clone it to another image file, and attach a loop device to
>> them. And its destroy part.
>>
>> Signed-off-by: Anand Jain <asj@kernel.org>
>> ---
>> common/rc | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 65 insertions(+)
>>
>> diff --git a/common/rc b/common/rc
>> index 106f044adc2d..e8ff5be0c547 100644
>> --- a/common/rc
>> +++ b/common/rc
>> @@ -1520,6 +1520,71 @@ _scratch_resvblks()
>> esac
>> }
>>
>> +# Create a small loop image, run an optional tuning function ($2) on it,
>> +# clone it, and attach both to loop devices, returned in ($1).
>> +# Args:
>> +# $1: Nameref to return the array of allocated loop devices [base, clone].
>> +# $2: Optional callback function to tune the base filesystem before cloning.
>> +_loop_image_create_clone()
>
> To capture both the relationship and distinction between this function and
> existing _create_loop_device, I'd like to rename it to *_create_cloned_loop_devs*.
I'm fine with _create_cloned_loop_devs() and other patches must be
updated accordingly.
>> +{
>> + local -n _ret=$1
>> + local pre_clone_tune_func="$2"
>> + local img_file=$TEST_DIR/${seq}.img
>> + local img_file_clone=$TEST_DIR/${seq}_clone.img
>> + local size=$(_small_fs_size_mb 128) # Smallest possible
>> + local loop_devs=()
>> +
>> + # Since we copy the block device image, we keep its size small.
>> + _require_fs_space $TEST_DIR $((size * 1024 * 2))
>> +
>> + _create_file_sized $((size * 1024 * 1024)) $img_file ||
>> + _fail "Failed: Create $img_file $size"
>> +
>> + loop_devs=("$(_create_loop_device $img_file)")
>> +
>> + case $FSTYP in
>> + xfs)
>> + _mkfs_dev -s size=4096 "${loop_devs[0]}"
>
> Why xfs needs a specific "-s size=4096" ? Hardcoding this parameter might cause
> failures in certain incompatible environments.
>> + ;;
>> + btrfs)
>> + _mkfs_dev "${loop_devs[0]}"
>
> If btrfs is handled the same way as the default `*)` branch below, there is
> no need to have a dedicated branch for it.
>
>> + ;;
>> + *)
>> + _mkfs_dev "${loop_devs[0]}"
>> + ;;
>> + esac
>> +
>> + # Only execute if the function argument is not empty
>> + if [ -n "$pre_clone_tune_func" ]; then
>> + $pre_clone_tune_func "${loop_devs[0]}"
>> + fi
>> +
>> + sync "${loop_devs[0]}"
>
> Since the mkfs command above operates directly on a loop device, I wanted to
> make sure, can the sync command be targeted at a block device, and does it
> guarantee a cache flush or blockdev page cache sync ?
>
> How about:
> sync -d "${loop_devs[0]}"
> blockdev --flushbufs "${loop_devs[0]}"
> or any better idea?
>
Spotted stale code here while refactoring pre_clone_tune_func.
The updated code with the suggested renames is below.
Agreed that <dev> in sync is redundant. Adding sync serves
as a safeguard if a future mkfs fails to do so. Flushing
via blockdev --flushbufs followed by a global sync properly
follows the data flow path it may not be strictly required
but it is safer.
>> + cp $img_file $img_file_clone || _fail "Failed to copy cloned image"
>> +
>> + loop_devs+=("$(_create_loop_device $img_file_clone)")
>> +
>> + _ret=()
>> + for i in "${loop_devs[@]}"; do
>> + _ret+=("$i")
>> + done
>
> How about:
> _ret=("${loop_devs[@]}")
> directly?
>
yeah. added.
>> +}
>> +
>> +# Teardown loop devices and delete their underlying backing image files.
>> +# Accepts a list of loop device paths (e.g., /dev/loop0 /dev/loop1).
>> +_loop_image_destroy()
>
> To keep it consistent with the renamed function above, we could rename this
> to *_destroy_cloned_loop_devs*. Alternatively, if we don't consider it
> clone-specific, *destroy_loop_devs* would also be good to me.
>
_destroy_cloned_loop_devs() is fine.
Updated code:
---------------------------------
diff --git a/common/rc b/common/rc
index 45cf9360ba73..285463b4e3db 100644
--- a/common/rc
+++ b/common/rc
@@ -1561,7 +1561,7 @@ _change_metadata_uuid()
# Args:
# $1: Nameref to return the array of allocated loop devices [base,
clone].
# $2: Optional callback function to tune the base filesystem before
cloning.
-_loop_image_create_clone()
+_create_cloned_loop_devs()
{
local -n _ret=$1
local pre_clone_tune_func="$2"
@@ -1578,37 +1578,28 @@ _loop_image_create_clone()
loop_devs=("$(_create_loop_device $img_file)")
- case $FSTYP in
- xfs)
- _mkfs_dev -s size=4096 "${loop_devs[0]}"
- ;;
- btrfs)
- _mkfs_dev "${loop_devs[0]}"
- ;;
- *)
- _mkfs_dev "${loop_devs[0]}"
- ;;
- esac
+ _mkfs_dev "${loop_devs[0]}"
# Only execute if the function argument is not empty
if [ -n "$pre_clone_tune_func" ]; then
$pre_clone_tune_func "${loop_devs[0]}"
fi
- sync "${loop_devs[0]}"
+ # We are about to copy the loop device's backing file
+ # Flush loop device's buffer cache
+ blockdev --flushbufs "${loop_devs[0]}"
+ # Sync system's dirty pages including backing file's
+ sync
cp $img_file $img_file_clone || _fail "Failed to copy cloned image"
loop_devs+=("$(_create_loop_device $img_file_clone)")
- _ret=()
- for i in "${loop_devs[@]}"; do
- _ret+=("$i")
- done
+ _ret=("${loop_devs[@]}")
}
# Teardown loop devices and delete their underlying backing image files.
# Accepts a list of loop device paths (e.g., /dev/loop0 /dev/loop1).
-_loop_image_destroy()
+_destroy_cloned_loop_devs()
{
for d in "$@"; do
# Retrieve the path of the backing file
-------------------------------
Thanks.
Anand
> Thanks,
> Zorro
>
>> +{
>> + for d in "$@"; do
>> + # Retrieve the path of the backing file
>> + local f=$(losetup --noheadings --output BACK-FILE $d)
>> +
>> + # Detach the loop device from the backing file
>> + _destroy_loop_device "$d"
>> +
>> + # Clean up the backing disk image file
>> + [ -n "$f" ] && rm -f "$f"
>> + done
>> +}
>>
>> # Repair scratch filesystem. Returns 0 if the FS is good to go (either no
>> # errors found or errors were fixed) and nonzero otherwise; also spits out
>> --
>> 2.43.0
>>
WARNING: multiple messages have this Message-ID (diff)
From: Anand Suveer Jain via Linux-f2fs-devel <linux-f2fs-devel@lists.sourceforge.net>
To: fstests@vger.kernel.org, linux-btrfs@vger.kernel.org,
linux-ext4@vger.kernel.org, linux-xfs@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net, djwong@kernel.org
Subject: Re: [f2fs-dev] [PATCH v8 01/13] fstests: add _loop_image_create_clone() helper
Date: Tue, 1 Sep 2026 21:52:37 +0800 [thread overview]
Message-ID: <345c5451-2d23-4df9-8c2b-ae2a3d29b383@kernel.org> (raw)
In-Reply-To: <apa_4wZ21FydhN8U@zlang-mailbox>
On 1/9/26 20:33, Zorro Lang wrote:
> On Sat, Jul 25, 2026 at 03:38:58PM +0800, Anand Jain wrote:
>> Introduce _loop_image_create_clone() and _loop_image_destroy() to mkfs an
>> image file and clone it to another image file, and attach a loop device to
>> them. And its destroy part.
>>
>> Signed-off-by: Anand Jain <asj@kernel.org>
>> ---
>> common/rc | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 65 insertions(+)
>>
>> diff --git a/common/rc b/common/rc
>> index 106f044adc2d..e8ff5be0c547 100644
>> --- a/common/rc
>> +++ b/common/rc
>> @@ -1520,6 +1520,71 @@ _scratch_resvblks()
>> esac
>> }
>>
>> +# Create a small loop image, run an optional tuning function ($2) on it,
>> +# clone it, and attach both to loop devices, returned in ($1).
>> +# Args:
>> +# $1: Nameref to return the array of allocated loop devices [base, clone].
>> +# $2: Optional callback function to tune the base filesystem before cloning.
>> +_loop_image_create_clone()
>
> To capture both the relationship and distinction between this function and
> existing _create_loop_device, I'd like to rename it to *_create_cloned_loop_devs*.
I'm fine with _create_cloned_loop_devs() and other patches must be
updated accordingly.
>> +{
>> + local -n _ret=$1
>> + local pre_clone_tune_func="$2"
>> + local img_file=$TEST_DIR/${seq}.img
>> + local img_file_clone=$TEST_DIR/${seq}_clone.img
>> + local size=$(_small_fs_size_mb 128) # Smallest possible
>> + local loop_devs=()
>> +
>> + # Since we copy the block device image, we keep its size small.
>> + _require_fs_space $TEST_DIR $((size * 1024 * 2))
>> +
>> + _create_file_sized $((size * 1024 * 1024)) $img_file ||
>> + _fail "Failed: Create $img_file $size"
>> +
>> + loop_devs=("$(_create_loop_device $img_file)")
>> +
>> + case $FSTYP in
>> + xfs)
>> + _mkfs_dev -s size=4096 "${loop_devs[0]}"
>
> Why xfs needs a specific "-s size=4096" ? Hardcoding this parameter might cause
> failures in certain incompatible environments.
>> + ;;
>> + btrfs)
>> + _mkfs_dev "${loop_devs[0]}"
>
> If btrfs is handled the same way as the default `*)` branch below, there is
> no need to have a dedicated branch for it.
>
>> + ;;
>> + *)
>> + _mkfs_dev "${loop_devs[0]}"
>> + ;;
>> + esac
>> +
>> + # Only execute if the function argument is not empty
>> + if [ -n "$pre_clone_tune_func" ]; then
>> + $pre_clone_tune_func "${loop_devs[0]}"
>> + fi
>> +
>> + sync "${loop_devs[0]}"
>
> Since the mkfs command above operates directly on a loop device, I wanted to
> make sure, can the sync command be targeted at a block device, and does it
> guarantee a cache flush or blockdev page cache sync ?
>
> How about:
> sync -d "${loop_devs[0]}"
> blockdev --flushbufs "${loop_devs[0]}"
> or any better idea?
>
Spotted stale code here while refactoring pre_clone_tune_func.
The updated code with the suggested renames is below.
Agreed that <dev> in sync is redundant. Adding sync serves
as a safeguard if a future mkfs fails to do so. Flushing
via blockdev --flushbufs followed by a global sync properly
follows the data flow path it may not be strictly required
but it is safer.
>> + cp $img_file $img_file_clone || _fail "Failed to copy cloned image"
>> +
>> + loop_devs+=("$(_create_loop_device $img_file_clone)")
>> +
>> + _ret=()
>> + for i in "${loop_devs[@]}"; do
>> + _ret+=("$i")
>> + done
>
> How about:
> _ret=("${loop_devs[@]}")
> directly?
>
yeah. added.
>> +}
>> +
>> +# Teardown loop devices and delete their underlying backing image files.
>> +# Accepts a list of loop device paths (e.g., /dev/loop0 /dev/loop1).
>> +_loop_image_destroy()
>
> To keep it consistent with the renamed function above, we could rename this
> to *_destroy_cloned_loop_devs*. Alternatively, if we don't consider it
> clone-specific, *destroy_loop_devs* would also be good to me.
>
_destroy_cloned_loop_devs() is fine.
Updated code:
---------------------------------
diff --git a/common/rc b/common/rc
index 45cf9360ba73..285463b4e3db 100644
--- a/common/rc
+++ b/common/rc
@@ -1561,7 +1561,7 @@ _change_metadata_uuid()
# Args:
# $1: Nameref to return the array of allocated loop devices [base,
clone].
# $2: Optional callback function to tune the base filesystem before
cloning.
-_loop_image_create_clone()
+_create_cloned_loop_devs()
{
local -n _ret=$1
local pre_clone_tune_func="$2"
@@ -1578,37 +1578,28 @@ _loop_image_create_clone()
loop_devs=("$(_create_loop_device $img_file)")
- case $FSTYP in
- xfs)
- _mkfs_dev -s size=4096 "${loop_devs[0]}"
- ;;
- btrfs)
- _mkfs_dev "${loop_devs[0]}"
- ;;
- *)
- _mkfs_dev "${loop_devs[0]}"
- ;;
- esac
+ _mkfs_dev "${loop_devs[0]}"
# Only execute if the function argument is not empty
if [ -n "$pre_clone_tune_func" ]; then
$pre_clone_tune_func "${loop_devs[0]}"
fi
- sync "${loop_devs[0]}"
+ # We are about to copy the loop device's backing file
+ # Flush loop device's buffer cache
+ blockdev --flushbufs "${loop_devs[0]}"
+ # Sync system's dirty pages including backing file's
+ sync
cp $img_file $img_file_clone || _fail "Failed to copy cloned image"
loop_devs+=("$(_create_loop_device $img_file_clone)")
- _ret=()
- for i in "${loop_devs[@]}"; do
- _ret+=("$i")
- done
+ _ret=("${loop_devs[@]}")
}
# Teardown loop devices and delete their underlying backing image files.
# Accepts a list of loop device paths (e.g., /dev/loop0 /dev/loop1).
-_loop_image_destroy()
+_destroy_cloned_loop_devs()
{
for d in "$@"; do
# Retrieve the path of the backing file
-------------------------------
Thanks.
Anand
> Thanks,
> Zorro
>
>> +{
>> + for d in "$@"; do
>> + # Retrieve the path of the backing file
>> + local f=$(losetup --noheadings --output BACK-FILE $d)
>> +
>> + # Detach the loop device from the backing file
>> + _destroy_loop_device "$d"
>> +
>> + # Clean up the backing disk image file
>> + [ -n "$f" ] && rm -f "$f"
>> + done
>> +}
>>
>> # Repair scratch filesystem. Returns 0 if the FS is good to go (either no
>> # errors found or errors were fixed) and nonzero otherwise; also spits out
>> --
>> 2.43.0
>>
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
next prev parent reply other threads:[~2026-09-01 13:52 UTC|newest]
Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-25 7:38 [PATCH v8 0/13] fstests: add test coverage for cloned filesystem ids Anand Jain
2026-07-25 7:38 ` [f2fs-dev] " Anand Jain via Linux-f2fs-devel
2026-07-25 7:38 ` [PATCH v8 01/13] fstests: add _loop_image_create_clone() helper Anand Jain
2026-07-25 7:38 ` [f2fs-dev] " Anand Jain via Linux-f2fs-devel
2026-09-01 12:33 ` Zorro Lang
2026-09-01 12:33 ` [f2fs-dev] " Zorro Lang via Linux-f2fs-devel
2026-09-01 13:52 ` Anand Suveer Jain [this message]
2026-09-01 13:52 ` Anand Suveer Jain via Linux-f2fs-devel
2026-07-25 7:38 ` [PATCH v8 02/13] fstests: add _clone_mount_option() helper Anand Jain
2026-07-25 7:38 ` [f2fs-dev] " Anand Jain via Linux-f2fs-devel
2026-09-01 12:39 ` Zorro Lang
2026-09-01 12:39 ` [f2fs-dev] " Zorro Lang via Linux-f2fs-devel
2026-09-01 13:54 ` Anand Suveer Jain
2026-09-01 13:54 ` [f2fs-dev] " Anand Suveer Jain via Linux-f2fs-devel
2026-07-25 7:39 ` [PATCH v8 03/13] fstests: add FSNOTIFYWAIT_PROG Anand Jain
2026-07-25 7:39 ` [f2fs-dev] " Anand Jain via Linux-f2fs-devel
2026-09-01 15:37 ` Zorro Lang
2026-09-01 15:37 ` [f2fs-dev] " Zorro Lang via Linux-f2fs-devel
2026-07-25 7:39 ` [PATCH v8 04/13] fstests: add _require_fanotify_function Anand Jain
2026-07-25 7:39 ` [f2fs-dev] " Anand Jain via Linux-f2fs-devel
2026-09-01 15:42 ` Zorro Lang
2026-09-01 15:42 ` [f2fs-dev] " Zorro Lang via Linux-f2fs-devel
2026-09-01 22:39 ` Anand Suveer Jain
2026-09-01 22:39 ` [f2fs-dev] " Anand Suveer Jain via Linux-f2fs-devel
2026-07-25 7:39 ` [PATCH v8 05/13] fstests: add _require_unique_f_fsid() helper Anand Jain
2026-07-25 7:39 ` [f2fs-dev] " Anand Jain via Linux-f2fs-devel
2026-09-01 16:09 ` Zorro Lang
2026-09-01 16:09 ` [f2fs-dev] " Zorro Lang via Linux-f2fs-devel
2026-09-01 23:32 ` Anand Suveer Jain via Linux-f2fs-devel
2026-09-01 23:32 ` Anand Suveer Jain
2026-07-25 7:39 ` [PATCH v8 06/13] fstests: add SEMANAGE_PROG Anand Jain
2026-07-25 7:39 ` [f2fs-dev] " Anand Jain via Linux-f2fs-devel
2026-07-25 7:39 ` [PATCH v8 07/13] fstests: verify fanotify isolation on cloned filesystems Anand Jain
2026-07-25 7:39 ` [f2fs-dev] " Anand Jain via Linux-f2fs-devel
2026-09-01 18:23 ` Zorro Lang
2026-09-01 18:23 ` [f2fs-dev] " Zorro Lang via Linux-f2fs-devel
2026-09-04 6:14 ` Anand Suveer Jain
2026-09-04 6:14 ` [f2fs-dev] " Anand Suveer Jain via Linux-f2fs-devel
2026-07-25 7:39 ` [PATCH v8 08/13] fstests: verify f_fsid for " Anand Jain
2026-07-25 7:39 ` [f2fs-dev] " Anand Jain via Linux-f2fs-devel
2026-09-01 18:51 ` Zorro Lang
2026-09-01 18:51 ` [f2fs-dev] " Zorro Lang via Linux-f2fs-devel
2026-09-20 14:10 ` Anand Suveer Jain
2026-09-20 14:10 ` [f2fs-dev] " Anand Suveer Jain via Linux-f2fs-devel
2026-07-25 7:39 ` [PATCH v8 09/13] fstests: verify libblkid resolution of duplicate UUIDs Anand Jain
2026-07-25 7:39 ` [f2fs-dev] " Anand Jain via Linux-f2fs-devel
2026-09-01 19:12 ` Zorro Lang
2026-09-01 19:12 ` [f2fs-dev] " Zorro Lang via Linux-f2fs-devel
2026-09-20 14:10 ` Anand Suveer Jain
2026-09-20 14:10 ` [f2fs-dev] " Anand Suveer Jain via Linux-f2fs-devel
2026-07-25 7:39 ` [PATCH v8 10/13] fstests: verify IMA isolation on cloned filesystems Anand Jain
2026-07-25 7:39 ` [f2fs-dev] " Anand Jain via Linux-f2fs-devel
2026-09-01 19:58 ` Zorro Lang
2026-09-01 19:58 ` [f2fs-dev] " Zorro Lang via Linux-f2fs-devel
2026-09-28 0:17 ` Anand Suveer Jain
2026-09-28 0:17 ` [f2fs-dev] " Anand Suveer Jain via Linux-f2fs-devel
2026-07-25 7:39 ` [PATCH v8 11/13] fstests: verify exportfs file handles " Anand Jain
2026-07-25 7:39 ` [f2fs-dev] " Anand Jain via Linux-f2fs-devel
2026-09-01 20:29 ` Zorro Lang
2026-09-01 20:29 ` [f2fs-dev] " Zorro Lang via Linux-f2fs-devel
2026-09-01 20:30 ` Zorro Lang
2026-09-01 20:30 ` [f2fs-dev] " Zorro Lang via Linux-f2fs-devel
2026-09-20 15:30 ` Anand Suveer Jain
2026-09-20 15:30 ` [f2fs-dev] " Anand Suveer Jain via Linux-f2fs-devel
2026-07-25 7:39 ` [PATCH v8 12/13] fstests: add _change_metadata_uuid helper Anand Jain
2026-07-25 7:39 ` [f2fs-dev] " Anand Jain via Linux-f2fs-devel
2026-09-01 20:53 ` Zorro Lang
2026-09-01 20:53 ` [f2fs-dev] " Zorro Lang via Linux-f2fs-devel
2026-09-20 15:39 ` Anand Suveer Jain via Linux-f2fs-devel
2026-09-20 15:39 ` Anand Suveer Jain
2026-07-25 7:39 ` [PATCH v8 13/13] fstests: test UUID consistency for clones with metadata_uuid Anand Jain
2026-07-25 7:39 ` [f2fs-dev] " Anand Jain via Linux-f2fs-devel
2026-09-01 20:51 ` Zorro Lang
2026-09-01 20:51 ` [f2fs-dev] " Zorro Lang via Linux-f2fs-devel
2026-09-27 4:41 ` Anand Suveer Jain
2026-09-27 4:41 ` [f2fs-dev] " Anand Suveer Jain via Linux-f2fs-devel
2026-09-27 15:06 ` Darrick J. Wong
2026-09-27 15:06 ` [f2fs-dev] " Darrick J. Wong via Linux-f2fs-devel
2026-09-27 22:48 ` Anand Suveer Jain
2026-09-27 22:48 ` [f2fs-dev] " Anand Suveer Jain via Linux-f2fs-devel
2026-08-31 7:17 ` [PATCH v8 0/13] fstests: add test coverage for cloned filesystem ids Anand Suveer Jain
2026-08-31 7:17 ` [f2fs-dev] " Anand Suveer Jain via Linux-f2fs-devel
2026-09-20 15:55 ` Anand Suveer Jain
2026-09-20 15:55 ` [f2fs-dev] " Anand Suveer Jain via Linux-f2fs-devel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=345c5451-2d23-4df9-8c2b-ae2a3d29b383@kernel.org \
--to=asj@kernel.org \
--cc=djwong@kernel.org \
--cc=fstests@vger.kernel.org \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--cc=linux-xfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.