instead of assumming the directory's initial state (xattrs & mutability), test it. instead of trusting chattr works and gives the exit code, verify chattr's actions on the directory by examining its xattrs, and do this both before and after setting it as a barrier. --- testfs.sh-0.20b 2009-08-20 19:45:48.000000000 -0500 +++ testfs.sh-0.20c 2009-08-21 16:45:44.000000000 -0500 @@ -479,6 +479,8 @@ function do_test () { local lsattr_U="-+(-)-i-+(-)-t*(-)" ;; *) + # non-barrier, immutable directory (used in testing chattr) + local attr_I="-+(-)-buI-" local attr_B="-+(-)-Bui-" attr_b="-+(-)-bui-" local attr_U="-+(-)--UI-" attr_u="-+(-)--ui-" local lsattr_B="-+(-)?(A)+(-)" @@ -491,10 +493,25 @@ function do_test () { eexec 101 0 "mount -t $fs -o $mopt $DEV $MNT 3>&2" || return eeval "mkdir -p $dpath" + # verify initial xattrs + eexec ??? 0 "do_xattr_verify $MNT showattr $dpath $attr_b" + # verify initial mutability + eexec ??? 0 "do_xattr_barrier $MNT $dpath ..." + # exercise chattr + eeval "go_xid 2 chattr =i $dpath" + # verify that chattr succeeded + eexec ??? 0 "do_xattr_verify $MNT showattr $dpath $attr_I" + # revert chattr's actions + eeval "go_xid 2 chattr -i $dpath" + # verify xattrs back to initial state + eexec ??? 0 "do_xattr_verify $MNT showattr $dpath $attr_b" eexec 102 0 "setattr --barrier $dpath" eexec 103 0 "do_xattr_verify $MNT showattr $dpath $attr_B" eexec 104 0 "do_xattr_verify $MNT lsattr $dpath $lsattr_B" - eexec 105 1 "go_xid 2 chattr =i $dpath" + # test immutability of barrier from a non-privileged context + eeval "go_xid 2 chattr =i $dpath" + # verify that chattr failed + eexec 105 0 "do_xattr_verify $MNT showattr $dpath $attr_B" eexec 106 0 "do_xattr_barrier $MNT $dpath ..^" eexec 108 0 "setattr --~barrier $dpath" eexec 109 0 "do_xattr_verify $MNT showattr $dpath $attr_b"