Whamcloud - gitweb
LU-1517 ptlrpc: throw net error to ptlrpc for bulk
[fs/lustre-release.git] / lustre / ptlrpc / layout.c
index 2d7eeea..20bde6c 100644 (file)
@@ -1,6 +1,4 @@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
  * GPL HEADER START
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -28,9 +26,8 @@
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
- */
-/*
- * Copyright (c) 2011 Whamcloud, Inc.
+ *
+ * Copyright (c) 2011, Whamcloud, Inc.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -51,9 +48,6 @@
 
 #if !defined(__REQ_LAYOUT_USER__)
 
-#ifndef EXPORT_SYMTAB
-# define EXPORT_SYMTAB
-#endif
 #define DEBUG_SUBSYSTEM S_RPC
 
 #ifdef __KERNEL__
@@ -97,6 +91,16 @@ static const struct req_msg_field *mgs_set_info[] = {
         &RMF_MGS_SEND_PARAM
 };
 
+static const struct req_msg_field *mgs_config_read_client[] = {
+        &RMF_PTLRPC_BODY,
+        &RMF_MGS_CONFIG_BODY
+};
+
+static const struct req_msg_field *mgs_config_read_server[] = {
+        &RMF_PTLRPC_BODY,
+        &RMF_MGS_CONFIG_RES
+};
+
 static const struct req_msg_field *log_cancel_client[] = {
         &RMF_PTLRPC_BODY,
         &RMF_LOGCOOKIES
@@ -117,14 +121,24 @@ static const struct req_msg_field *quotactl_only[] = {
         &RMF_PTLRPC_BODY,
         &RMF_OBD_QUOTACTL
 };
-static const struct req_msg_field *quota_adjust_qunit_only[] = {
-        &RMF_PTLRPC_BODY,
-        &RMF_QUOTA_ADJUST_QUNIT
+
+static const struct req_msg_field *quota_body_only[] = {
+       &RMF_PTLRPC_BODY,
+       &RMF_QUOTA_BODY
 };
 
-static const struct req_msg_field *qunit_data_only[] = {
-        &RMF_PTLRPC_BODY,
-        &RMF_QUNIT_DATA
+static const struct req_msg_field *ldlm_intent_quota_client[] = {
+       &RMF_PTLRPC_BODY,
+       &RMF_DLM_REQ,
+       &RMF_LDLM_INTENT,
+       &RMF_QUOTA_BODY
+};
+
+static const struct req_msg_field *ldlm_intent_quota_server[] = {
+       &RMF_PTLRPC_BODY,
+       &RMF_DLM_REP,
+       &RMF_DLM_LVB,
+       &RMF_QUOTA_BODY
 };
 
 static const struct req_msg_field *mdt_close_client[] = {
@@ -337,11 +351,23 @@ static const struct req_msg_field *ldlm_cp_callback_client[] = {
         &RMF_DLM_LVB
 };
 
+static const struct req_msg_field *ldlm_gl_callback_desc_client[] = {
+       &RMF_PTLRPC_BODY,
+       &RMF_DLM_REQ,
+       &RMF_DLM_GL_DESC
+};
+
 static const struct req_msg_field *ldlm_gl_callback_server[] = {
         &RMF_PTLRPC_BODY,
         &RMF_DLM_LVB
 };
 
+static const struct req_msg_field *ldlm_intent_basic_client[] = {
+       &RMF_PTLRPC_BODY,
+       &RMF_DLM_REQ,
+       &RMF_LDLM_INTENT,
+};
+
 static const struct req_msg_field *ldlm_intent_client[] = {
         &RMF_PTLRPC_BODY,
         &RMF_DLM_REQ,
@@ -447,17 +473,6 @@ static const struct req_msg_field *mds_setattr_server[] = {
         &RMF_CAPA2
 };
 
-static const struct req_msg_field *llog_catinfo_client[] = {
-        &RMF_PTLRPC_BODY,
-        &RMF_NAME,
-        &RMF_STRING
-};
-
-static const struct req_msg_field *llog_catinfo_server[] = {
-        &RMF_PTLRPC_BODY,
-        &RMF_STRING
-};
-
 static const struct req_msg_field *llog_origin_handle_create_client[] = {
         &RMF_PTLRPC_BODY,
         &RMF_LLOGD_BODY,
@@ -485,6 +500,16 @@ static const struct req_msg_field *llog_origin_handle_next_block_server[] = {
         &RMF_EADATA
 };
 
+static const struct req_msg_field *obd_idx_read_client[] = {
+       &RMF_PTLRPC_BODY,
+       &RMF_IDX_INFO
+};
+
+static const struct req_msg_field *obd_idx_read_server[] = {
+       &RMF_PTLRPC_BODY,
+       &RMF_IDX_INFO
+};
+
 static const struct req_msg_field *ost_body_only[] = {
         &RMF_PTLRPC_BODY,
         &RMF_OST_BODY
@@ -552,9 +577,11 @@ static const struct req_msg_field *ost_get_fiemap_server[] = {
 static struct req_format *req_formats[] = {
         &RQF_OBD_PING,
         &RQF_OBD_SET_INFO,
+       &RQF_OBD_IDX_READ,
         &RQF_SEC_CTX,
         &RQF_MGS_TARGET_REG,
         &RQF_MGS_SET_INFO,
+        &RQF_MGS_CONFIG_READ,
         &RQF_SEQ_QUERY,
         &RQF_FLD_QUERY,
         &RQF_MDS_CONNECT,
@@ -586,13 +613,11 @@ static struct req_format *req_formats[] = {
         &RQF_MDS_REINT_SETXATTR,
         &RQF_MDS_QUOTACHECK,
         &RQF_MDS_QUOTACTL,
-        &RQF_MDS_QUOTA_DQACQ,
         &RQF_QC_CALLBACK,
         &RQF_OST_CONNECT,
         &RQF_OST_DISCONNECT,
         &RQF_OST_QUOTACHECK,
         &RQF_OST_QUOTACTL,
-        &RQF_OST_QUOTA_ADJUST_QUNIT,
         &RQF_OST_GETATTR,
         &RQF_OST_SETATTR,
         &RQF_OST_CREATE,
@@ -614,13 +639,16 @@ static struct req_format *req_formats[] = {
         &RQF_LDLM_CP_CALLBACK,
         &RQF_LDLM_BL_CALLBACK,
         &RQF_LDLM_GL_CALLBACK,
+       &RQF_LDLM_GL_DESC_CALLBACK,
         &RQF_LDLM_INTENT,
+       &RQF_LDLM_INTENT_BASIC,
         &RQF_LDLM_INTENT_GETATTR,
         &RQF_LDLM_INTENT_OPEN,
         &RQF_LDLM_INTENT_CREATE,
         &RQF_LDLM_INTENT_UNLINK,
+       &RQF_LDLM_INTENT_QUOTA,
+       &RQF_QUOTA_DQACQ,
         &RQF_LOG_CANCEL,
-        &RQF_LLOG_CATINFO,
         &RQF_LLOG_ORIGIN_HANDLE_CREATE,
         &RQF_LLOG_ORIGIN_HANDLE_DESTROY,
         &RQF_LLOG_ORIGIN_HANDLE_NEXT_BLOCK,
@@ -690,6 +718,23 @@ struct req_msg_field RMF_MGS_SEND_PARAM =
                     NULL, NULL);
 EXPORT_SYMBOL(RMF_MGS_SEND_PARAM);
 
+struct req_msg_field RMF_MGS_CONFIG_BODY =
+        DEFINE_MSGF("mgs_config_read request", 0,
+                    sizeof(struct mgs_config_body),
+                    lustre_swab_mgs_config_body, NULL);
+EXPORT_SYMBOL(RMF_MGS_CONFIG_BODY);
+
+struct req_msg_field RMF_MGS_CONFIG_RES =
+        DEFINE_MSGF("mgs_config_read reply ", 0,
+                    sizeof(struct mgs_config_res),
+                    lustre_swab_mgs_config_res, NULL);
+EXPORT_SYMBOL(RMF_MGS_CONFIG_RES);
+
+struct req_msg_field RMF_U32 =
+        DEFINE_MSGF("generic u32", 0,
+                    sizeof(__u32), lustre_swab_generic_32s, NULL);
+EXPORT_SYMBOL(RMF_U32);
+
 struct req_msg_field RMF_SETINFO_VAL =
         DEFINE_MSGF("setinfo_val", 0, -1, NULL, NULL);
 EXPORT_SYMBOL(RMF_SETINFO_VAL);
@@ -740,16 +785,10 @@ struct req_msg_field RMF_OBD_QUOTACTL =
                     lustre_swab_obd_quotactl, NULL);
 EXPORT_SYMBOL(RMF_OBD_QUOTACTL);
 
-struct req_msg_field RMF_QUOTA_ADJUST_QUNIT =
-        DEFINE_MSGF("quota_adjust_qunit", 0,
-                    sizeof(struct quota_adjust_qunit),
-                    lustre_swab_quota_adjust_qunit, NULL);
-EXPORT_SYMBOL(RMF_QUOTA_ADJUST_QUNIT);
-
-struct req_msg_field RMF_QUNIT_DATA =
-        DEFINE_MSGF("qunit_data", 0,
-                    sizeof(struct qunit_data), lustre_swab_qdata, NULL);
-EXPORT_SYMBOL(RMF_QUNIT_DATA);
+struct req_msg_field RMF_QUOTA_BODY =
+       DEFINE_MSGF("quota_body", 0,
+                   sizeof(struct quota_body), lustre_swab_quota_body, NULL);
+EXPORT_SYMBOL(RMF_QUOTA_BODY);
 
 struct req_msg_field RMF_MDT_EPOCH =
         DEFINE_MSGF("mdt_ioepoch", 0,
@@ -821,7 +860,7 @@ EXPORT_SYMBOL(RMF_CONN);
 struct req_msg_field RMF_CONNECT_DATA =
         DEFINE_MSGF("cdata",
                     RMF_F_NO_SIZE_CHECK /* we allow extra space for interop */,
