Re: [PATCH v9 4/4] xfs/530: quotas on idmapped mounts

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



On Sun, Mar 21, 2021 at 10:51:39PM +0800, Eryu Guan wrote:
> On Tue, Mar 16, 2021 at 11:36:27AM +0100, Christian Brauner wrote:
> > This is basically a re-implementation of xfs/050 but each file creation
> > call is done through an idmapped mount which verifies that the semantics
> > are identical even when the mount is idmapped.
> > 
> > Cc: Christoph Hellwig <hch@xxxxxx>
> > Cc: Darrick J. Wong <djwong@xxxxxxxxxx>
> > Cc: fstests@xxxxxxxxxxxxxxx
> > Signed-off-by: Christian Brauner <christian.brauner@xxxxxxxxxx>
> > ---
> > /* v1 */
> > patch not present
> > 
> > /* v2 */
> > patch not present
> > 
> > /* v3 */
> > patch not present
> > 
> > /* v4 */
> > patch not present
> > 
> > /* v5 */
> > patch not present
> > 
> > /* v6 */
> > patch not present
> > 
> > /* v7 */
> > patch not present
> > 
> > /* v8 */
> > patch introduced
> > 
> > /* v9 */
> > - Christian Brauner <christian.brauner@xxxxxxxxxx>:
> >   - Rebased onto current master.
> > ---
> >  tests/xfs/530     | 274 ++++++++++++++++++++++++++++++++++++++++++++++
> >  tests/xfs/530.out | 129 ++++++++++++++++++++++
> >  tests/xfs/group   |   1 +
> >  3 files changed, 404 insertions(+)
> >  create mode 100644 tests/xfs/530
> >  create mode 100644 tests/xfs/530.out
> > 
> > diff --git a/tests/xfs/530 b/tests/xfs/530
> > new file mode 100644
> > index 00000000..9e10c40d
> > --- /dev/null
> > +++ b/tests/xfs/530
> > @@ -0,0 +1,274 @@
> > +#! /bin/bash
> > +# SPDX-License-Identifier: GPL-2.0+
> > +#
> > +# Copyright (c) 2021 Christian Brauner <christian.brauner@xxxxxxxxxx>
> > +# All Rights Reserved.
> > +#
> > +# FS QA Test No. 530
> > +#
> > +# Exercises basic XFS quota functionality
> > +#       uquota, gquota, uqnoenforce, gqnoenforce
> > +#
> > +seq=`basename $0`
> > +seqres=$RESULT_DIR/$seq
> > +echo "QA output created by $seq"
> > +
> > +here=`pwd`
> > +tmp=/tmp/$$
> > +status=1	# failure is the default!
> > +
> > +# get standard environment, filters and checks
> > +. ./common/rc
> > +. ./common/filter
> > +. ./common/quota
> > +
> > +_cleanup()
> > +{
> > +	cd /
> > +	_scratch_unmount 2>/dev/null
> > +	rm -f $tmp.*
> > +}
> > +trap "_cleanup; exit \$status" 0 1 2 3 15
> > +
> > +# real QA test starts here
> > +_supported_fs xfs
> > +
> > +cp /dev/null $seqres.full
> > +chmod a+rwx $seqres.full	# arbitrary users will write here
> > +
> > +_require_scratch
> > +_require_xfs_quota
> > +_require_user fsgqa
> > +
> > +_scratch_mkfs >/dev/null 2>&1
> > +_scratch_mount
> > +bsize=$(_get_file_block_size $SCRATCH_MNT)
> > +_scratch_unmount
> > +
> > +bsoft=$(( 200 * $bsize ))
> > +bhard=$(( 1000 * $bsize ))
> > +isoft=4
> > +ihard=10
> > +
> > +_filter_report()
> 
> Seems this is mostly copied from _filter_quota_report(), just remove the
> $id and $bsize check in the beginning, is it possible to re-use
> _filter_quota_report?

Yeah, I think even without that check I can just directly use
_filter_quota_report. Not sure why I didn't use it right away. Probably
an oversight on my part that it was available as a generic helper.
Thanks for the pointer.

