mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2025-06-27 11:37:35 +03:00

This mostly involves reworking platform checks to make illumos the exception (thanks to their unusual way of exposing xattrs). Other platforms are able to take advantage of the recently added xattr wrappers in libtest. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Ryan Moeller <ryan@ixsystems.com> Closes #9872
138 lines
4.1 KiB
Plaintext
138 lines
4.1 KiB
Plaintext
#
|
|
# 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 2008 Sun Microsystems, Inc. All rights reserved.
|
|
# Use is subject to license terms.
|
|
#
|
|
|
|
#
|
|
# Copyright (c) 2013, 2016 by Delphix. All rights reserved.
|
|
#
|
|
|
|
. $STF_SUITE/include/libtest.shlib
|
|
. $STF_SUITE/tests/functional/xattr/xattr.cfg
|
|
|
|
# a function that takes a file, then creates and verifies
|
|
# an xattr on that file. The xattr_contents is the file
|
|
# that should appear in the xattr namespace.
|
|
function create_xattr { # filename xattr_name xattr_contents
|
|
typeset FILE=$1
|
|
typeset XATTR_NAME=$2
|
|
typeset XATTR_CONTENTS=$3
|
|
|
|
if is_illumos; then
|
|
# read any empty xattr on that file
|
|
log_must runat $FILE ls
|
|
# create the xattr
|
|
log_must runat $FILE cp $XATTR_CONTENTS $XATTR_NAME
|
|
else
|
|
log_mustnot get_xattr $XATTR_NAME $FILE
|
|
log_must set_xattr_stdin $XATTR_NAME $FILE < $XATTR_CONTENTS
|
|
fi
|
|
|
|
verify_xattr $FILE $XATTR_NAME $XATTR_CONTENTS
|
|
}
|
|
|
|
# a function that compares the a single xattr between two files
|
|
# and checks to see if their contents are identical
|
|
function compare_xattrs { # filename1 filename2 xattr_name
|
|
typeset FILE1=$1
|
|
typeset FILE2=$2
|
|
typeset XATTR_NAME=$3
|
|
|
|
if is_illumos; then
|
|
runat $FILE1 cat $XATTR_NAME > $TEST_BASE_DIR/file1.$$
|
|
runat $FILE2 cat $XATTR_NAME > $TEST_BASE_DIR/file2.$$
|
|
else
|
|
get_xattr $XATTR_NAME $FILE1 > $TEST_BASE_DIR/file1.$$
|
|
get_xattr $XATTR_NAME $FILE2 > $TEST_BASE_DIR/file2.$$
|
|
fi
|
|
|
|
log_must diff $TEST_BASE_DIR/file1.$$ $TEST_BASE_DIR/file2.$$
|
|
log_must rm $TEST_BASE_DIR/file1.$$ $TEST_BASE_DIR/file2.$$
|
|
}
|
|
|
|
function verify_xattr { # filename xattr_name xattr_contents
|
|
typeset FILE=$1
|
|
typeset XATTR_NAME=$2
|
|
typeset XATTR_CONTENTS=$3
|
|
|
|
# read the xattr, writing it to a temp file
|
|
if is_illumos; then
|
|
log_must eval \
|
|
"runat $FILE cat $XATTR_NAME > $TEST_BASE_DIR/$XATTR_NAME.$$ 2>&1"
|
|
else
|
|
log_must eval \
|
|
"get_xattr $XATTR_NAME $FILE > $TEST_BASE_DIR/$XATTR_NAME.$$"
|
|
fi
|
|
|
|
log_must diff $XATTR_CONTENTS $TEST_BASE_DIR/$XATTR_NAME.$$
|
|
rm $TEST_BASE_DIR/$XATTR_NAME.$$
|
|
}
|
|
|
|
function delete_xattr { # filename xattr_name
|
|
typeset FILE=$1
|
|
typeset XATTR_NAME=$2
|
|
|
|
# delete the xattr
|
|
if is_illumos; then
|
|
log_must runat $FILE rm $XATTR_NAME
|
|
log_mustnot eval "runat $FILE ls $XATTR_NAME > /dev/null 2>&1"
|
|
else
|
|
log_must rm_xattr $XATTR_NAME $FILE
|
|
log_mustnot get_xattr $XATTR_NAME $FILE
|
|
fi
|
|
}
|
|
|
|
# not sure about this : really this should be testing write/append
|
|
function verify_write_xattr { # filename xattr_name
|
|
typeset FILE=$1
|
|
typeset XATTR_NAME=$2
|
|
|
|
if is_illumos; then
|
|
log_must eval "runat $FILE dd if=/etc/passwd of=$XATTR_NAME"
|
|
log_must eval \
|
|
"runat $FILE cat $XATTR_NAME > $TEST_BASE_DIR/$XATTR_NAME.$$ 2>&1"
|
|
else
|
|
log_must set_xattr_stdin $XATTR_NAME $FILE < /etc/passwd
|
|
log_must eval \
|
|
"get_xattr $XATTR_NAME $FILE > $TEST_BASE_DIR/$XATTR_NAME.$$"
|
|
fi
|
|
log_must dd if=/etc/passwd of=$TEST_BASE_DIR/passwd_dd.$$
|
|
log_must diff $TEST_BASE_DIR/passwd_dd.$$ $TEST_BASE_DIR/$XATTR_NAME.$$
|
|
log_must rm $TEST_BASE_DIR/passwd_dd.$$ $TEST_BASE_DIR/$XATTR_NAME.$$
|
|
}
|
|
|
|
# this function is to create the expected output
|
|
function create_expected_output { # expected_output_file contents_of_the_output
|
|
typeset FILE=$1
|
|
shift
|
|
if [[ -f $FILE ]]; then
|
|
log_must rm $FILE
|
|
fi
|
|
|
|
for line in $@
|
|
do
|
|
log_must eval "echo $line >> $FILE"
|
|
done
|
|
}
|