* Author: Mikhail Pershin <mike.pershin@intel.com>
*/
-#ifndef EXPORT_SYMTAB
-# define EXPORT_SYMTAB
-#endif
#define DEBUG_SUBSYSTEM S_MDS
#include <obd_class.h>
extern struct dt_object_operations lod_obj_ops;
/* Slab for OSD object allocation */
-cfs_mem_cache_t *lod_object_kmem;
+struct kmem_cache *lod_object_kmem;
static struct lu_kmem_descr lod_caches[] = {
{
int rc = 0;
ENTRY;
- OBD_SLAB_ALLOC_PTR_GFP(lod_obj, lod_object_kmem, CFS_ALLOC_IO);
+ OBD_SLAB_ALLOC_PTR_GFP(lod_obj, lod_object_kmem, __GFP_IO);
if (lod_obj == NULL)
RETURN(ERR_PTR(-ENOMEM));
return rc;
}
-static int lodname2mdt_index(char *lodname, int *index)
+static int lodname2mdt_index(char *lodname, long *index)
{
char *ptr, *tmp;
return 0;
}
-/*
- * Init client sequence manager which is used by local MDS to talk to sequence
- * controller on remote node.
- */
-static int lod_seq_init_cli(const struct lu_env *env,
- struct lod_device *lod,
- char *tgtuuid, int index)
-{
- struct seq_server_site *ss;
- struct obd_device *osp;
- int rc;
- char *prefix;
- struct obd_uuid obd_uuid;
- ENTRY;
-
- ss = lu_site2seq(lod2lu_dev(lod)->ld_site);
- LASSERT(ss != NULL);
-
- /* check if this is adding the first MDC and controller is not yet
- * initialized. */
- if (index != 0 || ss->ss_client_seq)
- RETURN(0);
-
- obd_str2uuid(&obd_uuid, tgtuuid);
- osp = class_find_client_obd(&obd_uuid, LUSTRE_OSP_NAME,
- &lod->lod_dt_dev.dd_lu_dev.ld_obd->obd_uuid);
- if (osp == NULL) {
- CERROR("%s: can't find %s device\n",
- lod->lod_dt_dev.dd_lu_dev.ld_obd->obd_name,
- tgtuuid);
- RETURN(-EINVAL);
- }
-
- if (!osp->obd_set_up) {
- CERROR("target %s not set up\n", osp->obd_name);
- rc = -EINVAL;
- }
-
- LASSERT(ss->ss_control_exp);
- OBD_ALLOC_PTR(ss->ss_client_seq);
- if (ss->ss_client_seq == NULL)
- RETURN(-ENOMEM);
-
- OBD_ALLOC(prefix, MAX_OBD_NAME + 5);
- if (!prefix) {
- OBD_FREE_PTR(ss->ss_client_seq);
- ss->ss_client_seq = NULL;
- RETURN(-ENOMEM);
- }
-
- snprintf(prefix, MAX_OBD_NAME + 5, "ctl-%s", osp->obd_name);
- rc = seq_client_init(ss->ss_client_seq, ss->ss_control_exp,
- LUSTRE_SEQ_METADATA, prefix, NULL);
- OBD_FREE(prefix, MAX_OBD_NAME + 5);
- if (rc) {
- OBD_FREE_PTR(ss->ss_client_seq);
- ss->ss_client_seq = NULL;
- RETURN(rc);
- }
-
- LASSERT(ss->ss_server_seq != NULL);
- rc = seq_server_set_cli(ss->ss_server_seq, ss->ss_client_seq,
- env);
-
- RETURN(rc);
-}
-
-static void lod_seq_fini_cli(struct lod_device *lod)
-{
- struct seq_server_site *ss;
-
- ENTRY;
-
- ss = lu_site2seq(lod2lu_dev(lod)->ld_site);
- if (ss == NULL) {
- EXIT;
- return;
- }
-
- if (ss->ss_server_seq)
- seq_server_set_cli(ss->ss_server_seq,
- NULL, NULL);
-
- if (ss->ss_control_exp) {
- class_export_put(ss->ss_control_exp);
- ss->ss_control_exp = NULL;
- }
-
- EXIT;
- return;
-}
-
/**
* Procss config log on LOD
* \param env environment info
if (mdt == NULL) {
mdt_index = 0;
} else {
+ long long_index;
rc = lodname2mdt_index(
- lustre_cfg_string(lcfg, 0), &mdt_index);
+ lustre_cfg_string(lcfg, 0),
+ &long_index);
if (rc != 0)
GOTO(out, rc);
+ mdt_index = long_index;
}
rc = lod_add_device(env, lod, arg1, index, gen,
mdt_index, LUSTRE_OSC_NAME, 1);
mdt_index = index;
rc = lod_add_device(env, lod, arg1, index, gen,
mdt_index, LUSTRE_MDC_NAME, 1);
- if (rc == 0)
- rc = lod_seq_init_cli(env, lod, arg1,
- mdt_index);
} else if (lcfg->lcfg_command == LCFG_LOV_ADD_INA) {
/*FIXME: Add mdt_index for LCFG_LOV_ADD_INA*/
mdt_index = 0;
lu_dev_del_linkage(dev->ld_site, dev);
lod_cleanup_desc_tgts(env, lod, &lod->lod_mdt_descs, lcfg);
lod_cleanup_desc_tgts(env, lod, &lod->lod_ost_descs, lcfg);
-
- lod_seq_fini_cli(lod);
-
if (lcfg->lcfg_command == LCFG_PRE_CLEANUP)
break;
/*
.ldt_ctx_tags = LCT_MD_THREAD,
};
-static int lod_obd_health_check(const struct lu_env *env,
- struct obd_device *obd)
+static int lod_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 lod_device *d = lu2lod_dev(obd->obd_lu_dev);
- struct lod_ost_desc *ost;
- int i, rc = 1;
- ENTRY;
+ int rc = -EINVAL;
- LASSERT(d);
- lod_getref(&d->lod_ost_descs);
- lod_foreach_ost(d, i) {
- ost = OST_TGT(d, i);
- LASSERT(ost && ost->ltd_ost);
- rc = obd_health_check(env, ost->ltd_exp->exp_obd);
- /* one healthy device is enough */
- if (rc == 0)
- break;
+ if (KEY_IS(KEY_OSP_CONNECTED)) {
+ struct obd_device *obd = exp->exp_obd;
+ struct lod_device *d;
+ struct lod_ost_desc *ost;
+ int i, rc = 1;
+
+ if (!obd->obd_set_up || obd->obd_stopping)
+ RETURN(-EAGAIN);
+
+ d = lu2lod_dev(obd->obd_lu_dev);
+ lod_getref(&d->lod_ost_descs);
+ lod_foreach_ost(d, i) {
+ ost = OST_TGT(d, i);
+ LASSERT(ost && ost->ltd_ost);
+
+ rc = obd_get_info(env, ost->ltd_exp, keylen, key,
+ vallen, val, lsm);
+ /* one healthy device is enough */
+ if (rc == 0)
+ break;
+ }
+ lod_putref(d, &d->lod_ost_descs);
+ RETURN(rc);
}
- lod_putref(d, &d->lod_ost_descs);
+
RETURN(rc);
}
.o_owner = THIS_MODULE,
.o_connect = lod_obd_connect,
.o_disconnect = lod_obd_disconnect,
- .o_health_check = lod_obd_health_check,
+ .o_get_info = lod_obd_get_info,
.o_pool_new = lod_pool_new,
.o_pool_rem = lod_pool_remove,
.o_pool_add = lod_pool_add,
lprocfs_lod_init_vars(&lvars);
- rc = class_register_type(&lod_obd_device_ops, NULL, lvars.module_vars,
- LUSTRE_LOD_NAME, &lod_device_type);
+ rc = class_register_type(&lod_obd_device_ops, NULL, NULL,
+#ifndef HAVE_ONLY_PROCFS_SEQ
+ lvars.module_vars,
+#endif
+ LUSTRE_LOD_NAME, &lod_device_type);
if (rc) {
lu_kmem_fini(lod_caches);
return rc;