#define ATTR_FROM_OPEN 0x1000 /* called from open path, ie O_TRUNC */
#define ATTR_CTIME_SET 0x2000
#define ATTR_BLOCKS 0x4000
+#define ATTR_KILL_SUID 0
+#define ATTR_KILL_SGID 0
struct iattr {
unsigned int ia_valid;
#define ll_set_fs_pwd set_fs_pwd
#endif /* HAVE_SET_FS_PWD */
-#define ATTR_BLOCKS 0x4000
+/*
+ * set ATTR_BLOCKS to a high value to avoid any risk of collision with other
+ * ATTR_* attributes (see bug 13828)
+ */
+#define ATTR_BLOCKS (1 << 27)
#if HAVE_INODE_I_MUTEX
#define UNLOCK_INODE_MUTEX(inode) do {mutex_unlock(&(inode)->i_mutex); } while(0)
#define __d_rehash(dentry, lock) d_rehash_cond(dentry, lock)
#endif /* !HAVE_D_REHASH_COND && !HAVE___D_REHASH*/
-#ifndef ATTR_FROM_OPEN
-#define ATTR_FROM_OPEN 0
-#endif
+#ifdef ATTR_OPEN
+# define ATTR_FROM_OPEN ATTR_OPEN
+#else
+# ifndef ATTR_FROM_OPEN
+# define ATTR_FROM_OPEN 0
+# endif
+#endif /* ATTR_OPEN */
+
#ifndef ATTR_RAW
#define ATTR_RAW 0
#endif
+#ifndef ATTR_CTIME_SET
+/*
+ * set ATTR_CTIME_SET to a high value to avoid any risk of collision with other
+ * ATTR_* attributes (see bug 13828)
+ */
+#define ATTR_CTIME_SET (1 << 28)
#endif
+
+#endif /* LUSTRE_PATCHLESS_COMPAT_H */
__u32 sa_suppgid;
__u32 sa_mode;
struct ll_fid sa_fid;
- __u64 sa_valid;
+ __u64 sa_valid; /* MDS_ATTR_* attributes */
__u64 sa_size;
__u64 sa_mtime;
__u64 sa_atime;
extern void lustre_swab_mdt_rec_setattr (struct mdt_rec_setattr *sa);
-/* Remove this once we declare it in include/linux/fs.h (v21 kernel patch?) */
-#ifndef ATTR_CTIME_SET
-#define ATTR_CTIME_SET 0x2000
-#endif
+/*
+ * Attribute flags used in mds_rec_setattr::sa_valid.
+ * The kernel's #defines for ATTR_* should not be used over the network
+ * since the client and MDS may run different kernels (see bug 13828)
+ * Therefore, we should only use MDS_ATTR_* attributes for sa_valid.
+ */
+#define MDS_ATTR_MODE 0x1ULL /* = 1 */
+#define MDS_ATTR_UID 0x2ULL /* = 2 */
+#define MDS_ATTR_GID 0x4ULL /* = 4 */
+#define MDS_ATTR_SIZE 0x8ULL /* = 8 */
+#define MDS_ATTR_ATIME 0x10ULL /* = 16 */
+#define MDS_ATTR_MTIME 0x20ULL /* = 32 */
+#define MDS_ATTR_CTIME 0x40ULL /* = 64 */
+#define MDS_ATTR_ATIME_SET 0x80ULL /* = 128 */
+#define MDS_ATTR_MTIME_SET 0x100ULL /* = 256 */
+#define MDS_ATTR_FORCE 0x200ULL /* = 512, Not a change, but a change it */
+#define MDS_ATTR_ATTR_FLAG 0x400ULL /* = 1024 */
+#define MDS_ATTR_KILL_SUID 0x800ULL /* = 2048 */
+#define MDS_ATTR_KILL_SGID 0x1000ULL /* = 4096 */
+#define MDS_ATTR_CTIME_SET 0x2000ULL /* = 8192 */
+#define MDS_ATTR_FROM_OPEN 0x4000ULL /* = 16384, called from open path, ie O_TRUNC */
+#define MDS_ATTR_BLOCKS 0x8000ULL /* = 32768 */
#ifndef FMODE_READ
#define FMODE_READ 00000001
static __u32 mds_pack_open_flags(__u32 flags)
{
- return
- (flags & (FMODE_READ | FMODE_WRITE |
- MDS_OPEN_DELAY_CREATE | MDS_OPEN_HAS_EA |
- MDS_OPEN_HAS_OBJS | MDS_OPEN_OWNEROVERRIDE |
- MDS_OPEN_LOCK)) |
- ((flags & O_CREAT) ? MDS_OPEN_CREAT : 0) |
- ((flags & O_EXCL) ? MDS_OPEN_EXCL : 0) |
- ((flags & O_TRUNC) ? MDS_OPEN_TRUNC : 0) |
- ((flags & O_APPEND) ? MDS_OPEN_APPEND : 0) |
- ((flags & O_SYNC) ? MDS_OPEN_SYNC : 0) |
- ((flags & O_DIRECTORY) ? MDS_OPEN_DIRECTORY : 0) |
- ((flags & O_JOIN_FILE) ? MDS_OPEN_JOIN_FILE : 0) |
+ __u32 cr_flags = (flags & (FMODE_READ | FMODE_WRITE |
+ MDS_OPEN_DELAY_CREATE | MDS_OPEN_HAS_EA |
+ MDS_OPEN_HAS_OBJS | MDS_OPEN_OWNEROVERRIDE |
+ MDS_OPEN_LOCK));
+ if (flags & O_CREAT)
+ cr_flags |= MDS_OPEN_CREAT;
+ if (flags & O_EXCL)
+ cr_flags |= MDS_OPEN_EXCL;
+ if (flags & O_TRUNC)
+ cr_flags |= MDS_OPEN_TRUNC;
+ if (flags & O_APPEND)
+ cr_flags |= MDS_OPEN_APPEND;
+ if (flags & O_SYNC)
+ cr_flags |= MDS_OPEN_SYNC;
+ if (flags & O_DIRECTORY)
+ cr_flags |= MDS_OPEN_DIRECTORY;
+ if (flags & O_JOIN_FILE)
+ cr_flags |= MDS_OPEN_JOIN_FILE;
#ifdef FMODE_EXEC
- ((flags & FMODE_EXEC) ? MDS_FMODE_EXEC : 0) |
+ if (flags & FMODE_EXEC)
+ cr_flags |= MDS_FMODE_EXEC;
#endif
- 0;
+ return cr_flags;
}
/* packing of MDS records */
}
}
+static inline __u64 attr_pack(unsigned int ia_valid) {
+ __u64 sa_valid = 0;
+
+ if (ia_valid & ATTR_MODE)
+ sa_valid |= MDS_ATTR_MODE;
+ if (ia_valid & ATTR_UID)
+ sa_valid |= MDS_ATTR_UID;
+ if (ia_valid & ATTR_GID)
+ sa_valid |= MDS_ATTR_GID;
+ if (ia_valid & ATTR_SIZE)
+ sa_valid |= MDS_ATTR_SIZE;
+ if (ia_valid & ATTR_ATIME)
+ sa_valid |= MDS_ATTR_ATIME;
+ if (ia_valid & ATTR_MTIME)
+ sa_valid |= MDS_ATTR_MTIME;
+ if (ia_valid & ATTR_CTIME)
+ sa_valid |= MDS_ATTR_CTIME;
+ if (ia_valid & ATTR_ATIME_SET)
+ sa_valid |= MDS_ATTR_ATIME_SET;
+ if (ia_valid & ATTR_MTIME_SET)
+ sa_valid |= MDS_ATTR_MTIME_SET;
+ if (ia_valid & ATTR_FORCE)
+ sa_valid |= MDS_ATTR_FORCE;
+ if (ia_valid & ATTR_ATTR_FLAG)
+ sa_valid |= MDS_ATTR_ATTR_FLAG;
+ if (ia_valid & ATTR_KILL_SUID)
+ sa_valid |= MDS_ATTR_KILL_SUID;
+ if (ia_valid & ATTR_KILL_SGID)
+ sa_valid |= MDS_ATTR_KILL_SGID;
+ if (ia_valid & ATTR_CTIME_SET)
+ sa_valid |= MDS_ATTR_CTIME_SET;
+ if (ia_valid & ATTR_FROM_OPEN)
+ sa_valid |= MDS_ATTR_FROM_OPEN;
+ if (ia_valid & ATTR_BLOCKS)
+ sa_valid |= MDS_ATTR_BLOCKS;
+ return sa_valid;
+}
+
static void mdc_setattr_pack_rec(struct mdt_rec_setattr *rec,
struct md_op_data *op_data)
{
rec->sa_suppgid = -1;
rec->sa_fid = op_data->op_fid1;
- rec->sa_valid = op_data->op_attr.ia_valid;
+ rec->sa_valid = attr_pack(op_data->op_attr.ia_valid);
rec->sa_mode = op_data->op_attr.ia_mode;
rec->sa_uid = op_data->op_attr.ia_uid;
rec->sa_gid = op_data->op_attr.ia_gid;
b->suppgid = -1;
}
+static inline unsigned int attr_unpack(__u64 sa_valid) {
+ unsigned int ia_valid = 0;
+
+ if (sa_valid & MDS_ATTR_MODE)
+ ia_valid |= ATTR_MODE;
+ if (sa_valid & MDS_ATTR_UID)
+ ia_valid |= ATTR_UID;
+ if (sa_valid & MDS_ATTR_GID)
+ ia_valid |= ATTR_GID;
+ if (sa_valid & MDS_ATTR_SIZE)
+ ia_valid |= ATTR_SIZE;
+ if (sa_valid & MDS_ATTR_ATIME)
+ ia_valid |= ATTR_ATIME;
+ if (sa_valid & MDS_ATTR_MTIME)
+ ia_valid |= ATTR_MTIME;
+ if (sa_valid & MDS_ATTR_CTIME)
+ ia_valid |= ATTR_CTIME;
+ if (sa_valid & MDS_ATTR_ATIME_SET)
+ ia_valid |= ATTR_ATIME_SET;
+ if (sa_valid & MDS_ATTR_MTIME_SET)
+ ia_valid |= ATTR_MTIME_SET;
+ if (sa_valid & MDS_ATTR_FORCE)
+ ia_valid |= ATTR_FORCE;
+ if (sa_valid & MDS_ATTR_ATTR_FLAG)
+ ia_valid |= ATTR_ATTR_FLAG;
+ if (sa_valid & MDS_ATTR_KILL_SUID)
+ ia_valid |= ATTR_KILL_SUID;
+ if (sa_valid & MDS_ATTR_KILL_SGID)
+ ia_valid |= ATTR_KILL_SGID;
+ if (sa_valid & MDS_ATTR_CTIME_SET)
+ ia_valid |= ATTR_CTIME_SET;
+ if (sa_valid & MDS_ATTR_FROM_OPEN)
+ ia_valid |= ATTR_FROM_OPEN;
+ if (sa_valid & MDS_ATTR_BLOCKS)
+ ia_valid |= ATTR_BLOCKS;
+ return ia_valid;
+}
+
/* unpacking */
static int mds_setattr_unpack(struct ptlrpc_request *req, int offset,
struct mds_update_record *r)
r->ur_uc.luc_suppgid2 = -1;
#endif
r->ur_fid1 = &rec->sa_fid;
- attr->ia_valid = rec->sa_valid;
+ attr->ia_valid = attr_unpack(rec->sa_valid);
attr->ia_mode = rec->sa_mode;
attr->ia_uid = rec->sa_uid;
attr->ia_gid = rec->sa_gid;
RETURN(0);
}
+static inline unsigned int attr_unpack(__u64 sa_valid) {
+ unsigned int ia_valid = 0;
+
+ if (sa_valid & MDS_ATTR_MODE)
+ ia_valid |= ATTR_MODE;
+ if (sa_valid & MDS_ATTR_UID)
+ ia_valid |= ATTR_UID;
+ if (sa_valid & MDS_ATTR_GID)
+ ia_valid |= ATTR_GID;
+ if (sa_valid & MDS_ATTR_SIZE)
+ ia_valid |= ATTR_SIZE;
+ if (sa_valid & MDS_ATTR_ATIME)
+ ia_valid |= ATTR_ATIME;
+ if (sa_valid & MDS_ATTR_MTIME)
+ ia_valid |= ATTR_MTIME;
+ if (sa_valid & MDS_ATTR_CTIME)
+ ia_valid |= ATTR_CTIME;
+ if (sa_valid & MDS_ATTR_ATIME_SET)
+ ia_valid |= ATTR_ATIME_SET;
+ if (sa_valid & MDS_ATTR_MTIME_SET)
+ ia_valid |= ATTR_MTIME_SET;
+ if (sa_valid & MDS_ATTR_FORCE)
+ ia_valid |= ATTR_FORCE;
+ if (sa_valid & MDS_ATTR_ATTR_FLAG)
+ ia_valid |= ATTR_ATTR_FLAG;
+ if (sa_valid & MDS_ATTR_KILL_SUID)
+ ia_valid |= ATTR_KILL_SUID;
+ if (sa_valid & MDS_ATTR_KILL_SGID)
+ ia_valid |= ATTR_KILL_SGID;
+ if (sa_valid & MDS_ATTR_CTIME_SET)
+ ia_valid |= ATTR_CTIME_SET;
+ if (sa_valid & MDS_ATTR_FROM_OPEN)
+ ia_valid |= ATTR_FROM_OPEN;
+ if (sa_valid & MDS_ATTR_BLOCKS)
+ ia_valid |= ATTR_BLOCKS;
+ return ia_valid;
+}
+
static __u64 mdt_attr_valid_xlate(__u64 in, struct mdt_reint_record *rr,
struct md_attr *ma)
{
uc->mu_suppgids[1] = -1;
rr->rr_fid1 = &rec->sa_fid;
- la->la_valid = mdt_attr_valid_xlate(rec->sa_valid, rr, ma);
+ la->la_valid = mdt_attr_valid_xlate(attr_unpack(rec->sa_valid), rr, ma);
la->la_mode = rec->sa_mode;
la->la_flags = rec->sa_attr_flags;
la->la_uid = rec->sa_uid;
(long long)(int)offsetof(struct mds_rec_setattr, sa_attr_flags));
LASSERTF((int)sizeof(((struct mds_rec_setattr *)0)->sa_attr_flags) == 4, " found %lld\n",
(long long)(int)sizeof(((struct mds_rec_setattr *)0)->sa_attr_flags));
+ CLASSERT(MDS_ATTR_MODE == 1);
+ CLASSERT(MDS_ATTR_UID == 2);
+ CLASSERT(MDS_ATTR_GID == 4);
+ CLASSERT(MDS_ATTR_SIZE == 8);
+ CLASSERT(MDS_ATTR_ATIME == 16);
+ CLASSERT(MDS_ATTR_MTIME == 32);
+ CLASSERT(MDS_ATTR_CTIME == 64);
+ CLASSERT(MDS_ATTR_ATIME_SET == 128);
+ CLASSERT(MDS_ATTR_MTIME_SET == 256);
+ CLASSERT(MDS_ATTR_FORCE == 512);
+ CLASSERT(MDS_ATTR_ATTR_FLAG == 1024);
+ CLASSERT(MDS_ATTR_KILL_SUID == 2048);
+ CLASSERT(MDS_ATTR_KILL_SGID == 4096);
+ CLASSERT(MDS_ATTR_CTIME_SET == 8192);
+ CLASSERT(MDS_ATTR_FROM_OPEN == 16384);
+ CLASSERT(MDS_ATTR_BLOCKS == 32768);
/* Checks for struct mds_rec_create */
LASSERTF((int)sizeof(struct mds_rec_create) == 96, " found %lld\n",
CHECK_MEMBER(mds_rec_setattr, sa_uid);
CHECK_MEMBER(mds_rec_setattr, sa_gid);
CHECK_MEMBER(mds_rec_setattr, sa_attr_flags);
+ CHECK_CDEFINE(MDS_ATTR_MODE);
+ CHECK_CDEFINE(MDS_ATTR_UID);
+ CHECK_CDEFINE(MDS_ATTR_GID);
+ CHECK_CDEFINE(MDS_ATTR_SIZE);
+ CHECK_CDEFINE(MDS_ATTR_ATIME);
+ CHECK_CDEFINE(MDS_ATTR_MTIME);
+ CHECK_CDEFINE(MDS_ATTR_CTIME);
+ CHECK_CDEFINE(MDS_ATTR_ATIME_SET);
+ CHECK_CDEFINE(MDS_ATTR_MTIME_SET);
+ CHECK_CDEFINE(MDS_ATTR_FORCE);
+ CHECK_CDEFINE(MDS_ATTR_ATTR_FLAG);
+ CHECK_CDEFINE(MDS_ATTR_KILL_SUID);
+ CHECK_CDEFINE(MDS_ATTR_KILL_SGID);
+ CHECK_CDEFINE(MDS_ATTR_CTIME_SET);
+ CHECK_CDEFINE(MDS_ATTR_FROM_OPEN);
+ CHECK_CDEFINE(MDS_ATTR_BLOCKS);
}
static void
(long long)(int)offsetof(struct mds_rec_setattr, sa_attr_flags));
LASSERTF((int)sizeof(((struct mds_rec_setattr *)0)->sa_attr_flags) == 4, " found %lld\n",
(long long)(int)sizeof(((struct mds_rec_setattr *)0)->sa_attr_flags));
+ CLASSERT(MDS_ATTR_MODE == 1);
+ CLASSERT(MDS_ATTR_UID == 2);
+ CLASSERT(MDS_ATTR_GID == 4);
+ CLASSERT(MDS_ATTR_SIZE == 8);
+ CLASSERT(MDS_ATTR_ATIME == 16);
+ CLASSERT(MDS_ATTR_MTIME == 32);
+ CLASSERT(MDS_ATTR_CTIME == 64);
+ CLASSERT(MDS_ATTR_ATIME_SET == 128);
+ CLASSERT(MDS_ATTR_MTIME_SET == 256);
+ CLASSERT(MDS_ATTR_FORCE == 512);
+ CLASSERT(MDS_ATTR_ATTR_FLAG == 1024);
+ CLASSERT(MDS_ATTR_KILL_SUID == 2048);
+ CLASSERT(MDS_ATTR_KILL_SGID == 4096);
+ CLASSERT(MDS_ATTR_CTIME_SET == 8192);
+ CLASSERT(MDS_ATTR_FROM_OPEN == 16384);
+ CLASSERT(MDS_ATTR_BLOCKS == 32768);
/* Checks for struct mds_rec_create */
LASSERTF((int)sizeof(struct mds_rec_create) == 96, " found %lld\n",