/* Slab for OFD object allocation */
static struct kmem_cache *ofd_object_kmem;
-
static struct lu_kmem_descr ofd_caches[] = {
{
.ckd_cache = &ofd_object_kmem,
* \retval negative value on error
*/
static int ofd_stack_init(const struct lu_env *env,
- struct ofd_device *m, struct lustre_cfg *cfg)
+ struct ofd_device *m, struct lustre_cfg *cfg,
+ u32 *lmd_flags)
{
const char *dev = lustre_cfg_string(cfg, 0);
struct lu_device *d;
}
lmd = s2lsi(lmi->lmi_sb)->lsi_lmd;
- if (lmd != NULL && lmd->lmd_flags & LMD_FLG_SKIP_LFSCK)
- m->ofd_skip_lfsck = 1;
+ if (lmd) {
+ if (lmd->lmd_flags & LMD_FLG_SKIP_LFSCK)
+ m->ofd_skip_lfsck = 1;
+ if (lmd->lmd_flags & LMD_FLG_NO_PRECREATE)
+ m->ofd_no_precreate = 1;
+ *lmd_flags = lmd->lmd_flags;
+ }
/* find bottom osd */
OBD_ALLOC(osdname, MTI_NAME_MAXLEN);
sval = strchr(param, '=');
if (sval != NULL) {
paramlen = sval - param;
- if (strncmp(param, "writethrough_cache_enable",
- paramlen) == 0 ||
- strncmp(param, "readcache_max_filesize",
- paramlen) == 0 ||
- strncmp(param, "read_cache_enable",
- paramlen) == 0 ||
- strncmp(param, "brw_stats", paramlen) == 0)
+ if (strncmp(param, "brw_stats", paramlen) == 0)
return true;
}
}
switch (cfg->lcfg_command) {
case LCFG_PARAM: {
- struct obd_device *obd = ofd_obd(m);
/* For interoperability */
- struct cfg_interop_param *ptr = NULL;
- struct lustre_cfg *old_cfg = NULL;
- char *param = NULL;
+ struct cfg_interop_param *ptr = NULL;
+ struct lustre_cfg *old_cfg = NULL;
+ char *param = NULL;
+ ssize_t count;
param = lustre_cfg_string(cfg, 1);
if (param == NULL) {
break;
}
- rc = class_process_proc_param(PARAM_OST, obd->obd_vars, cfg,
- d->ld_obd);
- if (rc > 0 || rc == -ENOSYS) {
- CDEBUG(D_CONFIG, "pass param %s down the stack.\n",
- param);
- /* we don't understand; pass it on */
- rc = next->ld_ops->ldo_process_config(env, next, cfg);
+ count = class_modify_config(cfg, PARAM_OST,
+ &d->ld_obd->obd_kset.kobj);
+ if (count > 0) {
+ rc = 0;
+ break;
}
+ CDEBUG(D_CONFIG, "pass param %s down the stack.\n",
+ param);
+ /* we don't understand; pass it on */
+ rc = next->ld_ops->ldo_process_config(env, next, cfg);
break;
}
case LCFG_SPTLRPC_CONF: {
RETURN(rc);
}
+static void ofd_object_free_rcu(struct rcu_head *head)
+{
+ struct ofd_object *of = container_of(head, struct ofd_object,
+ ofo_header.loh_rcu);
+
+ kmem_cache_free(ofd_object_kmem, of);
+}
+
/**
* Implementation of lu_object_operations::loo_object_free.
*
lu_object_fini(o);
lu_object_header_fini(h);
- OBD_SLAB_FREE_PTR(of, ofd_object_kmem);
+ OBD_FREE_PRE(of, sizeof(*of), "slab-freed");
+ call_rcu(&of->ofo_header.loh_rcu, ofd_object_free_rcu);
EXIT;
}
LASSERTF(rc == 0, "register namespace failed: rc = %d\n", rc);
target_recovery_init(&ofd->ofd_lut, tgt_request_handle);
+ OBD_FAIL_TIMEOUT_ORSET(OBD_FAIL_OST_PREPARE_DELAY, OBD_FAIL_ONCE,
+ (OBD_TIMEOUT_DEFAULT + 1) / 4);
LASSERT(obd->obd_no_conn);
spin_lock(&obd->obd_dev_lock);
obd->obd_no_conn = 0;
.ldo_prepare = ofd_prepare,
};
-LPROC_SEQ_FOPS(lprocfs_nid_stats_clear);
-
-/**
- * Initialize all needed procfs entries for OFD device.
- *
- * \param[in] ofd OFD device
- *
- * \retval 0 if successful
- * \retval negative value on error
- */
-static int ofd_procfs_init(struct ofd_device *ofd)
-{
- struct obd_device *obd = ofd_obd(ofd);
- struct proc_dir_entry *entry;
- int rc = 0;
-
- ENTRY;
-
- /* lprocfs must be setup before the ofd so state can be safely added
- * to /proc incrementally as the ofd is setup */
- obd->obd_vars = lprocfs_ofd_obd_vars;
- rc = lprocfs_obd_setup(obd, false);
- if (rc) {
- CERROR("%s: lprocfs_obd_setup failed: %d.\n",
- obd->obd_name, rc);
- RETURN(rc);
- }
-
- rc = lprocfs_alloc_obd_stats(obd, LPROC_OFD_STATS_LAST);
- if (rc) {
- CERROR("%s: lprocfs_alloc_obd_stats failed: %d.\n",
- obd->obd_name, rc);
- GOTO(obd_cleanup, rc);
- }
-
- entry = lprocfs_register("exports", obd->obd_proc_entry, NULL, NULL);
- if (IS_ERR(entry)) {
- rc = PTR_ERR(entry);
- CERROR("%s: error %d setting up lprocfs for %s\n",
- obd->obd_name, rc, "exports");
- GOTO(obd_cleanup, rc);
- }
- obd->obd_proc_exports_entry = entry;
-
- entry = lprocfs_add_simple(obd->obd_proc_exports_entry, "clear",
- obd, &lprocfs_nid_stats_clear_fops);
- if (IS_ERR(entry)) {
- rc = PTR_ERR(entry);
- CERROR("%s: add proc entry 'clear' failed: %d.\n",
- obd->obd_name, rc);
- GOTO(obd_cleanup, rc);
- }
-
- ofd_stats_counter_init(obd->obd_stats);
-
- rc = lprocfs_job_stats_init(obd, LPROC_OFD_STATS_LAST,
- ofd_stats_counter_init);
- if (rc)
- GOTO(obd_cleanup, rc);
- RETURN(0);
-obd_cleanup:
- lprocfs_obd_cleanup(obd);
- lprocfs_free_obd_stats(obd);
-
- return rc;
-}
-
#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 14, 53, 0)
/**
* Expose OSD statistics to OFD layer.
*/
static void ofd_procfs_add_brw_stats_symlink(struct ofd_device *ofd)
{
- struct obd_device *obd = ofd_obd(ofd);
- struct obd_device *osd_obd = ofd->ofd_osd_exp->exp_obd;
+ struct obd_device *obd = ofd_obd(ofd);
+ struct obd_device *osd_obd = ofd->ofd_osd_exp->exp_obd;
+ struct kobj_type *osd_type;
+ int i;
+
+ osd_type = get_ktype(&ofd->ofd_osd->dd_kobj);
+ for (i = 0; osd_type->default_attrs[i]; i++) {
+ if (strcmp(osd_type->default_attrs[i]->name,
+ "read_cache_enable") == 0) {
+ ofd->ofd_read_cache_enable =
+ osd_type->default_attrs[i];
+ }
+
+ if (strcmp(osd_type->default_attrs[i]->name,
+ "readcache_max_filesize") == 0) {
+ ofd->ofd_read_cache_max_filesize =
+ osd_type->default_attrs[i];
+ }
+
+ if (strcmp(osd_type->default_attrs[i]->name,
+ "writethrough_cache_enable") == 0) {
+ ofd->ofd_write_cache_enable =
+ osd_type->default_attrs[i];
+ }
+ }
if (obd->obd_proc_entry == NULL)
return;
lprocfs_add_symlink("brw_stats", obd->obd_proc_entry,
"../../%s/%s/brw_stats",
osd_obd->obd_type->typ_name, obd->obd_name);
-
- lprocfs_add_symlink("read_cache_enable", obd->obd_proc_entry,
- "../../%s/%s/read_cache_enable",
- osd_obd->obd_type->typ_name, obd->obd_name);
-
- lprocfs_add_symlink("readcache_max_filesize",
- obd->obd_proc_entry,
- "../../%s/%s/readcache_max_filesize",
- osd_obd->obd_type->typ_name, obd->obd_name);
-
- lprocfs_add_symlink("writethrough_cache_enable",
- obd->obd_proc_entry,
- "../../%s/%s/writethrough_cache_enable",
- osd_obd->obd_type->typ_name, obd->obd_name);
}
#endif
{
struct obd_device *obd = ofd_obd(ofd);
+ tgt_tunables_fini(&ofd->ofd_lut);
lprocfs_free_per_client_stats(obd);
lprocfs_obd_cleanup(obd);
lprocfs_free_obd_stats(obd);
*/
int ofd_fid_init(const struct lu_env *env, struct ofd_device *ofd)
{
- struct seq_server_site *ss = &ofd->ofd_seq_site;
- struct lu_device *lu = &ofd->ofd_dt_dev.dd_lu_dev;
- char *obd_name = ofd_name(ofd);
- char *name = NULL;
- int rc = 0;
+ struct seq_server_site *ss = &ofd->ofd_seq_site;
+ struct lu_device *lu = &ofd->ofd_dt_dev.dd_lu_dev;
+ char *obd_name = ofd_name(ofd);
+ char *name = NULL;
+ int len = strlen(obd_name) + 7;
+ int rc = 0;
ss = &ofd->ofd_seq_site;
lu->ld_site->ld_seq_site = ss;
ss->ss_lu = lu->ld_site;
ss->ss_node_id = ofd->ofd_lut.lut_lsd.lsd_osd_index;
- OBD_ALLOC(name, sizeof(obd_name) * 2 + 10);
+ OBD_ALLOC(name, len);
if (name == NULL)
return -ENOMEM;
rc = seq_server_init(env, ss->ss_server_seq, ofd->ofd_osd, obd_name,
LUSTRE_SEQ_SERVER, ss);
if (rc) {
- CERROR("%s : seq server init error %d\n", obd_name, rc);
+ CERROR("%s: seq server init error: rc = %d\n", obd_name, rc);
GOTO(out_server, rc);
}
ss->ss_server_seq->lss_space.lsr_index = ss->ss_node_id;
if (ss->ss_client_seq == NULL)
GOTO(out_server, rc = -ENOMEM);
- /*
- * It always printed as "%p", so that the name is unique in the kernel,
- * even if the filesystem is mounted twice. So sizeof(.) * 2 is enough.
- */
- snprintf(name, sizeof(obd_name) * 2 + 7, "%p-super", obd_name);
+ snprintf(name, len, "%s-super", obd_name);
rc = seq_client_init(ss->ss_client_seq, NULL, LUSTRE_SEQ_DATA,
name, NULL);
if (rc) {
- CERROR("%s : seq client init error %d\n", obd_name, rc);
+ CERROR("%s: seq client init error: rc = %d\n", obd_name, rc);
GOTO(out_client, rc);
}
ss->ss_server_seq = NULL;
}
out_name:
- OBD_FREE(name, sizeof(obd_name) * 2 + 10);
+ OBD_FREE(name, len);
return rc;
}
}
-static int ofd_lock_unlock_region(struct ldlm_namespace *ns,
+static int ofd_lock_unlock_region(const struct lu_env *env,
+ struct ldlm_namespace *ns,
struct ldlm_res_id *res_id,
unsigned long long begin,
unsigned long long end)
LASSERT(begin <= end);
- rc = tgt_extent_lock(ns, res_id, begin, end, &lh, LCK_PR, &flags);
+ rc = tgt_extent_lock(env, ns, res_id, begin, end, &lh, LCK_PR, &flags);
if (rc != 0)
return rc;
* \retval 0 if successful
* \retval negative value on error
*/
-static int lock_zero_regions(struct ldlm_namespace *ns,
+static int lock_zero_regions(const struct lu_env *env,
+ struct ldlm_namespace *ns,
struct ldlm_res_id *res_id,
struct fiemap *fiemap)
{
if (fiemap_start[i].fe_logical > begin) {
CDEBUG(D_OTHER, "ost lock [%llu,%llu]\n",
begin, fiemap_start[i].fe_logical);
- rc = ofd_lock_unlock_region(ns, res_id, begin,
+ rc = ofd_lock_unlock_region(env, ns, res_id, begin,
fiemap_start[i].fe_logical);
if (rc)
RETURN(rc);
if (begin < (fiemap->fm_start + fiemap->fm_length)) {
CDEBUG(D_OTHER, "ost lock [%llu,%llu]\n",
begin, fiemap->fm_start + fiemap->fm_length);
- rc = ofd_lock_unlock_region(ns, res_id, begin,
+ rc = ofd_lock_unlock_region(env, ns, res_id, begin,
fiemap->fm_start + fiemap->fm_length);
}
if (fm_key->lfik_oa.o_valid & OBD_MD_FLFLAGS &&
fm_key->lfik_oa.o_flags & OBD_FL_SRVLOCK) {
ost_fid_build_resid(fid, &fti->fti_resid);
- rc = lock_zero_regions(ofd->ofd_namespace,
+ rc = lock_zero_regions(tsi->tsi_env, ofd->ofd_namespace,
&fti->fti_resid, fiemap);
if (rc == 0)
rc = ofd_fiemap_get(tsi->tsi_env, ofd, fid,
if (unlikely(tsi->tsi_ost_body->oa.o_flags & OBD_FL_FLUSH))
lock_mode = LCK_PW;
- rc = tgt_extent_lock(tsi->tsi_tgt->lut_obd->obd_namespace,
+ rc = tgt_extent_lock(tsi->tsi_env,
+ tsi->tsi_tgt->lut_obd->obd_namespace,
&tsi->tsi_resid, 0, OBD_OBJECT_EOF, &lh,
lock_mode, &flags);
if (rc != 0)
if (OBD_FAIL_CHECK(OBD_FAIL_OST_EROFS))
RETURN(-EROFS);
+ if (ofd->ofd_no_precreate)
+ return -EPERM;
+
repbody = req_capsule_server_get(tsi->tsi_pill, &RMF_OST_BODY);
if (repbody == NULL)
RETURN(-ENOMEM);
u64 next_id;
int created = 0;
int count;
+ int rc2;
if (!(oa->o_valid & OBD_MD_FLFLAGS) ||
!(oa->o_flags & OBD_FL_DELORPHAN)) {
granted = 0;
}
- rc = ostid_set_id(&rep_oa->o_oi, ofd_seq_last_oid(oseq));
+ rc2 = ostid_set_id(&rep_oa->o_oi, ofd_seq_last_oid(oseq));
+ rc = rc ? : rc2;
}
EXIT;
ofd_counter_incr(exp, LPROC_OFD_STATS_CREATE,
tsi->tsi_jobid, 1);
+ if (unlikely(!oseq->os_last_id_synced))
+ oseq->os_last_id_synced = 1;
out:
mutex_unlock(&oseq->os_create_lock);
out_nolock:
- if (rc == 0) {
-#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 8, 53, 0)
- struct ofd_thread_info *info = ofd_info(tsi->tsi_env);
- struct lu_fid *fid = &info->fti_fid;
-
- /* For compatible purpose, it needs to convert back to
- * OST ID before put it on wire. */
- *fid = rep_oa->o_oi.oi_fid;
- fid_to_ostid(fid, &rep_oa->o_oi);
-#endif
+ if (rc == 0)
rep_oa->o_valid |= OBD_MD_FLID | OBD_MD_FLGROUP;
- }
ofd_seq_put(tsi->tsi_env, oseq);
out_sem:
OBD_FAIL_TIMEOUT(OBD_FAIL_OST_PAUSE_PUNCH, cfs_fail_val);
/* check that we do support OBD_CONNECT_TRUNCLOCK. */
- CLASSERT(OST_CONNECT_SUPPORTED & OBD_CONNECT_TRUNCLOCK);
+ BUILD_BUG_ON(!(OST_CONNECT_SUPPORTED & OBD_CONNECT_TRUNCLOCK));
if ((oa->o_valid & (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS)) !=
(OBD_MD_FLSIZE | OBD_MD_FLBLOCKS))
oa->o_flags & OBD_FL_SRVLOCK;
if (srvlock) {
- rc = tgt_extent_lock(ns, &tsi->tsi_resid, start, end, &lh,
- LCK_PW, &flags);
+ rc = tgt_extent_lock(tsi->tsi_env, ns, &tsi->tsi_resid, start,
+ end, &lh, LCK_PW, &flags);
if (rc != 0)
RETURN(rc);
}
PTLRPC_MAX_BRW_PAGES;
rnb.rnb_offset = start_index << PAGE_SHIFT;
rnb.rnb_len = nr_local << PAGE_SHIFT;
- rc = dt_bufs_get(env, ofd_object_child(fo), &rnb, lnb, dbt);
+ rc = dt_bufs_get(env, ofd_object_child(fo), &rnb, lnb,
+ PTLRPC_MAX_BRW_PAGES, dbt);
if (unlikely(rc < 0))
break;
nr_local = rc;
ioo.ioo_oid = body->oa.o_oi;
ioo.ioo_bufcnt = 1;
- rc = tgt_extent_lock(exp->exp_obd->obd_namespace,
+ rc = tgt_extent_lock(env, exp->exp_obd->obd_namespace,
&tsi->tsi_resid, start, end - 1,
&lockh, LCK_PR, &flags);
if (rc != 0)
rnb += ioo->ioo_bufcnt - 1;
pa.lpa_extent.end = rnb->rnb_offset + rnb->rnb_len - 1;
- DEBUG_REQ(D_RPCTRACE, req, "%s %s: refresh rw locks: "DFID
- " (%llu->%llu)\n", tgt_name(tsi->tsi_tgt),
- current->comm, PFID(&tsi->tsi_fid), pa.lpa_extent.start,
- pa.lpa_extent.end);
+ DEBUG_REQ(D_RPCTRACE, req,
+ "%s %s: refresh rw locks for "DFID" (%llu->%llu)",
+ tgt_name(tsi->tsi_tgt), current->comm, PFID(&tsi->tsi_fid),
+ pa.lpa_extent.start, pa.lpa_extent.end);
ofd_prolong_extent_locks(tsi, &pa);
- CDEBUG(D_DLMTRACE, "%s: refreshed %u locks timeout for req %p.\n",
+ CDEBUG(D_DLMTRACE, "%s: refreshed %u locks timeout for req %p\n",
tgt_name(tsi->tsi_tgt), pa.lpa_blocks_cnt, req);
if (pa.lpa_blocks_cnt > 0)
0, OST_SET_INFO, ofd_set_info_hdl,
&RQF_OBD_SET_INFO, LUSTRE_OST_VERSION),
TGT_OST_HDL(0, OST_GET_INFO, ofd_get_info_hdl),
-TGT_OST_HDL(HABEO_CORPUS| HABEO_REFERO, OST_GETATTR, ofd_getattr_hdl),
-TGT_OST_HDL(HABEO_CORPUS| HABEO_REFERO | MUTABOR,
+TGT_OST_HDL(HAS_BODY | HAS_REPLY, OST_GETATTR, ofd_getattr_hdl),
+TGT_OST_HDL(HAS_BODY | HAS_REPLY | IS_MUTABLE,
OST_SETATTR, ofd_setattr_hdl),
-TGT_OST_HDL(0 | HABEO_REFERO | MUTABOR,
+TGT_OST_HDL(HAS_REPLY | IS_MUTABLE,
OST_CREATE, ofd_create_hdl),
-TGT_OST_HDL(0 | HABEO_REFERO | MUTABOR,
+TGT_OST_HDL(HAS_REPLY | IS_MUTABLE,
OST_DESTROY, ofd_destroy_hdl),
-TGT_OST_HDL(0 | HABEO_REFERO, OST_STATFS, ofd_statfs_hdl),
-TGT_OST_HDL_HP(HABEO_CORPUS| HABEO_REFERO,
- OST_BRW_READ, tgt_brw_read,
+TGT_OST_HDL(HAS_REPLY, OST_STATFS, ofd_statfs_hdl),
+TGT_OST_HDL_HP(HAS_BODY | HAS_REPLY, OST_BRW_READ, tgt_brw_read,
ofd_hp_brw),
/* don't set CORPUS flag for brw_write because -ENOENT may be valid case */
-TGT_OST_HDL_HP(HABEO_CORPUS| MUTABOR, OST_BRW_WRITE, tgt_brw_write,
+TGT_OST_HDL_HP(HAS_BODY | IS_MUTABLE, OST_BRW_WRITE, tgt_brw_write,
ofd_hp_brw),
-TGT_OST_HDL_HP(HABEO_CORPUS| HABEO_REFERO | MUTABOR,
+TGT_OST_HDL_HP(HAS_BODY | HAS_REPLY | IS_MUTABLE,
OST_PUNCH, ofd_punch_hdl,
ofd_hp_punch),
-TGT_OST_HDL(HABEO_CORPUS| HABEO_REFERO, OST_SYNC, ofd_sync_hdl),
-TGT_OST_HDL(0 | HABEO_REFERO, OST_QUOTACTL, ofd_quotactl),
-TGT_OST_HDL(HABEO_CORPUS | HABEO_REFERO, OST_LADVISE, ofd_ladvise_hdl),
+TGT_OST_HDL(HAS_BODY | HAS_REPLY, OST_SYNC, ofd_sync_hdl),
+TGT_OST_HDL(HAS_REPLY, OST_QUOTACTL, ofd_quotactl),
+TGT_OST_HDL(HAS_BODY | HAS_REPLY, OST_LADVISE, ofd_ladvise_hdl),
};
static struct tgt_opc_slice ofd_common_slice[] = {
struct lu_fid fid;
struct nm_config_file *nodemap_config;
struct obd_device_target *obt;
+ u32 lmd_flags = 0;
int rc;
ENTRY;
obt = &obd->u.obt;
obt->obt_magic = OBT_MAGIC;
- m->ofd_fmd_max_num = OFD_FMD_MAX_NUM_DEFAULT;
- m->ofd_fmd_max_age = OFD_FMD_MAX_AGE_DEFAULT;
-
spin_lock_init(&m->ofd_flags_lock);
m->ofd_raid_degraded = 0;
m->ofd_checksum_t10pi_enforce = 0;
- m->ofd_syncjournal = 0;
+ m->ofd_sync_journal = 0;
ofd_slc_set(m);
m->ofd_soft_sync_limit = OFD_SOFT_SYNC_LIMIT_DEFAULT;
/* set this lu_device to obd, because error handling need it */
obd->obd_lu_dev = &m->ofd_dt_dev.dd_lu_dev;
- rc = ofd_procfs_init(m);
- if (rc) {
- CERROR("Can't init ofd lprocfs, rc %d\n", rc);
- RETURN(rc);
- }
-
/* No connection accepted until configurations will finish */
spin_lock(&obd->obd_dev_lock);
obd->obd_no_conn = 1;
info = ofd_info_init(env, NULL);
if (info == NULL)
- GOTO(err_fini_proc, rc = -EFAULT);
+ RETURN(-EFAULT);
- rc = ofd_stack_init(env, m, cfg);
+ rc = ofd_stack_init(env, m, cfg, &lmd_flags);
if (rc) {
- CERROR("Can't init device stack, rc %d\n", rc);
- GOTO(err_fini_proc, rc);
+ CERROR("%s: can't init device stack, rc %d\n",
+ obd->obd_name, rc);
+ RETURN(rc);
}
#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 14, 53, 0)
if (rc)
GOTO(err_free_ns, rc);
+ if (lmd_flags & LMD_FLG_SKIP_LFSCK)
+ m->ofd_skip_lfsck = 1;
+ if (lmd_flags & LMD_FLG_LOCAL_RECOV)
+ m->ofd_lut.lut_local_recovery = 1;
+
+ rc = ofd_tunables_init(m);
+ if (rc)
+ GOTO(err_fini_lut, rc);
+
tgd->tgd_reserved_pcnt = 0;
m->ofd_brw_size = m->ofd_lut.lut_dt_conf.ddp_brw_size;
rc = ofd_fs_setup(env, m, obd);
if (rc)
- GOTO(err_fini_lut, rc);
+ GOTO(err_fini_proc, rc);
fid.f_seq = FID_SEQ_LOCAL_NAME;
fid.f_oid = 1;
m->ofd_los = NULL;
err_fini_fs:
ofd_fs_cleanup(env, m);
+err_fini_proc:
+ ofd_procfs_fini(m);
err_fini_lut:
tgt_fini(env, &m->ofd_lut);
err_free_ns:
obd->obd_namespace = m->ofd_namespace = NULL;
err_fini_stack:
ofd_stack_fini(env, m, &m->ofd_osd->dd_lu_dev);
-err_fini_proc:
- ofd_procfs_fini(m);
return rc;
}
obd_exports_barrier(obd);
obd_zombie_barrier();
+ ofd_procfs_fini(m);
tgt_fini(env, &m->ofd_lut);
ofd_stop_inconsistency_verification_thread(m);
lfsck_degister(env, m->ofd_osd);
}
ofd_stack_fini(env, m, &m->ofd_dt_dev.dd_lu_dev);
- ofd_procfs_fini(m);
+
LASSERT(atomic_read(&d->ld_ref) == 0);
server_put_mount(obd->obd_name, true);
EXIT;
rc = lu_kmem_init(ofd_caches);
if (rc)
return rc;
-
- rc = ofd_fmd_init();
- if (rc) {
- lu_kmem_fini(ofd_caches);
- return(rc);
- }
-
rc = class_register_type(&ofd_obd_ops, NULL, true, NULL,
LUSTRE_OST_NAME, &ofd_device_type);
return rc;
*/
static void __exit ofd_exit(void)
{
- ofd_fmd_exit();
lu_kmem_fini(ofd_caches);
class_unregister_type(LUSTRE_OST_NAME);
}