Message ID | 20231110010139.3901150-5-sarthakkukreti@chromium.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | loop/010: Add test for mode 0 fallocate() on loop devices | expand |
On Fri, Nov 10, 2023 at 9:02 AM Sarthak Kukreti <sarthakkukreti@chromium.org> wrote: > > A recent patch series[1] adds support for calling fallocate() in mode 0 The patch link is missing in this patch. > on block devices. This test adds a basic sanity test for loopback devices > setup on a sparse file and validates that writes to the loopback device > succeed, even when the underlying filesystem runs out of space. > > Signed-off-by: Sarthak Kukreti <sarthakkukreti@chromium.org> > --- > tests/loop/010 | 60 ++++++++++++++++++++++++++++++++++++++++++++++ > tests/loop/010.out | 2 ++ > 2 files changed, 62 insertions(+) > create mode 100644 tests/loop/010 > create mode 100644 tests/loop/010.out > > diff --git a/tests/loop/010 b/tests/loop/010 > new file mode 100644 > index 0000000..091be5e > --- /dev/null > +++ b/tests/loop/010 > @@ -0,0 +1,60 @@ > +#!/bin/bash > +# SPDX-License-Identifier: GPL-3.0+ > +# Copyright (C) 2023 Google LLC. > +# Author: sarthakkukret@google.com (Sarthak Kukreti) > +# > +# Test if fallocate() on a loopback device provisions space on the underlying > +# filesystem and writes on the loop device succeed, even if the lower > +# filesystem is filled up. > + > +. tests/loop/rc > + > +DESCRIPTION="Loop device fallocate() space provisioning" > +QUICK=1 > + > +requires() { > + _have_program mkfs.ext4 > +} > + > +test() { > + echo "Running ${TEST_NAME}" > + > + local mount_dir="$TMPDIR/mnt" > + mkdir -p ${mount_dir} > + > + local image_file="$TMPDIR/img" > + truncate -s 1G "${image_file}" > + > + local loop_device > + loop_device="$(losetup -P -f --show "${image_file}")" > + > + mkfs.ext4 ${loop_device} &> /dev/null > + mount -t ext4 ${loop_device} ${mount_dir} > + > + local provisioned_file="${mount_dir}/provisioned" > + truncate -s 200M "${provisioned_file}" > + > + local provisioned_loop_device > + provisioned_loop_device="$(losetup -P -f --show "${provisioned_file}")" > + > + # Provision space for the file: without provisioning support, this fails > + # with EOPNOTSUPP. > + fallocate -l 200M "${provisioned_loop_device}" > + > + # Fill the filesystem, this command will error out with ENOSPC. > + local fs_fill_file="${mount_dir}/fill" > + dd if=/dev/zero of="${fs_fill_file}" bs=1M count=1024 status=none &>/dev/null > + sync > + > + # Write to provisioned loop device, ensure that it does not run into ENOSPC. > + dd if=/dev/zero of="${provisioned_loop_device}" bs=1M count=200 status=none > + sync > + > + # Cleanup. > + losetup --detach "${provisioned_loop_device}" > + umount "${mount_dir}" > + losetup --detach "${loop_device}" > + rm "${image_file}" > + > + echo "Test complete" > +} > \ No newline at end of file > diff --git a/tests/loop/010.out b/tests/loop/010.out > new file mode 100644 > index 0000000..068c489 > --- /dev/null > +++ b/tests/loop/010.out > @@ -0,0 +1,2 @@ > +Running loop/009 > +Test complete > -- > 2.42.0.758.gaed0368e0e-goog > >
I meant to add a reference to the latest REQ_OP_PROVISION patch series that this patch accompanied, I'll reword the commit so that it is clearer: [1] https://lore.kernel.org/lkml/20231110010139.3901150-1-sarthakkukreti@chromium.org/ Best Sarthak On Thu, Nov 9, 2023 at 5:28 PM Yi Zhang <yi.zhang@redhat.com> wrote: > > On Fri, Nov 10, 2023 at 9:02 AM Sarthak Kukreti > <sarthakkukreti@chromium.org> wrote: > > > > A recent patch series[1] adds support for calling fallocate() in mode 0 > > The patch link is missing in this patch. > > > on block devices. This test adds a basic sanity test for loopback devices > > setup on a sparse file and validates that writes to the loopback device > > succeed, even when the underlying filesystem runs out of space. > > > > Signed-off-by: Sarthak Kukreti <sarthakkukreti@chromium.org> > > --- > > tests/loop/010 | 60 ++++++++++++++++++++++++++++++++++++++++++++++ > > tests/loop/010.out | 2 ++ > > 2 files changed, 62 insertions(+) > > create mode 100644 tests/loop/010 > > create mode 100644 tests/loop/010.out > > > > diff --git a/tests/loop/010 b/tests/loop/010 > > new file mode 100644 > > index 0000000..091be5e > > --- /dev/null > > +++ b/tests/loop/010 > > @@ -0,0 +1,60 @@ > > +#!/bin/bash > > +# SPDX-License-Identifier: GPL-3.0+ > > +# Copyright (C) 2023 Google LLC. > > +# Author: sarthakkukret@google.com (Sarthak Kukreti) > > +# > > +# Test if fallocate() on a loopback device provisions space on the underlying > > +# filesystem and writes on the loop device succeed, even if the lower > > +# filesystem is filled up. > > + > > +. tests/loop/rc > > + > > +DESCRIPTION="Loop device fallocate() space provisioning" > > +QUICK=1 > > + > > +requires() { > > + _have_program mkfs.ext4 > > +} > > + > > +test() { > > + echo "Running ${TEST_NAME}" > > + > > + local mount_dir="$TMPDIR/mnt" > > + mkdir -p ${mount_dir} > > + > > + local image_file="$TMPDIR/img" > > + truncate -s 1G "${image_file}" > > + > > + local loop_device > > + loop_device="$(losetup -P -f --show "${image_file}")" > > + > > + mkfs.ext4 ${loop_device} &> /dev/null > > + mount -t ext4 ${loop_device} ${mount_dir} > > + > > + local provisioned_file="${mount_dir}/provisioned" > > + truncate -s 200M "${provisioned_file}" > > + > > + local provisioned_loop_device > > + provisioned_loop_device="$(losetup -P -f --show "${provisioned_file}")" > > + > > + # Provision space for the file: without provisioning support, this fails > > + # with EOPNOTSUPP. > > + fallocate -l 200M "${provisioned_loop_device}" > > + > > + # Fill the filesystem, this command will error out with ENOSPC. > > + local fs_fill_file="${mount_dir}/fill" > > + dd if=/dev/zero of="${fs_fill_file}" bs=1M count=1024 status=none &>/dev/null > > + sync > > + > > + # Write to provisioned loop device, ensure that it does not run into ENOSPC. > > + dd if=/dev/zero of="${provisioned_loop_device}" bs=1M count=200 status=none > > + sync > > + > > + # Cleanup. > > + losetup --detach "${provisioned_loop_device}" > > + umount "${mount_dir}" > > + losetup --detach "${loop_device}" > > + rm "${image_file}" > > + > > + echo "Test complete" > > +} > > \ No newline at end of file > > diff --git a/tests/loop/010.out b/tests/loop/010.out > > new file mode 100644 > > index 0000000..068c489 > > --- /dev/null > > +++ b/tests/loop/010.out > > @@ -0,0 +1,2 @@ > > +Running loop/009 > > +Test complete > > -- > > 2.42.0.758.gaed0368e0e-goog > > > > > > > -- > Best Regards, > Yi Zhang >
diff --git a/tests/loop/010 b/tests/loop/010 new file mode 100644 index 0000000..091be5e --- /dev/null +++ b/tests/loop/010 @@ -0,0 +1,60 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-3.0+ +# Copyright (C) 2023 Google LLC. +# Author: sarthakkukret@google.com (Sarthak Kukreti) +# +# Test if fallocate() on a loopback device provisions space on the underlying +# filesystem and writes on the loop device succeed, even if the lower +# filesystem is filled up. + +. tests/loop/rc + +DESCRIPTION="Loop device fallocate() space provisioning" +QUICK=1 + +requires() { + _have_program mkfs.ext4 +} + +test() { + echo "Running ${TEST_NAME}" + + local mount_dir="$TMPDIR/mnt" + mkdir -p ${mount_dir} + + local image_file="$TMPDIR/img" + truncate -s 1G "${image_file}" + + local loop_device + loop_device="$(losetup -P -f --show "${image_file}")" + + mkfs.ext4 ${loop_device} &> /dev/null + mount -t ext4 ${loop_device} ${mount_dir} + + local provisioned_file="${mount_dir}/provisioned" + truncate -s 200M "${provisioned_file}" + + local provisioned_loop_device + provisioned_loop_device="$(losetup -P -f --show "${provisioned_file}")" + + # Provision space for the file: without provisioning support, this fails + # with EOPNOTSUPP. + fallocate -l 200M "${provisioned_loop_device}" + + # Fill the filesystem, this command will error out with ENOSPC. + local fs_fill_file="${mount_dir}/fill" + dd if=/dev/zero of="${fs_fill_file}" bs=1M count=1024 status=none &>/dev/null + sync + + # Write to provisioned loop device, ensure that it does not run into ENOSPC. + dd if=/dev/zero of="${provisioned_loop_device}" bs=1M count=200 status=none + sync + + # Cleanup. + losetup --detach "${provisioned_loop_device}" + umount "${mount_dir}" + losetup --detach "${loop_device}" + rm "${image_file}" + + echo "Test complete" +} \ No newline at end of file diff --git a/tests/loop/010.out b/tests/loop/010.out new file mode 100644 index 0000000..068c489 --- /dev/null +++ b/tests/loop/010.out @@ -0,0 +1,2 @@ +Running loop/009 +Test complete
A recent patch series[1] adds support for calling fallocate() in mode 0 on block devices. This test adds a basic sanity test for loopback devices setup on a sparse file and validates that writes to the loopback device succeed, even when the underlying filesystem runs out of space. Signed-off-by: Sarthak Kukreti <sarthakkukreti@chromium.org> --- tests/loop/010 | 60 ++++++++++++++++++++++++++++++++++++++++++++++ tests/loop/010.out | 2 ++ 2 files changed, 62 insertions(+) create mode 100644 tests/loop/010 create mode 100644 tests/loop/010.out