+static int ofd_connect_to_next(const struct lu_env *env, struct ofd_device *m,
+ const char *next, struct obd_export **exp)
+{
+ struct obd_connect_data *data = NULL;
+ struct obd_device *obd;
+ int rc;
+ ENTRY;
+
+ OBD_ALLOC_PTR(data);
+ if (data == NULL)
+ GOTO(out, rc = -ENOMEM);
+
+ obd = class_name2obd(next);
+ if (obd == NULL) {
+ CERROR("%s: can't locate next device: %s\n",
+ m->ofd_dt_dev.dd_lu_dev.ld_obd->obd_name, next);
+ GOTO(out, rc = -ENOTCONN);
+ }
+
+ data->ocd_connect_flags = OBD_CONNECT_VERSION;
+ data->ocd_version = LUSTRE_VERSION_CODE;
+
+ rc = obd_connect(NULL, exp, obd, &obd->obd_uuid, data, NULL);
+ if (rc) {
+ CERROR("%s: cannot connect to next dev %s: rc = %d\n",
+ m->ofd_dt_dev.dd_lu_dev.ld_obd->obd_name, next, rc);
+ GOTO(out, rc);
+ }
+
+ m->ofd_dt_dev.dd_lu_dev.ld_site =
+ m->ofd_osd_exp->exp_obd->obd_lu_dev->ld_site;
+ LASSERT(m->ofd_dt_dev.dd_lu_dev.ld_site);
+ m->ofd_osd = lu2dt_dev(m->ofd_osd_exp->exp_obd->obd_lu_dev);
+ m->ofd_dt_dev.dd_lu_dev.ld_site->ls_top_dev = &m->ofd_dt_dev.dd_lu_dev;
+
+out:
+ if (data)
+ OBD_FREE_PTR(data);
+ RETURN(rc);
+}
+