xfs
[Top] [All Lists]

[PATCH v3 2/2] xfstests: make t_immutable and 079 filesystem-agnostic

To: linux-fsdevel@xxxxxxxxxxxxxxx, linux-btrfs@xxxxxxxxxxxxxxx, xfs@xxxxxxxxxxx
Subject: [PATCH v3 2/2] xfstests: make t_immutable and 079 filesystem-agnostic
From: Stefan Behrens <sbehrens@xxxxxxxxxxxxxxxx>
Date: Mon, 1 Aug 2011 12:31:20 +0200
In-reply-to: <cover.1312193821.git.sbehrens@xxxxxxxxxxxxxxxx>
In-reply-to: <cover.1312193821.git.sbehrens@xxxxxxxxxxxxxxxx>
References: <cover.1312193821.git.sbehrens@xxxxxxxxxxxxxxxx>
References: <cover.1312193821.git.sbehrens@xxxxxxxxxxxxxxxx>
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               |   12 +++++++--
 src/t_immutable.c |   66 +++++++++++++++++-----------------------------------
 2 files changed, 31 insertions(+), 47 deletions(-)

diff --git a/079 b/079
index 6c43fe7..8f6e179 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,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 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

<Prev in Thread] Current Thread [Next in Thread>