From: johann Date: Thu, 25 Oct 2007 19:48:30 +0000 (+0000) Subject: Branch HEAD X-Git-Tag: v1_7_0_51~567 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=4275694704e0fb82cd6980bec082cf358df0654c Branch HEAD 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 --- diff --git a/lustre/include/liblustre.h b/lustre/include/liblustre.h index 2e4968f..d84ed39 100644 --- a/lustre/include/liblustre.h +++ b/lustre/include/liblustre.h @@ -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; diff --git a/lustre/include/linux/lustre_compat25.h b/lustre/include/linux/lustre_compat25.h index 6a56a05..cd61080 100644 --- a/lustre/include/linux/lustre_compat25.h +++ b/lustre/include/linux/lustre_compat25.h @@ -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) diff --git a/lustre/include/linux/lustre_patchless_compat.h b/lustre/include/linux/lustre_patchless_compat.h index b5ca466..36d41a3 100644 --- a/lustre/include/linux/lustre_patchless_compat.h +++ b/lustre/include/linux/lustre_patchless_compat.h @@ -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 */ diff --git a/lustre/include/lustre/lustre_idl.h b/lustre/include/lustre/lustre_idl.h index b99ad84..5495b11 100644 --- a/lustre/include/lustre/lustre_idl.h +++ b/lustre/include/lustre/lustre_idl.h @@ -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 diff --git a/lustre/mdc/mdc_lib.c b/lustre/mdc/mdc_lib.c index 11e5c58..fd5aaea 100644 --- a/lustre/mdc/mdc_lib.c +++ b/lustre/mdc/mdc_lib.c @@ -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; diff --git a/lustre/mds/mds_lib.c b/lustre/mds/mds_lib.c index 6688f9e..f1e8e0e 100644 --- a/lustre/mds/mds_lib.c +++ b/lustre/mds/mds_lib.c @@ -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; diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index 9fe52e2..4d65b2b 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -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; diff --git a/lustre/ptlrpc/wiretest.c b/lustre/ptlrpc/wiretest.c index 24c1a16..2876a17 100644 --- a/lustre/ptlrpc/wiretest.c +++ b/lustre/ptlrpc/wiretest.c @@ -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", diff --git a/lustre/utils/wirecheck.c b/lustre/utils/wirecheck.c index a193fe9..08b7050 100644 --- a/lustre/utils/wirecheck.c +++ b/lustre/utils/wirecheck.c @@ -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 diff --git a/lustre/utils/wiretest.c b/lustre/utils/wiretest.c index 9153194..04b561d 100644 --- a/lustre/utils/wiretest.c +++ b/lustre/utils/wiretest.c @@ -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",