On Tue, Apr 11, 2017 at 09:58:44PM -0500, Eric Sandeen wrote: > 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. Works for me. --D > > 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 -- 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