> 
> > +{
> > +	tr -s '[:space:]' | \
> > +	perl -npe '
> > +		s/^\#'$id' /[NAME] /g;
> > +		s/^\#0 \d+ /[ROOT] 0 /g;
> > +		s/6 days/7 days/g' |
> > +	perl -npe '
> > +		$val = 0;
> > +		if ($ENV{'LARGE_SCRATCH_DEV'}) {
> > +			$val = $ENV{'NUM_SPACE_FILES'};
> > +		}
> > +		s/(^\[ROOT\] \S+ \S+ \S+ \S+ \[--------\] )(\S+)/$1@{[$2 - $val]}/g' |
> > +	sed -e 's/ 65535 \[--------\]/ 00 \[--------\]/g' |
> > +	perl -npe '
> > +		s|^(.*?) (\d+) (\d+) (\d+)|$1 @{[$2 * 1024 /'$bsize']} @{[$3 * 1024 /'$bsize']} @{[$4 * 1024 /'$bsize']}|'
> > +}
> > +
> > +# The actual point at which limit enforcement takes place for the
> > +# hard block limit is variable depending on filesystem blocksize,
> > +# and iosize.  What we want to test is that the limit is enforced
> > +# (ie. blksize less than limit but not unduly less - ~85% is kind)
> > +# nowadays we actually get much closer to the limit before EDQUOT.
> > +#
> > +_filter_and_check_blks()
> > +{
> > +	perl -npe '
> > +		if (/^\#'$id'\s+(\d+)/ && '$enforce') {
> > +			$maximum = '$bhard';
> > +			$minimum = '$bhard' * 85/100;
> > +			$used = $1 * 1024;
> > +			if (($used < $minimum || $used > $maximum) && '$noextsz') {
> > +				printf(" URK %d: %d is out of range! [%d,%d]\n",
> > +					'$id', $used, $minimum, $maximum);
> > +			}
> > +			s/^(\#'$id'\s+)(\d+)/\1 =OK=/g;
> > +		}
> > +	' | _filter_report
> > +}
> > +
> > +_qsetup()
> > +{
> > +	opt=$1
> > +	enforce=0
> > +	if [ $opt = "u" -o $opt = "uno" ]; then
> > +		type=u
> > +		eval `_choose_uid`
> > +	elif [ $opt = "g" -o $opt = "gno" ]; then
> > +		type=g
> > +		eval `_choose_gid`
> > +	elif [ $opt = "p" -o $opt = "pno" ]; then
> > +		type=p
> > +		eval `_choose_prid`
> > +	fi
> > +	[ $opt = "u" -o $opt = "g" -o $opt = "p" ] && enforce=1
> > +
> > +	echo "Using type=$type id=$id" >> $seqres.full
> > +}
> 
> And above two functions are copied from xfs/050 and xfs/299, could you
> please re-factor them into a common helper so they could be shared by
> tests?

Yeah, I've done that.

> 
> > +
> > +_mount_idmapped()
> 
> Seems this could be made into a generic _scratch_mount_idmapped()
> helper.

I've added this as a simpler helper in its current form with the ability
to map a single id for now. We can later add a more complex helper if we
need to but handling variable number of arguments isn't really pleasant
so I'd defer this part until we need it.

> 
> > +{
> > +	if [ "$type" == "u" ]; then
> > +		# This means root will be able to create files as uid %id in
> > +		# the underlying filesystem by going through the idmapped mount.
> > +		$here/src/idmapped-mounts/mount-idmapped --map-mount u:0:$id:1 \
> > +							 --map-mount u:$id:0:1 \
> > +							 --map-mount g:0:0:1 \
> > +							 "$SCRATCH_MNT" "$SCRATCH_MNT" || _fail "mount-idmapped failed"
> > +	else
> > +		# This means root will be able to create files as gid %id in
> > +		# the underlying filesystem by going through the idmapped mount.
> > +		$here/src/idmapped-mounts/mount-idmapped --map-mount g:0:$id:1 \
> > +							 --map-mount g:$id:0:1 \
> > +							 --map-mount u:0:0:1 \
> > +							 "$SCRATCH_MNT" "$SCRATCH_MNT" || _fail "mount-idmapped failed"
> > +	fi
> > +}
> > +
> > +_umount_idmapped()
> 
> And turn this into _scratch_umount_idmapped()

Added.

> 
> > +{
> > +	# ls -al "$SCRATCH_MNT"
> 
> Could be removed?

Yeah, debugging residual.

> 
> > +	umount -l -q "${SCRATCH_MNT}" >/dev/null 2>&1
> 
> s/umount/$UMOUNT_PROG/. And it'd be good to add some comments to desribe
> why lazy umount is needed.

We don't need the lazy umount. I just use this as my default umount
strategy.

> 
> > +	# ls -al "$SCRATCH_MNT"
> 
> Could be removed?
> 
> > +}
> > +
> > +_exercise()
> 
> Remove the leading "_" for local functions.

Done and rename to run_test()

Thanks!
Christian



[Index of Archives]     [Linux Filesystems Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux