static struct mdt_device *mdt_dev(struct lu_device *d);
static int mdt_regular_handle(struct ptlrpc_request *req);
static int mdt_unpack_req_pack_rep(struct mdt_thread_info *info, __u32 flags);
-static int mdt_fid2path(struct lu_env *env, struct mdt_device *mdt,
+static int mdt_fid2path(const struct lu_env *env, struct mdt_device *mdt,
struct getinfo_fid2path *fp);
static const struct lu_object_operations mdt_obj_ops;
struct lu_device *d = &m->mdt_md_dev.md_lu_dev;
struct lu_site *ls = d->ld_site;
struct obd_device *obd = mdt2obd_dev(m);
- int waited = 0;
ENTRY;
target_recovery_fini(obd);
- /* At this point, obd exports might still be on the "obd_zombie_exports"
- * list, and obd_zombie_impexp_thread() is trying to destroy them.
- * We wait a little bit until all exports (except the self-export)
- * have been destroyed, because the whole mdt stack might be accessed
- * in mdt_destroy_export(). This will not be a long time, maybe one or
- * two seconds are enough. This is not a problem while umounting.
- *
- * The three references that should be remaining are the
- * obd_self_export and the attach and setup references.
- */
- while (atomic_read(&obd->obd_refcount) > 3) {
- cfs_schedule_timeout(CFS_TASK_UNINT, cfs_time_seconds(1));
- ++waited;
- if (waited > 5 && IS_PO2(waited))
- LCONSOLE_WARN("Waiting for obd_zombie_impexp_thread "
- "more than %d seconds to destroy all "
- "the exports. The current obd refcount ="
- " %d. Is it stuck there?\n",
- waited, atomic_read(&obd->obd_refcount));
- }
ping_evictor_stop();
}
static int mdt_upcall(const struct lu_env *env, struct md_device *md,
- enum md_upcall_event ev)
+ enum md_upcall_event ev, void *data)
{
struct mdt_device *m = mdt_dev(&md->md_lu_dev);
struct md_device *next = m->mdt_child;
CDEBUG(D_INFO, "get max mdsize %d max cookiesize %d\n",
m->mdt_max_mdsize, m->mdt_max_cookiesize);
mdt_allow_cli(m, CONFIG_SYNC);
+ if (data)
+ (*(__u64 *)data) = m->mdt_mount_count;
break;
case MD_NO_TRANS:
mti = lu_context_key_get(&env->le_ctx, &mdt_thread_key);
static int mdt_rpc_fid2path(struct mdt_thread_info *info, void *key,
void *val, int vallen)
{
- struct lu_env env;
struct mdt_device *mdt = mdt_dev(info->mti_exp->exp_obd->obd_lu_dev);
struct getinfo_fid2path *fpout, *fpin;
int rc = 0;
if (fpout->gf_pathlen != vallen - sizeof(*fpin))
RETURN(-EINVAL);
- rc = lu_env_init(&env, LCT_MD_THREAD);
- if (rc)
- RETURN(rc);
- rc = mdt_fid2path(&env, mdt, fpout);
- lu_env_fini(&env);
-
+ rc = mdt_fid2path(info->mti_env, mdt, fpout);
RETURN(rc);
}
-static int mdt_fid2path(struct lu_env *env, struct mdt_device *mdt,
+static int mdt_fid2path(const struct lu_env *env, struct mdt_device *mdt,
struct getinfo_fid2path *fp)
{
- struct lu_context ioctl_session;
struct mdt_object *obj;
int rc;
ENTRY;
if (!fid_is_sane(&fp->gf_fid))
RETURN(-EINVAL);
- rc = lu_context_init(&ioctl_session, LCT_SESSION);
- if (rc)
- RETURN(rc);
- ioctl_session.lc_thread = (struct ptlrpc_thread *)cfs_current();
- lu_context_enter(&ioctl_session);
- env->le_ses = &ioctl_session;
-
obj = mdt_object_find(env, mdt, &fp->gf_fid);
if (obj == NULL || IS_ERR(obj)) {
CDEBUG(D_IOCTL, "no object "DFID": %ld\n",PFID(&fp->gf_fid),
PTR_ERR(obj));
- GOTO(out, rc = -EINVAL);
+ RETURN(-EINVAL);
}
rc = lu_object_exists(&obj->mot_obj.mo_lu);
mdt_object_put(env, obj);
CDEBUG(D_IOCTL, "nonlocal object "DFID": %d\n",
PFID(&fp->gf_fid), rc);
- GOTO(out, rc);
+ RETURN(rc);
}
rc = mo_path(env, md_object_next(&obj->mot_obj), fp->gf_path,
fp->gf_pathlen, &fp->gf_recno, &fp->gf_linkno);
mdt_object_put(env, obj);
- EXIT;
-
-out:
- lu_context_exit(&ioctl_session);
- lu_context_fini(&ioctl_session);
- return rc;
+ RETURN(rc);
}
static int mdt_get_info(struct mdt_thread_info *info)