From 245741a156afa305c8f812fc1f4c3da9b81b5240 Mon Sep 17 00:00:00 2001
From: johann <johann>
Date: Thu, 25 Oct 2007 05:28:30 +0000
Subject: [PATCH] Branch b1_6 b=13828 i=adilger i=shadow

Land 2nd attachment (#13342):
- use a higher value for ATTR_CTIME_SET
- define MDS_ATTR_* in hex
- improve attr_unpack/attr_pack/mds_pack_open_flags
---
 .../include/linux/lustre_patchless_compat.h   |  6 +-
 lustre/include/lustre/lustre_idl.h            | 30 +++----
 lustre/mdc/mdc_lib.c                          | 83 ++++++++++++-------
 lustre/mds/mds_lib.c                          | 48 +++++++----
 4 files changed, 107 insertions(+), 60 deletions(-)

diff --git a/lustre/include/linux/lustre_patchless_compat.h b/lustre/include/linux/lustre_patchless_compat.h
index 2dbd0981a5..afb599eff7 100644
--- a/lustre/include/linux/lustre_patchless_compat.h
+++ b/lustre/include/linux/lustre_patchless_compat.h
@@ -108,7 +108,11 @@ static inline void d_rehash_cond(struct dentry * entry, int lock)
 #endif
 
 #ifndef ATTR_CTIME_SET
-#define ATTR_CTIME_SET 131072
+/*
+ * 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 */
diff --git a/lustre/include/lustre/lustre_idl.h b/lustre/include/lustre/lustre_idl.h
index 67be4b925a..0ec2b25f44 100644
--- a/lustre/include/lustre/lustre_idl.h
+++ b/lustre/include/lustre/lustre_idl.h
@@ -831,21 +831,21 @@ struct mds_rec_setattr {
  * 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 */
+#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 */
 
 extern void lustre_swab_mds_rec_setattr (struct mds_rec_setattr *sa);
 
diff --git a/lustre/mdc/mdc_lib.c b/lustre/mdc/mdc_lib.c
index f7d9a8b268..864f1971f0 100644
--- a/lustre/mdc/mdc_lib.c
+++ b/lustre/mdc/mdc_lib.c
@@ -107,22 +107,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 */
@@ -176,21 +183,39 @@ 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);
+        __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;
+        return sa_valid;
 }
 
 void mdc_setattr_pack(struct ptlrpc_request *req, int offset,
diff --git a/lustre/mds/mds_lib.c b/lustre/mds/mds_lib.c
index d777cd8550..e0ce2e0fac 100644
--- a/lustre/mds/mds_lib.c
+++ b/lustre/mds/mds_lib.c
@@ -93,21 +93,39 @@ void mds_pack_inode2body(struct mds_body *b, struct inode *inode)
 }
 
 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);
+        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;
+        return ia_valid;
 }
 
 /* unpacking */
-- 
GitLab