@@ -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
@@ -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)
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(-)