-#if LUSTRE_VERSION_CODE > OBD_OCD_VERSION(2, 9, 0, 0)
+#if LUSTRE_VERSION_CODE > OBD_OCD_VERSION(2, 7, 50, 0)
                     sizeof(struct obd_connect_data),
 #else
 /* For interoperability with 1.8 and 2.0 clients/servers.
@@ -853,10 +892,15 @@ struct req_msg_field RMF_LDLM_INTENT =
 EXPORT_SYMBOL(RMF_LDLM_INTENT);
 
 struct req_msg_field RMF_DLM_LVB =
-        DEFINE_MSGF("dlm_lvb", 0, sizeof(struct ost_lvb), lustre_swab_ost_lvb,
+        DEFINE_MSGF("dlm_lvb", 0, sizeof(union ldlm_wire_lvb), lustre_swab_lvb,
         NULL);
 EXPORT_SYMBOL(RMF_DLM_LVB);
 
+struct req_msg_field RMF_DLM_GL_DESC =
+       DEFINE_MSGF("dlm_gl_desc", 0, sizeof(union ldlm_gl_desc),
+                   lustre_swab_gl_desc, NULL);
+EXPORT_SYMBOL(RMF_DLM_GL_DESC);
+
 struct req_msg_field RMF_MDT_MD =
         DEFINE_MSGF("mdt_md", RMF_F_NO_SIZE_CHECK, MIN_MD_SIZE, NULL, NULL);
 EXPORT_SYMBOL(RMF_MDT_MD);
@@ -930,6 +974,11 @@ struct req_msg_field RMF_FIEMAP_VAL =
         DEFINE_MSGF("fiemap", 0, -1, lustre_swab_fiemap, NULL);
 EXPORT_SYMBOL(RMF_FIEMAP_VAL);
 
+struct req_msg_field RMF_IDX_INFO =
+       DEFINE_MSGF("idx_info", 0, sizeof(struct idx_info),
+                   lustre_swab_idx_info, NULL);
+EXPORT_SYMBOL(RMF_IDX_INFO);
+
 /*
  * Request formats.
  */
