Whamcloud - gitweb
Branch b1_6
authorjohann <johann>
Thu, 18 Oct 2007 14:57:31 +0000 (14:57 +0000)
committerjohann <johann>
Thu, 18 Oct 2007 14:57:31 +0000 (14:57 +0000)
b=13828
i=adilger,shadow

Don't use kernel's ATTR_* attributes over the network since the client and MDS
may run different kernels. Instead, use MDS_ATTR_* attributes (defined in
lustre_idl.h) for sa_valid.

lustre/include/liblustre.h
lustre/include/linux/lustre_patchless_compat.h
lustre/include/lustre/lustre_idl.h
lustre/mdc/mdc_lib.c
lustre/mds/mds_lib.c
lustre/ptlrpc/wiretest.c
lustre/utils/wirecheck.c
lustre/utils/wiretest.c

index a08300e..abf8d3a 100644 (file)
@@ -476,6 +476,8 @@ static inline cfs_page_t* __grab_cache_page(unsigned long index)
 #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;
index 90933e6..2dbd098 100644 (file)
@@ -95,11 +95,20 @@ static inline void d_rehash_cond(struct dentry * entry, int lock)
 #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 */
index 83e4411..67be4b9 100644 (file)
@@ -814,7 +814,7 @@ struct mds_rec_setattr {
         __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;
@@ -825,10 +825,27 @@ struct mds_rec_setattr {
         __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);
 
index 8bed138..f7d9a8b 100644 (file)
@@ -175,6 +175,24 @@ void mdc_open_pack(struct ptlrpc_request *req, int offset,
         }
 }
 
+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)
@@ -189,7 +207,7 @@ void mdc_setattr_pack(struct ptlrpc_request *req, int offset,
         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;
index b6a3cf6..82bd53b 100644 (file)
@@ -92,6 +92,24 @@ void mds_pack_inode2body(struct mds_body *b, struct inode *inode)
         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)
@@ -111,7 +129,7 @@ static int mds_setattr_unpack(struct ptlrpc_request *req, int offset,
         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;
index 34ec67f..a80cbec 100644 (file)
@@ -1150,6 +1150,21 @@ void lustre_assert_wire_constants(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",
index 126d58a..560ec81 100644 (file)
@@ -502,6 +502,21 @@ check_mds_rec_setattr(void)
         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
index 2fa8933..4590602 100644 (file)
@@ -1166,6 +1166,21 @@ void lustre_assert_wire_constants(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",