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>
__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();
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;
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));
}
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))