@@ -968,6 +1017,12 @@ struct req_format RQF_OBD_SET_INFO =
         DEFINE_REQ_FMT0("OBD_SET_INFO", obd_set_info_client, empty);
 EXPORT_SYMBOL(RQF_OBD_SET_INFO);
 
+/* Read index file through the network */
+struct req_format RQF_OBD_IDX_READ =
+       DEFINE_REQ_FMT0("OBD_IDX_READ",
+                       obd_idx_read_client, obd_idx_read_server);
+EXPORT_SYMBOL(RQF_OBD_IDX_READ);
+
 struct req_format RQF_SEC_CTX =
         DEFINE_REQ_FMT0("SEC_CTX", empty, empty);
 EXPORT_SYMBOL(RQF_SEC_CTX);
@@ -982,6 +1037,11 @@ struct req_format RQF_MGS_SET_INFO =
                          mgs_set_info);
 EXPORT_SYMBOL(RQF_MGS_SET_INFO);
 
+struct req_format RQF_MGS_CONFIG_READ =
+        DEFINE_REQ_FMT0("MGS_CONFIG_READ", mgs_config_read_client,
+                         mgs_config_read_server);
+EXPORT_SYMBOL(RQF_MGS_CONFIG_READ);
+
 struct req_format RQF_SEQ_QUERY =
         DEFINE_REQ_FMT0("SEQ_QUERY", seq_query_client, seq_query_server);
 EXPORT_SYMBOL(RQF_SEQ_QUERY);
