Whamcloud - gitweb
LU-5319 mdc: manage number of modify RPCs in flight
[fs/lustre-release.git] / lustre / ldlm / ldlm_lib.c
index cff32cc..448eb9b 100644 (file)
@@ -415,6 +415,23 @@ int client_obd_setup(struct obd_device *obddev, struct lustre_cfg *lcfg)
                else
                        cli->cl_max_rpcs_in_flight = OBD_MAX_RIF_DEFAULT;
         }
+
+       spin_lock_init(&cli->cl_mod_rpcs_lock);
+       spin_lock_init(&cli->cl_mod_rpcs_hist.oh_lock);
+       cli->cl_max_mod_rpcs_in_flight = 0;
+       cli->cl_mod_rpcs_in_flight = 0;
+       cli->cl_close_rpcs_in_flight = 0;
+       init_waitqueue_head(&cli->cl_mod_rpcs_waitq);
+       cli->cl_mod_tag_bitmap = NULL;
+
+       if (connect_op == MDS_CONNECT) {
+               cli->cl_max_mod_rpcs_in_flight = cli->cl_max_rpcs_in_flight - 1;
+               OBD_ALLOC(cli->cl_mod_tag_bitmap,
+                         BITS_TO_LONGS(OBD_MAX_RIF_MAX) * sizeof(long));
+               if (cli->cl_mod_tag_bitmap == NULL)
+                       GOTO(err, rc = -ENOMEM);
+       }
+
         rc = ldlm_get_ref();
         if (rc) {
                 CERROR("ldlm_get_ref failed: %d\n", rc);
@@ -471,6 +488,10 @@ err_import:
 err_ldlm:
         ldlm_put_ref();
 err:
+       if (cli->cl_mod_tag_bitmap != NULL)
+               OBD_FREE(cli->cl_mod_tag_bitmap,
+                        BITS_TO_LONGS(OBD_MAX_RIF_MAX) * sizeof(long));
+       cli->cl_mod_tag_bitmap = NULL;
         RETURN(rc);
 
 }
@@ -478,6 +499,7 @@ EXPORT_SYMBOL(client_obd_setup);
 
 int client_obd_cleanup(struct obd_device *obddev)
 {
+       struct client_obd *cli = &obddev->u.cli;
        ENTRY;
 
        ldlm_namespace_free_post(obddev->obd_namespace);
@@ -487,6 +509,12 @@ int client_obd_cleanup(struct obd_device *obddev)
        LASSERT(obddev->u.cli.cl_import == NULL);
 
        ldlm_put_ref();
+
+       if (cli->cl_mod_tag_bitmap != NULL)
+               OBD_FREE(cli->cl_mod_tag_bitmap,
+                        BITS_TO_LONGS(OBD_MAX_RIF_MAX) * sizeof(long));
+       cli->cl_mod_tag_bitmap = NULL;
+
        RETURN(0);
 }
 EXPORT_SYMBOL(client_obd_cleanup);
@@ -502,6 +530,7 @@ int client_connect_import(const struct lu_env *env,
        struct obd_connect_data *ocd;
        struct lustre_handle    conn    = { 0 };
        int                     rc;
+       bool                    is_mdc = false;
        ENTRY;
 
         *exp = NULL;
@@ -526,6 +555,10 @@ int client_connect_import(const struct lu_env *env,
         ocd = &imp->imp_connect_data;
         if (data) {
                 *ocd = *data;
+               is_mdc = strncmp(imp->imp_obd->obd_type->typ_name,
+                                LUSTRE_MDC_NAME, 3) == 0;
+               if (is_mdc)
+                       data->ocd_connect_flags |= OBD_CONNECT_MULTIMODRPCS;
                 imp->imp_connect_flags_orig = data->ocd_connect_flags;
         }
 
@@ -541,6 +574,10 @@ int client_connect_import(const struct lu_env *env,
                          ocd->ocd_connect_flags, "old "LPX64", new "LPX64"\n",
                          data->ocd_connect_flags, ocd->ocd_connect_flags);
                 data->ocd_connect_flags = ocd->ocd_connect_flags;
+               /* clear the flag as it was not set and is not known
+                * by upper layers */
+               if (is_mdc)
+                       data->ocd_connect_flags &= ~OBD_CONNECT_MULTIMODRPCS;
         }
 
         ptlrpc_pinger_add_import(imp);