+/**
+ * Initialize Echo Server device with parameters in the config log \a cfg.
+ *
+ * This is the main starting point of Echo Server initialization. It fills all
+ * parameters with their initial values and starts Echo Server.
+ *
+ * \param[in] env execution environment
+ * \param[in] m Echo Server device
+ * \param[in] ldt LU device type of Echo Server
+ * \param[in] cfg configuration log
+ *
+ * \retval 0 if successful
+ * \retval negative value on error
+ */
+static int echo_srv_init0(const struct lu_env *env,
+ struct echo_srv_device *esd,
+ struct lu_device_type *ldt, struct lustre_cfg *cfg)
+{
+ const char *dev = lustre_cfg_string(cfg, 0);
+ struct obd_device *obd;
+ char ns_name[48];
+ int rc;
+
+ ENTRY;
+
+ obd = class_name2obd(dev);
+ if (!obd) {
+ CERROR("Cannot find obd with name %s\n", dev);
+ RETURN(-ENODEV);
+ }
+
+ spin_lock_init(&obd->u.echo.eo_lock);
+ obd->u.echo.eo_lastino = ECHO_INIT_OID;
+
+ esd->esd_dev.ld_ops = &echo_srv_lu_ops;
+ esd->esd_dev.ld_obd = obd;
+ /* set this lu_device to obd, because error handling need it */
+ obd->obd_lu_dev = &esd->esd_dev;
+
+ /* No connection accepted until configurations will finish */
+ spin_lock(&obd->obd_dev_lock);
+ obd->obd_no_conn = 1;
+ spin_unlock(&obd->obd_dev_lock);
+
+ /* non-replayable target */
+ obd->obd_replayable = 0;
+
+ snprintf(ns_name, sizeof(ns_name), "echotgt-%s", obd->obd_uuid.uuid);
+ obd->obd_namespace = ldlm_namespace_new(obd, ns_name,
+ LDLM_NAMESPACE_SERVER,
+ LDLM_NAMESPACE_MODEST,
+ LDLM_NS_TYPE_OST);
+ if (!obd->obd_namespace)
+ RETURN(-ENOMEM);
+
+ obd->obd_vars = lprocfs_echo_obd_vars;
+ if (!lprocfs_obd_setup(obd, true) &&
+ lprocfs_alloc_obd_stats(obd, LPROC_ECHO_LAST) == 0) {
+ lprocfs_counter_init(obd->obd_stats, LPROC_ECHO_READ_BYTES,
+ LPROCFS_CNTR_AVGMINMAX,
+ "read_bytes", "bytes");
+ lprocfs_counter_init(obd->obd_stats, LPROC_ECHO_WRITE_BYTES,
+ LPROCFS_CNTR_AVGMINMAX,
+ "write_bytes", "bytes");
+ }
+
+ ptlrpc_init_client(LDLM_CB_REQUEST_PORTAL, LDLM_CB_REPLY_PORTAL,
+ "echo_ldlm_cb_client", &obd->obd_ldlm_client);
+
+ rc = tgt_init(env, &esd->esd_lut, obd, NULL, esd_common_slice,
+ OBD_FAIL_OST_ALL_REQUEST_NET,
+ OBD_FAIL_OST_ALL_REPLY_NET);
+ if (rc)
+ GOTO(err_out, rc);
+
+ spin_lock(&obd->obd_dev_lock);
+ obd->obd_no_conn = 0;
+ spin_unlock(&obd->obd_dev_lock);
+
+ RETURN(0);
+
+err_out:
+ ldlm_namespace_free(obd->obd_namespace, NULL, obd->obd_force);
+ obd->obd_namespace = NULL;
+
+ lprocfs_obd_cleanup(obd);
+ lprocfs_free_obd_stats(obd);
+ RETURN(rc);