@@ -1010,18 +1070,19 @@ struct req_format RQF_OST_QUOTACTL =
         DEFINE_REQ_FMT0("OST_QUOTACTL", quotactl_only, quotactl_only);
 EXPORT_SYMBOL(RQF_OST_QUOTACTL);
 
-struct req_format RQF_OST_QUOTA_ADJUST_QUNIT =
-        DEFINE_REQ_FMT0("OST_QUOTA_ADJUST_QUNIT", quota_adjust_qunit_only,
-                        quota_adjust_qunit_only);
-EXPORT_SYMBOL(RQF_OST_QUOTA_ADJUST_QUNIT);
-
 struct req_format RQF_QC_CALLBACK =
         DEFINE_REQ_FMT0("QC_CALLBACK", quotactl_only, empty);
 EXPORT_SYMBOL(RQF_QC_CALLBACK);
 
-struct req_format RQF_MDS_QUOTA_DQACQ =
-        DEFINE_REQ_FMT0("MDS_QUOTA_DQACQ", qunit_data_only, qunit_data_only);
-EXPORT_SYMBOL(RQF_MDS_QUOTA_DQACQ);
+struct req_format RQF_QUOTA_DQACQ =
+       DEFINE_REQ_FMT0("QUOTA_DQACQ", quota_body_only, quota_body_only);
+EXPORT_SYMBOL(RQF_QUOTA_DQACQ);
+
+struct req_format RQF_LDLM_INTENT_QUOTA =
+       DEFINE_REQ_FMT0("LDLM_INTENT_QUOTA",
+                       ldlm_intent_quota_client,
+                       ldlm_intent_quota_server);
+EXPORT_SYMBOL(RQF_LDLM_INTENT_QUOTA);
 
 struct req_format RQF_MDS_GETSTATUS =
         DEFINE_REQ_FMT0("MDS_GETSTATUS", mdt_body_only, mdt_body_capa);
@@ -1153,6 +1214,16 @@ struct req_format RQF_LDLM_GL_CALLBACK =
                         ldlm_gl_callback_server);
 EXPORT_SYMBOL(RQF_LDLM_GL_CALLBACK);
 
+struct req_format RQF_LDLM_GL_DESC_CALLBACK =
+       DEFINE_REQ_FMT0("LDLM_GL_CALLBACK", ldlm_gl_callback_desc_client,
+                       ldlm_gl_callback_server);
+EXPORT_SYMBOL(RQF_LDLM_GL_DESC_CALLBACK);
+
+struct req_format RQF_LDLM_INTENT_BASIC =
+       DEFINE_REQ_FMT0("LDLM_INTENT_BASIC",
+                       ldlm_intent_basic_client, ldlm_enqueue_lvb_server);
+EXPORT_SYMBOL(RQF_LDLM_INTENT_BASIC);
+
 struct req_format RQF_LDLM_INTENT =
         DEFINE_REQ_FMT0("LDLM_INTENT",
                         ldlm_intent_client, ldlm_intent_server);
