X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdd%2Fmdd_device.c;h=52be69acb6fd0a0a4ba32e77d85aef2fd1815ed1;hb=3442db6faf685fbdbd092bdfdc8d273e4990a141;hp=88378b1fde5f6b0d249f6cdae44a92fde57f2ee2;hpb=c152f7b0c84cab95e55fb0ba19d0b6bdeefd6e12;p=fs%2Flustre-release.git diff --git a/lustre/mdd/mdd_device.c b/lustre/mdd/mdd_device.c index 88378b1..52be69a 100644 --- a/lustre/mdd/mdd_device.c +++ b/lustre/mdd/mdd_device.c @@ -41,13 +41,14 @@ #include #include #include -#include +#include #include #include #include -#include +#include #include #include +#include #include "mdd_internal.h" @@ -140,8 +141,18 @@ static int mdd_init0(const struct lu_env *env, struct mdd_device *mdd, RETURN(rc); mdd->mdd_atime_diff = MAX_ATIME_DIFF; - /* sync permission changes */ - mdd->mdd_sync_permission = 1; + /* sync permission changes */ + mdd->mdd_sync_permission = 1; + /* enable changelog garbage collection */ + 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 */ + mdd->mdd_changelog_max_idle_indexes = CHLOG_MAX_IDLE_INDEXES; + /* with a reasonable interval between each check */ + mdd->mdd_changelog_min_gc_interval = CHLOG_MIN_GC_INTERVAL; + /* with a very few number of free entries */ + mdd->mdd_changelog_min_free_cat_entries = CHLOG_MIN_FREE_CAT_ENTRIES; dt_conf_get(env, mdd->mdd_child, &mdd->mdd_dt_conf); @@ -178,9 +189,9 @@ static int changelog_init_cb(const struct lu_env *env, struct llog_handle *llh, CDEBUG(D_INFO, "seeing record at index %d/%d/%llu t=%x %.*s in log" - DOSTID"\n", hdr->lrh_index, rec->cr_hdr.lrh_index, + DFID"\n", hdr->lrh_index, rec->cr_hdr.lrh_index, rec->cr.cr_index, rec->cr.cr_type, rec->cr.cr_namelen, - changelog_rec_name(&rec->cr), POSTID(&llh->lgh_id.lgl_oi)); + changelog_rec_name(&rec->cr), PFID(&llh->lgh_id.lgl_oi.oi_fid)); mdd->mdd_cl.mc_index = rec->cr.cr_index; return LLOG_PROC_BREAK; @@ -190,16 +201,16 @@ static int changelog_user_init_cb(const struct lu_env *env, struct llog_handle *llh, struct llog_rec_hdr *hdr, void *data) { - struct mdd_device *mdd = (struct mdd_device *)data; - struct llog_changelog_user_rec *rec = - (struct llog_changelog_user_rec *)hdr; + struct mdd_device *mdd = (struct mdd_device *)data; + struct llog_changelog_user_rec *rec = + (struct llog_changelog_user_rec *)hdr; - LASSERT(llh->lgh_hdr->llh_flags & LLOG_F_IS_PLAIN); - LASSERT(rec->cur_hdr.lrh_type == CHANGELOG_USER_REC); + LASSERT(llh->lgh_hdr->llh_flags & LLOG_F_IS_PLAIN); + LASSERT(rec->cur_hdr.lrh_type == CHANGELOG_USER_REC); CDEBUG(D_INFO, "seeing user at index %d/%d id=%d endrec=%llu" - " in log "DOSTID"\n", hdr->lrh_index, rec->cur_hdr.lrh_index, - rec->cur_id, rec->cur_endrec, POSTID(&llh->lgh_id.lgl_oi)); + " in log "DFID"\n", hdr->lrh_index, rec->cur_hdr.lrh_index, + rec->cur_id, rec->cur_endrec, PFID(&llh->lgh_id.lgl_oi.oi_fid)); spin_lock(&mdd->mdd_cl.mc_user_lock); mdd->mdd_cl.mc_lastuser = rec->cur_id; @@ -257,9 +268,9 @@ static int llog_changelog_cancel(const struct lu_env *env, /* 0 or 1 means we're done */ rc = 0; else - CERROR("%s: cancel idx %u of catalog "DOSTID" rc=%d\n", + CERROR("%s: cancel idx %u of catalog "DFID": rc = %d\n", ctxt->loc_obd->obd_name, cathandle->lgh_last_idx, - POSTID(&cathandle->lgh_id.lgl_oi), rc); + PFID(&cathandle->lgh_id.lgl_oi.oi_fid), rc); RETURN(rc); } @@ -416,7 +427,7 @@ static int mdd_changelog_init(const struct lu_env *env, struct mdd_device *mdd) mdd->mdd_cl.mc_index = 0; spin_lock_init(&mdd->mdd_cl.mc_lock); - mdd->mdd_cl.mc_starttime = cfs_time_current_64(); + mdd->mdd_cl.mc_starttime = ktime_get(); spin_lock_init(&mdd->mdd_cl.mc_user_lock); mdd->mdd_cl.mc_lastuser = 0; @@ -493,7 +504,7 @@ mdd_changelog_llog_cancel(const struct lu_env *env, struct mdd_device *mdd, /* Some records were purged, so reset repeat-access time (so we record new mtime update records, so users can see a file has been changed since the last purge) */ - mdd->mdd_cl.mc_starttime = cfs_time_current_64(); + mdd->mdd_cl.mc_starttime = ktime_get(); rc = llog_cancel(env, ctxt, (struct llog_cookie *)&endrec, 0); out: @@ -520,7 +531,7 @@ int mdd_changelog_write_header(const struct lu_env *env, ENTRY; if (mdd->mdd_cl.mc_mask & (1 << CL_MARK)) { - mdd->mdd_cl.mc_starttime = cfs_time_current_64(); + mdd->mdd_cl.mc_starttime = ktime_get(); RETURN(0); } @@ -553,7 +564,7 @@ int mdd_changelog_write_header(const struct lu_env *env, llog_ctxt_put(ctxt); /* assume on or off event; reset repeat-access time */ - mdd->mdd_cl.mc_starttime = cfs_time_current_64(); + mdd->mdd_cl.mc_starttime = ktime_get(); RETURN(rc); } @@ -874,12 +885,17 @@ static int mdd_hsm_actions_llog_fini(const struct lu_env *env, static void mdd_device_shutdown(const struct lu_env *env, struct mdd_device *m, struct lustre_cfg *cfg) { + barrier_deregister(m->mdd_bottom); lfsck_degister(env, m->mdd_bottom); mdd_hsm_actions_llog_fini(env, m); mdd_changelog_fini(env, m); orph_index_fini(env, m); mdd_dot_lustre_cleanup(env, m); - nm_config_file_deregister_tgt(env, mdd2obd_dev(m)->u.obt.obt_nodemap_config_file); + if (mdd2obd_dev(m)->u.obt.obt_nodemap_config_file) { + nm_config_file_deregister_tgt(env, + mdd2obd_dev(m)->u.obt.obt_nodemap_config_file); + mdd2obd_dev(m)->u.obt.obt_nodemap_config_file = NULL; + } if (m->mdd_los != NULL) { local_oid_storage_fini(env, m->mdd_los); m->mdd_los = NULL; @@ -944,7 +960,8 @@ static int mdd_recovery_complete(const struct lu_env *env, next = &mdd->mdd_child->dd_lu_dev; /* XXX: orphans handling. */ - mdd_orphan_cleanup(env, mdd); + if (!mdd->mdd_bottom->dd_rdonly) + mdd_orphan_cleanup(env, mdd); rc = next->ld_ops->ldo_recovery_complete(env, next); RETURN(rc); @@ -977,10 +994,10 @@ int mdd_local_file_create(const struct lu_env *env, struct mdd_device *mdd, *fid = *lu_object_fid(&dto->do_lu); /* since stack is not fully set up the local_storage uses own stack * and we should drop its object from cache */ - lu_object_put_nocache(env, &dto->do_lu); + dt_object_put_nocache(env, dto); EXIT; out_put: - lu_object_put(env, &parent->do_lu); + dt_object_put(env, parent); return rc; } @@ -997,6 +1014,7 @@ static int mdd_prepare(const struct lu_env *env, struct mdd_device *mdd = lu2mdd_dev(cdev); struct lu_device *next = &mdd->mdd_child->dd_lu_dev; struct nm_config_file *nodemap_config; + struct obd_device_target *obt = &mdd2obd_dev(mdd)->u.obt; struct lu_fid fid; int rc; @@ -1060,10 +1078,13 @@ static int mdd_prepare(const struct lu_env *env, nodemap_config = nm_config_file_register_tgt(env, mdd->mdd_bottom, mdd->mdd_los); - if (IS_ERR(nodemap_config)) - GOTO(out_hsm, rc = PTR_ERR(nodemap_config)); - - mdd2obd_dev(mdd)->u.obt.obt_nodemap_config_file = nodemap_config; + if (IS_ERR(nodemap_config)) { + rc = PTR_ERR(nodemap_config); + if (rc != -EROFS) + GOTO(out_hsm, rc); + } else { + obt->obt_nodemap_config_file = nodemap_config; + } rc = lfsck_register(env, mdd->mdd_bottom, mdd->mdd_child, mdd2obd_dev(mdd), mdd_lfsck_out_notify, @@ -1074,11 +1095,20 @@ static int mdd_prepare(const struct lu_env *env, GOTO(out_nodemap, rc); } + rc = barrier_register(mdd->mdd_bottom, mdd->mdd_child); + if (rc) { + CERROR("%s: failed to register to barrier: rc = %d\n", + mdd2obd_dev(mdd)->obd_name, rc); + GOTO(out_lfsck, rc); + } + RETURN(0); +out_lfsck: + lfsck_degister(env, mdd->mdd_bottom); out_nodemap: - nm_config_file_deregister_tgt(env, mdd2obd_dev(mdd)->u.obt.obt_nodemap_config_file); - mdd2obd_dev(mdd)->u.obt.obt_nodemap_config_file = NULL; + nm_config_file_deregister_tgt(env, obt->obt_nodemap_config_file); + obt->obt_nodemap_config_file = NULL; out_hsm: mdd_hsm_actions_llog_fini(env, mdd); out_changelog: @@ -1130,15 +1160,12 @@ static int mdd_statfs(const struct lu_env *env, struct md_device *m, RETURN(rc); } -static int mdd_maxeasize_get(const struct lu_env *env, struct md_device *m, - int *easize) +static const struct dt_device_param *mdd_dtconf_get(const struct lu_env *env, + struct md_device *m) { struct mdd_device *mdd = lu2mdd_dev(&m->md_lu_dev); - ENTRY; - - *easize = mdd->mdd_dt_conf.ddp_max_ea_size; - RETURN(0); + return &mdd->mdd_dt_conf; } static int mdd_llog_ctxt_get(const struct lu_env *env, struct md_device *m, @@ -1320,6 +1347,11 @@ static int mdd_changelog_user_register(const struct lu_env *env, } *id = rec->cur_id = ++mdd->mdd_cl.mc_lastuser; rec->cur_endrec = mdd->mdd_cl.mc_index; + + rec->cur_time = (__u32)get_seconds(); + if (OBD_FAIL_CHECK(OBD_FAIL_TIME_IN_CHLOG_USER)) + rec->cur_time = 0; + spin_unlock(&mdd->mdd_cl.mc_user_lock); rc = llog_cat_add(env, ctxt->loc_handle, &rec->cur_hdr, NULL); @@ -1386,8 +1418,8 @@ static int mdd_changelog_user_purge_cb(const struct lu_env *env, RETURN(rc); } -static int mdd_changelog_user_purge(const struct lu_env *env, - struct mdd_device *mdd, __u32 id) +int mdd_changelog_user_purge(const struct lu_env *env, + struct mdd_device *mdd, __u32 id) { struct mdd_changelog_user_purge mcup = { .mcup_id = id, @@ -1493,6 +1525,11 @@ static int mdd_changelog_clear_cb(const struct lu_env *env, * We now know the record to flush. */ rec->cur_endrec = mcuc->mcuc_endrec; + + rec->cur_time = (__u32)get_seconds(); + if (OBD_FAIL_CHECK(OBD_FAIL_TIME_IN_CHLOG_USER)) + rec->cur_time = 0; + mcuc->mcuc_flush = true; CDEBUG(D_IOCTL, "Rewriting changelog user %u endrec to %llu\n", @@ -1591,27 +1628,24 @@ out: static int mdd_iocontrol(const struct lu_env *env, struct md_device *m, unsigned int cmd, int len, void *karg) { - struct mdd_device *mdd; + struct mdd_device *mdd = lu2mdd_dev(&m->md_lu_dev); struct obd_ioctl_data *data = karg; int rc; - ENTRY; - mdd = lu2mdd_dev(&m->md_lu_dev); - /* Doesn't use obd_ioctl_data */ switch (cmd) { case OBD_IOC_CHANGELOG_CLEAR: { struct changelog_setinfo *cs = karg; + + if (unlikely(!barrier_entry(mdd->mdd_bottom))) + RETURN(-EINPROGRESS); + rc = mdd_changelog_clear(env, mdd, cs->cs_id, cs->cs_recno); + barrier_exit(mdd->mdd_bottom); RETURN(rc); } - case OBD_IOC_GET_MNTOPT: { - mntopt_t *mntopts = (mntopt_t *)karg; - *mntopts = mdd->mdd_dt_conf.ddp_mntopts; - RETURN(0); - } case OBD_IOC_START_LFSCK: { rc = lfsck_start(env, mdd->mdd_bottom, (struct lfsck_start_param *)karg); @@ -1642,10 +1676,18 @@ static int mdd_iocontrol(const struct lu_env *env, struct md_device *m, switch (cmd) { case OBD_IOC_CHANGELOG_REG: + if (unlikely(!barrier_entry(mdd->mdd_bottom))) + RETURN(-EINPROGRESS); + rc = mdd_changelog_user_register(env, mdd, &data->ioc_u32_1); + barrier_exit(mdd->mdd_bottom); break; case OBD_IOC_CHANGELOG_DEREG: + if (unlikely(!barrier_entry(mdd->mdd_bottom))) + RETURN(-EINPROGRESS); + rc = mdd_changelog_user_purge(env, mdd, data->ioc_u32_1); + barrier_exit(mdd->mdd_bottom); break; default: rc = -ENOTTY; @@ -1662,7 +1704,7 @@ static const struct md_device_operations mdd_ops = { .mdo_root_get = mdd_root_get, .mdo_llog_ctxt_get = mdd_llog_ctxt_get, .mdo_iocontrol = mdd_iocontrol, - .mdo_maxeasize_get = mdd_maxeasize_get, + .mdo_dtconf_get = mdd_dtconf_get, }; static struct lu_device_type_operations mdd_device_type_ops = { @@ -1689,14 +1731,15 @@ static struct lu_device_type mdd_device_type = { LU_KEY_INIT(mdd, struct mdd_thread_info); static void mdd_key_fini(const struct lu_context *ctx, - struct lu_context_key *key, void *data) + struct lu_context_key *key, void *data) { - struct mdd_thread_info *info = data; + struct mdd_thread_info *info = data; lu_buf_free(&info->mti_big_buf); lu_buf_free(&info->mti_link_buf); + lu_buf_free(&info->mti_xattr_buf); - OBD_FREE_PTR(info); + OBD_FREE_PTR(info); } /* context key: mdd_thread_key */