? 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 +#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; }