]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blobdiff - spaceman/freesp.c
xfs: don't assert when on-disk btree pointers are garbage
[thirdparty/xfsprogs-dev.git] / spaceman / freesp.c
index 99e50cff04294e9a95fabcecc8c783d86b541164..367c95d115049301c1d2610352b6477f73cff5fc 100644 (file)
@@ -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,7 +230,18 @@ 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);
+       }
+       free(fsmap);
 }
+
 static void
 aglistadd(
        char            *a)
@@ -251,14 +267,14 @@ init(
        int             c;
        int             speced = 0;     /* only one of -b -e -h or -m */
 
-       agcount = dumpflag = equalsize = multsize = optind = 0;
+       agcount = dumpflag = equalsize = multsize = optind = gflag = 0;
        histcount = seen1 = summaryflag = 0;
        totblocks = totexts = 0;
        aglist = NULL;
        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 +296,10 @@ init(
                                return command_usage(&freesp_cmd);
                        speced = 1;
                        break;
+               case 'g':
+                       histcount = 0;
+                       gflag++;
+                       break;
                case 'h':
                        if (speced && !histcount)
                                goto many_spec;
@@ -331,13 +351,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 +385,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 +405,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;