Whamcloud - gitweb
Branch HEAD
[fs/lustre-release.git] / lustre / mdc / mdc_lib.c
index 11e5c58..8f4cd9e 100644 (file)
@@ -144,22 +144,31 @@ 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_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;
+        if (flags & O_LOV_DELAY_CREATE)
+                cr_flags |= MDS_OPEN_DELAY_CREATE;
+
+        return cr_flags;
 }
 
 /* packing of MDS records */
@@ -220,6 +229,47 @@ 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;
+        if (ia_valid & MDS_OPEN_OWNEROVERRIDE)
+                /* NFSD hack (see bug 5781) */
+                sa_valid |= MDS_OPEN_OWNEROVERRIDE;
+        return sa_valid;
+}
+
 static void mdc_setattr_pack_rec(struct mdt_rec_setattr *rec,
                                  struct md_op_data *op_data)
 {
@@ -230,7 +280,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;