Re: [PATCH] xfs_db: allow write -d to inodes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux