Whamcloud - gitweb
LU-473 llite: improve error for 2.x cli + 1.8 srv
[fs/lustre-release.git] / lustre / include / lustre / lustre_idl.h
index eefff59..fcba9a1 100644 (file)
@@ -30,6 +30,9 @@
  * 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,7 +94,9 @@
 #ifndef _LUSTRE_IDL_H_
 #define _LUSTRE_IDL_H_
 
+#if !defined(LASSERT) && !defined(LPU64)
 #include <libcfs/libcfs.h> /* for LASSERT, LPUX64, etc */
+#endif
 
 /* Defn's shared with user-space. */
 #include <lustre/lustre_user.h>
 
 /* 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
@@ -423,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
@@ -797,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,
 };
 
 /**
@@ -861,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)
@@ -907,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 */
 
@@ -921,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;
 }
@@ -1077,6 +1099,9 @@ extern void lustre_swab_ptlrpc_body(struct ptlrpc_body *pb);
 #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 */
 
@@ -1088,16 +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_FULL20 | OBD_CONNECT_LAYOUTLOCK)
+                                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 | \
@@ -1108,11 +1134,16 @@ 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_FULL20)
+                                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 | \
                                 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))
 #define OBD_OCD_VERSION_MAJOR(version) ((int)((version)>>24)&255)
@@ -1124,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 */
@@ -1136,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);
 
 /*
@@ -1201,6 +1270,8 @@ enum obdo_flags {
         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,
 
@@ -1218,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 */
@@ -1867,7 +1935,8 @@ 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 */
@@ -2218,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
@@ -2234,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;
@@ -2258,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);
@@ -2668,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);