mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
Project Quota on ZFS
Project quota is a new ZFS system space/object usage accounting and enforcement mechanism. Similar as user/group quota, project quota is another dimension of system quota. It bases on the new object attribute - project ID. Project ID is a numerical value to indicate to which project an object belongs. An object only can belong to one project though you (the object owner or privileged user) can change the object project ID via 'chattr -p' or 'zfs project [-s] -p' explicitly. The object also can inherit the project ID from its parent when created if the parent has the project inherit flag (that can be set via 'chattr +P' or 'zfs project -s [-p]'). By accounting the spaces/objects belong to the same project, we can know how many spaces/objects used by the project. And if we set the upper limit then we can control the spaces/objects that are consumed by such project. It is useful when multiple groups and users cooperate for the same project, or a user/group needs to participate in multiple projects. Support the following commands and functionalities: zfs set projectquota@project zfs set projectobjquota@project zfs get projectquota@project zfs get projectobjquota@project zfs get projectused@project zfs get projectobjused@project zfs projectspace zfs allow projectquota zfs allow projectobjquota zfs allow projectused zfs allow projectobjused zfs unallow projectquota zfs unallow projectobjquota zfs unallow projectused zfs unallow projectobjused chattr +/-P chattr -p project_id lsattr -p This patch also supports tree quota based on the project quota via "zfs project" commands set as following: zfs project [-d|-r] <file|directory ...> zfs project -C [-k] [-r] <file|directory ...> zfs project -c [-0] [-d|-r] [-p id] <file|directory ...> zfs project [-p id] [-r] [-s] <file|directory ...> For "df [-i] $DIR" command, if we set INHERIT (project ID) flag on the $DIR, then the proejct [obj]quota and [obj]used values for the $DIR's project ID will be shown as the total/free (avail) resource. Keep the same behavior as EXT4/XFS does. Reviewed-by: Andreas Dilger <andreas.dilger@intel.com> Reviewed-by Ned Bass <bass6@llnl.gov> Reviewed-by: Matthew Ahrens <mahrens@delphix.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Fan Yong <fan.yong@intel.com> TEST_ZIMPORT_POOLS="zol-0.6.1 zol-0.6.2 master" Change-Id: Ib4f0544602e03fb61fd46a849d7ba51a6005693c Closes #6290
This commit is contained in:
committed by
Brian Behlendorf
parent
c03f04708c
commit
9c5167d19f
@@ -65,6 +65,7 @@ export SYSTEM_FILES='arp
|
||||
logname
|
||||
losetup
|
||||
ls
|
||||
lsattr
|
||||
lsblk
|
||||
lsmod
|
||||
lsscsi
|
||||
|
||||
@@ -43,6 +43,7 @@ SUBDIRS = \
|
||||
pool_names \
|
||||
poolversion \
|
||||
privilege \
|
||||
projectquota \
|
||||
quota \
|
||||
raidz \
|
||||
redundancy \
|
||||
|
||||
@@ -79,5 +79,6 @@ if is_linux; then
|
||||
"feature@large_dnode"
|
||||
"feature@userobj_accounting"
|
||||
"feature@encryption"
|
||||
"feature@project_quota"
|
||||
)
|
||||
fi
|
||||
|
||||
@@ -31,6 +31,10 @@
|
||||
|
||||
. $STF_SUITE/include/libtest.shlib
|
||||
|
||||
if is_linux; then
|
||||
log_unsupported "Requires pfexec command"
|
||||
fi
|
||||
|
||||
ZFS_USER=zfsrbac
|
||||
USES_NIS=false
|
||||
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
pkgdatadir = $(datadir)/@PACKAGE@/zfs-tests/tests/functional/projectquota
|
||||
dist_pkgdata_SCRIPTS = \
|
||||
projectquota.cfg \
|
||||
projectquota_common.kshlib \
|
||||
setup.ksh \
|
||||
cleanup.ksh \
|
||||
projectid_001_pos.ksh \
|
||||
projectid_002_pos.ksh \
|
||||
projectid_003_pos.ksh \
|
||||
projectquota_001_pos.ksh \
|
||||
projectquota_002_pos.ksh \
|
||||
projectquota_003_pos.ksh \
|
||||
projectquota_004_neg.ksh \
|
||||
projectquota_005_pos.ksh \
|
||||
projectquota_006_pos.ksh \
|
||||
projectquota_007_pos.ksh \
|
||||
projectquota_008_pos.ksh \
|
||||
projectquota_009_pos.ksh \
|
||||
projectspace_001_pos.ksh \
|
||||
projectspace_002_pos.ksh \
|
||||
projectspace_003_pos.ksh \
|
||||
projectspace_004_pos.ksh \
|
||||
projecttree_001_pos.ksh \
|
||||
projecttree_002_pos.ksh \
|
||||
projecttree_003_neg.ksh
|
||||
@@ -0,0 +1,37 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
log_must cleanup_projectquota
|
||||
log_must del_user $PUSER
|
||||
log_must del_group $PGROUP
|
||||
default_cleanup
|
||||
@@ -0,0 +1,103 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
#
|
||||
#
|
||||
# DESCRIPTION:
|
||||
# Check project ID/flags can be set/inherited properly
|
||||
#
|
||||
#
|
||||
# STRATEGY:
|
||||
# 1. Create a regular file and a directroy.
|
||||
# 2. Set project ID on both directroy and regular file.
|
||||
# 3. New created subdir or regular file should inherit its parent's
|
||||
# project ID if its parent has project inherit flag.
|
||||
# 4. New created subdir should inherit its parent project's inherit flag.
|
||||
#
|
||||
|
||||
function cleanup
|
||||
{
|
||||
log_must rm -f $PRJFILE
|
||||
log_must rm -rf $PRJDIR
|
||||
}
|
||||
|
||||
if ! lsattr -pd > /dev/null 2>&1; then
|
||||
log_unsupported "Current e2fsprogs does not support set/show project ID"
|
||||
fi
|
||||
|
||||
log_onexit cleanup
|
||||
|
||||
log_assert "Check project ID/flags can be set/inherited properly"
|
||||
|
||||
log_must touch $PRJFILE
|
||||
log_must mkdir $PRJDIR
|
||||
|
||||
log_must chattr -p $PRJID1 $PRJFILE
|
||||
log_must eval "lsattr -p $PRJFILE | grep $PRJID1 | grep '\- '"
|
||||
log_must chattr -p $PRJID1 $PRJDIR
|
||||
log_must eval "lsattr -pd $PRJDIR | grep $PRJID1 | grep '\- '"
|
||||
|
||||
log_must chattr +P $PRJDIR
|
||||
log_must eval "lsattr -pd $PRJDIR | grep $PRJID1 | grep '\-P '"
|
||||
|
||||
# "-1" is invalid project ID, should be denied
|
||||
log_mustnot chattr -p -1 $PRJFILE
|
||||
log_must eval "lsattr -p $PRJFILE | grep $PRJID1 | grep '\- '"
|
||||
|
||||
log_must mkdir $PRJDIR/dchild
|
||||
log_must eval "lsattr -pd $PRJDIR/dchild | grep $PRJID1 | grep '\-P '"
|
||||
log_must touch $PRJDIR/fchild
|
||||
log_must eval "lsattr -p $PRJDIR/fchild | grep $PRJID1"
|
||||
|
||||
log_must touch $PRJDIR/dchild/foo
|
||||
log_must eval "lsattr -p $PRJDIR/dchild/foo | grep $PRJID1"
|
||||
|
||||
# not support project ID/flag on symlink
|
||||
log_must ln -s $PRJDIR/dchild/foo $PRJDIR/dchild/s_foo
|
||||
log_mustnot lsattr -p $PRJDIR/dchild/s_foo
|
||||
log_mustnot chattr -p 123 $PRJDIR/dchild/s_foo
|
||||
log_mustnot chattr +P $PRJDIR/dchild/s_foo
|
||||
|
||||
# not support project ID/flag on block special file
|
||||
log_must mknod $PRJDIR/dchild/b_foo b 124 124
|
||||
log_mustnot lsattr -p $PRJDIR/dchild/b_foo
|
||||
log_mustnot chattr -p 123 $PRJDIR/dchild/b_foo
|
||||
log_mustnot chattr +P $PRJDIR/dchild/b_foo
|
||||
|
||||
# not support project ID/flag on character special file
|
||||
log_must mknod $PRJDIR/dchild/c_foo c 125 125
|
||||
log_mustnot lsattr -p $PRJDIR/dchild/c_foo
|
||||
log_mustnot chattr -p 123 $PRJDIR/dchild/c_foo
|
||||
log_mustnot chattr +P $PRJDIR/dchild/c_foo
|
||||
|
||||
log_pass "Check project ID/flags can be set/inherited properly"
|
||||
@@ -0,0 +1,88 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
#
|
||||
#
|
||||
# DESCRIPTION:
|
||||
# Project ID affects POSIX behavior
|
||||
#
|
||||
#
|
||||
# STRATEGY:
|
||||
# 1. Create three directories
|
||||
# 2. Set tdir1 and tdir3 project ID as PRJID1,
|
||||
# set tdir2 project ID as PRJID2.
|
||||
# 3. Create regular file under tdir1. It inherits tdir1 proejct ID.
|
||||
# 4. Hardlink from tdir1's child to tdir2 should be denied,
|
||||
# move tdir1's child to tdir2 will be object recreated.
|
||||
# 5. Hardlink from tdir1's child to tdir3 should succeed.
|
||||
#
|
||||
|
||||
function cleanup
|
||||
{
|
||||
log_must rm -rf $PRJDIR1
|
||||
log_must rm -rf $PRJDIR2
|
||||
log_must rm -rf $PRJDIR3
|
||||
}
|
||||
|
||||
if ! lsattr -pd > /dev/null 2>&1; then
|
||||
log_unsupported "Current e2fsprogs does not support set/show project ID"
|
||||
fi
|
||||
|
||||
log_onexit cleanup
|
||||
|
||||
log_assert "Project ID affects POSIX behavior"
|
||||
|
||||
log_must mkdir $PRJDIR1
|
||||
log_must mkdir $PRJDIR2
|
||||
log_must mkdir $PRJDIR3
|
||||
log_must mkdir $PRJDIR3/dir
|
||||
|
||||
log_must chattr +P -p $PRJID1 $PRJDIR1
|
||||
log_must chattr +P -p $PRJID2 $PRJDIR2
|
||||
|
||||
log_must touch $PRJDIR1/tfile1
|
||||
log_must touch $PRJDIR1/tfile2
|
||||
log_must eval "lsattr -p $PRJDIR1/tfile1 | grep $PRJID1"
|
||||
|
||||
log_mustnot ln $PRJDIR1/tfile1 $PRJDIR2/tfile2
|
||||
|
||||
log_must mv $PRJDIR1/tfile1 $PRJDIR2/tfile2
|
||||
log_must eval "lsattr -p $PRJDIR2/tfile2 | grep $PRJID2"
|
||||
|
||||
log_must mv $PRJDIR3/dir $PRJDIR2/
|
||||
log_must eval "lsattr -dp $PRJDIR2/dir | grep $PRJID2"
|
||||
|
||||
log_must chattr +P -p $PRJID1 $PRJDIR3
|
||||
log_must ln $PRJDIR1/tfile2 $PRJDIR3/tfile3
|
||||
|
||||
log_pass "Project ID affects POSIX behavior"
|
||||
@@ -0,0 +1,81 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. Fan rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
#
|
||||
# DESCRIPTION:
|
||||
# Check changing project ID for the file with directory-based
|
||||
# extended attributes.
|
||||
#
|
||||
#
|
||||
# STRATEGY:
|
||||
# 1. create new file with default project ID
|
||||
# 2. set non-ACL extended attributes on the file
|
||||
# 3. use zfs projectspace to check the object usage
|
||||
# 4. change the file's project ID
|
||||
# 5. use zfs projectspace to check the object usage again
|
||||
#
|
||||
|
||||
function cleanup
|
||||
{
|
||||
log_must rm -f $PRJGUARD
|
||||
log_must rm -f $PRJFILE
|
||||
}
|
||||
|
||||
if ! lsattr -pd > /dev/null 2>&1; then
|
||||
log_unsupported "Current e2fsprogs does not support set/show project ID"
|
||||
fi
|
||||
|
||||
log_onexit cleanup
|
||||
|
||||
log_assert "Check changing project ID with directory-based extended attributes"
|
||||
|
||||
log_must zfs set xattr=on $QFS
|
||||
|
||||
log_must touch $PRJGUARD
|
||||
log_must chattr -p $PRJID1 $PRJGUARD
|
||||
log_must touch $PRJFILE
|
||||
log_must setfattr -n trusted.ea1 -v val1 $PRJFILE
|
||||
log_must setfattr -n trusted.ea2 -v val2 $PRJFILE
|
||||
log_must setfattr -n trusted.ea3 -v val3 $PRJFILE
|
||||
|
||||
sync_pool
|
||||
typeset prj_bef=$(project_obj_count $QFS $PRJID1)
|
||||
|
||||
log_must chattr -p $PRJID1 $PRJFILE
|
||||
sync_pool
|
||||
typeset prj_aft=$(project_obj_count $QFS $PRJID1)
|
||||
|
||||
[[ $prj_aft -ge $((prj_bef + 5)) ]] ||
|
||||
log_fail "new value ($prj_aft) is NOT 5 largr than old one ($prj_bef)"
|
||||
|
||||
log_pass "Changing project ID with directory-based extended attributes pass"
|
||||
@@ -0,0 +1,46 @@
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
export PUSER=puser
|
||||
export PGROUP=pgroup
|
||||
|
||||
export PRJID1=1001
|
||||
export PRJID2=1002
|
||||
|
||||
export QFS=$TESTPOOL/$TESTFS
|
||||
export PRJFILE=$TESTDIR/tfile
|
||||
export PRJGUARD=$TESTDIR/guard
|
||||
export PRJDIR=$TESTDIR/tdir
|
||||
export PRJDIR1=$TESTDIR/tdir1
|
||||
export PRJDIR2=$TESTDIR/tdir2
|
||||
export PRJDIR3=$TESTDIR/tdir3
|
||||
|
||||
export PQUOTA_LIMIT=1000000
|
||||
export PQUOTA_OBJLIMIT=1000
|
||||
@@ -0,0 +1,88 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
#
|
||||
#
|
||||
# DESCRIPTION:
|
||||
# Check the basic function of the project{obj}quota
|
||||
#
|
||||
#
|
||||
# STRATEGY:
|
||||
# 1. Set projectquota and overwrite the quota size.
|
||||
# 2. The write operation should fail with Disc quota exceeded
|
||||
# 3. Set projectobjquota and overcreate the quota size.
|
||||
# 4. More create should fail with Disc quota exceeded
|
||||
# 5. More chattr to such project should fail with Disc quota exceeded
|
||||
#
|
||||
|
||||
function cleanup
|
||||
{
|
||||
cleanup_projectquota
|
||||
}
|
||||
|
||||
if ! lsattr -pd > /dev/null 2>&1; then
|
||||
log_unsupported "Current e2fsprogs does not support set/show project ID"
|
||||
fi
|
||||
|
||||
log_onexit cleanup
|
||||
|
||||
log_assert "If operation overwrite project{obj}quota size, it will fail"
|
||||
|
||||
mkmount_writable $QFS
|
||||
|
||||
log_note "Check the projectquota@$PRJID1"
|
||||
log_must user_run $PUSER mkdir $PRJDIR
|
||||
log_must chattr +P -p $PRJID1 $PRJDIR
|
||||
|
||||
log_must zfs set projectquota@$PRJID1=$PQUOTA_LIMIT $QFS
|
||||
log_must user_run $PUSER mkfile $PQUOTA_LIMIT $PRJDIR/qf
|
||||
sync_pool
|
||||
log_mustnot user_run $PUSER mkfile 1 $PRJDIR/of
|
||||
|
||||
log_must rm -rf $PRJDIR
|
||||
|
||||
log_note "Check the projectobjquota@$PRJID2"
|
||||
log_must zfs set xattr=sa $QFS
|
||||
log_must user_run $PUSER mkdir $PRJDIR
|
||||
log_must chattr +P -p $PRJID2 $PRJDIR
|
||||
|
||||
log_must zfs set projectobjquota@$PRJID2=$PQUOTA_OBJLIMIT $QFS
|
||||
log_must user_run $PUSER mkfiles $PRJDIR/qf_ $((PQUOTA_OBJLIMIT - 1))
|
||||
sync_pool
|
||||
log_mustnot user_run $PUSER mkfile 1 $PRJDIR/of
|
||||
|
||||
log_must user_run $PUSER touch $PRJFILE
|
||||
log_must user_run $PUSER chattr -p 123 $PRJFILE
|
||||
log_mustnot user_run $PUSER chattr -p $PRJID2 $PRJFILE
|
||||
|
||||
log_pass "Operation overwrite project{obj}quota size failed as expect"
|
||||
@@ -0,0 +1,86 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
#
|
||||
# DESCRIPTION:
|
||||
# The project{obj}quota can be set during zpool or zfs creation
|
||||
#
|
||||
#
|
||||
# STRATEGY:
|
||||
# 1. Set project{obj}quota via "zpool -O or zfs create -o"
|
||||
#
|
||||
|
||||
verify_runnable "global"
|
||||
|
||||
function cleanup
|
||||
{
|
||||
if poolexists $TESTPOOL1; then
|
||||
log_must zpool destroy $TESTPOOL1
|
||||
fi
|
||||
|
||||
if [[ -f $pool_vdev ]]; then
|
||||
rm -f $pool_vdev
|
||||
fi
|
||||
}
|
||||
|
||||
log_onexit cleanup
|
||||
|
||||
log_assert "The project{obj}quota can be set during zpool,zfs creation"
|
||||
|
||||
typeset pool_vdev=/var/tmp/pool_dev.$$
|
||||
|
||||
log_must mkfile 500m $pool_vdev
|
||||
|
||||
if poolexists $TESTPOOL1; then
|
||||
zpool destroy $TESTPOOL1
|
||||
fi
|
||||
|
||||
log_must zpool create -O projectquota@$PRJID1=$PQUOTA_LIMIT \
|
||||
-O projectobjquota@$PRJID2=$PQUOTA_OBJLIMIT $TESTPOOL1 $pool_vdev
|
||||
|
||||
log_must eval "zfs list -r -o projectquota@$PRJID1,projectobjquota@$PRJID2 \
|
||||
$TESTPOOL1 > /dev/null 2>&1"
|
||||
|
||||
log_must check_quota "projectquota@$PRJID1" $TESTPOOL1 "$PQUOTA_LIMIT"
|
||||
log_must check_quota "projectobjquota@$PRJID2" $TESTPOOL1 "$PQUOTA_OBJLIMIT"
|
||||
|
||||
log_must zfs create -o projectquota@$PRJID1=$PQUOTA_LIMIT \
|
||||
-o projectobjquota@$PRJID2=$PQUOTA_OBJLIMIT $TESTPOOL1/fs
|
||||
|
||||
log_must eval "zfs list -r -o projectquota@$PRJID1,projectobjquota@$PRJID2 \
|
||||
$TESTPOOL1 > /dev/null 2>&1"
|
||||
|
||||
log_must check_quota "projectquota@$PRJID1" $TESTPOOL1/fs "$PQUOTA_LIMIT"
|
||||
log_must check_quota "projectobjquota@$PRJID2" $TESTPOOL1/fs "$PQUOTA_OBJLIMIT"
|
||||
|
||||
log_pass "The project{obj}quota can be set during zpool,zfs creation"
|
||||
@@ -0,0 +1,98 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
#
|
||||
# DESCRIPTION:
|
||||
# Check the basic function project{obj}used
|
||||
#
|
||||
#
|
||||
# STRATEGY:
|
||||
# 1. Write data to fs with some project then check the project{obj}used
|
||||
#
|
||||
|
||||
function cleanup
|
||||
{
|
||||
cleanup_projectquota
|
||||
}
|
||||
|
||||
if ! lsattr -pd > /dev/null 2>&1; then
|
||||
log_unsupported "Current e2fsprogs does not support set/show project ID"
|
||||
fi
|
||||
|
||||
log_onexit cleanup
|
||||
|
||||
log_assert "Check the basic function of project{obj}used"
|
||||
|
||||
sync_pool
|
||||
typeset project_used=$(get_value "projectused@$PRJID1" $QFS)
|
||||
typeset file_size='10m'
|
||||
|
||||
if [[ $project_used != 0 ]]; then
|
||||
log_fail "FAIL: projectused is $project_used, should be 0"
|
||||
fi
|
||||
|
||||
mkmount_writable $QFS
|
||||
log_must user_run $PUSER mkdir $PRJDIR
|
||||
log_must chattr +P -p $PRJID1 $PRJDIR
|
||||
log_must user_run $PUSER mkfile $file_size $PRJDIR/qf
|
||||
sync_pool
|
||||
project_used=$(get_value "projectused@$PRJID1" $QFS)
|
||||
# get_value() reads the exact byte value which is slightly more than 10m
|
||||
if [[ "$(($project_used/1024/1024))m" != "$file_size" ]]; then
|
||||
log_note "project $PRJID1 used is $project_used"
|
||||
log_fail "projectused for project $PRJID1 expected to be $file_size, " \
|
||||
"not $project_used"
|
||||
fi
|
||||
|
||||
log_must rm -rf $PRJDIR
|
||||
typeset project_obj_used=$(get_value "projectobjused@$PRJID2" $QFS)
|
||||
typeset file_count=100
|
||||
|
||||
if [[ $project_obj_used != 0 ]]; then
|
||||
log_fail "FAIL: projectobjused is $project_obj_used, should be 0"
|
||||
fi
|
||||
|
||||
log_must zfs set xattr=sa $QFS
|
||||
log_must user_run $PUSER mkdir $PRJDIR
|
||||
log_must chattr +P -p $PRJID2 $PRJDIR
|
||||
# $PRJDIR has already used one object with the $PRJID2
|
||||
log_must user_run $PUSER mkfiles $PRJDIR/qf_ $((file_count - 1))
|
||||
sync_pool
|
||||
project_obj_used=$(get_value "projectobjused@$PRJID2" $QFS)
|
||||
if [[ $project_obj_used != $file_count ]]; then
|
||||
log_note "project $PRJID2 used is $project_obj_used"
|
||||
log_fail "projectobjused for project $PRJID2 expected to be " \
|
||||
"$file_count, not $project_obj_used"
|
||||
fi
|
||||
|
||||
log_pass "Check the basic function of project{obj}used pass as expect"
|
||||
@@ -0,0 +1,87 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
#
|
||||
# DESCRIPTION:
|
||||
# Check the invalid parameter of zfs set project{obj}quota
|
||||
#
|
||||
#
|
||||
# STRATEGY:
|
||||
# 1. check the invalid zfs set project{obj}quota to fs
|
||||
# 2. check the valid zfs set project{obj}quota to snapshots
|
||||
#
|
||||
|
||||
function cleanup
|
||||
{
|
||||
if datasetexists $snap_fs; then
|
||||
log_must zfs destroy $snap_fs
|
||||
fi
|
||||
|
||||
log_must cleanup_projectquota
|
||||
}
|
||||
|
||||
log_onexit cleanup
|
||||
|
||||
log_assert "Check the invalid parameter of zfs set project{obj}quota"
|
||||
typeset snap_fs=$QFS@snap
|
||||
|
||||
log_must zfs snapshot $snap_fs
|
||||
|
||||
set -A no_prjs "mms1234" "ss@#" "root-122" "-1"
|
||||
for prj in "${no_prjs[@]}"; do
|
||||
log_mustnot zfs set projectquota@$prj=100m $QFS
|
||||
done
|
||||
|
||||
log_note "can set all numberic id even that id is not existed"
|
||||
log_must zfs set projectquota@12345678=100m $QFS
|
||||
|
||||
set -A sizes "100mfsd" "m0.12m" "GGM" "-1234-m" "123m-m"
|
||||
for size in "${sizes[@]}"; do
|
||||
log_note "can not set projectquota with invalid size parameter"
|
||||
log_mustnot zfs set projectquota@$PRJID1=$size $QFS
|
||||
done
|
||||
|
||||
log_note "can not set projectquota to snapshot $snap_fs"
|
||||
log_mustnot zfs set projectquota@$PRJID1=100m $snap_fs
|
||||
|
||||
for prj in "${no_prjs[@]}"; do
|
||||
log_mustnot zfs set projectobjquota@$prj=100 $QFS
|
||||
done
|
||||
|
||||
log_note "can not set projectobjquota with invalid size parameter"
|
||||
log_mustnot zfs set projectobjquota@$PRJID2=100msfsd $QFS
|
||||
|
||||
log_note "can not set projectobjquota to snapshot $snap_fs"
|
||||
log_mustnot zfs set projectobjquota@$PRJID2=100m $snap_fs
|
||||
|
||||
log_pass "Check the invalid parameter of zfs set project{obj}quota"
|
||||
@@ -0,0 +1,68 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
#
|
||||
# DESCRIPTION:
|
||||
# Check the invalid parameter of zfs get project{obj}quota
|
||||
#
|
||||
#
|
||||
# STRATEGY:
|
||||
# 1. check the invalid zfs get project{obj}quota to fs
|
||||
# 2. check the valid zfs get project{obj}quota to snapshots
|
||||
#
|
||||
|
||||
function cleanup
|
||||
{
|
||||
if datasetexists $snap_fs; then
|
||||
log_must zfs destroy $snap_fs
|
||||
fi
|
||||
|
||||
log_must cleanup_projectquota
|
||||
}
|
||||
|
||||
log_onexit cleanup
|
||||
|
||||
log_assert "Check the invalid parameter of zfs get project{obj}quota"
|
||||
typeset snap_fs=$QFS@snap
|
||||
|
||||
log_must zfs snapshot $snap_fs
|
||||
|
||||
set -A no_prjs "mms1234" "ss@#" "root-122"
|
||||
for prj in "${no_prjs[@]}"; do
|
||||
log_must eval "zfs get projectquota@$prj $QFS >/dev/null 2>&1"
|
||||
log_must eval "zfs get projectquota@$prj $snap_fs >/dev/null 2>&1"
|
||||
log_must eval "zfs get projectobjquota@$prj $QFS >/dev/null 2>&1"
|
||||
log_must eval "zfs get projectobjquota@$prj $snap_fs >/dev/null 2>&1"
|
||||
done
|
||||
|
||||
log_pass "Check the invalid parameter of zfs get project{obj}quota"
|
||||
@@ -0,0 +1,75 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
#
|
||||
# DESCRIPTION:
|
||||
# Projectquota can be set beyond the fs quota.
|
||||
# Pprojectquota can be set at a smaller size than its current usage.
|
||||
#
|
||||
# STRATEGY:
|
||||
# 1. set quota to a fs and set a larger size of projectquota
|
||||
# 2. write some data to the fs and set a smaller projectquota
|
||||
#
|
||||
|
||||
function cleanup
|
||||
{
|
||||
log_must cleanup_projectquota
|
||||
log_must zfs set quota=none $QFS
|
||||
}
|
||||
|
||||
if ! lsattr -pd > /dev/null 2>&1; then
|
||||
log_unsupported "Current e2fsprogs does not support set/show project ID"
|
||||
fi
|
||||
|
||||
log_onexit cleanup
|
||||
|
||||
log_assert "Check set projectquota to larger than the quota size of a fs"
|
||||
|
||||
log_must zfs set quota=200m $QFS
|
||||
log_must zfs set projectquota@$PRJID1=500m $QFS
|
||||
|
||||
log_must zfs get projectquota@$PRJID1 $QFS
|
||||
|
||||
log_note "write some data to the $QFS"
|
||||
mkmount_writable $QFS
|
||||
log_must user_run $PUSER mkdir $PRJDIR
|
||||
log_must chattr +P -p $PRJID1 $PRJDIR
|
||||
log_must user_run $PUSER mkfile 100m $PRJDIR/qf
|
||||
sync
|
||||
|
||||
log_note "set projectquota at a smaller size than it current usage"
|
||||
log_must zfs set projectquota@$PRJID1=90m $QFS
|
||||
|
||||
log_must zfs get projectquota@$PRJID1 $QFS
|
||||
|
||||
log_pass "set projectquota to larger than quota size of a fs"
|
||||
@@ -0,0 +1,58 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
#
|
||||
# DESCRIPTION:
|
||||
# zfs get all <fs> does not print out project{obj}quota
|
||||
#
|
||||
# STRATEGY:
|
||||
# 1. set project{obj}quota to a fs
|
||||
# 2. check zfs get all fs
|
||||
#
|
||||
|
||||
function cleanup
|
||||
{
|
||||
log_must cleanup_projectquota
|
||||
}
|
||||
|
||||
log_onexit cleanup
|
||||
|
||||
log_assert "Check zfs get all will not print out project{obj}quota"
|
||||
|
||||
log_must zfs set projectquota@$PRJID1=50m $QFS
|
||||
log_must zfs set projectobjquota@$PRJID2=100 $QFS
|
||||
|
||||
log_mustnot eval "zfs get all $QFS | grep projectquota"
|
||||
log_mustnot eval "zfs get all $QFS | grep projectobjquota"
|
||||
|
||||
log_pass "zfs get all will not print out project{obj}quota"
|
||||
@@ -0,0 +1,91 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
#
|
||||
# DESCRIPTION:
|
||||
# Check project{obj}quota to snapshot that:
|
||||
# 1) can not set project{obj}quota to snapshot directly
|
||||
# 2) snapshot can inherit the parent fs's project{obj}quota
|
||||
# 3) the project{obj}quota will not change even the parent quota changed.
|
||||
#
|
||||
#
|
||||
# STRATEGY:
|
||||
# 1. create a snapshot of a fs
|
||||
# 2. set the project{obj}quota to snapshot and expect fail
|
||||
# 3. set project{obj}quota to fs and check the snapshot
|
||||
# 4. re-set project{obj}quota to fs and check the snapshot's value
|
||||
#
|
||||
|
||||
function cleanup
|
||||
{
|
||||
if datasetexists $snap_fs; then
|
||||
log_must zfs destroy $snap_fs
|
||||
fi
|
||||
|
||||
log_must cleanup_projectquota
|
||||
}
|
||||
|
||||
log_onexit cleanup
|
||||
|
||||
log_assert "Check the snapshot's project{obj}quota"
|
||||
typeset snap_fs=$QFS@snap
|
||||
|
||||
|
||||
log_must zfs set projectquota@$PRJID1=$PQUOTA_LIMIT $QFS
|
||||
log_must check_quota "projectquota@$PRJID1" $QFS "$PQUOTA_LIMIT"
|
||||
|
||||
log_must zfs set projectobjquota@$PRJID2=$PQUOTA_OBJLIMIT $QFS
|
||||
log_must check_quota "projectobjquota@$PRJID2" $QFS "$PQUOTA_OBJLIMIT"
|
||||
|
||||
log_must zfs snapshot $snap_fs
|
||||
|
||||
log_note "check the snapshot $snap_fs project{obj}quota"
|
||||
log_must check_quota "projectquota@$PRJID1" $snap_fs "$PQUOTA_LIMIT"
|
||||
log_must check_quota "projectobjquota@$PRJID2" $snap_fs "$PQUOTA_OBJLIMIT"
|
||||
|
||||
log_note "set project{obj}quota to $snap_fs which will fail"
|
||||
log_mustnot zfs set projectquota@$PRJID1=100m $snap_fs
|
||||
log_mustnot zfs set projectobjquota@$PRJID2=100 $snap_fs
|
||||
|
||||
log_note "change the parent's project{obj}quota"
|
||||
log_must zfs set projectquota@$PRJID1=$((PQUOTA_LIMIT * 2)) $QFS
|
||||
log_must zfs set projectobjquota@$PRJID2=50 $QFS
|
||||
|
||||
log_must check_quota "projectquota@$PRJID1" $QFS $((PQUOTA_LIMIT * 2))
|
||||
log_must check_quota "projectobjquota@$PRJID2" $QFS 50
|
||||
|
||||
log_note "check the snapshot $snap_fs project{obj}quota"
|
||||
log_must check_quota "projectquota@$PRJID1" $snap_fs "$PQUOTA_LIMIT"
|
||||
log_must check_quota "projectobjquota@$PRJID2" $snap_fs "$PQUOTA_OBJLIMIT"
|
||||
|
||||
log_pass "Check the snapshot's project{obj}quota"
|
||||
@@ -0,0 +1,131 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
#
|
||||
# DESCRIPTION:
|
||||
# The project{obj}quota will not change during zfs actions, such as
|
||||
# snapshot,clone,rename,upgrade,send,receive.
|
||||
#
|
||||
#
|
||||
# STRATEGY:
|
||||
# 1. Create a pool, and create fs with preset project{obj}quota
|
||||
# 2. Check set project{obj}quota via zfs snapshot|clone|list -o
|
||||
# 3. Check the project{obj}quota can not change during zfs
|
||||
# rename|upgrade|promote
|
||||
# 4. Check the project{obj}quota can not change during zfs clone
|
||||
# 5. Check the project{obj}quota can not change during zfs send/receive
|
||||
#
|
||||
|
||||
function cleanup
|
||||
{
|
||||
for ds in $TESTPOOL/fs $TESTPOOL/fs-rename $TESTPOOL/fs-clone; do
|
||||
if datasetexists $ds; then
|
||||
log_must zfs destroy -rRf $ds
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
log_onexit cleanup
|
||||
|
||||
log_assert "the project{obj}quota can't change during zfs actions"
|
||||
|
||||
cleanup
|
||||
|
||||
log_must zfs create -o projectquota@$PRJID1=$PQUOTA_LIMIT \
|
||||
-o projectobjquota@$PRJID2=$PQUOTA_OBJLIMIT $TESTPOOL/fs
|
||||
|
||||
log_must zfs snapshot $TESTPOOL/fs@snap
|
||||
log_must eval "zfs list -r -o projectquota@$PRJID1,projectobjquota@$PRJID2 \
|
||||
$TESTPOOL >/dev/null 2>&1"
|
||||
|
||||
log_must check_quota "projectquota@$PRJID1" $TESTPOOL/fs@snap "$PQUOTA_LIMIT"
|
||||
log_must check_quota "projectobjquota@$PRJID2" $TESTPOOL/fs@snap \
|
||||
"$PQUOTA_OBJLIMIT"
|
||||
|
||||
|
||||
log_note "clone fs gets its parent's project{obj}quota initially"
|
||||
log_must zfs clone -o projectquota@$PRJID1=$PQUOTA_LIMIT \
|
||||
-o projectobjquota@$PRJID2=$PQUOTA_OBJLIMIT \
|
||||
$TESTPOOL/fs@snap $TESTPOOL/fs-clone
|
||||
|
||||
log_must eval "zfs list -r -o projectquota@$PRJID1,projectobjquota@$PRJID2 \
|
||||
$TESTPOOL >/dev/null 2>&1"
|
||||
|
||||
log_must check_quota "projectquota@$PRJID1" $TESTPOOL/fs-clone "$PQUOTA_LIMIT"
|
||||
log_must check_quota "projectobjquota@$PRJID2" $TESTPOOL/fs-clone \
|
||||
"$PQUOTA_OBJLIMIT"
|
||||
|
||||
log_must eval "zfs list -o projectquota@$PRJID1,projectobjquota@$PRJID2 \
|
||||
$TESTPOOL/fs-clone >/dev/null 2>&1"
|
||||
|
||||
log_note "zfs promote can not change the previously set project{obj}quota"
|
||||
log_must zfs promote $TESTPOOL/fs-clone
|
||||
|
||||
log_must eval "zfs list -r -o projectquota@$PRJID1,projectobjquota@$PRJID2 \
|
||||
$TESTPOOL >/dev/null 2>&1"
|
||||
|
||||
log_must check_quota "projectquota@$PRJID1" $TESTPOOL/fs-clone "$PQUOTA_LIMIT"
|
||||
log_must check_quota "projectobjquota@$PRJID2" $TESTPOOL/fs-clone \
|
||||
"$PQUOTA_OBJLIMIT"
|
||||
|
||||
log_note "zfs send receive can not change the previously set project{obj}quota"
|
||||
log_must zfs send $TESTPOOL/fs-clone@snap | zfs receive $TESTPOOL/fs-rev
|
||||
|
||||
log_must eval "zfs list -r -o projectquota@$PRJID1,projectobjquota@$PRJID2 \
|
||||
$TESTPOOL >/dev/null 2>&1"
|
||||
|
||||
log_must check_quota "projectquota@$PRJID1" $TESTPOOL/fs-rev "$PQUOTA_LIMIT"
|
||||
log_must check_quota "projectobjquota@$PRJID2" $TESTPOOL/fs-rev \
|
||||
"$PQUOTA_OBJLIMIT"
|
||||
|
||||
log_note "zfs rename can not change the previously set project{obj}quota"
|
||||
log_must zfs rename $TESTPOOL/fs-rev $TESTPOOL/fs-rename
|
||||
|
||||
log_must eval "zfs list -r -o projectquota@$PRJID1,projectobjquota@$PRJID2 \
|
||||
$TESTPOOL >/dev/null 2>&1"
|
||||
|
||||
log_must check_quota "projectquota@$PRJID1" $TESTPOOL/fs-rename "$PQUOTA_LIMIT"
|
||||
log_must check_quota "projectobjquota@$PRJID2" $TESTPOOL/fs-rename \
|
||||
"$PQUOTA_OBJLIMIT"
|
||||
|
||||
log_note "zfs upgrade can not change the previously set project{obj}quota"
|
||||
log_must zfs upgrade $TESTPOOL/fs-rename
|
||||
|
||||
log_must eval "zfs list -r -o projectquota@$PRJID1,projectobjquota@$PRJID2 \
|
||||
$TESTPOOL >/dev/null 2>&1"
|
||||
|
||||
log_must check_quota "projectquota@$PRJID1" $TESTPOOL/fs-rename "$PQUOTA_LIMIT"
|
||||
log_must check_quota "projectobjquota@$PRJID2" $TESTPOOL/fs-rename \
|
||||
"$PQUOTA_OBJLIMIT"
|
||||
|
||||
log_pass "the project{obj}quota can't change during zfs actions"
|
||||
@@ -0,0 +1,101 @@
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/include/libtest.shlib
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota.cfg
|
||||
|
||||
#
|
||||
# reset the projectquota and delete temporary files
|
||||
#
|
||||
function cleanup_projectquota
|
||||
{
|
||||
if datasetexists $QFS; then
|
||||
typeset mntp=$(get_prop mountpoint $QFS)
|
||||
|
||||
log_must zfs set projectquota@$PRJID1=none $QFS
|
||||
log_must zfs set projectobjquota@$PRJID1=none $QFS
|
||||
log_must zfs set projectquota@$PRJID2=none $QFS
|
||||
log_must zfs set projectobjquota@$PRJID2=none $QFS
|
||||
log_must chmod 0755 $mntp
|
||||
fi
|
||||
|
||||
[[ -f $PRJFILE ]] && log_must rm -f $PRJFILE
|
||||
[[ -d $PRJDIR ]] && log_must rm -rf $PRJDIR
|
||||
[[ -d $PRJDIR1 ]] && log_must rm -rf $PRJDIR1
|
||||
[[ -d $PRJDIR2 ]] && log_must rm -rf $PRJDIR2
|
||||
[[ -d $PRJDIR3 ]] && log_must rm -rf $PRJDIR3
|
||||
sync
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
function mkmount_writable
|
||||
{
|
||||
typeset fs=$1
|
||||
typeset mntp=$(get_prop mountpoint $fs)
|
||||
log_must chmod 0777 $mntp
|
||||
}
|
||||
|
||||
function check_quota
|
||||
{
|
||||
typeset fs=$2
|
||||
typeset prop=$1
|
||||
typeset expected=$3
|
||||
typeset value=$(get_prop $prop $fs)
|
||||
|
||||
if (($value != $expected)); then
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function get_value
|
||||
{
|
||||
typeset prop_val
|
||||
typeset prop=$1
|
||||
typeset dataset=$2
|
||||
|
||||
prop_val=$(zfs get -H -p -o value $prop $dataset 2>/dev/null)
|
||||
if [[ $? -ne 0 ]]; then
|
||||
log_note "Unable to get $prop property for dataset $dataset"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo $prop_val
|
||||
}
|
||||
|
||||
function project_obj_count
|
||||
{
|
||||
typeset fs=$1
|
||||
typeset prj=$2
|
||||
typeset cnt=$(zfs projectspace -oname,objused $fs |
|
||||
awk /$prj/'{print $2}')
|
||||
[[ "$cnt" == "-" ]] && cnt=0 || true
|
||||
echo $cnt
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. Fan rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
#
|
||||
# DESCRIPTION:
|
||||
# Check the zfs projectspace with kinds of parameters
|
||||
#
|
||||
#
|
||||
# STRATEGY:
|
||||
# 1. set zfs projectspace to a fs
|
||||
# 2. write some data to the fs with specified project ID
|
||||
# 3. use zfs projectspace with all possible parameters to check the result
|
||||
# 4. use zfs projectspace with some bad parameters to check the result
|
||||
#
|
||||
|
||||
function cleanup
|
||||
{
|
||||
if datasetexists $snap_fs; then
|
||||
log_must zfs destroy $snap_fs
|
||||
fi
|
||||
|
||||
log_must cleanup_projectquota
|
||||
}
|
||||
|
||||
if ! lsattr -pd > /dev/null 2>&1; then
|
||||
log_unsupported "Current e2fsprogs does not support set/show project ID"
|
||||
fi
|
||||
|
||||
log_onexit cleanup
|
||||
|
||||
log_assert "Check the zfs projectspace with all possible parameters"
|
||||
|
||||
set -A good_params -- "-H" "-p" "-o type,name,used,quota" "-o name,used,quota" \
|
||||
"-o used,quota" "-o objused" "-o quota" "-s type" "-s name" "-s used" \
|
||||
"-s quota" "-S type" "-S name" "-S used" "-S quota"
|
||||
|
||||
typeset snap_fs=$QFS@snap
|
||||
|
||||
log_must zfs set projectquota@$PRJID1=100m $QFS
|
||||
log_must zfs set projectobjquota@$PRJID1=100 $QFS
|
||||
mkmount_writable $QFS
|
||||
log_must user_run $PUSER mkdir $PRJDIR
|
||||
log_must chattr +P -p $PRJID1 $PRJDIR
|
||||
log_must user_run $PUSER mkfile 50m $PRJDIR/qf
|
||||
sync
|
||||
|
||||
log_must zfs snapshot $snap_fs
|
||||
|
||||
for param in "${good_params[@]}"; do
|
||||
log_must eval "zfs projectspace $param $QFS >/dev/null 2>&1"
|
||||
log_must eval "zfs projectspace $param $snap_fs >/dev/null 2>&1"
|
||||
done
|
||||
|
||||
log_assert "Check the zfs projectspace with some bad parameters"
|
||||
|
||||
set -A bad_params -- "-i" "-n" "-P" "-t posixuser"
|
||||
|
||||
for param in "${bad_params[@]}"; do
|
||||
log_mustnot eval "zfs projectspace $param $QFS >/dev/null 2>&1"
|
||||
log_mustnot eval "zfs projectspace $param $snap_fs >/dev/null 2>&1"
|
||||
done
|
||||
|
||||
log_pass "zfs projectspace with kinds of parameters pass"
|
||||
@@ -0,0 +1,85 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
#
|
||||
# DESCRIPTION:
|
||||
# Check the project used size and quota in zfs projectspace
|
||||
#
|
||||
#
|
||||
# STRATEGY:
|
||||
# 1. set zfs projectquota to a fs
|
||||
# 2. write some data to the fs with specified project and size
|
||||
# 3. use zfs projectspace to check the used size and quota size
|
||||
#
|
||||
|
||||
function cleanup
|
||||
{
|
||||
if datasetexists $snapfs; then
|
||||
log_must zfs destroy $snapfs
|
||||
fi
|
||||
|
||||
log_must cleanup_projectquota
|
||||
}
|
||||
|
||||
if ! lsattr -pd > /dev/null 2>&1; then
|
||||
log_unsupported "Current e2fsprogs does not support set/show project ID"
|
||||
fi
|
||||
|
||||
log_onexit cleanup
|
||||
|
||||
log_assert "Check the zfs projectspace used and quota"
|
||||
|
||||
log_must zfs set projectquota@$PRJID1=100m $QFS
|
||||
|
||||
mkmount_writable $QFS
|
||||
log_must user_run $PUSER mkdir $PRJDIR
|
||||
log_must chattr +P -p $PRJID1 $PRJDIR
|
||||
log_must user_run $PUSER mkfile 50m $PRJDIR/qf
|
||||
sync
|
||||
|
||||
typeset snapfs=$QFS@snap
|
||||
|
||||
log_must zfs snapshot $snapfs
|
||||
|
||||
log_must eval "zfs projectspace $QFS >/dev/null 2>&1"
|
||||
log_must eval "zfs projectspace $snapfs >/dev/null 2>&1"
|
||||
|
||||
for fs in "$QFS" "$snapfs"; do
|
||||
log_note "check the quota size in zfs projectspace $fs"
|
||||
log_must eval "zfs projectspace $fs | grep $PRJID1 | grep 100M"
|
||||
|
||||
log_note "check the project used size in zfs projectspace $fs"
|
||||
log_must eval "zfs projectspace $fs | grep $PRJID1 | grep 50\\.\*M"
|
||||
done
|
||||
|
||||
log_pass "Check the zfs projectspace used and quota"
|
||||
@@ -0,0 +1,118 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
#
|
||||
# DESCRIPTION:
|
||||
# Check the project used object accounting in zfs projectspace
|
||||
#
|
||||
#
|
||||
# STRATEGY:
|
||||
# 1. create a bunch of files by specific project
|
||||
# 2. use zfs projectspace to check the used objects
|
||||
# 3. change the project ID of test files and verify object count
|
||||
# 4. delete files and verify object count
|
||||
#
|
||||
|
||||
function cleanup
|
||||
{
|
||||
if datasetexists $snapfs; then
|
||||
log_must zfs destroy $snapfs
|
||||
fi
|
||||
|
||||
log_must cleanup_projectquota
|
||||
}
|
||||
|
||||
if ! lsattr -pd > /dev/null 2>&1; then
|
||||
log_unsupported "Current e2fsprogs does not support set/show project ID"
|
||||
fi
|
||||
|
||||
log_onexit cleanup
|
||||
|
||||
log_assert "Check the zfs projectspace object used"
|
||||
|
||||
mkmount_writable $QFS
|
||||
log_must zfs set xattr=sa $QFS
|
||||
log_must user_run $PUSER mkdir $PRJDIR1
|
||||
log_must user_run $PUSER mkdir $PRJDIR2
|
||||
log_must chattr +P -p $PRJID1 $PRJDIR1
|
||||
log_must chattr +P -p $PRJID2 $PRJDIR2
|
||||
|
||||
((prj_cnt1 = RANDOM % 100 + 2))
|
||||
((prj_cnt2 = RANDOM % 100 + 2))
|
||||
|
||||
log_must user_run $PUSER mkfiles $PRJDIR1/qf $((prj_cnt1 - 1))
|
||||
log_must user_run $PUSER mkfiles $PRJDIR2/qf $((prj_cnt2 - 1))
|
||||
sync_pool
|
||||
|
||||
typeset snapfs=$QFS@snap
|
||||
|
||||
log_must zfs snapshot $snapfs
|
||||
|
||||
log_must eval "zfs projectspace $QFS >/dev/null 2>&1"
|
||||
log_must eval "zfs projectspace $snapfs >/dev/null 2>&1"
|
||||
|
||||
for fs in "$QFS" "$snapfs"; do
|
||||
log_note "check the project used objects in zfs projectspace $fs"
|
||||
prjused=$(project_obj_count $fs $PRJID1)
|
||||
[[ $prjused -eq $prj_cnt1 ]] ||
|
||||
log_fail "($PRJID1) expected $prj_cnt1, got $prjused"
|
||||
prjused=$(project_obj_count $fs $PRJID2)
|
||||
[[ $prjused -eq $prj_cnt2 ]] ||
|
||||
log_fail "($PRJID2) expected $prj_cnt2, got $prjused"
|
||||
done
|
||||
|
||||
log_note "change the project of files"
|
||||
log_must chattr -p $PRJID2 $PRJDIR1/qf*
|
||||
sync_pool
|
||||
|
||||
prjused=$(project_obj_count $QFS $PRJID1)
|
||||
[[ $prjused -eq 1 ]] ||
|
||||
log_fail "expected 1 for project $PRJID1, got $prjused"
|
||||
|
||||
prjused=$(project_obj_count $snapfs $PRJID1)
|
||||
[[ $prjused -eq $prj_cnt1 ]] ||
|
||||
log_fail "expected $prj_cnt1 for $PRJID1 in snapfs, got $prjused"
|
||||
|
||||
prjused=$(project_obj_count $QFS $PRJID2)
|
||||
[[ $prjused -eq $((prj_cnt1 + prj_cnt2 - 1)) ]] ||
|
||||
log_fail "($PRJID2) expected $((prj_cnt1 + prj_cnt2 - 1)), got $prjused"
|
||||
|
||||
log_note "file removal"
|
||||
log_must rm -rf $PRJDIR1
|
||||
sync_pool
|
||||
|
||||
prjused=$(project_obj_count $QFS $PRJID1)
|
||||
[[ $prjused -eq 0 ]] || log_fail "expected 0 for $PRJID1, got $prjused"
|
||||
|
||||
cleanup
|
||||
log_pass "Check the zfs projectspace object used"
|
||||
@@ -0,0 +1,76 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. Fan rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
#
|
||||
# DESCRIPTION:
|
||||
# Check 'df' command on the directory with INHERIT (project ID) flag
|
||||
#
|
||||
#
|
||||
# STRATEGY:
|
||||
# 1. set project [obj]quota on the directory
|
||||
# 2. set project ID and inherit flag on the directoty
|
||||
# 3. run 'df [-i]' on the directory and check the result
|
||||
#
|
||||
|
||||
function cleanup
|
||||
{
|
||||
if datasetexists $snap_fs; then
|
||||
log_must zfs destroy $snap_fs
|
||||
fi
|
||||
|
||||
log_must cleanup_projectquota
|
||||
}
|
||||
|
||||
if ! lsattr -pd > /dev/null 2>&1; then
|
||||
log_unsupported "Current e2fsprogs does not support set/show project ID"
|
||||
fi
|
||||
|
||||
log_onexit cleanup
|
||||
|
||||
log_assert "Check 'df' on dir with inherit project shows the project quota/used"
|
||||
|
||||
log_must zfs set projectquota@$PRJID1=100m $QFS
|
||||
log_must zfs set projectobjquota@$PRJID1=100 $QFS
|
||||
mkmount_writable $QFS
|
||||
log_must user_run $PUSER mkdir $PRJDIR
|
||||
log_must chattr +P -p $PRJID1 $PRJDIR
|
||||
log_must user_run $PUSER mkfile 50m $PRJDIR/qf
|
||||
sync_pool
|
||||
|
||||
total=$(df $PRJDIR | tail -n 1 | awk '{ print $2 }')
|
||||
[[ $total -eq 102400 ]] || log_fail "expect '102400' resource, but got '$total'"
|
||||
|
||||
used=$(df -i $PRJDIR | tail -n 1 | awk '{ print $5 }')
|
||||
[[ "$used" == "2%" ]] || log_fail "expect '2%' used, but got '$used'"
|
||||
|
||||
log_pass "'df' on the directory with inherit project ID flag pass as expect"
|
||||
@@ -0,0 +1,98 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
#
|
||||
#
|
||||
# DESCRIPTION:
|
||||
# Check 'zfs project' is compatible with chattr/lsattr
|
||||
#
|
||||
#
|
||||
# STRATEGY:
|
||||
# Verify the following:
|
||||
# 1. "zfs project -p" behaviours the same as "chattr -p"
|
||||
# 2. "zfs project" behaviours the same as "lsattr -p"
|
||||
# 3. "zfs project -d" behaviours the same as "lsattr -p -d"
|
||||
# 4. "zfs project -s" behaviours the same as "chattr +P"
|
||||
# 5. "zfs project -s -p" behaviours the same as "chattr +P -p"
|
||||
# 6. "zfs project -C" behaviours the same as "chattr -P"
|
||||
#
|
||||
|
||||
function cleanup
|
||||
{
|
||||
log_must rm -rf $PRJDIR
|
||||
}
|
||||
|
||||
if ! lsattr -pd > /dev/null 2>&1; then
|
||||
log_unsupported "Current e2fsprogs does not support set/show project ID"
|
||||
fi
|
||||
|
||||
log_onexit cleanup
|
||||
|
||||
log_assert "Check 'zfs project' is compatible with chattr/lsattr"
|
||||
|
||||
log_must mkdir $PRJDIR
|
||||
log_must mkdir $PRJDIR/a1
|
||||
log_must mkdir $PRJDIR/a2
|
||||
log_must touch $PRJDIR/a3
|
||||
|
||||
log_must chattr -p $PRJID1 $PRJDIR/a3
|
||||
log_must eval "zfs project $PRJDIR/a3 | grep '$PRJID1 \-'"
|
||||
|
||||
log_must zfs project -p $PRJID2 $PRJDIR/a3
|
||||
log_must eval "lsattr -p $PRJDIR/a3 | grep $PRJID2 | grep '\- '"
|
||||
|
||||
log_must chattr -p $PRJID1 $PRJDIR/a1
|
||||
log_must eval "zfs project -d $PRJDIR/a1 | grep '$PRJID1 \-'"
|
||||
|
||||
log_must zfs project -p $PRJID2 $PRJDIR/a1
|
||||
log_must eval "lsattr -pd $PRJDIR/a1 | grep $PRJID2 | grep '\- '"
|
||||
|
||||
log_must chattr +P $PRJDIR/a2
|
||||
log_must eval "zfs project -d $PRJDIR/a2 | grep '0 P'"
|
||||
|
||||
log_must zfs project -s $PRJDIR/a2
|
||||
log_must eval "lsattr -pd $PRJDIR/a2 | grep 0 | grep '\-P '"
|
||||
|
||||
log_must chattr +P -p $PRJID1 $PRJDIR/a1
|
||||
log_must eval "zfs project -d $PRJDIR/a1 | grep '$PRJID1 P'"
|
||||
|
||||
log_must zfs project -s -p $PRJID2 $PRJDIR/a2
|
||||
log_must eval "lsattr -pd $PRJDIR/a2 | grep $PRJID2 | grep '\-P '"
|
||||
|
||||
log_must chattr -P $PRJDIR/a1
|
||||
log_must eval "zfs project -d $PRJDIR/a1 | grep '$PRJID1 \-'"
|
||||
|
||||
log_must zfs project -C -k $PRJDIR/a2
|
||||
log_must eval "lsattr -pd $PRJDIR/a2 | grep $PRJID2 | grep '\- '"
|
||||
|
||||
log_pass "Check 'zfs project' is compatible with chattr/lsattr"
|
||||
@@ -0,0 +1,120 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
#
|
||||
#
|
||||
# DESCRIPTION:
|
||||
# Check project ID/flag can be operated via "zfs project"
|
||||
#
|
||||
#
|
||||
# STRATEGY:
|
||||
# 1. Create a tree with 4 level directories.
|
||||
# 2. Set project ID on both directroy and regular file via
|
||||
# "zfs project -p".
|
||||
# 3. Check the project ID via "zfs project".
|
||||
# 4. Set project inherit flag on kinds of level directories (and its
|
||||
# descendants for some)) via "zfs project -s [-r]".
|
||||
# 5. Check the project ID and inherit flag via "zfs project -r".
|
||||
# 6. Clear the project inherit flag from some directories (and its
|
||||
# descendants for some) via "zfs project -C [-r]".
|
||||
# 7. Check the project ID and inherit flag via "zfs project -r".
|
||||
#
|
||||
|
||||
function cleanup
|
||||
{
|
||||
log_must rm -rf $PRJDIR
|
||||
}
|
||||
|
||||
log_onexit cleanup
|
||||
|
||||
log_assert "Check project ID/flag can be operated via 'zfs project'"
|
||||
|
||||
log_must mkdir $PRJDIR
|
||||
|
||||
log_must mkdir $PRJDIR/a1
|
||||
log_must mkdir $PRJDIR/b1
|
||||
log_must touch $PRJDIR/c1
|
||||
|
||||
log_must mkdir $PRJDIR/a1/a2
|
||||
log_must mkdir $PRJDIR/a1/b2
|
||||
log_must touch $PRJDIR/a1/c2
|
||||
|
||||
log_must mkdir $PRJDIR/b1/a2
|
||||
log_must mkdir $PRJDIR/b1/b2
|
||||
log_must touch $PRJDIR/b1/c2
|
||||
|
||||
log_must mkdir $PRJDIR/a1/a2/a3
|
||||
log_must mkdir $PRJDIR/a1/a2/b3
|
||||
log_must touch $PRJDIR/a1/a2/c3
|
||||
|
||||
log_must mkdir $PRJDIR/b1/a2/a3
|
||||
|
||||
log_must touch $PRJDIR/a1/a2/a3/c4
|
||||
log_must touch $PRJDIR/a1/a2/a3/d4
|
||||
|
||||
log_must zfs project -p $PRJID1 $PRJDIR/a1/c2
|
||||
log_must eval "zfs project $PRJDIR/a1/c2 | grep $PRJID1"
|
||||
|
||||
log_must zfs project -p $PRJID2 $PRJDIR/a1/a2/a3
|
||||
log_must eval "zfs project -d $PRJDIR/a1/a2/a3 | grep $PRJID2"
|
||||
|
||||
log_must zfs project -s $PRJDIR/b1/a2
|
||||
log_must eval "zfs project -d $PRJDIR/b1/a2 | grep ' P '"
|
||||
log_must eval "zfs project -d $PRJDIR/b1/a2/a3 | grep ' \- '"
|
||||
|
||||
log_must zfs project -s -r -p $PRJID2 $PRJDIR/a1/a2
|
||||
log_must zfs project -c -r $PRJDIR/a1/a2
|
||||
log_must eval "zfs project -d $PRJDIR/a1/a2/a3 | grep ' P '"
|
||||
log_must eval "zfs project $PRJDIR/a1/a2/a3/c4 | grep $PRJID2"
|
||||
|
||||
log_must zfs project -C $PRJDIR/a1/a2/a3
|
||||
log_must eval "zfs project -cr $PRJDIR/a1/a2 | grep 'inherit flag is not set'"
|
||||
log_must eval "zfs project $PRJDIR/a1/a2/a3/c4 | grep $PRJID2 | grep -v not"
|
||||
log_must zfs project -p 123 $PRJDIR/a1/a2/a3/c4
|
||||
log_must eval "zfs project -c -r $PRJDIR/a1/a2 | grep 123 | grep 'not set'"
|
||||
log_mustnot eval "zfs project -cr -p 123 $PRJDIR/a1/a2 | grep c4 | grep -v not"
|
||||
|
||||
log_must zfs project -C -r $PRJDIR/a1/a2/a3
|
||||
log_must eval "zfs project -cr $PRJDIR/a1/a2 | grep a3 | grep 'not set'"
|
||||
log_must eval "zfs project -cr $PRJDIR/a1/a2 | grep d4 | grep 'not set'"
|
||||
log_must eval "zfs project $PRJDIR/a1/a2/a3/d4 | grep '0 \-'"
|
||||
|
||||
log_must eval \
|
||||
"zfs project -cr -0 $PRJDIR/a1/a2 | xargs -0 zfs project -s -p $PRJID2"
|
||||
log_mustnot eval "zfs project -cr $PRJDIR/a1/a2 | grep a3 | grep 'not set'"
|
||||
log_mustnot eval "zfs project -cr $PRJDIR/a1/a2 | grep d4 | grep 'not set'"
|
||||
|
||||
log_must zfs project -C -r -k $PRJDIR/a1/a2
|
||||
log_must eval "zfs project -d $PRJDIR/a1/a2/b3 | grep '$PRJID2 \- '"
|
||||
|
||||
log_pass "Check project ID/flag can be operated via 'zfs project'"
|
||||
@@ -0,0 +1,103 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
#
|
||||
#
|
||||
# DESCRIPTION:
|
||||
# Check 'zfs project' invalid options combinations
|
||||
#
|
||||
#
|
||||
# STRATEGY:
|
||||
# Verify the following:
|
||||
# 1. "-c" only supports "-d", "-p", "-r" and "-0".
|
||||
# 2. "-C" only supports "-r" and "-k".
|
||||
# 3. "-s" only supports "-r" and "-p".
|
||||
# 4. "-c", "-C" and "-s" can NOT be specified together.
|
||||
# 5. "-d" can overwirte former "-r".
|
||||
# 6. "-r" can overwirte former "-d".
|
||||
# 7. "-0" must be together with "-c".
|
||||
# 8. "-d" must be on directory.
|
||||
# 9. "-r" must be on directory.
|
||||
# 10. "-p" must be together with "-c -r" or "-s".
|
||||
#
|
||||
|
||||
function cleanup
|
||||
{
|
||||
log_must rm -rf $PRJDIR
|
||||
}
|
||||
|
||||
log_onexit cleanup
|
||||
|
||||
log_assert "Check 'zfs project' invalid options combinations"
|
||||
|
||||
log_must mkdir $PRJDIR
|
||||
log_must mkdir $PRJDIR/a1
|
||||
log_must touch $PRJDIR/a2
|
||||
|
||||
log_mustnot zfs project -c
|
||||
log_mustnot zfs project -c -k $PRJDIR/a1
|
||||
log_mustnot zfs project -c -C $PRJDIR/a1
|
||||
log_mustnot zfs project -c -s $PRJDIR/a1
|
||||
log_must zfs project -c -d -r $PRJDIR/a1
|
||||
log_must zfs project -c -r -d $PRJDIR/a1
|
||||
log_mustnot zfs project -c -d $PRJDIR/a2
|
||||
log_mustnot zfs project -c -r $PRJDIR/a2
|
||||
|
||||
log_mustnot zfs project -C
|
||||
log_mustnot zfs project -C -c $PRJDIR/a1
|
||||
log_mustnot zfs project -C -d $PRJDIR/a1
|
||||
log_mustnot zfs project -C -p 100 $PRJDIR/a1
|
||||
log_mustnot zfs project -C -s $PRJDIR/a1
|
||||
log_mustnot zfs project -C -r -0 $PRJDIR/a1
|
||||
log_mustnot zfs project -C -0 $PRJDIR/a1
|
||||
|
||||
log_mustnot zfs project -s
|
||||
log_mustnot zfs project -s -d $PRJDIR/a1
|
||||
log_mustnot zfs project -s -k $PRJDIR/a1
|
||||
log_mustnot zfs project -s -r -0 $PRJDIR/a1
|
||||
log_mustnot zfs project -s -0 $PRJDIR/a1
|
||||
log_mustnot zfs project -s -r $PRJDIR/a2
|
||||
|
||||
log_mustnot zfs project -p 100
|
||||
log_mustnot zfs project -p -1 $PRJDIR/a2
|
||||
log_mustnot zfs project -p 100 -d $PRJDIR/a1
|
||||
log_mustnot zfs project -p 100 -k $PRJDIR/a1
|
||||
log_mustnot zfs project -p 100 -0 $PRJDIR/a1
|
||||
log_mustnot zfs project -p 100 -r -0 $PRJDIR/a1
|
||||
|
||||
log_mustnot zfs project
|
||||
log_mustnot zfs project -0 $PRJDIR/a2
|
||||
log_mustnot zfs project -k $PRJDIR/a2
|
||||
log_mustnot zfs project -S $PRJDIR/a1
|
||||
|
||||
log_pass "Check 'zfs project' invalid options combinations"
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/projectquota/projectquota_common.kshlib
|
||||
|
||||
verify_runnable "both"
|
||||
|
||||
del_user $PUSER
|
||||
del_group $PGROUP
|
||||
log_must add_group $PGROUP
|
||||
log_must add_user $PGROUP $PUSER
|
||||
|
||||
#
|
||||
# Verify the test user can execute the zfs utilities. This may not
|
||||
# be possible due to default permissions on the user home directory.
|
||||
# This can be resolved granting group read access.
|
||||
#
|
||||
# chmod 0750 $HOME
|
||||
#
|
||||
user_run $PUSER zfs list
|
||||
if [ $? -ne 0 ]; then
|
||||
log_unsupported "Test user $PUSER cannot execute zfs utilities"
|
||||
fi
|
||||
|
||||
DISK=${DISKS%% *}
|
||||
default_setup_noexit $DISK
|
||||
|
||||
log_pass
|
||||
@@ -1,5 +1,7 @@
|
||||
pkgdatadir = $(datadir)/@PACKAGE@/zfs-tests/tests/functional/upgrade
|
||||
dist_pkgdata_SCRIPTS = \
|
||||
upgrade_common.kshlib \
|
||||
setup.ksh \
|
||||
cleanup.ksh \
|
||||
upgrade_userobj_001_pos.ksh
|
||||
upgrade_userobj_001_pos.ksh \
|
||||
upgrade_projectquota_001_pos.ksh
|
||||
|
||||
@@ -33,12 +33,10 @@
|
||||
# Copyright (c) 2016 by Jinshan Xiong. No rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/include/libtest.shlib
|
||||
. $STF_SUITE/tests/functional/upgrade/upgrade_common.kshlib
|
||||
|
||||
verify_runnable "global"
|
||||
|
||||
log_must zpool destroy $TESTPOOL
|
||||
|
||||
log_must rm /tmp/zpool_upgrade_test.dat
|
||||
log_must rm -f $TMPDEV
|
||||
|
||||
default_cleanup
|
||||
|
||||
@@ -33,12 +33,11 @@
|
||||
# Copyright (c) 2016 by Jinshan Xiong. No rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/include/libtest.shlib
|
||||
. $STF_SUITE/tests/functional/upgrade/upgrade_common.kshlib
|
||||
|
||||
verify_runnable "global"
|
||||
|
||||
# create a pool without any features
|
||||
log_must mkfile 128m /tmp/zpool_upgrade_test.dat
|
||||
log_must zpool create -d -m $TESTDIR $TESTPOOL /tmp/zpool_upgrade_test.dat
|
||||
log_must mkfile 128m $TMPDEV
|
||||
|
||||
log_pass
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/include/libtest.shlib
|
||||
|
||||
export TMPDEV=/tmp/zpool_upgrade_test.dat
|
||||
|
||||
function cleanup_upgrade
|
||||
{
|
||||
datasetexists $TESTPOOL/fs1 && log_must zfs destroy $TESTPOOL/fs1
|
||||
datasetexists $TESTPOOL/fs2 && log_must zfs destroy $TESTPOOL/fs2
|
||||
datasetexists $TESTPOOL/fs3 && log_must zfs destroy $TESTPOOL/fs3
|
||||
datasetexists $TESTPOOL && log_must zpool destroy $TESTPOOL
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
#!/bin/ksh -p
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 by Fan Yong. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/tests/functional/upgrade/upgrade_common.kshlib
|
||||
|
||||
#
|
||||
# DESCRIPTION:
|
||||
#
|
||||
# Check whether zfs upgrade for project quota works or not.
|
||||
# The project quota is per dataset based feature, this test
|
||||
# will create multiple datasets and try different upgrade methods.
|
||||
#
|
||||
# STRATEGY:
|
||||
# 1. Create a pool with all features disabled
|
||||
# 2. Create a few dataset for testing
|
||||
# 3. Make sure automatic upgrade work
|
||||
# 4. Make sure manual upgrade work
|
||||
#
|
||||
|
||||
verify_runnable "global"
|
||||
|
||||
if ! lsattr -pd > /dev/null 2>&1; then
|
||||
log_unsupported "Current e2fsprogs does not support set/show project ID"
|
||||
fi
|
||||
|
||||
log_assert "pool upgrade for projectquota should work"
|
||||
log_onexit cleanup_upgrade
|
||||
|
||||
log_must zpool create -d -m $TESTDIR $TESTPOOL $TMPDEV
|
||||
|
||||
log_must mkfiles $TESTDIR/tf $((RANDOM % 100 + 1))
|
||||
log_must zfs create $TESTPOOL/fs1
|
||||
log_must mkfiles $TESTDIR/fs1/tf $((RANDOM % 100 + 1))
|
||||
log_must zfs umount $TESTPOOL/fs1
|
||||
|
||||
log_must zfs create $TESTPOOL/fs2
|
||||
log_must mkdir $TESTDIR/fs2/dir
|
||||
log_must mkfiles $TESTDIR/fs2/tf $((RANDOM % 100 + 1))
|
||||
|
||||
log_must zfs create $TESTPOOL/fs3
|
||||
log_must mkdir $TESTDIR/fs3/dir
|
||||
log_must mkfiles $TESTDIR/fs3/tf $((RANDOM % 100 + 1))
|
||||
|
||||
# Make sure project quota is disabled
|
||||
zfs projectspace -o used $TESTPOOL | grep -q "USED" &&
|
||||
log_fail "project quota should be disabled initially"
|
||||
|
||||
# set projectquota before upgrade will fail
|
||||
log_mustnot zfs set projectquota@100=100m $TESTDIR/fs3
|
||||
|
||||
# set projectobjquota before upgrade will fail
|
||||
log_mustnot zfs set projectobjquota@100=1000 $TESTDIR/fs3
|
||||
|
||||
# 'chattr -p' should fail before upgrade
|
||||
log_mustnot chattr -p 100 $TESTDIR/fs3/dir
|
||||
|
||||
# 'chattr +P' should fail before upgrade
|
||||
log_mustnot chattr +P $TESTDIR/fs3/dir
|
||||
|
||||
# Upgrade zpool to support all features
|
||||
log_must zpool upgrade $TESTPOOL
|
||||
|
||||
# Double check project quota is disabled
|
||||
zfs projectspace -o used $TESTPOOL | grep -q "USED" &&
|
||||
log_fail "project quota should be disabled after pool upgrade"
|
||||
|
||||
# Mount dataset should trigger upgrade
|
||||
log_must zfs mount $TESTPOOL/fs1
|
||||
log_must sleep 3 # upgrade done in the background so let's wait for a while
|
||||
zfs projectspace -o used $TESTPOOL/fs1 | grep -q "USED" ||
|
||||
log_fail "project quota should be enabled for $TESTPOOL/fs1"
|
||||
|
||||
# Create file should trigger dataset upgrade
|
||||
log_must mkfile 1m $TESTDIR/fs2/dir/tf
|
||||
log_must sleep 3 # upgrade done in the background so let's wait for a while
|
||||
zfs projectspace -o used $TESTPOOL/fs2 | grep -q "USED" ||
|
||||
log_fail "project quota should be enabled for $TESTPOOL/fs2"
|
||||
|
||||
# "lsattr -p" should NOT trigger upgrade
|
||||
log_must lsattr -p -d $TESTDIR/fs3/dir
|
||||
zfs projectspace -o used $TESTPOOL/fs3 | grep -q "USED" &&
|
||||
log_fail "project quota should not active for $TESTPOOL/fs3"
|
||||
|
||||
# 'chattr -p' should trigger dataset upgrade
|
||||
log_must chattr -p 100 $TESTDIR/fs3/dir
|
||||
log_must sleep 5 # upgrade done in the background so let's wait for a while
|
||||
zfs projectspace -o used $TESTPOOL/fs3 | grep -q "USED" ||
|
||||
log_fail "project quota should be enabled for $TESTPOOL/fs3"
|
||||
cnt=$(zfs get -H projectobjused@100 $TESTPOOL/fs3 | awk '{print $3}')
|
||||
# if 'xattr=on', then 'cnt = 2'
|
||||
[[ $cnt -ne 1 ]] && [[ $cnt -ne 2 ]] &&
|
||||
log_fail "projectquota accounting failed $cnt"
|
||||
|
||||
# All in all, after having been through this, the dataset for testpool
|
||||
# still shouldn't be upgraded
|
||||
zfs projectspace -o used $TESTPOOL | grep -q "USED" &&
|
||||
log_fail "project quota should be disabled for $TESTPOOL"
|
||||
|
||||
# Manual upgrade root dataset
|
||||
# uses an ioctl which will wait for the upgrade to be done before returning
|
||||
log_must zfs set version=current $TESTPOOL
|
||||
zfs projectspace -o used $TESTPOOL | grep -q "USED" ||
|
||||
log_fail "project quota should be enabled for $TESTPOOL"
|
||||
|
||||
log_pass "Project Quota upgrade done"
|
||||
@@ -25,7 +25,7 @@
|
||||
# Copyright (c) 2017 Datto Inc.
|
||||
#
|
||||
|
||||
. $STF_SUITE/include/libtest.shlib
|
||||
. $STF_SUITE/tests/functional/upgrade/upgrade_common.kshlib
|
||||
|
||||
#
|
||||
# DESCRIPTION:
|
||||
@@ -41,16 +41,12 @@
|
||||
# 4. Make sure manual upgrade work
|
||||
#
|
||||
|
||||
function cleanup
|
||||
{
|
||||
datasetexists $TESTPOOL/fs1 && log_must zfs destroy $TESTPOOL/fs1
|
||||
datasetexists $TESTPOOL/fs2 && log_must zfs destroy $TESTPOOL/fs2
|
||||
}
|
||||
|
||||
verify_runnable "global"
|
||||
|
||||
log_assert "pool upgrade for userobj accounting should work"
|
||||
log_onexit cleanup
|
||||
log_onexit cleanup_upgrade
|
||||
|
||||
log_must zpool create -d -m $TESTDIR $TESTPOOL $TMPDEV
|
||||
|
||||
log_must mkfiles $TESTDIR/tf $((RANDOM % 1000 + 1))
|
||||
log_must zfs create $TESTPOOL/fs1
|
||||
|
||||
Reference in New Issue
Block a user