Refactor nilfs_cleanerd_clean_segments() with nilfs_xreclaim_segment() function. Signed-off-by: Ryusuke Konishi <konishi.ryusuke@xxxxxxxxxxxxx> --- sbin/cleanerd/cleanerd.c | 57 +++++++++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/sbin/cleanerd/cleanerd.c b/sbin/cleanerd/cleanerd.c index 742ab98..1d09b5b 100644 --- a/sbin/cleanerd/cleanerd.c +++ b/sbin/cleanerd/cleanerd.c @@ -1338,31 +1338,49 @@ static void nilfs_cleanerd_progress(struct nilfs_cleanerd *cleanerd, int nsegs) } } -static ssize_t nilfs_cleanerd_clean_segments(struct nilfs_cleanerd *cleanerd, - __u64 *segnums, size_t nsegs, - __u64 protseq, __u64 prottime) +static int nilfs_cleanerd_clean_segments(struct nilfs_cleanerd *cleanerd, + __u64 *segnums, size_t nsegs, + __u64 protseq, __u64 prottime, + size_t *ncleaned) { - nilfs_cno_t protcno; + struct nilfs_reclaim_params params; + struct nilfs_reclaim_stat stat; int ret, i; - ret = nilfs_cnoconv_time2cno(cleanerd->cnoconv, prottime, &protcno); + params.flags = + NILFS_RECLAIM_PARAM_PROTSEQ | NILFS_RECLAIM_PARAM_PROTCNO; + params.reserved = 0; + params.protseq = protseq; + + ret = nilfs_cnoconv_time2cno(cleanerd->cnoconv, prottime, + ¶ms.protcno); if (ret < 0) { syslog(LOG_ERR, "cannot convert protection time to checkpoint " "number: %m"); goto out; } - ret = nilfs_reclaim_segment(cleanerd->nilfs, segnums, nsegs, - protseq, protcno); - if (ret > 0) { - for (i = 0; i < ret; i++) + memset(&stat, 0, sizeof(stat)); + ret = nilfs_xreclaim_segment(cleanerd->nilfs, segnums, nsegs, 0, + ¶ms, &stat); + if (ret < 0) { + if (errno == ENOMEM) { + nilfs_cleanerd_reduce_ncleansegs_for_retry(cleanerd); + cleanerd->fallback = 1; + *ncleaned = 0; + ret = 0; + } + goto out; + } + + if (stat.cleaned_segs > 0) { + for (i = 0; i < stat.cleaned_segs; i++) syslog(LOG_DEBUG, "segment %llu cleaned", (unsigned long long)segnums[i]); - nilfs_cleanerd_progress(cleanerd, ret); + nilfs_cleanerd_progress(cleanerd, stat.cleaned_segs); cleanerd->fallback = 0; cleanerd->retry_cleaning = 0; - - } else if (ret == 0) { + } else { syslog(LOG_DEBUG, "no segments cleaned"); if (!cleanerd->retry_cleaning && @@ -1375,12 +1393,8 @@ static ssize_t nilfs_cleanerd_clean_segments(struct nilfs_cleanerd *cleanerd, } else { cleanerd->retry_cleaning = 0; } - - } else if (ret < 0 && errno == ENOMEM) { - nilfs_cleanerd_reduce_ncleansegs_for_retry(cleanerd); - cleanerd->fallback = 1; - ret = 0; } + *ncleaned = stat.cleaned_segs; out: return ret; } @@ -1395,7 +1409,8 @@ static int nilfs_cleanerd_clean_loop(struct nilfs_cleanerd *cleanerd) __u64 prottime = 0, oldest = 0; __u64 segnums[NILFS_CLDCONFIG_NSEGMENTS_PER_CLEAN_MAX]; sigset_t sigset; - int ns, ndone, ret; + size_t ndone; + int ns, ret; sigemptyset(&sigset); if (sigprocmask(SIG_SETMASK, &sigset, NULL) < 0) { @@ -1466,10 +1481,10 @@ static int nilfs_cleanerd_clean_loop(struct nilfs_cleanerd *cleanerd) ns, (ns <= 1) ? "" : "s"); ndone = 0; if (ns > 0) { - ndone = nilfs_cleanerd_clean_segments( + ret = nilfs_cleanerd_clean_segments( cleanerd, segnums, ns, sustat.ss_prot_seq, - prottime); - if (ndone < 0) + prottime, &ndone); + if (ret < 0) return -1; } else { cleanerd->retry_cleaning = 0; -- 1.7.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-nilfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html