]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
db: limit AGFL bno array printing
authorDave Chinner <dchinner@redhat.com>
Mon, 30 May 2016 00:33:16 +0000 (10:33 +1000)
committerDave Chinner <david@fromorbit.com>
Mon, 30 May 2016 00:33:16 +0000 (10:33 +1000)
When asking for a single agfl entry such as:

# xfs_db -c "agfl 0" -c "p bno[1]" /dev/ram0
bno[1] = 1:6 2:7 3:8 4:null .....

The result should be just the single entry being asked for.
Currently this outputs the entire remainder of the array starting at
the given index. This makes it difficult to extract single entry
values.

This occurs because the printing of a flat array of number types
does not take into account the range that is specified on the
command line, which is held in fl->low and fl->high. To make this
work for flat arrays of number types (print function fp_num), change
print_flist() to limit the count of values to be emitted to the
range specified. This now gives:

# xfs_db -c "agfl 0" -c "p bno[1-2]" /dev/ram0
bno[1-2] = 1:6 2:7

To further simplify external parsing of single entry values, if only
a single value is requested from the array of fp_num type, don't
print the array index - it's already known. Hence:

# xfs_db -c "agfl 0" -c "p bno[1]" /dev/ram0
bno[1] = 6

This change will take effect on all types of flat number arrays that
are printed. e.g. the range limiting will work for things like the
AGI unlinked list arrays.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Dave Chinner <david@fromorbit.com>
db/fprint.c
db/print.c

index f2b3794abe45e44e3af98daae57a3c100a38e5fb..fd7e7f45760cde0430707add127f46bced54646e 100644 (file)
@@ -93,7 +93,7 @@ fp_num(
                        val == -1LL : val == ((1LL << size) - 1LL);
                if ((arg & FTARG_SKIPNULL) && isnull)
                        continue;
-               if (array)
+               if (array && count > 1)
                        dbprintf("%d:", i + base);
                if ((arg & FTARG_DONULL) && isnull)
                        dbprintf(_("null"));
index 3ff2548e9fe30c6cc17d1d57aa65f796160107bb..998daf45d54d74f2e2ccda14fc0fc8606fc5f280 100644 (file)
@@ -107,6 +107,7 @@ print_flist_1(
        const ftattr_t  *fa;
        flist_t         *fl;
        int             low;
+       int             count;
        int             neednl;
        char            **pfx;
 
@@ -139,10 +140,12 @@ print_flist_1(
                                low = fl->low;
                        else
                                low = 0;
+                       count = fcount(f, iocur_top->data, parentoff);
+                       if (fl->flags & FL_OKHIGH)
+                               count = min(count, fl->high - low + 1);
                        if (fa->prfunc) {
                                neednl = fa->prfunc(iocur_top->data, fl->offset,
-                                       fcount(f, iocur_top->data, parentoff),
-                                       fa->fmtstr,
+                                       count, fa->fmtstr,
                                        fsize(f, iocur_top->data, parentoff, 0),
                                        fa->arg, low,
                                        (f->flags & FLD_ARRAY) != 0);