Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

# $NetBSD: t_extattr.sh,v 1.4 2022/11/30 07:20:36 martin Exp $
#
#  Copyright (c) 2021 The NetBSD Foundation, Inc.
#  All rights reserved.
# 
#  Redistribution and use in source and binary forms, with or without
#  modification, are permitted provided that the following conditions
#  are met:
#  1. Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
#  2. Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
# 
#  THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
#  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
#  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
#  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
#  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
#  POSSIBILITY OF SUCH DAMAGE.
#

VND=vnd0
BDEV=/dev/${VND}
CDEV=/dev/r${VND}
IMG=fsimage
MNT=mnt

atf_test_case fsck_extattr_enable cleanup
atf_test_case fsck_extattr_enable_corrupted cleanup
atf_test_case fsck_extattr_disable cleanup

cleanup()
{
	echo in cleanup
	umount -f ${MNT} > /dev/null 2>&1 || true
	vnconfig -u ${VND} > /dev/null 2>&1 || true
}

fsck_extattr_enable_head()
{
	atf_set "descr" "Checks fsck_ffs enabling extattrs"
	atf_set "require.user" "root";
}

fsck_extattr_enable_body()
{
	atf_check mkdir -p ${MNT}

	atf_check -o ignore newfs -O2 -s 4m -F ${IMG}
	atf_check vnconfig ${VND} ${IMG}

	# Verify that extattrs are disabled.
	atf_check -o ignore -e 'match:POSIX1e ACLs not supported by this fs' \
		tunefs -p enable ${CDEV}
	atf_check mount -t ffs ${BDEV} ${MNT}
	atf_check touch ${MNT}/file
	atf_check -s exit:1 -e ignore setextattr user name1 value1 ${MNT}/file
	atf_check umount ${MNT}

	# Enable extattrs.
	atf_check -o 'match:ENABLING EXTATTR SUPPORT' \
		fsck_ffs -c ea ${CDEV}

	# Verify that extattrs are now enabled.
	atf_check -o 'match:POSIX1e ACLs set' -e ignore \
		tunefs -p enable ${CDEV}
	atf_check mount -t ffs ${BDEV} ${MNT}
	atf_check touch ${MNT}/file
	atf_check setextattr user testname testvalue ${MNT}/file
	atf_check -o 'match:testvalue' getextattr user testname ${MNT}/file
	atf_check umount ${MNT}
	atf_check vnconfig -u ${VND}
}

fsck_extattr_enable_cleanup()
{
	cleanup
}

fsck_extattr_enable_corrupted_head()
{
	atf_set "descr" "Checks fsck_ffs enabling extattrs with corruption"
	atf_set "require.user" "root";
}

fsck_extattr_enable_corrupted_body()
{
	atf_check mkdir -p ${MNT}

	# Create an fs with extattrs enabled and set an extattr on the test file.
	atf_check -o ignore newfs -O2ea -b 8k -f 1k -s 4m -F ${IMG}
	atf_check vnconfig ${VND} ${IMG}

	atf_check mount -t ffs ${BDEV} ${MNT}
	atf_check touch ${MNT}/file
	atf_check setextattr user testname testvalue ${MNT}/file
	atf_check -o 'match:testvalue' getextattr user testname ${MNT}/file
	atf_check umount ${MNT}

	# Find the location and size of the extattr block.
	extb0=$(printf 'cd file\niptrs\n' | fsdb -n $CDEV | grep 'di_extb 0' |
		awk '{print $3}')
	extsize=$(printf 'cd file\n' | fsdb -n $CDEV | grep EXTSIZE | tail -1 |
		awk '{print $4}' | sed 's,.*=,,')
	atf_check [ $extb0 != 0 ]
	atf_check [ $extsize != 0 ]

	# Recreate the fs with extattrs disabled and set the extattr block
	# size/location of the new test file to the same values as the old
	# test file.  This simulates extattrs having been created in a
	# UFS2-non-ea file system before UFS2ea was invented.
	atf_check -o ignore newfs -O2 -b 8k -f 1k -s 4m -F ${IMG}
	atf_check mount -t ffs ${BDEV} ${MNT}
	atf_check touch ${MNT}/file
	atf_check umount ${MNT}
	printf "cd file\nchextb 0 $extb0\n" | fsdb -N $CDEV
	printf "cd file\nchextsize $extsize\n" | fsdb -N $CDEV

	# Convert to enable extattrs.
	atf_check -o 'match:CLEAR EXTATTR FIELDS' \
		  -o 'match:ENABLING EXTATTR SUPPORT' \
		  fsck_ffs -y -c ea ${CDEV}

	# Verify that the test file does not have the extattr.
	atf_check -o ignore fsck_ffs -n ${CDEV}
	atf_check mount -t ffs ${BDEV} ${MNT}
	atf_check -s exit:1 -e 'match:Attribute not found' \
		  getextattr user testname ${MNT}/file
	atf_check umount ${MNT}
	atf_check vnconfig -u ${VND}
}

fsck_extattr_enable_corrupted_cleanup()
{
	cleanup
}

fsck_extattr_disable_head()
{
	atf_set "descr" "Checks fsck_ffs disabling extattrs"
	atf_set "require.user" "root";
}

fsck_extattr_disable_body()
{
	atf_check mkdir -p ${MNT}

	# Create an fs with extattrs enabled and set an extattr on the test file.
	atf_check -o ignore newfs -O2ea -b 8k -f 1k -s 4m -F ${IMG}
	atf_check vnconfig ${VND} ${IMG}

	atf_check mount -t ffs ${BDEV} ${MNT}
	atf_check touch ${MNT}/file
	atf_check setextattr user testname testvalue ${MNT}/file
	atf_check -o 'match:testvalue' getextattr user testname ${MNT}/file
	atf_check umount ${MNT}

	# Convert to disable extattrs.
	atf_check -o 'match:CLEAR EXTATTR FIELDS' \
		  -o 'match:DISABLING EXTATTR SUPPORT' \
		  fsck_ffs -y -c no-ea ${CDEV}

	# Verify that the test file does not have the test extattr.
	atf_check -o ignore fsck_ffs -n ${CDEV}
	atf_check mount -t ffs ${BDEV} ${MNT}
	atf_check -s exit:1 -e 'match:getextattr: mnt/file: failed: Operation not supported' \
		  getextattr user testname ${MNT}/file
	atf_check umount ${MNT}

	# Convert to enable extattrs again.
	atf_check -o 'match:ENABLING EXTATTR SUPPORT' \
		  fsck_ffs -y -c ea ${CDEV}

	# Verify that the test extattr is still gone.
	atf_check -o ignore fsck_ffs -n ${CDEV}
	atf_check mount -t ffs ${BDEV} ${MNT}
	atf_check -s exit:1 -e 'match:Attribute not found' \
		  getextattr user testname ${MNT}/file
	atf_check umount ${MNT}

	atf_check vnconfig -u ${VND}
}

fsck_extattr_disable_cleanup()
{
	cleanup
}

atf_init_test_cases()
{
	atf_add_test_case fsck_extattr_enable
	atf_add_test_case fsck_extattr_enable_corrupted
	atf_add_test_case fsck_extattr_disable
}