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. 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