X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Flustre%2Flustre_idl.h;h=fcba9a1a427e89ebdb6dea811b9f78ab85a7e87a;hb=04f2d8ab2524851477f0b6fbffbc115d0c82fdc6;hp=54f07302cdd462ee0dfe8ee453d4ea65417aa72b;hpb=4c01e64e0a72c1682ebf0a8bd4cccf99fd04cd88;p=fs%2Flustre-release.git diff --git a/lustre/include/lustre/lustre_idl.h b/lustre/include/lustre/lustre_idl.h index 54f0730..fcba9a1 100644 --- a/lustre/include/lustre/lustre_idl.h +++ b/lustre/include/lustre/lustre_idl.h @@ -26,10 +26,13 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. */ /* + * Copyright (c) 2011 Whamcloud, Inc. + */ +/* * This file is part of Lustre, http://www.lustre.org/ * Lustre is a trademark of Sun Microsystems, Inc. * @@ -91,11 +94,12 @@ #ifndef _LUSTRE_IDL_H_ #define _LUSTRE_IDL_H_ -#include +#if !defined(LASSERT) && !defined(LPU64) +#include /* for LASSERT, LPUX64, etc */ +#endif /* Defn's shared with user-space. */ #include -#include /* * GENERAL STUFF @@ -141,13 +145,6 @@ /* Portal 63 is reserved for the Cray Inc DVS - nic@cray.com, roe@cray.com, n8851@cray.com */ -#define SVC_KILLED 1 -#define SVC_EVENT 2 -#define SVC_SIGNAL 4 -#define SVC_RUNNING 8 -#define SVC_STOPPING 16 -#define SVC_STOPPED 32 - /* packet types */ #define PTL_RPC_MSG_REQUEST 4711 #define PTL_RPC_MSG_ERR 4712 @@ -175,7 +172,7 @@ typedef __u32 mdsno_t; typedef __u64 seqno_t; typedef __u64 obd_id; typedef __u64 obd_seq; -typedef __u64 obd_time; +typedef __s64 obd_time; typedef __u64 obd_size; typedef __u64 obd_off; typedef __u64 obd_blocks; @@ -190,15 +187,18 @@ typedef __u32 obd_count; /** * Describes a range of sequence, lsr_start is included but lsr_end is * not in the range. - * Same structure is used in fld module where lsr_mdt field holds mdt id + * Same structure is used in fld module where lsr_index field holds mdt id * of the home mdt. */ +#define LU_SEQ_RANGE_MDT 0x0 +#define LU_SEQ_RANGE_OST 0x1 + struct lu_seq_range { __u64 lsr_start; __u64 lsr_end; - __u32 lsr_mdt; - __u32 lsr_padding; + __u32 lsr_index; + __u32 lsr_flags; }; /** @@ -216,7 +216,7 @@ static inline __u64 range_space(const struct lu_seq_range *range) static inline void range_init(struct lu_seq_range *range) { - range->lsr_start = range->lsr_end = range->lsr_mdt = 0; + range->lsr_start = range->lsr_end = range->lsr_index = 0; } /** @@ -229,18 +229,6 @@ static inline int range_within(const struct lu_seq_range *range, return s >= range->lsr_start && s < range->lsr_end; } -/** - * allocate \a w units of sequence from range \a from. - */ -static inline void range_alloc(struct lu_seq_range *to, - struct lu_seq_range *from, - __u64 width) -{ - to->lsr_start = from->lsr_start; - to->lsr_end = from->lsr_start + width; - from->lsr_start += width; -} - static inline int range_is_sane(const struct lu_seq_range *range) { return (range->lsr_end >= range->lsr_start); @@ -257,12 +245,21 @@ static inline int range_is_exhausted(const struct lu_seq_range *range) return range_space(range) == 0; } -#define DRANGE "[%#16.16"LPF64"x-%#16.16"LPF64"x):%x" +/* return 0 if two range have the same location */ +static inline int range_compare_loc(const struct lu_seq_range *r1, + const struct lu_seq_range *r2) +{ + return r1->lsr_index != r2->lsr_index || + r1->lsr_flags != r2->lsr_flags; +} + +#define DRANGE "[%#16.16"LPF64"x-%#16.16"LPF64"x):%x:%x" #define PRANGE(range) \ (range)->lsr_start, \ (range)->lsr_end, \ - (range)->lsr_mdt + (range)->lsr_index, \ + (range)->lsr_flags /** \defgroup lu_fid lu_fid * @{ */ @@ -402,6 +399,10 @@ static inline obd_id fid_ver_oid(const struct lu_fid *fid) } /** + * Note that reserved SEQ numbers below 12 will conflict with ldiskfs + * inodes in the IGIF namespace, so these reserved SEQ numbers can be + * used for other purposes and not risk collisions with existing inodes. + * * Different FID Format * http://arch.lustre.org/index.php?title=Interoperability_fids_zfs#NEW.0 */ @@ -420,7 +421,8 @@ enum fid_seq { FID_SEQ_START = 0x200000000ULL, FID_SEQ_LOCAL_FILE = 0x200000001ULL, FID_SEQ_DOT_LUSTRE = 0x200000002ULL, - FID_SEQ_NORMAL = 0x200000400ULL + FID_SEQ_NORMAL = 0x200000400ULL, + FID_SEQ_LOV_DEFAULT= 0xffffffffffffffffULL }; #define OBIF_OID_MAX_BITS 32 @@ -484,7 +486,7 @@ static inline int fid_seq_is_idif(const __u64 seq) static inline int fid_is_idif(const struct lu_fid *fid) { - return fid_seq_is_igif(fid_seq(fid)); + return fid_seq_is_idif(fid_seq(fid)); } struct ost_id { @@ -794,8 +796,9 @@ static inline int lu_fid_cmp(const struct lu_fid *f0, * enumeration. */ enum lu_dirent_attrs { - LUDA_FID = 0x0001, - LUDA_TYPE = 0x0002, + LUDA_FID = 0x0001, + LUDA_TYPE = 0x0002, + LUDA_64BITHASH = 0x0004, }; /** @@ -858,7 +861,14 @@ struct lu_dirpage { }; enum lu_dirpage_flags { - LDF_EMPTY = 1 << 0 + /** + * dirpage contains no entry. + */ + LDF_EMPTY = 1 << 0, + /** + * last entry's lde_hash equals ldp_hash_end. + */ + LDF_COLLIDE = 1 << 1 }; static inline struct lu_dirent *lu_dirent_start(struct lu_dirpage *dp) @@ -904,7 +914,22 @@ static inline int lu_dirent_size(struct lu_dirent *ent) return le16_to_cpu(ent->lde_reclen); } -#define DIR_END_OFF 0xfffffffffffffffeULL +#define MDS_DIR_END_OFF 0xfffffffffffffffeULL + +/** + * MDS_READPAGE page size + * + * This is the directory page size packed in MDS_READPAGE RPC. + * It's different than CFS_PAGE_SIZE because the client needs to + * access the struct lu_dirpage header packed at the beginning of + * the "page" and without this there isn't any way to know find the + * lu_dirpage header is if client and server CFS_PAGE_SIZE differ. + */ +#define LU_PAGE_SHIFT 12 +#define LU_PAGE_SIZE (1UL << LU_PAGE_SHIFT) +#define LU_PAGE_MASK (~(LU_PAGE_SIZE - 1)) + +#define LU_PAGE_COUNT 1 << (CFS_PAGE_SHIFT - LU_PAGE_SHIFT) /** @} lu_dir */ @@ -918,8 +943,8 @@ static inline int lustre_handle_is_used(struct lustre_handle *lh) return lh->cookie != 0ull; } -static inline int lustre_handle_equal(struct lustre_handle *lh1, - struct lustre_handle *lh2) +static inline int lustre_handle_equal(const struct lustre_handle *lh1, + const struct lustre_handle *lh2) { return lh1->cookie == lh2->cookie; } @@ -932,6 +957,7 @@ static inline void lustre_handle_copy(struct lustre_handle *tgt, /* flags for lm_flags */ #define MSGHDR_AT_SUPPORT 0x1 +#define MSGHDR_CKSUM_INCOMPAT18 0x2 #define lustre_msg lustre_msg_v2 /* we depend on this structure to be 8-byte aligned */ @@ -1070,6 +1096,12 @@ extern void lustre_swab_ptlrpc_body(struct ptlrpc_body *pb); #define OBD_CONNECT_LOV_V3 0x100000000ULL /*client supports LOV v3 EA */ #define OBD_CONNECT_GRANT_SHRINK 0x200000000ULL /* support grant shrink */ #define OBD_CONNECT_SKIP_ORPHAN 0x400000000ULL /* don't reuse orphan objids */ +#define OBD_CONNECT_MAX_EASIZE 0x800000000ULL /* preserved for large EA */ +#define OBD_CONNECT_FULL20 0x1000000000ULL /* it is 2.0 client */ +#define OBD_CONNECT_LAYOUTLOCK 0x2000000000ULL /* client supports layout lock */ +#define OBD_CONNECT_64BITHASH 0x4000000000ULL /* client supports 64-bits + * directory hash */ +#define OBD_CONNECT_MAXBYTES 0x8000000000ULL /* max stripe size */ /* also update obd_connect_names[] for lprocfs_rd_connect_flags() * and lustre/utils/wirecheck.c */ @@ -1081,15 +1113,17 @@ extern void lustre_swab_ptlrpc_body(struct ptlrpc_body *pb); #define MDT_CONNECT_SUPPORTED (OBD_CONNECT_RDONLY | OBD_CONNECT_VERSION | \ OBD_CONNECT_ACL | OBD_CONNECT_XATTR | \ - OBD_CONNECT_IBITS | OBD_CONNECT_JOIN | \ - OBD_CONNECT_NODEVOH |/* OBD_CONNECT_ATTRFID |*/\ + OBD_CONNECT_IBITS | \ + OBD_CONNECT_NODEVOH | OBD_CONNECT_ATTRFID | \ OBD_CONNECT_CANCELSET | OBD_CONNECT_AT | \ OBD_CONNECT_RMT_CLIENT | \ OBD_CONNECT_RMT_CLIENT_FORCE | \ - OBD_CONNECT_MDS_CAPA | OBD_CONNECT_OSS_CAPA | \ - OBD_CONNECT_MDS_MDS | OBD_CONNECT_FID | \ - LRU_RESIZE_CONNECT_FLAG | OBD_CONNECT_VBR | \ - OBD_CONNECT_LOV_V3 | OBD_CONNECT_SOM) + OBD_CONNECT_BRW_SIZE | OBD_CONNECT_MDS_CAPA | \ + OBD_CONNECT_OSS_CAPA | OBD_CONNECT_MDS_MDS | \ + OBD_CONNECT_FID | LRU_RESIZE_CONNECT_FLAG | \ + OBD_CONNECT_VBR | OBD_CONNECT_LOV_V3 | \ + OBD_CONNECT_SOM | OBD_CONNECT_FULL20 | \ + OBD_CONNECT_64BITHASH) #define OST_CONNECT_SUPPORTED (OBD_CONNECT_SRVLOCK | OBD_CONNECT_GRANT | \ OBD_CONNECT_REQPORTAL | OBD_CONNECT_VERSION | \ OBD_CONNECT_TRUNCLOCK | OBD_CONNECT_INDEX | \ @@ -1100,9 +1134,15 @@ extern void lustre_swab_ptlrpc_body(struct ptlrpc_body *pb); OBD_CONNECT_OSS_CAPA | OBD_CONNECT_RMT_CLIENT | \ OBD_CONNECT_RMT_CLIENT_FORCE | OBD_CONNECT_VBR | \ OBD_CONNECT_MDS | OBD_CONNECT_SKIP_ORPHAN | \ - OBD_CONNECT_GRANT_SHRINK) + OBD_CONNECT_GRANT_SHRINK | OBD_CONNECT_FULL20 | \ + OBD_CONNECT_64BITHASH | OBD_CONNECT_MAXBYTES) #define ECHO_CONNECT_SUPPORTED (0) -#define MGS_CONNECT_SUPPORTED (OBD_CONNECT_VERSION | OBD_CONNECT_AT) +#define MGS_CONNECT_SUPPORTED (OBD_CONNECT_VERSION | OBD_CONNECT_AT | \ + OBD_CONNECT_FULL20) + +/* Features required for this version of the client to work with server */ +#define CLIENT_CONNECT_MDT_REQD (OBD_CONNECT_IBITS | OBD_CONNECT_FID | \ + OBD_CONNECT_FULL20) #define OBD_OCD_VERSION(major,minor,patch,fix) (((major)<<24) + ((minor)<<16) +\ ((patch)<<8) + (fix)) @@ -1115,6 +1155,23 @@ extern void lustre_swab_ptlrpc_body(struct ptlrpc_body *pb); * * If we eventually have separate connect data for different types, which we * almost certainly will, then perhaps we stick a union in here. */ +struct obd_connect_data_v1 { + __u64 ocd_connect_flags; /* OBD_CONNECT_* per above */ + __u32 ocd_version; /* lustre release version number */ + __u32 ocd_grant; /* initial cache grant amount (bytes) */ + __u32 ocd_index; /* LOV index to connect to */ + __u32 ocd_brw_size; /* Maximum BRW size in bytes */ + __u64 ocd_ibits_known; /* inode bits this client understands */ + __u32 ocd_nllu; /* non-local-lustre-user */ + __u32 ocd_nllg; /* non-local-lustre-group */ + __u64 ocd_transno; /* first transno from client to be replayed */ + __u32 ocd_group; /* MDS group on OST */ + __u32 ocd_cksum_types; /* supported checksum algorithms */ + __u32 ocd_max_easize; /* How big LOV EA can be on MDS */ + __u32 padding; /* also fix lustre_swab_connect */ + __u64 ocd_maxbytes; /* Maximum stripe size in bytes */ +}; + struct obd_connect_data { __u64 ocd_connect_flags; /* OBD_CONNECT_* per above */ __u32 ocd_version; /* lustre release version number */ @@ -1127,10 +1184,31 @@ struct obd_connect_data { __u64 ocd_transno; /* first transno from client to be replayed */ __u32 ocd_group; /* MDS group on OST */ __u32 ocd_cksum_types; /* supported checksum algorithms */ - __u64 padding1; /* also fix lustre_swab_connect */ - __u64 padding2; /* also fix lustre_swab_connect */ + __u32 ocd_max_easize; /* How big LOV EA can be on MDS */ + __u32 padding; /* also fix lustre_swab_connect */ + __u64 ocd_maxbytes; /* Maximum stripe size in bytes */ + /* Fields after ocd_maxbytes are only accessible by the receiver + * if the corresponding flag in ocd_connect_flags is set. Accessing + * any field after ocd_maxbytes on the receiver without a valid flag + * may result in out-of-bound memory access and kernel oops. */ + __u64 padding1; /* added 2.2.0. also fix lustre_swab_connect */ + __u64 padding2; /* added 2.2.0. also fix lustre_swab_connect */ + __u64 padding3; /* added 2.2.0. also fix lustre_swab_connect */ + __u64 padding4; /* added 2.2.0. also fix lustre_swab_connect */ + __u64 padding5; /* added 2.2.0. also fix lustre_swab_connect */ + __u64 padding6; /* added 2.2.0. also fix lustre_swab_connect */ + __u64 padding7; /* added 2.2.0. also fix lustre_swab_connect */ + __u64 padding8; /* added 2.2.0. also fix lustre_swab_connect */ + __u64 padding9; /* added 2.2.0. also fix lustre_swab_connect */ + __u64 paddingA; /* added 2.2.0. also fix lustre_swab_connect */ + __u64 paddingB; /* added 2.2.0. also fix lustre_swab_connect */ + __u64 paddingC; /* added 2.2.0. also fix lustre_swab_connect */ + __u64 paddingD; /* added 2.2.0. also fix lustre_swab_connect */ + __u64 paddingE; /* added 2.2.0. also fix lustre_swab_connect */ + __u64 paddingF; /* added 2.2.0. also fix lustre_swab_connect */ }; + extern void lustre_swab_connect(struct obd_connect_data *ocd); /* @@ -1191,13 +1269,14 @@ enum obdo_flags { OBD_FL_CKSUM_RSVD2 = 0x00008000, /* for future cksum types */ OBD_FL_CKSUM_RSVD3 = 0x00010000, /* for future cksum types */ OBD_FL_SHRINK_GRANT = 0x00020000, /* object shrink the grant */ + OBD_FL_MMAP = 0x00040000, /* object is mmapped on the client */ + OBD_FL_RECOV_RESEND = 0x00080000, /* recoverable resent */ + OBD_FL_NOSPC_BLK = 0x00100000, /* no more block space on OST */ OBD_FL_CKSUM_ALL = OBD_FL_CKSUM_CRC32 | OBD_FL_CKSUM_ADLER, /* mask for local-only flag, which won't be sent over network */ OBD_FL_LOCAL_MASK = 0xF0000000, - /* temporary OBDO used by osc_brw_async (see bug 18364) */ - OBD_FL_TEMPORARY = 0x10000000, }; #define LOV_MAGIC_V1 0x0BD10BD0 @@ -1210,9 +1289,6 @@ enum obdo_flags { #define LOV_PATTERN_FIRST 0x100 /* first stripe is not in round-robin */ #define LOV_PATTERN_CMOBD 0x200 -#define LOV_OBJECT_GROUP_DEFAULT ~0ULL -#define LOV_OBJECT_GROUP_CLEAR 0ULL - #define lov_ost_data lov_ost_data_v1 struct lov_ost_data_v1 { /* per-stripe data structure (little-endian)*/ __u64 l_object_id; /* OST object ID */ @@ -1354,6 +1430,7 @@ extern void lustre_swab_obd_statfs (struct obd_statfs *os); #define OBD_BRW_NOCACHE 0x80 /* this page is a part of non-cached IO */ #define OBD_BRW_NOQUOTA 0x100 #define OBD_BRW_SRVLOCK 0x200 /* Client holds no lock over this page */ +#define OBD_BRW_ASYNC 0x400 /* Server may delay commit to disk */ #define OBD_BRW_MEMALLOC 0x800 /* Client runs in the "kswapd" context */ #define OBD_OBJECT_EOF 0xffffffffffffffffULL @@ -1392,11 +1469,11 @@ extern void lustre_swab_niobuf_remote (struct niobuf_remote *nbr); #define OST_LVB_GET_ERR(blocks) (int)(blocks - OST_LVB_ERR_INIT) struct ost_lvb { - __u64 lvb_size; - __u64 lvb_mtime; - __u64 lvb_atime; - __u64 lvb_ctime; - __u64 lvb_blocks; + __u64 lvb_size; + obd_time lvb_mtime; + obd_time lvb_atime; + obd_time lvb_ctime; + __u64 lvb_blocks; }; extern void lustre_swab_ost_lvb(struct ost_lvb *); @@ -1561,9 +1638,9 @@ struct mds_body { struct lustre_handle handle; __u64 valid; __u64 size; /* Offset, in the case of MDS_READPAGE */ - __u64 mtime; - __u64 atime; - __u64 ctime; + obd_time mtime; + obd_time atime; + obd_time ctime; __u64 blocks; /* XID, in the case of MDS_READPAGE */ __u64 io_epoch; __u64 ino; @@ -1593,9 +1670,9 @@ struct mdt_body { struct lustre_handle handle; __u64 valid; __u64 size; /* Offset, in the case of MDS_READPAGE */ - __u64 mtime; - __u64 atime; - __u64 ctime; + obd_time mtime; + obd_time atime; + obd_time ctime; __u64 blocks; /* XID, in the case of MDS_READPAGE */ __u64 ioepoch; __u64 ino; /* for 1.6 compatibility */ @@ -1614,8 +1691,9 @@ struct mdt_body { __u32 aclsize; __u32 max_mdsize; __u32 max_cookiesize; - __u32 padding_4; /* also fix lustre_swab_mdt_body */ - __u64 padding_5; + __u32 uid_h; /* high 32-bits of uid, for FUID */ + __u32 gid_h; /* high 32-bits of gid, for FUID */ + __u32 padding_5; /* also fix lustre_swab_mdt_body */ __u64 padding_6; __u64 padding_7; __u64 padding_8; @@ -1685,6 +1763,8 @@ extern void lustre_swab_quota_adjust_qunit(struct quota_adjust_qunit *q); #define LQUOTA_FLAGS_ADJINO 8UL /* adjust the inode qunit size */ #define LQUOTA_FLAGS_CHG_QS 16UL /* indicate whether it has capability of * OBD_CONNECT_CHANGE_QS */ +#define LQUOTA_FLAGS_RECOVERY 32UL /* recovery is going on a uid/gid */ +#define LQUOTA_FLAGS_SETQUOTA 64UL /* being setquota on a uid/gid */ /* flags is specific for quota_adjust_qunit */ #define LQUOTA_QAQ_CREATE_LQS (1 << 31) /* when it is set, need create lqs */ @@ -1727,7 +1807,9 @@ struct mdt_remote_perm { __u32 rp_uid; __u32 rp_gid; __u32 rp_fsuid; + __u32 rp_fsuid_h; __u32 rp_fsgid; + __u32 rp_fsgid_h; __u32 rp_access_perm; /* MAY_READ/WRITE/EXEC */ }; @@ -1750,9 +1832,9 @@ struct mdt_rec_setattr { __u32 sa_gid; __u64 sa_size; __u64 sa_blocks; - __u64 sa_mtime; - __u64 sa_atime; - __u64 sa_ctime; + obd_time sa_mtime; + obd_time sa_atime; + obd_time sa_ctime; __u32 sa_attr_flags; __u32 sa_mode; __u32 sa_padding_2; @@ -1825,6 +1907,9 @@ extern void lustre_swab_mdt_rec_setattr (struct mdt_rec_setattr *sa); #define MDS_OPEN_LOCK 04000000000 /* This open requires open lock */ #define MDS_OPEN_HAS_EA 010000000000 /* specify object create pattern */ #define MDS_OPEN_HAS_OBJS 020000000000 /* Just set the EA the obj exist */ +#define MDS_OPEN_NORESTORE 0100000000000ULL /* Do not restore file at open */ +#define MDS_OPEN_NEWSTRIPE 0200000000000ULL /* New stripe needed (restripe or + * hsm restore) */ /* permission for create non-directory file */ #define MAY_CREATE (1 << 7) @@ -1850,9 +1935,11 @@ enum { MDS_PERM_BYPASS = 1 << 3, MDS_SOM = 1 << 4, MDS_QUOTA_IGNORE = 1 << 5, - MDS_CLOSE_CLEANUP = 1 << 6 + MDS_CLOSE_CLEANUP = 1 << 6, + MDS_KEEP_ORPHAN = 1 << 7 }; +/* instance of mdt_reint_rec */ struct mdt_rec_create { __u32 cr_opcode; __u32 cr_cap; @@ -1867,18 +1954,33 @@ struct mdt_rec_create { struct lu_fid cr_fid1; struct lu_fid cr_fid2; struct lustre_handle cr_old_handle; /* handle in case of open replay */ - __u64 cr_time; + obd_time cr_time; __u64 cr_rdev; __u64 cr_ioepoch; - __u64 cr_padding_1; /* pad for 64 bits*/ + __u64 cr_padding_1; /* rr_blocks */ __u32 cr_mode; __u32 cr_bias; - __u32 cr_flags; /* for use with open */ - __u32 cr_padding_2; - __u32 cr_padding_3; - __u32 cr_padding_4; + /* use of helpers set/get_mrc_cr_flags() is needed to access + * 64 bits cr_flags [cr_flags_l, cr_flags_h], this is done to + * extend cr_flags size without breaking 1.8 compat */ + __u32 cr_flags_l; /* for use with open, low 32 bits */ + __u32 cr_flags_h; /* for use with open, high 32 bits */ + __u32 cr_padding_3; /* rr_padding_3 */ + __u32 cr_padding_4; /* rr_padding_4 */ }; +static inline void set_mrc_cr_flags(struct mdt_rec_create *mrc, __u64 flags) +{ + mrc->cr_flags_l = (__u32)(flags & 0xFFFFFFFFUll); + mrc->cr_flags_h = (__u32)(flags >> 32); +} + +static inline __u64 get_mrc_cr_flags(struct mdt_rec_create *mrc) +{ + return ((__u64)(mrc->cr_flags_l) | ((__u64)mrc->cr_flags_h << 32)); +} + +/* instance of mdt_reint_rec */ struct mdt_rec_link { __u32 lk_opcode; __u32 lk_cap; @@ -1892,19 +1994,20 @@ struct mdt_rec_link { __u32 lk_suppgid2_h; struct lu_fid lk_fid1; struct lu_fid lk_fid2; - __u64 lk_time; - __u64 lk_padding_1; - __u64 lk_padding_2; - __u64 lk_padding_3; - __u64 lk_padding_4; + obd_time lk_time; + __u64 lk_padding_1; /* rr_atime */ + __u64 lk_padding_2; /* rr_ctime */ + __u64 lk_padding_3; /* rr_size */ + __u64 lk_padding_4; /* rr_blocks */ __u32 lk_bias; - __u32 lk_padding_5; - __u32 lk_padding_6; - __u32 lk_padding_7; - __u32 lk_padding_8; - __u32 lk_padding_9; + __u32 lk_padding_5; /* rr_mode */ + __u32 lk_padding_6; /* rr_flags */ + __u32 lk_padding_7; /* rr_padding_2 */ + __u32 lk_padding_8; /* rr_padding_3 */ + __u32 lk_padding_9; /* rr_padding_4 */ }; +/* instance of mdt_reint_rec */ struct mdt_rec_unlink { __u32 ul_opcode; __u32 ul_cap; @@ -1918,19 +2021,20 @@ struct mdt_rec_unlink { __u32 ul_suppgid2_h; struct lu_fid ul_fid1; struct lu_fid ul_fid2; - __u64 ul_time; - __u64 ul_padding_2; - __u64 ul_padding_3; - __u64 ul_padding_4; - __u64 ul_padding_5; + obd_time ul_time; + __u64 ul_padding_2; /* rr_atime */ + __u64 ul_padding_3; /* rr_ctime */ + __u64 ul_padding_4; /* rr_size */ + __u64 ul_padding_5; /* rr_blocks */ __u32 ul_bias; __u32 ul_mode; - __u32 ul_padding_6; - __u32 ul_padding_7; - __u32 ul_padding_8; - __u32 ul_padding_9; + __u32 ul_padding_6; /* rr_flags */ + __u32 ul_padding_7; /* rr_padding_2 */ + __u32 ul_padding_8; /* rr_padding_3 */ + __u32 ul_padding_9; /* rr_padding_4 */ }; +/* instance of mdt_reint_rec */ struct mdt_rec_rename { __u32 rn_opcode; __u32 rn_cap; @@ -1944,19 +2048,20 @@ struct mdt_rec_rename { __u32 rn_suppgid2_h; struct lu_fid rn_fid1; struct lu_fid rn_fid2; - __u64 rn_time; - __u64 rn_padding_1; - __u64 rn_padding_2; - __u64 rn_padding_3; - __u64 rn_padding_4; - __u32 rn_bias; /* some operation flags */ - __u32 rn_mode; /* cross-ref rename has mode */ - __u32 rn_padding_5; - __u32 rn_padding_6; - __u32 rn_padding_7; - __u32 rn_padding_8; -}; - + obd_time rn_time; + __u64 rn_padding_1; /* rr_atime */ + __u64 rn_padding_2; /* rr_ctime */ + __u64 rn_padding_3; /* rr_size */ + __u64 rn_padding_4; /* rr_blocks */ + __u32 rn_bias; /* some operation flags */ + __u32 rn_mode; /* cross-ref rename has mode */ + __u32 rn_padding_5; /* rr_flags */ + __u32 rn_padding_6; /* rr_padding_2 */ + __u32 rn_padding_7; /* rr_padding_3 */ + __u32 rn_padding_8; /* rr_padding_4 */ +}; + +/* instance of mdt_reint_rec */ struct mdt_rec_setxattr { __u32 sx_opcode; __u32 sx_cap; @@ -1969,22 +2074,30 @@ struct mdt_rec_setxattr { __u32 sx_suppgid2; __u32 sx_suppgid2_h; struct lu_fid sx_fid; - __u64 sx_padding_1; /* These three members are lu_fid size */ + __u64 sx_padding_1; /* These three are rr_fid2 */ __u32 sx_padding_2; __u32 sx_padding_3; __u64 sx_valid; - __u64 sx_time; - __u64 sx_padding_5; - __u64 sx_padding_6; - __u64 sx_padding_7; + obd_time sx_time; + __u64 sx_padding_5; /* rr_ctime */ + __u64 sx_padding_6; /* rr_size */ + __u64 sx_padding_7; /* rr_blocks */ __u32 sx_size; __u32 sx_flags; - __u32 sx_padding_8; - __u32 sx_padding_9; - __u32 sx_padding_10; - __u32 sx_padding_11; + __u32 sx_padding_8; /* rr_flags */ + __u32 sx_padding_9; /* rr_padding_2 */ + __u32 sx_padding_10; /* rr_padding_3 */ + __u32 sx_padding_11; /* rr_padding_4 */ }; +/* + * mdt_rec_reint is the template for all mdt_reint_xxx structures. + * Do NOT change the size of various members, otherwise the value + * will be broken in lustre_swab_mdt_rec_reint(). + * + * If you add new members in other mdt_reint_xxx structres and need to use the + * rr_padding_x fields, then update lustre_swab_mdt_rec_reint() also. + */ struct mdt_rec_reint { __u32 rr_opcode; __u32 rr_cap; @@ -1998,14 +2111,14 @@ struct mdt_rec_reint { __u32 rr_suppgid2_h; struct lu_fid rr_fid1; struct lu_fid rr_fid2; - __u64 rr_mtime; - __u64 rr_atime; - __u64 rr_ctime; + obd_time rr_mtime; + obd_time rr_atime; + obd_time rr_ctime; __u64 rr_size; __u64 rr_blocks; __u32 rr_bias; __u32 rr_mode; - __u32 rr_padding_1; /* also fix lustre_swab_mdt_rec_reint */ + __u32 rr_flags; __u32 rr_padding_2; /* also fix lustre_swab_mdt_rec_reint */ __u32 rr_padding_3; /* also fix lustre_swab_mdt_rec_reint */ __u32 rr_padding_4; /* also fix lustre_swab_mdt_rec_reint */ @@ -2174,12 +2287,12 @@ struct ldlm_inodebits { __u64 bits; }; -struct ldlm_flock { - __u64 start; - __u64 end; - __u64 blocking_export; /* not actually used over the wire */ - __u32 blocking_pid; /* not actually used over the wire */ - __u32 pid; +struct ldlm_flock_wire { + __u64 lfw_start; + __u64 lfw_end; + __u64 lfw_owner; + __u32 lfw_padding; + __u32 lfw_pid; }; /* it's important that the fields of the ldlm_extent structure match @@ -2190,11 +2303,11 @@ struct ldlm_flock { typedef union { struct ldlm_extent l_extent; - struct ldlm_flock l_flock; + struct ldlm_flock_wire l_flock; struct ldlm_inodebits l_inodebits; -} ldlm_policy_data_t; +} ldlm_wire_policy_data_t; -extern void lustre_swab_ldlm_policy_data (ldlm_policy_data_t *d); +extern void lustre_swab_ldlm_policy_data (ldlm_wire_policy_data_t *d); struct ldlm_intent { __u64 opc; @@ -2214,7 +2327,7 @@ struct ldlm_lock_desc { struct ldlm_resource_desc l_resource; ldlm_mode_t l_req_mode; ldlm_mode_t l_granted_mode; - ldlm_policy_data_t l_policy_data; + ldlm_wire_policy_data_t l_policy_data; }; extern void lustre_swab_ldlm_lock_desc (struct ldlm_lock_desc *l); @@ -2307,8 +2420,8 @@ struct cfg_marker { __u32 cm_flags; __u32 cm_vers; /* lustre release version number */ __u32 padding; /* 64 bit align */ - __u64 cm_createtime; /*when this record was first created */ - __u64 cm_canceltime; /*when this record is no longer valid*/ + obd_time cm_createtime; /*when this record was first created */ + obd_time cm_canceltime; /*when this record is no longer valid*/ char cm_tgtname[MTI_NAME_MAXLEN]; char cm_comment[MTI_NAME_MAXLEN]; }; @@ -2467,7 +2580,7 @@ struct llog_size_change_rec { /** bits covering all \a changelog_rec_type's */ #define CHANGELOG_ALLMASK 0XFFFFFFFF /** default \a changelog_rec_type mask */ -#define CHANGELOG_DEFMASK CHANGELOG_ALLMASK +#define CHANGELOG_DEFMASK CHANGELOG_ALLMASK & ~(1 << CL_ATIME) /* changelog llog name, needed by client replicators */ #define CHANGELOG_CATALOG "changelog_catalog" @@ -2518,7 +2631,7 @@ struct llog_gen_rec { struct llog_log_hdr { struct llog_rec_hdr llh_hdr; - __u64 llh_timestamp; + obd_time llh_timestamp; __u32 llh_count; __u32 llh_bitmap_offset; __u32 llh_size; @@ -2601,7 +2714,8 @@ struct obdo { struct lustre_handle o_handle; /* brw: lock handle to prolong locks */ struct llog_cookie o_lcookie; /* destroy: unlink cookie from MDS */ - __u64 o_padding_2; + __u32 o_uid_h; + __u32 o_gid_h; __u64 o_padding_3; __u64 o_padding_4; __u64 o_padding_5; @@ -2615,12 +2729,6 @@ struct obdo { #define o_dropped o_misc #define o_cksum o_nlink -static inline void obdo_unpack_ostid(struct obdo *oa, struct ost_id *ostid) -{ - ostid->oi_id = ostid_id(&oa->o_oi); - ostid->oi_seq = ostid_seq(&oa->o_oi); -} - static inline void lustre_set_wire_obdo(struct obdo *wobdo, struct obdo *lobdo) { memcpy(wobdo, lobdo, sizeof(*lobdo)); @@ -2629,13 +2737,19 @@ static inline void lustre_set_wire_obdo(struct obdo *wobdo, struct obdo *lobdo) static inline void lustre_get_wire_obdo(struct obdo *lobdo, struct obdo *wobdo) { - obd_flag local_flags = lobdo->o_flags & OBD_FL_LOCAL_MASK; + obd_flag local_flags = 0; + + if (lobdo->o_valid & OBD_MD_FLFLAGS) + local_flags = lobdo->o_flags & OBD_FL_LOCAL_MASK; LASSERT(!(wobdo->o_flags & OBD_FL_LOCAL_MASK)); memcpy(lobdo, wobdo, sizeof(*lobdo)); - lobdo->o_flags &= ~OBD_FL_LOCAL_MASK; - lobdo->o_flags |= local_flags; + if (local_flags != 0) { + lobdo->o_valid |= OBD_MD_FLFLAGS; + lobdo->o_flags &= ~OBD_FL_LOCAL_MASK; + lobdo->o_flags |= local_flags; + } } extern void lustre_swab_obdo (struct obdo *o); @@ -2861,8 +2975,6 @@ struct getinfo_fid2path { void lustre_swab_fid2path (struct getinfo_fid2path *gf); -extern void lustre_swab_kuch(struct kuc_hdr *); - #endif /** @} lustreidl */