Changed the test 079 to be generic for all filesystems and to be executed for all filesystems. In src/t_immutable.c which is compiled for Linux only, replaced the old style XFS and ext2 specific code for setting the append-only and immutable flags by generic code that makes use of the ioctl(FS_IOC_SETFLAGS) and ioctl(FS_IOC_GETFLAGS). Therefore the check for the specific filesystem type was removed. FS_IOC_GETFLAGS/FS_IOC_SETFLAGS is always used. This code is inside an '#ifdef FS_IOC_SETFLAGS' block in order to never fail compilation. Without support for FS_IOC_SETFLAGS, the test completes with _notrun. Signed-off-by: Stefan Behrens <sbehrens@xxxxxxxxxxxxxxxx> --- 079 | 13 ++++++++-- src/t_immutable.c | 66 +++++++++++++++++----------------------------------- 2 files changed, 32 insertions(+), 47 deletions(-) diff --git a/079 b/079 index 6c43fe7..0c70811 100755 --- a/079 +++ b/079 @@ -46,7 +46,7 @@ _cleanup() . ./common.filter . ./common.attr -_supported_fs xfs +_supported_fs generic _supported_os Linux _require_attrs @@ -55,10 +55,17 @@ _require_scratch [ -x $timmutable ] || _notrun "t_immutable was not built for this platform" # real QA test starts here -_scratch_mkfs_xfs 2>&1 >/dev/null || _fail "mkfs failed" +_scratch_mkfs >/dev/null 2>&1 || _fail "mkfs failed" _scratch_mount || _fail "mount failed" echo "*** starting up" -$timmutable -c $SCRATCH_MNT/$seq +$timmutable -c $SCRATCH_MNT/$seq >$tmp.out 2>&1 +if grep -q 'Operation not supported' $tmp.out +then + rm -f $tmp.out + _notrun "Setting immutable/append flag not supported" +fi +cat $tmp.out +rm -f $tmp.out status=$? exit diff --git a/src/t_immutable.c b/src/t_immutable.c index 7bb3154..87ffc75 100644 --- a/src/t_immutable.c +++ b/src/t_immutable.c @@ -41,11 +41,8 @@ #include <xfs/xfs.h> #include <xfs/handle.h> #include <xfs/jdm.h> - -#define EXT2_SUPER_MAGIC 0xEF53 -#define EXT2_IMMUTABLE_FL 0x00000010 -#define EXT2_APPEND_FL 0x00000020 -#define EXT2_IOC_SETFLAGS _IOW('f', 2, long) +#include <linux/fs.h> +#include <linux/magic.h> #ifndef XFS_SUPER_MAGIC #define XFS_SUPER_MAGIC 0x58465342 @@ -55,52 +52,33 @@ extern const char *__progname; static int fsetflag(const char *path, int fd, int on, int immutable) { - int e2flags = 0; - struct fsxattr attr; - struct statfs stfs; - int xfsfl; - int e2fl; - - if (immutable) { - xfsfl = XFS_XFLAG_IMMUTABLE; - e2fl = EXT2_IMMUTABLE_FL; - } else { - xfsfl = XFS_XFLAG_APPEND; - e2fl = EXT2_APPEND_FL; - } +#ifdef FS_IOC_SETFLAGS + int fsflags = 0; + int fsfl; - if (fstatfs(fd, &stfs) != 0) + if (ioctl(fd, FS_IOC_GETFLAGS, &fsflags) < 0) { + close(fd); return 1; - - if (stfs.f_type == XFS_SUPER_MAGIC) { - if (xfsctl(path, fd, XFS_IOC_FSGETXATTR, &attr) < 0) { - close(fd); - return 1; - } - if (on) - attr.fsx_xflags |= xfsfl; - else - attr.fsx_xflags &= ~xfsfl; - if (xfsctl(path, fd, XFS_IOC_FSSETXATTR, &attr) < 0) { - close(fd); - return 1; - } - } else if (stfs.f_type == EXT2_SUPER_MAGIC) { - if (on) - e2flags |= e2fl; - else - e2flags &= ~e2fl; - if (ioctl(fd, EXT2_IOC_SETFLAGS, &e2flags) < 0) { - close(fd); - return 1; - } - } else { - errno = EOPNOTSUPP; + } + if (immutable) + fsfl = FS_IMMUTABLE_FL; + else + fsfl = FS_APPEND_FL; + if (on) + fsflags |= fsfl; + else + fsflags &= ~fsfl; + if (ioctl(fd, FS_IOC_SETFLAGS, &fsflags) < 0) { close(fd); return 1; } close(fd); return 0; +#else + errno = EOPNOTSUPP; + close(fd); + return 1; +#endif } static int add_acl(const char *path, const char *acl_text) -- 1.7.3.4 _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs