[v2,4/4] xfstests: Changed test 079 to be generic for all filesystems
diff mbox

Message ID d63d92aa14e5fa81b4a40d0903001e70f7da9249.1311953979.git.sbehrens@giantdisaster.de
State Not Applicable
Headers show

Commit Message

Stefan Behrens July 29, 2011, 4:07 p.m. UTC
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@giantdisaster.de>
---
 079               |   13 ++++++++--
 src/t_immutable.c |   66 +++++++++++++++++-----------------------------------
 2 files changed, 32 insertions(+), 47 deletions(-)

Comments

Christoph Hellwig July 30, 2011, 2:28 p.m. UTC | #1
On Fri, Jul 29, 2011 at 06:07:01PM +0200, Stefan Behrens wrote:
> 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.

A little nitpicking for the subject again, I'd rather see something like:

	xfstests: make t_immutable and 079 filesystem-agnostic

> +$timmutable -c $SCRATCH_MNT/$seq >$tmp.out 2>&1
> +if grep -q 'Operation not supported' $tmp.out
> +then

if grep -q 'Operation not supported' $tmp.out; then

please

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch
diff mbox

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)