From: johann Date: Thu, 18 Oct 2007 14:57:31 +0000 (+0000) Subject: Branch b1_6 X-Git-Tag: v1_8_0_110~1085 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=d2fe065c4bb3a59eb725e7e289338211e2f46717;p=fs%2Flustre-release.git Branch b1_6 b=13828 i=adilger,shadow 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. --- diff --git a/lustre/include/liblustre.h b/lustre/include/liblustre.h index a08300e..abf8d3a 100644 --- a/lustre/include/liblustre.h +++ b/lustre/include/liblustre.h @@ -476,6 +476,8 @@ static inline cfs_page_t* __grab_cache_page(unsigned long index) #define ATTR_RAW 0x0800 /* file system, not vfs will massage attrs */ #define ATTR_FROM_OPEN 0x1000 /* called from open path, ie O_TRUNC */ #define ATTR_CTIME_SET 0x2000 +#define ATTR_KILL_SUID 0 +#define ATTR_KILL_SGID 0 struct iattr { unsigned int ia_valid; diff --git a/lustre/include/linux/lustre_patchless_compat.h b/lustre/include/linux/lustre_patchless_compat.h index 90933e6..2dbd098 100644 --- a/lustre/include/linux/lustre_patchless_compat.h +++ b/lustre/include/linux/lustre_patchless_compat.h @@ -95,11 +95,20 @@ 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 +#define ATTR_CTIME_SET 131072 #endif + +#endif /* LUSTRE_PATCHLESS_COMPAT_H */ diff --git a/lustre/include/lustre/lustre_idl.h b/lustre/include/lustre/lustre_idl.h index 83e4411..67be4b9 100644 --- a/lustre/include/lustre/lustre_idl.h +++ b/lustre/include/lustre/lustre_idl.h @@ -814,7 +814,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; @@ -825,10 +825,27 @@ struct mds_rec_setattr { __u32 sa_padding; /* also fix lustre_swab_mds_rec_setattr */ }; -/* 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 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 */ 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 8bed138..f7d9a8b 100644 --- a/lustre/mdc/mdc_lib.c +++ b/lustre/mdc/mdc_lib.c @@ -175,6 +175,24 @@ 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); +} + void mdc_setattr_pack(struct ptlrpc_request *req, int offset, struct mdc_op_data *data, struct iattr *iattr, void *ea, int ealen, void *ea2, int ea2len) @@ -189,7 +207,7 @@ void mdc_setattr_pack(struct ptlrpc_request *req, int offset, rec->sa_suppgid = -1; if (iattr) { - rec->sa_valid = iattr->ia_valid; + rec->sa_valid = attr_pack(iattr->ia_valid); rec->sa_mode = iattr->ia_mode; rec->sa_uid = iattr->ia_uid; rec->sa_gid = iattr->ia_gid; diff --git a/lustre/mds/mds_lib.c b/lustre/mds/mds_lib.c index b6a3cf6..82bd53b 100644 --- a/lustre/mds/mds_lib.c +++ b/lustre/mds/mds_lib.c @@ -92,6 +92,24 @@ void mds_pack_inode2body(struct mds_body *b, struct inode *inode) b->suppgid = -1; } +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); +} + /* unpacking */ static int mds_setattr_unpack(struct ptlrpc_request *req, int offset, struct mds_update_record *r) @@ -111,7 +129,7 @@ static int mds_setattr_unpack(struct ptlrpc_request *req, int offset, r->ur_uc.luc_suppgid1 = rec->sa_suppgid; r->ur_uc.luc_suppgid2 = -1; 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/ptlrpc/wiretest.c b/lustre/ptlrpc/wiretest.c index 34ec67f..a80cbec 100644 --- a/lustre/ptlrpc/wiretest.c +++ b/lustre/ptlrpc/wiretest.c @@ -1150,6 +1150,21 @@ 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); /* 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 126d58a..560ec81 100644 --- a/lustre/utils/wirecheck.c +++ b/lustre/utils/wirecheck.c @@ -502,6 +502,21 @@ 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); } static void diff --git a/lustre/utils/wiretest.c b/lustre/utils/wiretest.c index 2fa8933..45906022 100644 --- a/lustre/utils/wiretest.c +++ b/lustre/utils/wiretest.c @@ -1166,6 +1166,21 @@ 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); /* Checks for struct mds_rec_create */ LASSERTF((int)sizeof(struct mds_rec_create) == 96, " found %lld\n",