@@ -1213,11 +1284,6 @@ struct req_format RQF_MDS_IS_SUBDIR =
                         mdt_body_only, mdt_body_only);
 EXPORT_SYMBOL(RQF_MDS_IS_SUBDIR);
 
-struct req_format RQF_LLOG_CATINFO =
-        DEFINE_REQ_FMT0("LLOG_CATINFO",
-                        llog_catinfo_client, llog_catinfo_server);
-EXPORT_SYMBOL(RQF_LLOG_CATINFO);
-
 struct req_format RQF_LLOG_ORIGIN_HANDLE_CREATE =
         DEFINE_REQ_FMT0("LLOG_ORIGIN_HANDLE_CREATE",
                         llog_origin_handle_create_client, llogd_body_only);
@@ -2055,5 +2121,67 @@ void req_capsule_shrink(struct req_capsule *pill,
 }
 EXPORT_SYMBOL(req_capsule_shrink);
 
+int req_capsule_server_grow(struct req_capsule *pill,
+                            const struct req_msg_field *field,
+                            unsigned int newlen)
+{
+        struct ptlrpc_reply_state *rs = pill->rc_req->rq_reply_state, *nrs;
+        char *from, *to;
+        int offset, len, rc;
+
+        LASSERT(pill->rc_fmt != NULL);
+        LASSERT(__req_format_is_sane(pill->rc_fmt));
+        LASSERT(req_capsule_has_field(pill, field, RCL_SERVER));
+        LASSERT(req_capsule_field_present(pill, field, RCL_SERVER));
+
+        len = req_capsule_get_size(pill, field, RCL_SERVER);
+        offset = __req_capsule_offset(pill, field, RCL_SERVER);
+        if (pill->rc_req->rq_repbuf_len >=
+            lustre_packed_msg_size(pill->rc_req->rq_repmsg) - len + newlen)
+                CERROR("Inplace repack might be done\n");
+
+        pill->rc_req->rq_reply_state = NULL;
+        req_capsule_set_size(pill, field, RCL_SERVER, newlen);
+        rc = req_capsule_server_pack(pill);
+        if (rc) {
+                /* put old rs back, the caller will decide what to do */
+                pill->rc_req->rq_reply_state = rs;
+                return rc;
+        }
+        nrs = pill->rc_req->rq_reply_state;
+        /* Now we need only buffers, copy first chunk */
+        to = lustre_msg_buf(nrs->rs_msg, 0, 0);
+        from = lustre_msg_buf(rs->rs_msg, 0, 0);
+        len = (char *)lustre_msg_buf(rs->rs_msg, offset, 0) - from;
+        memcpy(to, from, len);
+        /* check if we have tail and copy it too */
+        if (rs->rs_msg->lm_bufcount > offset + 1) {
+                to = lustre_msg_buf(nrs->rs_msg, offset + 1, 0);
+                from = lustre_msg_buf(rs->rs_msg, offset + 1, 0);
+                offset = rs->rs_msg->lm_bufcount - 1;
+                len = (char *)lustre_msg_buf(rs->rs_msg, offset, 0) +
+                      cfs_size_round(rs->rs_msg->lm_buflens[offset]) - from;
+                memcpy(to, from, len);
+        }
+        /* drop old reply if everything is fine */
+        if (rs->rs_difficult) {
+                /* copy rs data */
+                int i;
+
+                nrs->rs_difficult = 1;
+                nrs->rs_no_ack = rs->rs_no_ack;
+                for (i = 0; i < rs->rs_nlocks; i++) {
+                        nrs->rs_locks[i] = rs->rs_locks[i];
+                        nrs->rs_modes[i] = rs->rs_modes[i];
+                        nrs->rs_nlocks++;
+                }
+                rs->rs_nlocks = 0;
+                rs->rs_difficult = 0;
+                rs->rs_no_ack = 0;
+        }
+        ptlrpc_rs_decref(rs);
+        return 0;
+}
+EXPORT_SYMBOL(req_capsule_server_grow);
 /* __REQ_LAYOUT_USER__ */
 #endif