Hi, here the changes Thank in advance, David Arendt On 03/29/10 05:59, Ryusuke Konishi wrote: > Hi, > On Sun, 28 Mar 2010 23:52:52 +0200, David Arendt <admin@xxxxxxxxx> wrote: > >> Hi, >> >> thanks for applying the patches. I did all my tests on 2 gbyte loop >> devices and now that it is officially in git, I deployed it to some >> production systems with big disks. Here I have noticed, that I have >> completely forgotten the reserved segments. Technically this is not a >> problem, but I think people changing configuration files will tend to >> forget about it. I'm thinking it might be useful to add them internally >> to min_free_segments and max_free_segments so users don't need to worry >> about them. What do you think ? >> > Ahh, we should take into account the number of reserved segments. If > not so, cleaner control with the two threshold values will not work > properly for large drives. > > >> If you like to change the current behavior to this behavior, I will >> submit a short update patch. >> > Yes, please do. > > >> I am thinking about getting the number of reserved segments this way: >> >> (nilfs_cleanerd->c_nilfs->n_sb->s_nsegments * >> nilfs_cleanerd->c_nilfs->n_sb->s_r_segments_percentage) / 100 >> >> or do you know any better way ? >> > The kernel code calulates the number by: > > = max(NILFS_MIN_NRSVSEGS, > DIV_ROUND_UP(nsegments * r_segments_percentage, 100)) > > where NILFS_MIN_NRSVSEGS is defined in include/nilfs2_fs.h, and > DIV_ROUND_UP is defined as follows: > > #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) > > The same or some equivelent calculation seems preferable. > > With regards, > Ryusuke Konishi > > >> On 03/28/10 17:26, Ryusuke Konishi wrote: >> >>> Hi, >>> On Sun, 28 Mar 2010 14:17:00 +0200, David Arendt <admin@xxxxxxxxx> wrote: >>> >>> >>>> Hi, >>>> >>>> here the nogc patch >>>> >>>> As changelog description for this one, we could put: >>>> >>>> add mount option to disable garbage collection >>>> >>>> Thanks in advance >>>> Bye, >>>> David Arendt >>>> >>>> >>> Hmm, the patch looks perfect. >>> >>> Will queue both in the git tree of utils. >>> >>> Thanks, >>> Ryusuke Konishi >>> >>> >>
diff -ur nilfs2-utils.orig/sbin/cleanerd/cleanerd.c nilfs2-utils/sbin/cleanerd/cleanerd.c --- nilfs2-utils.orig/sbin/cleanerd/cleanerd.c 2010-03-29 06:05:51.382126765 +0200 +++ nilfs2-utils/sbin/cleanerd/cleanerd.c 2010-03-29 06:32:09.129775882 +0200 @@ -1185,7 +1185,7 @@ static int nilfs_cleanerd_clean_loop(struct nilfs_cleanerd *cleanerd) { struct nilfs_sustat sustat; - __u64 prev_nongc_ctime = 0, prottime = 0, oldest = 0; + __u64 r_segments, prev_nongc_ctime = 0, prottime = 0, oldest = 0; __u64 segnums[NILFS_CLDCONFIG_NSEGMENTS_PER_CLEAN_MAX]; struct timespec timeout; sigset_t sigset; @@ -1215,6 +1215,10 @@ cleanerd->c_ncleansegs = cleanerd->c_config.cf_nsegments_per_clean; + r_segments = ((nilfs_cleanerd->c_nilfs->n_sb->s_nsegments * nilfs_cleanerd->c_nilfs->n_sb->s_r_segments_percentage) + 99) / 100; + if (r_segments < NILFS_MIN_NRSVSEGS) + r_segments = NILFS_MIN_NRSVSEGS; + if (cleanerd->c_config.cf_min_clean_segments > 0) nilfs_cleanerd_clean_check_pause(cleanerd, &timeout); else @@ -1242,13 +1246,13 @@ if (cleanerd->c_config.cf_min_clean_segments > 0) { if (cleanerd->c_running) { - if (sustat.ss_ncleansegs > cleanerd->c_config.cf_max_clean_segments) { + if (sustat.ss_ncleansegs > cleanerd->c_config.cf_max_clean_segments + r_segments) { nilfs_cleanerd_clean_check_pause(cleanerd, &timeout); goto sleep; } } else { - if (sustat.ss_ncleansegs < cleanerd->c_config.cf_min_clean_segments) + if (sustat.ss_ncleansegs < cleanerd->c_config.cf_min_clean_segments + r_segments) nilfs_cleanerd_clean_check_resume(cleanerd); else goto sleep;