th = mdd_child_ops(mdd)->dt_trans_create(env, mdd->mdd_child);
if (!IS_ERR(th) && uc)
- th->th_ignore_quota = !!md_capable(uc, CAP_SYS_RESOURCE);
+ th->th_ignore_quota = !!cap_raised(uc->uc_cap, CAP_SYS_RESOURCE);
return th;
}
rec = container_of(hdr, typeof(*rec), cur_hdr);
- if (mdd_changelog_is_too_idle(mdd, rec->cur_endrec, rec->cur_time) &&
- rec->cur_endrec < mcgc->mcgc_minrec) {
+ if (rec->cur_endrec < mcgc->mcgc_minrec &&
+ (mdd->mdd_changelog_emrg_gc ||
+ mdd_changelog_is_too_idle(mdd, rec->cur_endrec, rec->cur_time))) {
mcgc->mcgc_mintime = rec->cur_time;
mcgc->mcgc_minrec = rec->cur_endrec;
mcgc->mcgc_id = rec->cur_id;
mdd_changelog_user_purge(env, mdd, mcgc.mcgc_id);
+ if (mdd->mdd_changelog_emrg_gc &&
+ mdd_changelog_is_space_safe(env, mdd, ctxt->loc_handle, 0))
+ mdd->mdd_changelog_emrg_gc = false;
+
if (kthread_should_stop())
GOTO(out_ctxt, rc = 0);
}