On 4/11/17 9:09 PM, Eric Sandeen wrote: > On 4/11/17 5:53 PM, Darrick J. Wong wrote: >> From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> >> >> Add a helper function to xfs_db so that we can recalculate the CRC of an >> inode whose field we just wrote. This enables us to write arbitrary >> values with a good CRC for the purpose of checking the read verifiers on >> a v5 filesystem. Mention this newfound ability in the manpage. > > -d isn't new, so I'd really rather have a patch to document the existing > behavior, followed by a patch to extend it to inodes. > > There are actually several structures for which -d still won't work, so > it would be good if that fact were documented - reading "including > inodes" may leave some heads scratching. > > Let me ruminate on the inode crc writing, I have this nagging feeling > that there's an easier generic way to handle these structures, > ...but I'm probably wrong. I don't know where I was going with that idea. :/ I can split this up into a manpage patch and an inode crc patch on the way in if you'd like. For the content as-is, Reviewed-by: Eric Sandeen <sandeen@xxxxxxxxxx> -Eric > Thanks, > -Eric > >> Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> >> --- >> db/io.c | 11 +++++++++++ >> db/io.h | 1 + >> db/write.c | 7 ++++++- >> man/man8/xfs_db.8 | 7 ++++++- >> 4 files changed, 24 insertions(+), 2 deletions(-) >> >> diff --git a/db/io.c b/db/io.c >> index f398195..67ed5f9 100644 >> --- a/db/io.c >> +++ b/db/io.c >> @@ -465,6 +465,17 @@ xfs_dummy_verify( >> } >> >> void >> +xfs_verify_recalc_inode_crc( >> + struct xfs_buf *bp) >> +{ >> + ASSERT(iocur_top->ino_buf); >> + ASSERT(iocur_top->bp == bp); >> + >> + libxfs_dinode_calc_crc(mp, iocur_top->data); >> + iocur_top->ino_crc_ok = 1; >> +} >> + >> +void >> xfs_verify_recalc_crc( >> struct xfs_buf *bp) >> { >> diff --git a/db/io.h b/db/io.h >> index c69e9ce..12d96c2 100644 >> --- a/db/io.h >> +++ b/db/io.h >> @@ -64,6 +64,7 @@ extern void set_cur(const struct typ *t, __int64_t d, int c, int ring_add, >> extern void ring_add(void); >> extern void set_iocur_type(const struct typ *t); >> extern void xfs_dummy_verify(struct xfs_buf *bp); >> +extern void xfs_verify_recalc_inode_crc(struct xfs_buf *bp); >> extern void xfs_verify_recalc_crc(struct xfs_buf *bp); >> >> /* >> diff --git a/db/write.c b/db/write.c >> index 5c83874..70c9865 100644 >> --- a/db/write.c >> +++ b/db/write.c >> @@ -137,7 +137,9 @@ write_f( >> return 0; >> } >> >> - if (invalid_data && iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF) { >> + if (invalid_data && >> + iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF && >> + !iocur_top->ino_buf) { >> dbprintf(_("Cannot recalculate CRCs on this type of object\n")); >> return 0; >> } >> @@ -164,6 +166,9 @@ write_f( >> if (corrupt) { >> local_ops.verify_write = xfs_dummy_verify; >> dbprintf(_("Allowing write of corrupted data and bad CRC\n")); >> + } else if (iocur_top->ino_buf) { >> + local_ops.verify_write = xfs_verify_recalc_inode_crc; >> + dbprintf(_("Allowing write of corrupted inode with good CRC\n")); >> } else { /* invalid data */ >> local_ops.verify_write = xfs_verify_recalc_crc; >> dbprintf(_("Allowing write of corrupted data with good CRC\n")); >> diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 >> index 460d89d..b1c341d 100644 >> --- a/man/man8/xfs_db.8 >> +++ b/man/man8/xfs_db.8 >> @@ -755,7 +755,7 @@ and >> bits respectively, and their string equivalent reported >> (but no modifications are made). >> .TP >> -.BI "write [\-c] [" "field value" "] ..." >> +.BI "write [\-c] [\-d] [" "field value" "] ..." >> Write a value to disk. >> Specific fields can be set in structures (struct mode), >> or a block can be set to data values (data mode), >> @@ -778,6 +778,11 @@ with no arguments gives more information on the allowed commands. >> .B \-c >> Skip write verifiers and CRC recalculation; allows invalid data to be written >> to disk. >> +.TP 0.4i >> +.B \-d >> +Skip write verifiers but perform CRC recalculation. >> +This allows invalid data, including inodes, to be written to disk to >> +test detection of invalid data. >> .RE >> .SH TYPES >> This section gives the fields in each structure type and their meanings. >> > > -- > 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