#define ATTR_RAW 0x0800 /* file system, not vfs will massage attrs */
#define ATTR_FROM_OPEN 0x1000 /* called from open path, ie O_TRUNC */
#define ATTR_CTIME_SET 0x2000
+#define ATTR_KILL_SUID 0
+#define ATTR_KILL_SGID 0
struct iattr {
unsigned int ia_valid;
#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
+#define ATTR_CTIME_SET 131072
#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;
__u32 sa_padding; /* also fix lustre_swab_mds_rec_setattr */
};
-/* 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 1
+#define MDS_ATTR_UID 2
+#define MDS_ATTR_GID 4
+#define MDS_ATTR_SIZE 8
+#define MDS_ATTR_ATIME 16
+#define MDS_ATTR_MTIME 32
+#define MDS_ATTR_CTIME 64
+#define MDS_ATTR_ATIME_SET 128
+#define MDS_ATTR_MTIME_SET 256
+#define MDS_ATTR_FORCE 512 /* Not a change, but a change it */
+#define MDS_ATTR_ATTR_FLAG 1024
+#define MDS_ATTR_KILL_SUID 2048
+#define MDS_ATTR_KILL_SGID 4096
+#define MDS_ATTR_CTIME_SET 8192
+#define MDS_ATTR_FROM_OPEN 16384 /* called from open path, ie O_TRUNC */
extern void lustre_swab_mds_rec_setattr (struct mds_rec_setattr *sa);
}
}
+static inline __u64 attr_pack(unsigned int ia_valid) {
+ return (ia_valid & ATTR_MODE ? MDS_ATTR_MODE : 0) | \
+ (ia_valid & ATTR_UID ? MDS_ATTR_UID : 0) | \
+ (ia_valid & ATTR_GID ? MDS_ATTR_GID : 0) | \
+ (ia_valid & ATTR_SIZE ? MDS_ATTR_SIZE : 0) | \
+ (ia_valid & ATTR_ATIME ? MDS_ATTR_ATIME : 0) | \
+ (ia_valid & ATTR_MTIME ? MDS_ATTR_MTIME : 0) | \
+ (ia_valid & ATTR_CTIME ? MDS_ATTR_CTIME : 0) | \
+ (ia_valid & ATTR_ATIME_SET ? MDS_ATTR_ATIME_SET : 0) | \
+ (ia_valid & ATTR_MTIME_SET ? MDS_ATTR_MTIME_SET : 0) | \
+ (ia_valid & ATTR_FORCE ? MDS_ATTR_FORCE : 0) | \
+ (ia_valid & ATTR_ATTR_FLAG ? MDS_ATTR_ATTR_FLAG : 0) | \
+ (ia_valid & ATTR_KILL_SUID ? MDS_ATTR_KILL_SUID : 0) | \
+ (ia_valid & ATTR_KILL_SGID ? MDS_ATTR_KILL_SGID : 0) | \
+ (ia_valid & ATTR_CTIME_SET ? MDS_ATTR_CTIME_SET : 0) | \
+ (ia_valid & ATTR_FROM_OPEN ? MDS_ATTR_FROM_OPEN : 0);
+}
+
void mdc_setattr_pack(struct ptlrpc_request *req, int offset,
struct mdc_op_data *data, struct iattr *iattr, void *ea,
int ealen, void *ea2, int ea2len)
rec->sa_suppgid = -1;
if (iattr) {
- rec->sa_valid = iattr->ia_valid;
+ rec->sa_valid = attr_pack(iattr->ia_valid);
rec->sa_mode = iattr->ia_mode;
rec->sa_uid = iattr->ia_uid;
rec->sa_gid = iattr->ia_gid;
b->suppgid = -1;
}
+static inline unsigned int attr_unpack(__u64 sa_valid) {
+ return (sa_valid & MDS_ATTR_MODE ? ATTR_MODE : 0) | \
+ (sa_valid & MDS_ATTR_UID ? ATTR_UID : 0) | \
+ (sa_valid & MDS_ATTR_GID ? ATTR_GID : 0) | \
+ (sa_valid & MDS_ATTR_SIZE ? ATTR_SIZE : 0) | \
+ (sa_valid & MDS_ATTR_ATIME ? ATTR_ATIME : 0) | \
+ (sa_valid & MDS_ATTR_MTIME ? ATTR_MTIME : 0) | \
+ (sa_valid & MDS_ATTR_CTIME ? ATTR_CTIME : 0) | \
+ (sa_valid & MDS_ATTR_ATIME_SET ? ATTR_ATIME_SET : 0) | \
+ (sa_valid & MDS_ATTR_MTIME_SET ? ATTR_MTIME_SET : 0) | \
+ (sa_valid & MDS_ATTR_FORCE ? ATTR_FORCE : 0) | \
+ (sa_valid & MDS_ATTR_ATTR_FLAG ? ATTR_ATTR_FLAG : 0) | \
+ (sa_valid & MDS_ATTR_KILL_SUID ? ATTR_KILL_SUID : 0) | \
+ (sa_valid & MDS_ATTR_KILL_SGID ? ATTR_KILL_SGID : 0) | \
+ (sa_valid & MDS_ATTR_CTIME_SET ? ATTR_CTIME_SET : 0) | \
+ (sa_valid & MDS_ATTR_FROM_OPEN ? ATTR_FROM_OPEN : 0);
+}
+
/* unpacking */
static int mds_setattr_unpack(struct ptlrpc_request *req, int offset,
struct mds_update_record *r)
r->ur_uc.luc_suppgid1 = rec->sa_suppgid;
r->ur_uc.luc_suppgid2 = -1;
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;
(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);
/* 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);
}
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);
/* Checks for struct mds_rec_create */
LASSERTF((int)sizeof(struct mds_rec_create) == 96, " found %lld\n",