#include <lustre_fid.h>
#include "fid_internal.h"
-int client_fid_init(struct obd_export *exp, enum lu_cli_type type)
+int client_fid_init(struct obd_device *obd,
+ struct obd_export *exp, enum lu_cli_type type)
{
- struct client_obd *cli = &exp->exp_obd->u.cli;
+ struct client_obd *cli = &obd->u.cli;
char *prefix;
int rc;
ENTRY;
if (prefix == NULL)
GOTO(out_free_seq, rc = -ENOMEM);
- snprintf(prefix, MAX_OBD_NAME + 5, "cli-%s",
- exp->exp_obd->obd_name);
+ snprintf(prefix, MAX_OBD_NAME + 5, "cli-%s", obd->obd_name);
/* Init client side sequence-manager */
rc = seq_client_init(cli->cl_seq, exp, type, prefix, NULL);
}
EXPORT_SYMBOL(client_fid_init);
-int client_fid_fini(struct obd_export *exp)
+int client_fid_fini(struct obd_device *obd)
{
- struct client_obd *cli = &exp->exp_obd->u.cli;
+ struct client_obd *cli = &obd->u.cli;
ENTRY;
if (cli->cl_seq != NULL) {
int fid_is_local(const struct lu_env *env,
struct lu_site *site, const struct lu_fid *fid);
-int client_fid_init(struct obd_export *exp, enum lu_cli_type type);
-int client_fid_fini(struct obd_export *exp);
+int client_fid_init(struct obd_device *obd, struct obd_export *exp,
+ enum lu_cli_type type);
+int client_fid_fini(struct obd_device *obd);
/* fid locking */
void *localdata);
int (*o_disconnect)(struct obd_export *exp);
- /* Initialize/finalize fids infrastructure. */
- int (*o_fid_init)(struct obd_export *exp, enum lu_cli_type type);
- int (*o_fid_fini)(struct obd_export *exp);
+ /* Initialize/finalize fids infrastructure. */
+ int (*o_fid_init)(struct obd_device *obd,
+ struct obd_export *exp, enum lu_cli_type type);
+ int (*o_fid_fini)(struct obd_device *obd);
/* Allocate new fid according to passed @hint. */
int (*o_fid_alloc)(struct obd_export *exp, struct lu_fid *fid,
RETURN(rc);
}
-static inline int obd_fid_init(struct obd_export *exp, enum lu_cli_type type)
+static inline int obd_fid_init(struct obd_device *obd, struct obd_export *exp,
+ enum lu_cli_type type)
{
- int rc;
- ENTRY;
+ int rc;
+ ENTRY;
- OBD_CHECK_DT_OP(exp->exp_obd, fid_init, 0);
- EXP_COUNTER_INCREMENT(exp, fid_init);
+ OBD_CHECK_DT_OP(obd, fid_init, 0);
+ OBD_COUNTER_INCREMENT(obd, fid_init);
- rc = OBP(exp->exp_obd, fid_init)(exp, type);
+ rc = OBP(obd, fid_init)(obd, exp, type);
RETURN(rc);
}
-static inline int obd_fid_fini(struct obd_export *exp)
+static inline int obd_fid_fini(struct obd_device *obd)
{
- int rc;
- ENTRY;
+ int rc;
+ ENTRY;
- OBD_CHECK_DT_OP(exp->exp_obd, fid_fini, 0);
- EXP_COUNTER_INCREMENT(exp, fid_fini);
+ OBD_CHECK_DT_OP(obd, fid_fini, 0);
+ OBD_COUNTER_INCREMENT(obd, fid_fini);
- rc = OBP(exp->exp_obd, fid_fini)(exp);
- RETURN(rc);
+ rc = OBP(obd, fid_fini)(obd);
+ RETURN(rc);
}
static inline int obd_fid_alloc(struct obd_export *exp,
RETURN(rc);
}
- /*
- * Init fid sequence client for this mdc and add new fld target.
- */
- rc = obd_fid_init(mdc_exp, LUSTRE_SEQ_METADATA);
- if (rc)
- RETURN(rc);
+ /*
+ * Init fid sequence client for this mdc and add new fld target.
+ */
+ rc = obd_fid_init(mdc_obd, mdc_exp, LUSTRE_SEQ_METADATA);
+ if (rc)
+ RETURN(rc);
target.ft_srv = NULL;
target.ft_exp = mdc_exp;
}
}
#endif
- rc = obd_fid_fini(tgt->ltd_exp);
- if (rc)
- CERROR("Can't finanize fids factory\n");
+ rc = obd_fid_fini(tgt->ltd_exp->exp_obd);
+ if (rc)
+ CERROR("Can't finanize fids factory\n");
CDEBUG(D_INFO, "Disconnected from %s(%s) successfully\n",
tgt->ltd_exp->exp_obd->obd_name,
#include "lod_internal.h"
+/**
+ * Lookup MDT/OST index \a tgt by FID \a fid.
+ *
+ * \param lod LOD to be lookup at.
+ * \param fid FID of object to find MDT/OST.
+ * \param tgt MDT/OST index to return.
+ * \param flags indidcate the FID is on MDS or OST.
+ **/
+int lod_fld_lookup(const struct lu_env *env, struct lod_device *lod,
+ const struct lu_fid *fid, __u32 *tgt, int flags)
+{
+ struct lu_seq_range range;
+ struct lu_server_fld *server_fld;
+ int rc = 0;
+ ENTRY;
+
+ LASSERTF(fid_is_sane(fid), "Invalid FID "DFID"\n", PFID(fid));
+ if (fid_is_idif(fid)) {
+ *tgt = fid_idif_ost_idx(fid);
+ RETURN(rc);
+ }
+
+ if (!lod->lod_initialized || !fid_is_norm(fid)) {
+ LASSERT(lu_site2seq(lod2lu_dev(lod)->ld_site) != NULL);
+ *tgt = lu_site2seq(lod2lu_dev(lod)->ld_site)->ss_node_id;
+ RETURN(rc);
+ }
+
+ server_fld = lu_site2seq(lod2lu_dev(lod)->ld_site)->ss_server_fld;
+ range.lsr_flags = flags;
+ rc = fld_server_lookup(env, server_fld, fid_seq(fid), &range);
+ if (rc) {
+ CERROR("%s: Can't find tgt by seq "LPX64", rc %d\n",
+ lod2obd(lod)->obd_name, fid_seq(fid), rc);
+ RETURN(rc);
+ }
+
+ *tgt = range.lsr_index;
+
+ CDEBUG(D_INFO, "LOD: got tgt %x for sequence: "
+ LPX64"\n", *tgt, fid_seq(fid));
+
+ RETURN(rc);
+}
+
extern struct lu_object_operations lod_lu_obj_ops;
extern struct dt_object_operations lod_obj_ops;
ENTRY;
rc = next->ld_ops->ldo_prepare(env, pdev, next);
+ if (rc != 0) {
+ CERROR("%s: prepare bottom error: rc = %d\n",
+ lod2obd(lod)->obd_name, rc);
+ RETURN(rc);
+ }
+
+ lod->lod_initialized = 1;
RETURN(rc);
}
cfs_proc_dir_entry_t *lod_proc_entry;
struct lprocfs_stats *lod_stats;
int lod_connects;
- int lod_recovery_completed;
+ unsigned int lod_recovery_completed:1,
+ lod_initialized:1;
/* lov settings descriptor storing static information */
struct lov_desc lod_desc;
if ((__dev)->lod_osts_size > 0) \
cfs_foreach_bit((__dev)->lod_ost_bitmap, (index))
+/* lod_dev.c */
+int lod_fld_lookup(const struct lu_env *env, struct lod_device *lod,
+ const struct lu_fid *fid, mdsno_t *tgt, int flags);
/* lod_lov.c */
void lod_getref(struct lod_device *lod);
void lod_putref(struct lod_device *lod);
CERROR("%s: qos_del_tgt(%s) failed: rc = %d\n",
lod2obd(lod)->obd_name,
obd_uuid2str(&ost_desc->ltd_uuid), rc);
+
rc = obd_disconnect(ost_desc->ltd_exp);
if (rc)
CERROR("%s: failed to disconnect %s: rc = %d\n",
}
for (i = 0; i < lo->ldo_stripenr; i++) {
- const struct lu_fid *fid;
+ const struct lu_fid *fid;
+ struct lod_device *lod;
+ __u32 index;
+ lod = lu2lod_dev(lo->ldo_obj.do_lu.lo_dev);
LASSERT(lo->ldo_stripe[i]);
fid = lu_object_fid(&lo->ldo_stripe[i]->do_lu);
rc = fid_ostid_pack(fid, &info->lti_ostid);
LASSERT(rc == 0);
- LASSERT(info->lti_ostid.oi_seq == FID_SEQ_OST_MDT0);
objs[i].l_object_id = cpu_to_le64(info->lti_ostid.oi_id);
objs[i].l_object_seq = cpu_to_le64(info->lti_ostid.oi_seq);
objs[i].l_ost_gen = cpu_to_le32(0);
- objs[i].l_ost_idx = cpu_to_le32(fid_idif_ost_idx(fid));
+ rc = lod_fld_lookup(env, lod, fid, &index, LU_SEQ_RANGE_OST);
+ if (rc < 0) {
+ CERROR("%s: Can not locate "DFID": rc = %d\n",
+ lod2obd(lod)->obd_name, PFID(fid), rc);
+ RETURN(rc);
+ }
+ objs[i].l_ost_idx = cpu_to_le32(index);
}
info->lti_buf.lb_buf = lmm;
lo->ldo_stripes_allocated = lo->ldo_stripenr;
for (i = 0; i < lo->ldo_stripenr; i++) {
-
info->lti_ostid.oi_id = le64_to_cpu(objs[i].l_object_id);
- /* XXX: support for DNE? */
info->lti_ostid.oi_seq = le64_to_cpu(objs[i].l_object_seq);
idx = le64_to_cpu(objs[i].l_ost_idx);
fid_ostid_unpack(&info->lti_fid, &info->lti_ostid, idx);
-
+ LASSERTF(fid_is_sane(&info->lti_fid), ""DFID" insane!\n",
+ PFID(&info->lti_fid));
/*
* XXX: assertion is left for testing, to make
* sure we never process requests till configuration
/* stop sync thread */
osp_sync_fini(d);
+ obd_fid_fini(d->opd_obd);
+
RETURN(rc);
}
if (rc)
GOTO(out_precreat, 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, rc);
+ }
+
/*
* Initiate connect to OST
*/
RETURN(rc);
*exp = class_conn2export(&conn);
- if (is_osp_on_ost(obd->obd_name))
- osp->opd_exp = *exp;
+ osp->opd_exp = *exp;
/* Why should there ever be more than 1 connect? */
osp->opd_connects++;
d->opd_imp_seen_connected = 1;
if (is_osp_on_ost(d->opd_obd->obd_name))
break;
+ if (d->opd_obd->u.cli.cl_seq->lcs_exp == NULL)
+ d->opd_obd->u.cli.cl_seq->lcs_exp =
+ class_export_get(d->opd_exp);
cfs_waitq_signal(&d->opd_pre_waitq);
__osp_sync_check_for_work(d);
CDEBUG(D_HA, "got connected\n");
.o_import_event = osp_import_event,
.o_iocontrol = osp_iocontrol,
.o_statfs = osp_obd_statfs,
+ .o_fid_init = client_fid_init,
+ .o_fid_fini = client_fid_fini,
};
struct llog_operations osp_mds_ost_orig_logops;