Whamcloud - gitweb
Branch HEAD
authorjohann <johann>
Thu, 25 Oct 2007 19:48:30 +0000 (19:48 +0000)
committerjohann <johann>
Thu, 25 Oct 2007 19:48:30 +0000 (19:48 +0000)
b=13828
i=adilger,shadow

attachment #13289:
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.

attachment #13342:
- use a higher value for ATTR_CTIME_SET
- define MDS_ATTR_* in hex
- improve attr_unpack/attr_pack/mds_pack_open_flags

lustre/include/liblustre.h
lustre/include/linux/lustre_compat25.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/mdt/mdt_lib.c
lustre/ptlrpc/wiretest.c
lustre/utils/wirecheck.c
lustre/utils/wiretest.c

index 2e4968f..d84ed39 100644 (file)
@@ -483,6 +483,8 @@ static inline cfs_page_t* __grab_cache_page(unsigned long index)
 #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;
index 6a56a05..cd61080 100644 (file)
@@ -65,7 +65,11 @@ static inline void ll_set_fs_pwd(struct fs_struct *fs, struct vfsmount *mnt,
 #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)
index b5ca466..36d41a3 100644 (file)
@@ -96,11 +96,24 @@ 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
+/*
+ * 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 */
index b99ad84..5495b11 100644 (file)
@@ -1145,7 +1145,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;
@@ -1180,10 +1180,28 @@ struct mdt_rec_setattr {
 
 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
index 11e5c58..fd5aaea 100644 (file)
@@ -144,22 +144,29 @@ void mdc_create_pack(struct ptlrpc_request *req, int offset,
 
 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 */
@@ -220,6 +227,44 @@ void mdc_open_pack(struct ptlrpc_request *req, int offset,
         }
 }
 
+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)
 {
@@ -230,7 +275,7 @@ static void mdc_setattr_pack_rec(struct mdt_rec_setattr *rec,
         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;
index 6688f9e..f1e8e0e 100644 (file)
@@ -86,6 +86,44 @@ void mds_pack_inode2body(struct mds_body *b, struct inode *inode)
         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)
@@ -107,7 +145,7 @@ static int mds_setattr_unpack(struct ptlrpc_request *req, int offset,
         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;
index 9fe52e2..4d65b2b 100644 (file)
@@ -667,6 +667,44 @@ int mdt_handle_last_unlink(struct mdt_thread_info *info, struct mdt_object *mo,
         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)
 {
@@ -734,7 +772,7 @@ static int mdt_setattr_unpack_rec(struct mdt_thread_info *info)
         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;
index 24c1a16..2876a17 100644 (file)
@@ -1149,6 +1149,22 @@ 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);
+        CLASSERT(MDS_ATTR_BLOCKS == 32768);
 
         /* Checks for struct mds_rec_create */
         LASSERTF((int)sizeof(struct mds_rec_create) == 96, " found %lld\n",
index a193fe9..08b7050 100644 (file)
@@ -500,6 +500,22 @@ 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);
+        CHECK_CDEFINE(MDS_ATTR_BLOCKS);
 }
 
 static void
index 9153194..04b561d 100644 (file)
@@ -1165,6 +1165,22 @@ 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);
+        CLASSERT(MDS_ATTR_BLOCKS == 32768);
 
         /* Checks for struct mds_rec_create */
         LASSERTF((int)sizeof(struct mds_rec_create) == 96, " found %lld\n",