rc = osp_disconnect(d);
if (!d->opd_connect_mdt) {
- /* stop precreate thread */
- osp_precreate_fini(d);
-
/* stop sync thread */
osp_sync_fini(d);
+ /* stop precreate thread */
+ osp_precreate_fini(d);
+
/* release last_used file */
osp_last_used_fini(env, d);
}
ENTRY;
osp->opd_recovery_completed = 1;
- if (!osp->opd_connect_mdt)
+
+ if (!osp->opd_connect_mdt && osp->opd_pre != NULL)
wake_up(&osp->opd_pre_waitq);
RETURN(rc);
}
if (unlikely(d->opd_imp_active == 0))
RETURN(-ENOTCONN);
+ if (d->opd_pre == NULL)
+ RETURN(0);
+
/* return recently updated data */
*sfs = d->opd_statfs;
* layer above osp (usually lod) can use ffree to estimate
* how many objects are available for immediate creation
*/
-
spin_lock(&d->opd_pre_lock);
LASSERTF(fid_seq(&d->opd_pre_last_created_fid) ==
fid_seq(&d->opd_pre_used_fid),
osp_lprocfs_init(m);
+ rc = obd_fid_init(m->opd_obd, NULL, m->opd_connect_mdt ?
+ LUSTRE_SEQ_METADATA : LUSTRE_SEQ_DATA);
+ if (rc) {
+ CERROR("%s: fid init error: rc = %d\n",
+ m->opd_obd->obd_name, rc);
+ GOTO(out_proc, rc);
+ }
+
if (!m->opd_connect_mdt) {
/* Initialize last id from the storage - will be
* used in orphan cleanup. */
if (rc)
GOTO(out_proc, rc);
- rc = obd_fid_init(m->opd_obd, NULL, LUSTRE_SEQ_DATA);
- if (rc) {
- CERROR("%s: fid init error: rc = %d\n",
- m->opd_obd->obd_name, rc);
- GOTO(out_last_used, rc);
- }
/* Initialize precreation thread, it handles new
* connections as well. */
rc = osp_sync_init(env, m);
if (rc)
GOTO(out_precreat, rc);
-
}
+
/*
* Initiate connect to OST
*/
return 0;
}
+static int osp_prepare_fid_client(struct osp_device *osp)
+{
+ LASSERT(osp->opd_obd->u.cli.cl_seq != NULL);
+ if (osp->opd_obd->u.cli.cl_seq->lcs_exp != NULL)
+ return 0;
+
+ LASSERT(osp->opd_exp != NULL);
+ osp->opd_obd->u.cli.cl_seq->lcs_exp =
+ class_export_get(osp->opd_exp);
+ return 0;
+}
+
/*
* we use exports to track all LOD users
*/
}
ptlrpc_pinger_add_import(imp);
-
- if (osp->opd_connect_mdt && data->ocd_index == 0) {
- /* set seq controller export for MDC0 if exists */
- struct seq_server_site *ss;
-
- ss = lu_site2seq(osp2lu_dev(osp)->ld_site);
- ss->ss_control_exp = class_export_get(*exp);
- ss->ss_server_fld->lsf_control_exp = *exp;
- }
out:
RETURN(rc);
}
d->opd_imp_connected = 0;
if (d->opd_connect_mdt)
break;
- osp_pre_update_status(d, -ENODEV);
- wake_up(&d->opd_pre_waitq);
+
+ if (d->opd_pre != NULL) {
+ osp_pre_update_status(d, -ENODEV);
+ wake_up(&d->opd_pre_waitq);
+ }
+
CDEBUG(D_HA, "got disconnected\n");
break;
case IMP_EVENT_INACTIVE:
d->opd_imp_active = 0;
if (d->opd_connect_mdt)
break;
- osp_pre_update_status(d, -ENODEV);
- wake_up(&d->opd_pre_waitq);
+
+ if (d->opd_pre != NULL) {
+ osp_pre_update_status(d, -ENODEV);
+ wake_up(&d->opd_pre_waitq);
+ }
+
CDEBUG(D_HA, "got inactive\n");
break;
case IMP_EVENT_ACTIVE:
d->opd_imp_active = 1;
+
+ if (osp_prepare_fid_client(d) != 0)
+ break;
+
if (d->opd_got_disconnected)
d->opd_new_connection = 1;
d->opd_imp_connected = 1;
d->opd_imp_seen_connected = 1;
if (d->opd_connect_mdt)
break;
- wake_up(&d->opd_pre_waitq);
+
+ if (d->opd_pre != NULL)
+ wake_up(&d->opd_pre_waitq);
+
__osp_sync_check_for_work(d);
CDEBUG(D_HA, "got connected\n");
break;
return rc;
}
-static int osp_obd_health_check(const struct lu_env *env,
- struct obd_device *obd)
+static int osp_obd_get_info(const struct lu_env *env, struct obd_export *exp,
+ __u32 keylen, void *key, __u32 *vallen, void *val,
+ struct lov_stripe_md *lsm)
{
- struct osp_device *d = lu2osp_dev(obd->obd_lu_dev);
+ int rc = -EINVAL;
- ENTRY;
+ if (KEY_IS(KEY_OSP_CONNECTED)) {
+ struct obd_device *obd = exp->exp_obd;
+ struct osp_device *osp;
- /*
- * 1.8/2.0 behaviour is that OST being connected once at least
- * is considired "healthy". and one "healty" OST is enough to
- * allow lustre clients to connect to MDS
- */
- LASSERT(d);
- RETURN(!d->opd_imp_seen_connected);
+ if (!obd->obd_set_up || obd->obd_stopping)
+ RETURN(-EAGAIN);
+
+ osp = lu2osp_dev(obd->obd_lu_dev);
+ LASSERT(osp);
+ /*
+ * 1.8/2.0 behaviour is that OST being connected once at least
+ * is considered "healthy". and one "healthy" OST is enough to
+ * allow lustre clients to connect to MDS
+ */
+ RETURN(!osp->opd_imp_seen_connected);
+ }
+
+ RETURN(rc);
}
/* context key constructor/destructor: mdt_key_init, mdt_key_fini */
.o_reconnect = osp_reconnect,
.o_connect = osp_obd_connect,
.o_disconnect = osp_obd_disconnect,
- .o_health_check = osp_obd_health_check,
+ .o_get_info = osp_obd_get_info,
.o_import_event = osp_import_event,
.o_iocontrol = osp_iocontrol,
.o_statfs = osp_obd_statfs,