On 6/15/17 3:37 PM, Darrick J. Wong wrote: > From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > > Add a -g switch to show only a per-group summary. > > Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> with a small fix (see below) Reviewed-by: Eric Sandeen <sandeen@xxxxxxxxxx> > --- > man/man8/xfs_spaceman.8 | 6 +++++- > spaceman/freesp.c | 27 ++++++++++++++++++++++++--- > 2 files changed, 29 insertions(+), 4 deletions(-) > > > diff --git a/man/man8/xfs_spaceman.8 b/man/man8/xfs_spaceman.8 > index f064360..0302196 100644 > --- a/man/man8/xfs_spaceman.8 > +++ b/man/man8/xfs_spaceman.8 > @@ -25,7 +25,7 @@ then the program exits. > > .SH COMMANDS > .TP > -.BI "freesp [ \-drs ] [-a agno] [ \-b | \-e bsize | \-h bsize | \-m factor ]" > +.BI "freesp [ \-dgrs ] [-a agno] [ \-b | \-e bsize | \-h bsize | \-m factor ]" > With no arguments, > .B freesp > shows a histogram of all free space extents in the filesystem. > @@ -49,6 +49,10 @@ This is the default, and is mutually exclusive with the > Print debugging information such as the raw free space extent information. > > .TP > +.B \-g > +Print the free space block and extent counts for each AG. > + > +.TP > .B \-e bsize > Set all histogram bin sizes to a specific value. > This option is mutually exclusive with the > diff --git a/spaceman/freesp.c b/spaceman/freesp.c > index 99e50cf..79eea44 100644 > --- a/spaceman/freesp.c > +++ b/spaceman/freesp.c > @@ -43,6 +43,7 @@ static long long multsize; > static int histcount; > static int seen1; > static int summaryflag; > +static int gflag; > static bool rtflag; > static long long totblocks; > static long long totexts; > @@ -164,6 +165,8 @@ scan_ag( > off64_t bperag; > off64_t aglen; > xfs_agblock_t agbno; > + unsigned long long freeblks = 0; > + unsigned long long freeexts = 0; > int ret; > int i; > > @@ -216,6 +219,8 @@ scan_ag( > agbno = (extent->fmr_physical - (bperag * agno)) / > blocksize; > aglen = extent->fmr_length / blocksize; > + freeblks += aglen; > + freeexts++; > > addtohist(agno, agbno, aglen); > } > @@ -225,6 +230,15 @@ scan_ag( > break; > fsmap_advance(fsmap); > } > + > + if (gflag) { > + if (agno == NULLAGNUMBER) > + printf(_(" rtdev %10llu %10llu\n"), freeexts, > + freeblks); > + else > + printf(_("%10u %10llu %10llu\n"), agno, freeexts, > + freeblks); > + } > } > static void > aglistadd( > @@ -258,7 +272,7 @@ init( > hist = NULL; > rtflag = false; > > - while ((c = getopt(argc, argv, "a:bde:h:m:rs")) != EOF) { > + while ((c = getopt(argc, argv, "a:bde:gh:m:rs")) != EOF) { > switch (c) { > case 'a': > aglistadd(optarg); > @@ -280,6 +294,10 @@ init( > return command_usage(&freesp_cmd); > speced = 1; > break; > + case 'g': > + histcount = 0; > + gflag++; > + break; This global needs to be reset in init() or it sticks: (I can fix it on the way in) xfs_spaceman> freesp from to extents blocks pct 1 1 647503 647503 1.69 2 3 334189 790976 2.07 4 7 369499 2009667 5.26 8 15 116258 1233152 3.23 16 31 16648 370824 0.97 32 63 8817 387963 1.01 64 127 5474 487854 1.28 128 255 3483 631960 1.65 256 511 2613 956121 2.50 512 1023 1758 1249204 3.27 1024 2047 828 1151649 3.01 2048 4095 357 972144 2.54 4096 8191 122 687724 1.80 8192 16383 38 432634 1.13 16384 32767 23 566786 1.48 32768 65535 15 765430 2.00 65536 131071 14 1359754 3.56 131072 262143 4 653264 1.71 262144 524287 4 1775562 4.64 524288 1048575 2 1390287 3.64 1048576 2097151 2 2446908 6.40 2097152 4194303 2 6234130 16.31 4194304 8388607 2 11023746 28.84 xfs_spaceman> freesp -g AG extents blocks 0 280589 6629403 1 289696 11847480 2 14299 7806587 3 923071 11941772 xfs_spaceman> freesp AG extents blocks 0 280589 6629403 1 289696 11847480 2 14299 7806587 3 923071 11941772 > case 'h': > if (speced && !histcount) > goto many_spec; > @@ -331,13 +349,15 @@ freesp_f( > > if (!init(argc, argv)) > return 0; > + if (gflag) > + printf(_(" AG extents blocks\n")); > if (rtflag) > scan_ag(NULLAGNUMBER); > for (agno = 0; !rtflag && agno < file->geom.agcount; agno++) { > if (inaglist(agno)) > scan_ag(agno); > } > - if (histcount) > + if (histcount && !gflag) > printhist(); > if (summaryflag) { > printf(_("total free extents %lld\n"), totexts); > @@ -363,6 +383,7 @@ freesp_help(void) > " -b -- binary histogram bin size\n" > " -d -- debug output\n" > " -e bsize -- Use fixed histogram bin size of bsize\n" > +" -g -- Print only a per-AG summary.\n" > " -h hbsz -- Use custom histogram bin size of h1.\n" > " Multiple specifications are allowed.\n" > " -m bmult -- Use histogram bin size multiplier of bmult.\n" > @@ -382,7 +403,7 @@ freesp_init(void) > freesp_cmd.cfunc = freesp_f; > freesp_cmd.argmin = 0; > freesp_cmd.argmax = -1; > - freesp_cmd.args = "[-drs] [-a agno]... [ -b | -e bsize | -h h1... | -m bmult ]"; > + freesp_cmd.args = "[-dgrs] [-a agno]... [ -b | -e bsize | -h h1... | -m bmult ]"; > freesp_cmd.flags = CMD_FLAG_ONESHOT; > freesp_cmd.oneline = _("Examine filesystem free space"); > freesp_cmd.help = freesp_help; > > -- > To unsubscribe from this list: send the line "unsubscribe linux-xfs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html