__u32 mcgc_id;
__u32 mcgc_maxtime;
__u64 mcgc_maxindexes;
- bool mcgc_found;
+ char mcgc_name[CHANGELOG_USER_NAMELEN_FULL];
};
/* return first registered ChangeLog user idle since too long
struct llog_handle *llh,
struct llog_rec_hdr *hdr, void *data)
{
- struct llog_changelog_user_rec *rec;
- struct mdd_changelog_gc *mcgc = (struct mdd_changelog_gc *)data;
+ struct llog_changelog_user_rec2 *rec;
+ struct mdd_changelog_gc *mcgc = data;
struct mdd_device *mdd = mcgc->mcgc_mdd;
+
ENTRY;
if ((llh->lgh_hdr->llh_flags & LLOG_F_IS_PLAIN) == 0)
RETURN(-ENXIO);
- rec = container_of(hdr, struct llog_changelog_user_rec,
- cur_hdr);
+ rec = container_of(hdr, typeof(*rec), cur_hdr);
/* find oldest idle user, based on last record update/cancel time (new
* behavior), or for old user records, last record index vs current
* first as we assume they could be idle since longer
*/
if (rec->cur_time != 0) {
- /* FIXME !!!! cur_time is a timestamp but only 32 bit in
- * in size. This is not 2038 safe !!!!
- */
u32 time_now = (u32)ktime_get_real_seconds();
timeout_t time_out = rec->cur_time +
mdd->mdd_changelog_max_idle_time;
mcgc->mcgc_maxindexes == 0) {
mcgc->mcgc_maxtime = idle_time;
mcgc->mcgc_id = rec->cur_id;
- mcgc->mcgc_found = true;
+ mdd_chlg_username(rec, mcgc->mcgc_name,
+ sizeof(mcgc->mcgc_name));
}
} else {
/* old user record with no idle time stamp, so use empirical
idle_indexes > mcgc->mcgc_maxindexes) {
mcgc->mcgc_maxindexes = idle_indexes;
mcgc->mcgc_id = rec->cur_id;
- mcgc->mcgc_found = true;
+ mdd_chlg_username(rec, mcgc->mcgc_name,
+ sizeof(mcgc->mcgc_name));
}
}
/* recover space from long-term inactive ChangeLog users */
static int mdd_chlg_garbage_collect(void *data)
{
- struct mdd_device *mdd = (struct mdd_device *)data;
- struct lu_env *env = NULL;
- int rc;
+ struct mdd_device *mdd = data;
+ struct lu_env *env = NULL;
+ int rc;
struct llog_ctxt *ctxt;
- struct mdd_changelog_gc mcgc = {
- .mcgc_mdd = mdd,
- .mcgc_found = false,
- .mcgc_maxtime = 0,
- .mcgc_maxindexes = 0,
- };
+
ENTRY;
mdd->mdd_cl.mc_gc_task = current;
GOTO(out, rc);
for (;;) {
+ struct mdd_changelog_gc mcgc = {
+ .mcgc_mdd = mdd,
+ .mcgc_maxtime = 0,
+ .mcgc_maxindexes = 0,
+ };
+
ctxt = llog_get_context(mdd2obd_dev(mdd),
LLOG_CHANGELOG_USER_ORIG_CTXT);
if (ctxt == NULL ||
rc = llog_cat_process(env, ctxt->loc_handle,
mdd_changelog_gc_cb, &mcgc, 0, 0);
- if (rc != 0 || mcgc.mcgc_found == false)
+ if (rc != 0 || !mcgc.mcgc_name[0])
break;
llog_ctxt_put(ctxt);
if (mcgc.mcgc_maxindexes != 0)
- CWARN("%s: Force deregister of ChangeLog user cl%d "
- "idle with more than %llu unprocessed records\n",
- mdd2obd_dev(mdd)->obd_name, mcgc.mcgc_id,
+ CWARN("%s: Force deregister of ChangeLog user %s idle with more than %llu unprocessed records\n",
+ mdd2obd_dev(mdd)->obd_name, mcgc.mcgc_name,
mcgc.mcgc_maxindexes);
else
- CWARN("%s: Force deregister of ChangeLog user cl%d "
- "idle since more than %us\n",
- mdd2obd_dev(mdd)->obd_name, mcgc.mcgc_id,
+ CWARN("%s: Force deregister of ChangeLog user %s idle since more than %us\n",
+ mdd2obd_dev(mdd)->obd_name, mcgc.mcgc_name,
mcgc.mcgc_maxtime);
mdd_changelog_user_purge(env, mdd, mcgc.mcgc_id);
if (kthread_should_stop())
GOTO(out_env, rc = 0);
-
- /* try again to search for another candidate */
- mcgc.mcgc_found = false;
- mcgc.mcgc_maxtime = 0;
- mcgc.mcgc_maxindexes = 0;
}
out_ctxt: