]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
db: don't claim unchecked CRCs are correct
authorDave Chinner <dchinner@redhat.com>
Thu, 1 May 2014 23:30:39 +0000 (09:30 +1000)
committerDave Chinner <david@fromorbit.com>
Thu, 1 May 2014 23:30:39 +0000 (09:30 +1000)
Currently xfs_db will claim the CRC on a structure is correct if the
buffer is not marked with an error. However, buffers may have been
read without a verifier, and hence have not had their CRCs
validated. in this case, we shoul dreport "unchecked" rather than
"correct". For example:

xfs_db> fsb 0x6003f
xfs_db> type dir3
xfs_db> p
dhdr.hdr.magic = 0x58444433
dhdr.hdr.crc = 0x2d0f9c9d (unchecked)
....

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Dave Chinner <david@fromorbit.com>
db/fprint.c
db/io.c
db/io.h
include/libxfs.h

index 435d984f3c5b49a4a51816d8313e2fc85da53976..52782e24bae14d954edb2696534358f3a78d80dd 100644 (file)
@@ -206,7 +206,20 @@ fp_crc(
        __int64_t       val;
        char            *ok;
 
-       ok = iocur_crc_valid() ? "correct" : "bad";
+       switch (iocur_crc_valid()) {
+       case -1:
+               ok = "unchecked";
+               break;
+       case 0:
+               ok = "bad";
+               break;
+       case 1:
+               ok = "correct";
+               break;
+       default:
+               ok = "unknown state";
+               break;
+       }
 
        for (i = 0, bitpos = bit;
             i < count && !seenint();
diff --git a/db/io.c b/db/io.c
index 5eb61d920e2fd4ad45d1b599b613b395af47e026..387f17156a9f2dd78e8dfd09e993aafbb69f9b62 100644 (file)
--- a/db/io.c
+++ b/db/io.c
@@ -531,6 +531,8 @@ set_cur(
                return;
        iocur_top->buf = bp->b_addr;
        iocur_top->bp = bp;
+       if (!ops)
+               bp->b_flags |= LIBXFS_B_UNCHECKED;
 
        iocur_top->bb = d;
        iocur_top->blen = c;
diff --git a/db/io.h b/db/io.h
index ad39beee2c3295554876877de469e848334eac8e..7875119c63c0a7727941ee206b759083e1bf1bdd 100644 (file)
--- a/db/io.h
+++ b/db/io.h
@@ -63,10 +63,16 @@ extern void set_cur(const struct typ *t, __int64_t d, int c, int ring_add,
                        bbmap_t *bbmap);
 extern void     ring_add(void);
 
-static inline bool
+/*
+ * returns -1 for unchecked, 0 for bad and 1 for good
+ */
+static inline int
 iocur_crc_valid()
 {
-       return (iocur_top->bp &&
-               iocur_top->bp->b_error != EFSBADCRC &&
+       if (!iocur_top->bp)
+               return -1;
+       if (iocur_top->bp->b_flags & LIBXFS_B_UNCHECKED)
+               return -1;
+       return (iocur_top->bp->b_error != EFSBADCRC &&
                (!iocur_top->ino_buf || iocur_top->ino_crc_ok));
 }
index 6bc6c945a73cb13820f763b3ef7f215a4e75720c..6b1e27628f8d2f6ddce7c11c14015aebe616946f 100644 (file)
@@ -333,6 +333,7 @@ enum xfs_buf_flags_t {      /* b_flags bits */
        LIBXFS_B_STALE          = 0x0004,       /* buffer marked as invalid */
        LIBXFS_B_UPTODATE       = 0x0008,       /* buffer is sync'd to disk */
        LIBXFS_B_DISCONTIG      = 0x0010,       /* discontiguous buffer */
+       LIBXFS_B_UNCHECKED      = 0x0020,       /* needs verification */
 };
 
 #define XFS_BUF_DADDR_NULL             ((xfs_daddr_t) (-1LL))