]> git.apps.os.sepia.ceph.com Git - xfstests-dev.git/commitdiff
make t_immutable and 079 filesystem-agnostic
authorStefan Behrens <sbehrens@giantdisaster.de>
Mon, 1 Aug 2011 10:31:20 +0000 (12:31 +0200)
committerChristoph Hellwig <hch@lst.de>
Wed, 3 Aug 2011 12:00:15 +0000 (14:00 +0200)
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>
079
src/t_immutable.c

diff --git a/079 b/079
index 6c43fe7edb606c3ebab156398910b272d0b9fdca..8f6e179d6f699490c85febe8ca8a3e9f0812c317 100755 (executable)
--- 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
index 7bb3154f25ee817bfe20ae12dee1e99a952d2a8b..87ffc75f2d0229941ad6c5235ce9deea272d66c9 100644 (file)
 #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)