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