#include <linux/module.h>
#include <obd_class.h>
+#include <lustre_ioctl.h>
#include <lustre_mds.h>
#include <obd_support.h>
#include <lu_object.h>
#include "mdd_internal.h"
-const struct md_device_operations mdd_ops;
+static const struct md_device_operations mdd_ops;
static struct lu_device_type mdd_device_type;
static const char mdd_root_dir_name[] = "ROOT";
static const char mdd_obf_dir_name[] = "fid";
+static const char mdd_lpf_dir_name[] = "lost+found";
/* Slab for MDD object allocation */
-cfs_mem_cache_t *mdd_object_kmem;
+struct kmem_cache *mdd_object_kmem;
static struct lu_kmem_descr mdd_caches[] = {
{
static struct lu_device *mdd_device_fini(const struct lu_env *env,
struct lu_device *d)
{
- struct mdd_device *mdd = lu2mdd_dev(d);
- int rc;
+ struct mdd_device *mdd = lu2mdd_dev(d);
if (d->ld_site)
lu_dev_del_linkage(d->ld_site, d);
- rc = mdd_procfs_fini(mdd);
- if (rc) {
- CERROR("proc fini error %d \n", rc);
- return ERR_PTR(rc);
- }
+ mdd_procfs_fini(mdd);
return NULL;
}
spin_lock(&mdd->mdd_cl.mc_user_lock);
mdd->mdd_cl.mc_lastuser = rec->cur_id;
+ if (rec->cur_endrec > mdd->mdd_cl.mc_index)
+ mdd->mdd_cl.mc_index = rec->cur_endrec;
spin_unlock(&mdd->mdd_cl.mc_user_lock);
return LLOG_PROC_BREAK;
static int llog_changelog_cancel(const struct lu_env *env,
struct llog_ctxt *ctxt,
- struct lov_stripe_md *lsm, int count,
struct llog_cookie *cookies, int flags)
{
struct llog_handle *cathandle = ctxt->loc_handle;
static struct llog_operations changelog_orig_logops;
-int mdd_changelog_on(const struct lu_env *env, struct mdd_device *mdd, int on);
+static int
+mdd_changelog_on(const struct lu_env *env, struct mdd_device *mdd, int on);
static int mdd_changelog_llog_init(const struct lu_env *env,
struct mdd_device *mdd)
}
}
-int mdd_changelog_write_header(const struct lu_env *env,
- struct mdd_device *mdd, int markerflags);
+static int
+mdd_changelog_write_header(const struct lu_env *env, struct mdd_device *mdd,
+ int markerflags);
/* Start / stop recording */
-int mdd_changelog_on(const struct lu_env *env, struct mdd_device *mdd, int on)
+static int
+mdd_changelog_on(const struct lu_env *env, struct mdd_device *mdd, int on)
{
int rc = 0;
* \param endrec
* \retval 0 ok
*/
-int mdd_changelog_llog_cancel(const struct lu_env *env,
- struct mdd_device *mdd, long long endrec)
+static int
+mdd_changelog_llog_cancel(const struct lu_env *env, struct mdd_device *mdd,
+ long long endrec)
{
struct obd_device *obd = mdd2obd_dev(mdd);
struct llog_ctxt *ctxt;
changed since the last purge) */
mdd->mdd_cl.mc_starttime = cfs_time_current_64();
- rc = llog_cancel(env, ctxt, NULL, 1, (struct llog_cookie *)&endrec, 0);
+ rc = llog_cancel(env, ctxt, (struct llog_cookie *)&endrec, 0);
out:
llog_ctxt_put(ctxt);
return rc;
ctxt = llog_get_context(obd, LLOG_CHANGELOG_ORIG_CTXT);
LASSERT(ctxt);
- rc = llog_cat_add(env, ctxt->loc_handle, &rec->cr_hdr, NULL, NULL);
+ rc = llog_cat_add(env, ctxt->loc_handle, &rec->cr_hdr, NULL);
if (rc > 0)
rc = 0;
llog_ctxt_put(ctxt);
sscanf(name, SFID, RFID(f));
if (!fid_is_sane(f)) {
- CWARN("%s: bad FID format [%s], should be "DFID"\n",
- mdd2obd_dev(mdd)->obd_name, lname->ln_name,
+ CWARN("%s: Trying to lookup invalid FID [%s] in %s/%s, FID "
+ "format should be "DFID"\n", mdd2obd_dev(mdd)->obd_name,
+ lname->ln_name, dot_lustre_name, mdd_obf_dir_name,
(__u64)FID_SEQ_NORMAL, 1, 0);
GOTO(out, rc = -EINVAL);
}
- if (!fid_is_norm(f) && !fid_is_igif(f) && !fid_is_root(f)) {
- CWARN("%s: "DFID" is invalid, sequence should be "
- ">= "LPX64" or within ["LPX64","LPX64"].\n",
- mdd2obd_dev(mdd)->obd_name, PFID(f),
- (__u64)FID_SEQ_NORMAL, (__u64)FID_SEQ_IGIF,
- (__u64)FID_SEQ_IGIF_MAX);
+ if (!fid_is_norm(f) && !fid_is_igif(f) && !fid_is_root(f) &&
+ !fid_seq_is_dot(f->f_seq)) {
+ CWARN("%s: Trying to lookup invalid FID "DFID" in %s/%s, "
+ "sequence should be >= "LPX64" or within ["LPX64","
+ ""LPX64"].\n", mdd2obd_dev(mdd)->obd_name, PFID(f),
+ dot_lustre_name, mdd_obf_dir_name, (__u64)FID_SEQ_NORMAL,
+ (__u64)FID_SEQ_IGIF, (__u64)FID_SEQ_IGIF_MAX);
GOTO(out, rc = -EINVAL);
}
return rc;
}
-static int obf_create(const struct lu_env *env, struct md_object *pobj,
- const struct lu_name *lname, struct md_object *child,
- struct md_op_spec *spec, struct md_attr* ma)
+static int mdd_dummy_create(const struct lu_env *env,
+ struct md_object *pobj,
+ const struct lu_name *lname,
+ struct md_object *child,
+ struct md_op_spec *spec,
+ struct md_attr* ma)
{
- return -EPERM;
+ return -EPERM;
}
-static int obf_rename(const struct lu_env *env,
- struct md_object *src_pobj, struct md_object *tgt_pobj,
- const struct lu_fid *lf, const struct lu_name *lsname,
- struct md_object *tobj, const struct lu_name *ltname,
- struct md_attr *ma)
+static int mdd_dummy_rename(const struct lu_env *env,
+ struct md_object *src_pobj,
+ struct md_object *tgt_pobj,
+ const struct lu_fid *lf,
+ const struct lu_name *lsname,
+ struct md_object *tobj,
+ const struct lu_name *ltname,
+ struct md_attr *ma)
{
- return -EPERM;
+ return -EPERM;
}
-static int obf_link(const struct lu_env *env, struct md_object *tgt_obj,
- struct md_object *src_obj, const struct lu_name *lname,
- struct md_attr *ma)
+static int mdd_dummy_link(const struct lu_env *env,
+ struct md_object *tgt_obj,
+ struct md_object *src_obj,
+ const struct lu_name *lname,
+ struct md_attr *ma)
{
- return -EPERM;
+ return -EPERM;
}
-static int obf_unlink(const struct lu_env *env, struct md_object *pobj,
- struct md_object *cobj, const struct lu_name *lname,
- struct md_attr *ma, int no_name)
+static int mdd_dummy_unlink(const struct lu_env *env,
+ struct md_object *pobj,
+ struct md_object *cobj,
+ const struct lu_name *lname,
+ struct md_attr *ma,
+ int no_name)
{
return -EPERM;
}
static struct md_dir_operations mdd_obf_dir_ops = {
- .mdo_lookup = obf_lookup,
- .mdo_create = obf_create,
- .mdo_rename = obf_rename,
- .mdo_link = obf_link,
- .mdo_unlink = obf_unlink
+ .mdo_lookup = obf_lookup,
+ .mdo_create = mdd_dummy_create,
+ .mdo_rename = mdd_dummy_rename,
+ .mdo_link = mdd_dummy_link,
+ .mdo_unlink = mdd_dummy_unlink
+};
+
+static struct md_dir_operations mdd_lpf_dir_ops = {
+ .mdo_lookup = mdd_lookup,
+ .mdo_create = mdd_dummy_create,
+ .mdo_rename = mdd_dummy_rename,
+ .mdo_link = mdd_dummy_link,
+ .mdo_unlink = mdd_dummy_unlink
};
static struct md_object *mdo_locate(const struct lu_env *env,
return mdo;
}
+static int mdd_lpf_setup(const struct lu_env *env, struct mdd_device *m)
+{
+ struct md_object *mdo;
+ struct mdd_object *mdd_lpf;
+ struct lu_fid fid = LU_LPF_FID;
+ int rc;
+ ENTRY;
+
+ rc = mdd_local_file_create(env, m, mdd_object_fid(m->mdd_dot_lustre),
+ mdd_lpf_dir_name, S_IFDIR | S_IRUSR | S_IXUSR,
+ &fid);
+ if (rc != 0)
+ RETURN(rc);
+
+ mdo = mdo_locate(env, &m->mdd_md_dev, &fid);
+ if (IS_ERR(mdo))
+ RETURN(PTR_ERR(mdo));
+
+ LASSERT(lu_object_exists(&mdo->mo_lu));
+
+ mdd_lpf = md2mdd_obj(mdo);
+ mdd_lpf->mod_obj.mo_dir_ops = &mdd_lpf_dir_ops;
+ m->mdd_dot_lustre_objs.mdd_lpf = mdd_lpf;
+
+ RETURN(0);
+}
+
/**
* Create special in-memory "fid" object for open-by-fid.
*/
return 0;
}
+static void mdd_dot_lustre_cleanup(const struct lu_env *env,
+ struct mdd_device *m)
+{
+ if (m->mdd_dot_lustre_objs.mdd_lpf != NULL) {
+ mdd_object_put(env, m->mdd_dot_lustre_objs.mdd_lpf);
+ m->mdd_dot_lustre_objs.mdd_lpf = NULL;
+ }
+ if (m->mdd_dot_lustre_objs.mdd_obf != NULL) {
+ mdd_object_put(env, m->mdd_dot_lustre_objs.mdd_obf);
+ m->mdd_dot_lustre_objs.mdd_obf = NULL;
+ }
+ if (m->mdd_dot_lustre != NULL) {
+ mdd_object_put(env, m->mdd_dot_lustre);
+ m->mdd_dot_lustre = NULL;
+ }
+}
+
/** Setup ".lustre" directory object */
static int mdd_dot_lustre_setup(const struct lu_env *env, struct mdd_device *m)
{
mdd2obd_dev(m)->obd_name, rc);
GOTO(out, rc);
}
+
+ rc = mdd_lpf_setup(env, m);
+ if (rc != 0) {
+ CERROR("%s: error initializing \"lost+found\": rc = %d.\n",
+ mdd2obd_dev(m)->obd_name, rc);
+ GOTO(out, rc);
+ }
+
RETURN(0);
+
out:
- mdd_object_put(env, m->mdd_dot_lustre);
- m->mdd_dot_lustre = NULL;
+ mdd_dot_lustre_cleanup(env, m);
+
+ return rc;
+}
+
+
+static struct llog_operations hsm_actions_logops;
+
+/**
+ * set llog methods and create LLOG_AGENT_ORIG_CTXT llog
+ * object in obd_device
+ */
+static int mdd_hsm_actions_llog_init(const struct lu_env *env,
+ struct mdd_device *m)
+{
+ struct obd_device *obd = mdd2obd_dev(m);
+ struct llog_ctxt *ctxt = NULL;
+ int rc;
+ ENTRY;
+
+ OBD_SET_CTXT_MAGIC(&obd->obd_lvfs_ctxt);
+ obd->obd_lvfs_ctxt.dt = m->mdd_bottom;
+
+ rc = llog_setup(env, obd, &obd->obd_olg, LLOG_AGENT_ORIG_CTXT,
+ obd, &hsm_actions_logops);
+ if (rc) {
+ CERROR("%s: hsm actions llog setup failed: rc = %d\n",
+ obd->obd_name, rc);
+ RETURN(rc);
+ }
+
+ ctxt = llog_get_context(obd, LLOG_AGENT_ORIG_CTXT);
+ LASSERT(ctxt);
+
+ rc = llog_open_create(env, ctxt, &ctxt->loc_handle, NULL,
+ HSM_ACTIONS);
+ if (rc) {
+ CERROR("%s: hsm actions llog open_create failed: rc = %d\n",
+ obd->obd_name, rc);
+ GOTO(out_cleanup, rc);
+ }
+
+ rc = llog_cat_init_and_process(env, ctxt->loc_handle);
+ if (rc)
+ GOTO(out_close, rc);
+
+ llog_ctxt_put(ctxt);
+ RETURN(0);
+
+out_close:
+ llog_cat_close(env, ctxt->loc_handle);
+ ctxt->loc_handle = NULL;
+out_cleanup:
+ llog_cleanup(env, ctxt);
+
return rc;
}
+/**
+ * cleanup the context created by llog_setup_named()
+ */
+static int mdd_hsm_actions_llog_fini(const struct lu_env *env,
+ struct mdd_device *m)
+{
+ struct obd_device *obd = mdd2obd_dev(m);
+ struct llog_ctxt *lctxt;
+ ENTRY;
+
+ lctxt = llog_get_context(obd, LLOG_AGENT_ORIG_CTXT);
+ if (lctxt) {
+ llog_cat_close(env, lctxt->loc_handle);
+ lctxt->loc_handle = NULL;
+ llog_cleanup(env, lctxt);
+ }
+
+ RETURN(0);
+}
+
static void mdd_device_shutdown(const struct lu_env *env, struct mdd_device *m,
struct lustre_cfg *cfg)
{
+ mdd_generic_thread_stop(&m->mdd_orph_cleanup_thread);
lfsck_degister(env, m->mdd_bottom);
+ mdd_hsm_actions_llog_fini(env, m);
mdd_changelog_fini(env, m);
orph_index_fini(env, m);
- if (m->mdd_dot_lustre_objs.mdd_obf)
- mdd_object_put(env, m->mdd_dot_lustre_objs.mdd_obf);
- if (m->mdd_dot_lustre)
- mdd_object_put(env, m->mdd_dot_lustre);
- if (m->mdd_los != NULL)
+ mdd_dot_lustre_cleanup(env, m);
+ if (m->mdd_los != NULL) {
local_oid_storage_fini(env, m->mdd_los);
+ m->mdd_los = NULL;
+ }
lu_site_purge(env, mdd2lu_dev(m)->ld_site, ~0);
if (m->mdd_child_exp)
ENTRY;
switch (cfg->lcfg_command) {
- case LCFG_PARAM: {
- struct lprocfs_static_vars lvars;
-
- lprocfs_mdd_init_vars(&lvars);
- rc = class_process_proc_param(PARAM_MDD, lvars.obd_vars, cfg,m);
- if (rc > 0 || rc == -ENOSYS)
- /* we don't understand; pass it on */
- rc = next->ld_ops->ldo_process_config(env, next, cfg);
- break;
- }
+ case LCFG_PARAM: {
+ struct obd_device *obd = mdd2obd_dev(m);
+
+ rc = class_process_proc_seq_param(PARAM_MDD, obd->obd_vars,
+ cfg, m);
+ if (rc > 0 || rc == -ENOSYS)
+ /* we don't understand; pass it on */
+ rc = next->ld_ops->ldo_process_config(env, next, cfg);
+ break;
+ }
case LCFG_SETUP:
rc = next->ld_ops->ldo_process_config(env, next, cfg);
if (rc)
next = &mdd->mdd_child->dd_lu_dev;
/* XXX: orphans handling. */
- __mdd_orphan_cleanup(env, mdd);
+ mdd_orphan_cleanup(env, mdd);
rc = next->ld_ops->ldo_recovery_complete(env, next);
RETURN(rc);
return 0;
}
+static int mdd_lfsck_out_notify(const struct lu_env *env, void *data,
+ enum lfsck_events event)
+{
+ return 0;
+}
+
static int mdd_prepare(const struct lu_env *env,
struct lu_device *pdev,
struct lu_device *cdev)
if (rc < 0)
GOTO(out_los, rc);
+ lu_root_fid(&fid);
if (mdd_seq_site(mdd)->ss_node_id == 0) {
- lu_root_fid(&fid);
rc = mdd_local_file_create(env, mdd, &mdd->mdd_local_root_fid,
mdd_root_dir_name, S_IFDIR |
S_IRUGO | S_IWUSR | S_IXUGO, &fid);
mdd2obd_dev(mdd)->obd_name, rc);
GOTO(out_los, rc);
}
- mdd->mdd_root_fid = fid;
+ mdd->mdd_root_fid = fid;
rc = mdd_dot_lustre_setup(env, mdd);
if (rc != 0) {
CERROR("%s: initializing .lustre failed: rc = %d\n",
}
rc = mdd_compat_fixes(env, mdd);
- if (rc)
- GOTO(out_los, rc);
-
+ if (rc != 0)
+ GOTO(out_dot, rc);
+ } else {
+ /* Normal client usually send root access to MDT0 directly,
+ * the root FID on non-MDT0 will only be used by echo client. */
+ mdd->mdd_root_fid = fid;
}
rc = orph_index_init(env, mdd);
GOTO(out_orph, rc);
}
- rc = lfsck_register(env, mdd->mdd_bottom, mdd->mdd_child, true);
+ rc = mdd_hsm_actions_llog_init(env, mdd);
+ if (rc != 0)
+ GOTO(out_changelog, rc);
+
+ rc = lfsck_register(env, mdd->mdd_bottom, mdd->mdd_child,
+ mdd2obd_dev(mdd), mdd_lfsck_out_notify,
+ mdd, true);
if (rc != 0) {
CERROR("%s: failed to initialize lfsck: rc = %d\n",
mdd2obd_dev(mdd)->obd_name, rc);
- GOTO(out_changelog, rc);
+ GOTO(out_hsm, rc);
}
RETURN(0);
+out_hsm:
+ mdd_hsm_actions_llog_fini(env, mdd);
out_changelog:
mdd_changelog_fini(env, mdd);
out_orph:
orph_index_fini(env, mdd);
out_dot:
- if (mdd_seq_site(mdd)->ss_node_id == 0) {
- mdd_object_put(env, mdd->mdd_dot_lustre);
- mdd->mdd_dot_lustre = NULL;
- mdd_object_put(env, mdd->mdd_dot_lustre_objs.mdd_obf);
- mdd->mdd_dot_lustre_objs.mdd_obf = NULL;
- }
+ if (mdd_seq_site(mdd)->ss_node_id == 0)
+ mdd_dot_lustre_cleanup(env, mdd);
out_los:
local_oid_storage_fini(env, mdd->mdd_los);
mdd->mdd_los = NULL;
+
return rc;
}
* No permission check is needed.
*/
static int mdd_statfs(const struct lu_env *env, struct md_device *m,
- struct obd_statfs *sfs)
+ struct obd_statfs *sfs)
{
- struct mdd_device *mdd = lu2mdd_dev(&m->md_lu_dev);
- int rc;
+ struct mdd_device *mdd = lu2mdd_dev(&m->md_lu_dev);
+ int rc;
- ENTRY;
+ ENTRY;
- rc = mdd_child_ops(mdd)->dt_statfs(env, mdd->mdd_child, sfs);
+ rc = mdd_child_ops(mdd)->dt_statfs(env, mdd->mdd_child, sfs);
- RETURN(rc);
+ sfs->os_namelen = min_t(__u32, sfs->os_namelen, NAME_MAX);
+
+ RETURN(rc);
}
/*
RETURN(rc);
}
+static int mdd_maxeasize_get(const struct lu_env *env, struct md_device *m,
+ int *easize)
+{
+ struct mdd_device *mdd = lu2mdd_dev(&m->md_lu_dev);
+ ENTRY;
+
+ *easize = mdd->mdd_dt_conf.ddp_max_ea_size;
+
+ RETURN(0);
+}
+
static int mdd_update_capa_key(const struct lu_env *env,
struct md_device *m,
struct lustre_capa_key *key)
struct mdd_device *m = lu2mdd_dev(lu);
ENTRY;
- LASSERT(cfs_atomic_read(&lu->ld_ref) == 0);
+ LASSERT(atomic_read(&lu->ld_ref) == 0);
md_device_fini(&m->mdd_md_dev);
OBD_FREE_PTR(m);
RETURN(NULL);
RETURN(rc);
}
-static int mdd_obd_health_check(const struct lu_env *env,
- struct obd_device *obd)
+static int mdd_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 mdd_device *mdd = lu2mdd_dev(obd->obd_lu_dev);
- int rc;
- ENTRY;
+ int rc = -EINVAL;
+
+ if (KEY_IS(KEY_OSP_CONNECTED)) {
+ struct obd_device *obd = exp->exp_obd;
+ struct mdd_device *mdd;
+
+ if (!obd->obd_set_up || obd->obd_stopping)
+ RETURN(-EAGAIN);
+
+ mdd = lu2mdd_dev(obd->obd_lu_dev);
+ LASSERT(mdd);
+ rc = obd_get_info(env, mdd->mdd_child_exp, keylen, key, vallen,
+ val, lsm);
+ RETURN(rc);
+ }
- LASSERT(mdd);
- rc = obd_health_check(env, mdd->mdd_child_exp->exp_obd);
RETURN(rc);
}
.o_owner = THIS_MODULE,
.o_connect = mdd_obd_connect,
.o_disconnect = mdd_obd_disconnect,
- .o_health_check = mdd_obd_health_check
+ .o_get_info = mdd_obd_get_info,
};
-/*
- * context key constructor/destructor:
- * mdd_capainfo_key_init, mdd_capainfo_key_fini
- */
-LU_KEY_INIT_FINI(mdd_capainfo, struct md_capainfo);
-
-struct lu_context_key mdd_capainfo_key = {
- .lct_tags = LCT_SESSION,
- .lct_init = mdd_capainfo_key_init,
- .lct_fini = mdd_capainfo_key_fini
-};
-
-struct md_capainfo *md_capainfo(const struct lu_env *env)
-{
- /* NB, in mdt_init0 */
- if (env->le_ses == NULL)
- return NULL;
- return lu_context_key_get(env->le_ses, &mdd_capainfo_key);
-}
-EXPORT_SYMBOL(md_capainfo);
-
static int mdd_changelog_user_register(const struct lu_env *env,
struct mdd_device *mdd, int *id)
{
rec->cur_endrec = mdd->mdd_cl.mc_index;
spin_unlock(&mdd->mdd_cl.mc_user_lock);
- rc = llog_cat_add(env, ctxt->loc_handle, &rec->cur_hdr, NULL, NULL);
+ rc = llog_cat_add(env, ctxt->loc_handle, &rec->cur_hdr, NULL);
CDEBUG(D_IOCTL, "Registered changelog user %d\n", *id);
out:
CDEBUG(D_IOCTL, "Rewriting changelog user %d endrec to "LPU64"\n",
mcud->mcud_id, rec->cur_endrec);
- /* hdr+1 is loc of data */
- hdr->lrh_len -= sizeof(*hdr) + sizeof(struct llog_rec_tail);
- rc = llog_write(env, llh, hdr, NULL, 0, (void *)(hdr + 1),
- hdr->lrh_index);
+ rc = llog_write(env, llh, hdr, hdr->lrh_index);
RETURN(rc);
}
RETURN(rc);
}
case OBD_IOC_STOP_LFSCK: {
- rc = lfsck_stop(env, mdd->mdd_bottom, false);
- RETURN(rc);
- }
- case OBD_IOC_PAUSE_LFSCK: {
- rc = lfsck_stop(env, mdd->mdd_bottom, true);
+ rc = lfsck_stop(env, mdd->mdd_bottom,
+ (struct lfsck_stop *)karg);
RETURN(rc);
}
}
}
/* type constructor/destructor: mdd_type_init, mdd_type_fini */
-LU_TYPE_INIT_FINI(mdd, &mdd_thread_key, &mdd_capainfo_key);
+LU_TYPE_INIT_FINI(mdd, &mdd_thread_key);
-const struct md_device_operations mdd_ops = {
+static const struct md_device_operations mdd_ops = {
.mdo_statfs = mdd_statfs,
.mdo_root_get = mdd_root_get,
.mdo_init_capa_ctxt = mdd_init_capa_ctxt,
.mdo_update_capa_key= mdd_update_capa_key,
.mdo_llog_ctxt_get = mdd_llog_ctxt_get,
.mdo_iocontrol = mdd_iocontrol,
+ .mdo_maxeasize_get = mdd_maxeasize_get,
};
static struct lu_device_type_operations mdd_device_type_ops = {
/* context key: mdd_thread_key */
LU_CONTEXT_KEY_DEFINE(mdd, LCT_MD_THREAD);
+int mdd_generic_thread_start(struct mdd_generic_thread *thread,
+ int (*func)(void *), void *data, char *name)
+{
+ struct task_struct *task;
+
+ LASSERT(thread->mgt_init == false);
+ init_completion(&thread->mgt_started);
+ init_completion(&thread->mgt_finished);
+ thread->mgt_data = data;
+ thread->mgt_abort = false;
+ thread->mgt_init = true;
+
+ task = kthread_run(func, thread, name);
+ if (IS_ERR(task)) {
+ complete(&thread->mgt_finished);
+ return PTR_ERR(task);
+ }
+ wait_for_completion(&thread->mgt_started);
+ return 0;
+}
+
+void mdd_generic_thread_stop(struct mdd_generic_thread *thread)
+{
+ if (thread->mgt_init == true) {
+ thread->mgt_abort = true;
+ wait_for_completion(&thread->mgt_finished);
+ }
+}
+
static int __init mdd_mod_init(void)
{
- struct lprocfs_static_vars lvars;
int rc;
- lprocfs_mdd_init_vars(&lvars);
-
rc = lu_kmem_init(mdd_caches);
if (rc)
return rc;
changelog_orig_logops.lop_add = llog_cat_add_rec;
changelog_orig_logops.lop_declare_add = llog_cat_declare_add_rec;
- rc = class_register_type(&mdd_obd_device_ops, NULL, lvars.module_vars,
+ hsm_actions_logops = llog_osd_ops;
+ hsm_actions_logops.lop_add = llog_cat_add_rec;
+ hsm_actions_logops.lop_declare_add = llog_cat_declare_add_rec;
+
+ rc = class_register_type(&mdd_obd_device_ops, NULL, true, NULL,
+#ifndef HAVE_ONLY_PROCFS_SEQ
+ NULL,
+#endif
LUSTRE_MDD_NAME, &mdd_device_type);
if (rc)
lu_kmem_fini(mdd_caches);