diff options
author | Stefan Behrens <sbehrens@giantdisaster.de> | 2011-08-01 12:31:20 +0200 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2011-08-03 14:00:15 +0200 |
commit | de164fbfb3e39b0fa22b7150960b921efa417fed (patch) | |
tree | 08b40195340b44f7439bd24c92796417fe320ffb | |
parent | b2b36d0a4efd68f68add77a03feb654d5f10273a (diff) |
make t_immutable and 079 filesystem-agnostic
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, replace 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) and remove the check for
the specific filesystem type. FS_IOC_GETFLAGS/FS_IOC_SETFLAGS is always
used and placed in 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@giantdisaster.de>
Signed-off-by: Christoph Hellwig <hch@lst.de>
-rwxr-xr-x | 079 | 12 | ||||
-rw-r--r-- | src/t_immutable.c | 66 |
2 files changed, 31 insertions, 47 deletions
@@ -46,7 +46,7 @@ _cleanup() . ./common.filter . ./common.attr -_supported_fs xfs +_supported_fs generic _supported_os Linux _require_attrs @@ -55,10 +55,16 @@ _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 7bb3154f..87ffc75f 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) |