? include/.pvfs2-types.h.swp
? src/kernel/linux-2.6/.file.c.swp
Index: include/pvfs2-types.h
===================================================================
RCS file: /projects/cvsroot/pvfs2/include/pvfs2-types.h,v
retrieving revision 1.143
diff -u -a -p -r1.143 pvfs2-types.h
--- include/pvfs2-types.h	19 Jul 2007 22:28:26 -0000	1.143
+++ include/pvfs2-types.h	20 Aug 2007 22:32:30 -0000
@@ -275,10 +275,24 @@ typedef enum
 #define decode_PVFS_ds_type decode_enum
 #define encode_PVFS_ds_type encode_enum
 
+#ifdef __KERNEL__
+#include <linux/fs.h>
+#endif
+
+#if defined(FS_IMMUTABLE_FL)
+
+#define PVFS_IMMUTABLE_FL FS_IMMUTABLE_FL
+#define PVFS_APPEND_FL    FS_APPEND_FL
+#define PVFS_NOATIME_FL   FS_NOATIME_FL
+
+#else
+
 /* PVFS Object Flags (PVFS_flags); Add more as we implement them */
-#define PVFS_IMMUTABLE_FL 0x1ULL
-#define PVFS_APPEND_FL    0x2ULL
-#define PVFS_NOATIME_FL   0x4ULL
+#define PVFS_IMMUTABLE_FL 0x10ULL
+#define PVFS_APPEND_FL    0x20ULL
+#define PVFS_NOATIME_FL   0x80ULL
+
+#endif
 
 /* Key/Value Pairs */
 /* Extended attributes are stored on objects with */
Index: src/kernel/linux-2.6/file.c
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/kernel/linux-2.6/file.c,v
retrieving revision 1.137
diff -u -a -p -r1.137 file.c
--- src/kernel/linux-2.6/file.c	19 Aug 2007 18:20:27 -0000	1.137
+++ src/kernel/linux-2.6/file.c	20 Aug 2007 22:32:30 -0000
@@ -2855,8 +2855,54 @@ int pvfs2_ioctl(
     unsigned long arg)
 {
     int ret = -ENOTTY;
+    uint64_t val = 0;
+    unsigned long uval;
 
     gossip_debug(GOSSIP_FILE_DEBUG, "pvfs2_ioctl: called with cmd %d\n", cmd);
+
+    /* we understand some general ioctls on files, such as the immutable
+     * and append flags
+     */
+    if(cmd == FS_IOC_GETFLAGS)
+    {
+        val = 0;
+        ret = pvfs2_xattr_get_default(inode,
+                                      "user.pvfs2.meta_hint",
+                                      &val, sizeof(val));
+        if(ret < 0 && ret != -ENODATA)
+        {
+            return ret;
+        }
+        else if(ret == -ENODATA)
+        {
+            val = 0;
+        }
+        uval = val;
+        gossip_debug(GOSSIP_FILE_DEBUG, "pvfs2_ioctl: FS_IOC_GETFLAGS: %llu\n",
+                     (unsigned long long)uval);
+        return put_user(uval, (int __user *)arg);
+    }
+    else if(cmd == FS_IOC_SETFLAGS)
+    {
+        ret = 0;
+        if(get_user(uval, (int __user *)arg))
+        {
+            return -EFAULT;
+        }
+        if(uval & (~(FS_IMMUTABLE_FL|FS_APPEND_FL|FS_NOATIME_FL)))
+        {
+            gossip_err("pvfs2_ioctl: the FS_IOC_SETFLAGS only supports setting "
+                       "one of FS_IMMUTABLE_FL|FS_APPEND_FL|FS_NOATIME_FL\n");
+            return -EINVAL;
+        }
+        val = uval;
+        gossip_debug(GOSSIP_FILE_DEBUG, "pvfs2_ioctl: FS_IOC_SETFLAGS: %llu\n",
+                     (unsigned long long)val);
+        ret = pvfs2_xattr_set_default(inode,
+                                      "user.pvfs2.meta_hint",
+                                      &val, sizeof(val), 0);
+    }
+
     return ret;
 }
 
