X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmdd%2Fmdd_device.c;h=a00a24061d6a797e7650ddf5a154b6a1f97cdb1d;hp=fd7dfda82defe166f1b9f0ea649daac44253ea9c;hb=1cc689723685a564c4d3f45ba44348e2e43a8442;hpb=31fef6845e8be39ae8dfd242714a84001925b7ad diff --git a/lustre/mdd/mdd_device.c b/lustre/mdd/mdd_device.c index fd7dfda..a00a240 100644 --- a/lustre/mdd/mdd_device.c +++ b/lustre/mdd/mdd_device.c @@ -145,7 +145,7 @@ static int mdd_init0(const struct lu_env *env, struct mdd_device *mdd, /* sync permission changes */ mdd->mdd_sync_permission = 1; /* enable changelog garbage collection */ - mdd->mdd_changelog_gc = 0; + mdd->mdd_changelog_gc = 1; /* with a significant amount of idle time */ mdd->mdd_changelog_max_idle_time = CHLOG_MAX_IDLE_TIME; /* or a significant amount of late indexes */ @@ -154,6 +154,9 @@ static int mdd_init0(const struct lu_env *env, struct mdd_device *mdd, mdd->mdd_changelog_min_gc_interval = CHLOG_MIN_GC_INTERVAL; /* with a very few number of free catalog entries */ mdd->mdd_changelog_min_free_cat_entries = CHLOG_MIN_FREE_CAT_ENTRIES; + /* special default striping for files created with O_APPEND */ + mdd->mdd_append_stripe_count = 1; + mdd->mdd_append_pool[0] = '\0'; dt_conf_get(env, mdd->mdd_child, &mdd->mdd_dt_conf); @@ -487,9 +490,6 @@ static int mdd_changelog_llog_init(const struct lu_env *env, if (rc) GOTO(out_ucleanup, rc); - uctxt->loc_handle->lgh_logops->lop_add = llog_cat_add_rec; - uctxt->loc_handle->lgh_logops->lop_declare_add = llog_cat_declare_add_rec; - rc = llog_init_handle(env, uctxt->loc_handle, LLOG_F_IS_CAT, NULL); if (rc) GOTO(out_uclose, rc); @@ -737,9 +737,6 @@ int mdd_changelog_write_header(const struct lu_env *env, rec->cr.cr_namelen); rec->cr_hdr.lrh_type = CHANGELOG_REC; rec->cr.cr_time = cl_time(); - spin_lock(&mdd->mdd_cl.mc_lock); - rec->cr.cr_index = ++mdd->mdd_cl.mc_index; - spin_unlock(&mdd->mdd_cl.mc_lock); ctxt = llog_get_context(obd, LLOG_CHANGELOG_ORIG_CTXT); LASSERT(ctxt); @@ -844,9 +841,21 @@ static int mdd_dummy_unlink(const struct lu_env *env, return -EPERM; } +int mdd_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_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) +{ + if (spec->sp_cr_flags & MDS_OPEN_VOLATILE) + return mdd_create(env, pobj, lname, child, spec, ma); + RETURN(-EPERM); +} + static struct md_dir_operations mdd_obf_dir_ops = { .mdo_lookup = obf_lookup, - .mdo_create = mdd_dummy_create, + .mdo_create = mdd_obf_create, .mdo_rename = mdd_dummy_rename, .mdo_link = mdd_dummy_link, .mdo_unlink = mdd_dummy_unlink @@ -995,9 +1004,6 @@ out: return rc; } - -static struct llog_operations hsm_actions_logops; - /** * set llog methods and create LLOG_AGENT_ORIG_CTXT llog * object in obd_device @@ -1014,7 +1020,7 @@ static int mdd_hsm_actions_llog_init(const struct lu_env *env, obd->obd_lvfs_ctxt.dt = m->mdd_bottom; rc = llog_setup(env, obd, &obd->obd_olg, LLOG_AGENT_ORIG_CTXT, - obd, &hsm_actions_logops); + obd, &llog_common_cat_ops); if (rc) { CERROR("%s: hsm actions llog setup failed: rc = %d\n", obd->obd_name, rc); @@ -1103,10 +1109,11 @@ static int mdd_process_config(const struct lu_env *env, switch (cfg->lcfg_command) { case LCFG_PARAM: { - struct obd_device *obd = mdd2obd_dev(m); + ssize_t count; - rc = class_process_proc_param(PARAM_MDD, obd->obd_vars, cfg, m); - if (rc > 0 || rc == -ENOSYS) + count = class_modify_config(cfg, PARAM_MDD, &m->mdd_kobj); + rc = count > 0 ? 0 : count; + if (rc) /* we don't understand; pass it on */ rc = next->ld_ops->ldo_process_config(env, next, cfg); break; @@ -1338,7 +1345,7 @@ static int mdd_statfs(const struct lu_env *env, struct md_device *m, 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, NULL); sfs->os_namelen = min_t(__u32, sfs->os_namelen, NAME_MAX); @@ -1490,7 +1497,7 @@ static int mdd_obd_set_info_async(const struct lu_env *env, RETURN(rc); } -static struct obd_ops mdd_obd_device_ops = { +static const struct obd_ops mdd_obd_device_ops = { .o_owner = THIS_MODULE, .o_connect = mdd_obd_connect, .o_disconnect = mdd_obd_disconnect, @@ -1647,6 +1654,8 @@ int mdd_changelog_user_purge(const struct lu_env *env, mdd_changelog_user_purge_cb, &mcup, 0, 0); + OBD_FAIL_TIMEOUT(OBD_FAIL_LLOG_PURGE_DELAY, cfs_fail_val); + if ((rc == 0) && (mcup.mcup_usercount == 0)) { spin_lock(&mdd->mdd_cl.mc_user_lock); if (mdd->mdd_cl.mc_users == 0) { @@ -1894,7 +1903,15 @@ static int mdd_iocontrol(const struct lu_env *env, struct md_device *m, if (unlikely(!barrier_entry(mdd->mdd_bottom))) RETURN(-EINPROGRESS); - rc = mdd_changelog_user_purge(env, mdd, data->ioc_u32_1); + /* explicitly clear changelog first, to protect from crash in + * the middle of purge that would lead to unregistered consumer + * but pending changelog entries + */ + rc = mdd_changelog_clear(env, mdd, data->ioc_u32_1, 0); + if (!rc) + rc = mdd_changelog_user_purge(env, + mdd, data->ioc_u32_1); + barrier_exit(mdd->mdd_bottom); break; default: @@ -1990,15 +2007,10 @@ static int __init mdd_init(void) if (rc) return rc; - changelog_orig_logops = llog_osd_ops; - changelog_orig_logops.lop_add = llog_cat_add_rec; - changelog_orig_logops.lop_declare_add = llog_cat_declare_add_rec; - - 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; + changelog_orig_logops = llog_common_cat_ops; + changelog_orig_logops.lop_write_rec = mdd_changelog_write_rec; - rc = class_register_type(&mdd_obd_device_ops, NULL, true, NULL, + rc = class_register_type(&mdd_obd_device_ops, NULL, false, NULL, LUSTRE_MDD_NAME, &mdd_device_type); if (rc) lu_kmem_fini(mdd_caches);