Details
-
Bug
-
Resolution: Fixed
-
Minor
-
None
-
3
-
9223372036854775807
Description
When storing changelogs we do not strictly order the entries with respect to index.
int mdd_changelog_store(const struct lu_env *env, struct mdd_device *mdd, struct llog_changelog_rec *rec, struct thandle *th) { ... /* llog_lvfs_write_rec sets the llog tail len */ rec->cr_hdr.lrh_type = CHANGELOG_REC; rec->cr.cr_time = cl_time(); spin_lock(&mdd->mdd_cl.mc_lock); /* NB: I suppose it's possible llog_add adds out of order wrt cr_index, * but as long as the MDD transactions are ordered correctly for e.g. * rename conflicts, I don't think this should matter. */ 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); if (ctxt == NULL) return -ENXIO; llog_th = thandle_get_sub(env, th, ctxt->loc_handle->lgh_obj); if (IS_ERR(llog_th)) GOTO(out_put, rc = PTR_ERR(llog_th)); /* nested journal transaction */ rc = llog_add(env, ctxt->loc_handle, &rec->cr_hdr, NULL, llog_th);
This may not be a bug in itself but it means that a changelog consumer must account for gaps in the sequence when clearing changelog entries.