From: Eric Sandeen Date: Fri, 4 Aug 2017 21:33:52 +0000 (-0500) Subject: xfs_db: use TYP_F_CRC_FUNC for inodes & dquots X-Git-Tag: v4.13.0-rc1~27 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1e9c13c58d5cd6c7b83987b6189e47671863b65f;p=thirdparty%2Fxfsprogs-dev.git xfs_db: use TYP_F_CRC_FUNC for inodes & dquots Now that typ_t has a ->set_crc method, use it for inodes & dquots as well, rather than recognizing them as special types and calling their crc functions directly by name. Signed-off-by: Eric Sandeen Reviewed-by: Darrick J. Wong Signed-off-by: Eric Sandeen --- diff --git a/db/dquot.c b/db/dquot.c index 061eca5df..4e35df42b 100644 --- a/db/dquot.c +++ b/db/dquot.c @@ -170,6 +170,17 @@ dquot_f( return 0; } +void +xfs_dquot_set_crc( + struct xfs_buf *bp) +{ + ASSERT((iocur_top->dquot_buf)); + ASSERT(iocur_top->bp == bp); + + xfs_update_cksum(iocur_top->data, sizeof(struct xfs_dqblk), + XFS_DQUOT_CRC_OFF); +} + void dquot_init(void) { diff --git a/db/dquot.h b/db/dquot.h index 83a51189c..12a724468 100644 --- a/db/dquot.h +++ b/db/dquot.h @@ -20,4 +20,5 @@ extern const struct field disk_dquot_flds[]; extern const struct field dqblk_flds[]; extern const struct field dqblk_hfld[]; +extern void xfs_dquot_set_crc(struct xfs_buf *); extern void dquot_init(void); diff --git a/db/fuzz.c b/db/fuzz.c index e1c2045a4..a9b157703 100644 --- a/db/fuzz.c +++ b/db/fuzz.c @@ -125,8 +125,7 @@ fuzz_f( return 0; } - if (invalid_data && iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF && - !iocur_top->ino_buf && !iocur_top->dquot_buf) { + if (invalid_data && iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF) { dbprintf(_("Cannot recalculate CRCs on this type of object\n")); return 0; } @@ -153,12 +152,6 @@ fuzz_f( if (corrupt) { local_ops.verify_write = xfs_dummy_verify; dbprintf(_("Allowing fuzz of corrupted data and bad CRC\n")); - } else if (iocur_top->ino_buf) { - local_ops.verify_write = xfs_verify_recalc_inode_crc; - dbprintf(_("Allowing fuzz of corrupted inode with good CRC\n")); - } else if (iocur_top->dquot_buf) { - local_ops.verify_write = xfs_verify_recalc_dquot_crc; - dbprintf(_("Allowing fuzz of corrupted dquot with good CRC\n")); } else if (iocur_top->typ->crc_off == TYP_F_CRC_FUNC) { local_ops.verify_write = iocur_top->typ->set_crc; dbprintf(_("Allowing fuzz of corrupted data with good CRC\n")); diff --git a/db/inode.c b/db/inode.c index 6cc47d6a7..6f971c63a 100644 --- a/db/inode.c +++ b/db/inode.c @@ -711,3 +711,14 @@ _("Metadata CRC error detected for ino %lld\n"), /* track updated info in ring */ ring_add(); } + +void +xfs_inode_set_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; +} diff --git a/db/inode.h b/db/inode.h index 1624f1d58..d79b0a4c7 100644 --- a/db/inode.h +++ b/db/inode.h @@ -33,4 +33,5 @@ extern void inode_init(void); extern typnm_t inode_next_type(void); extern int inode_size(void *obj, int startoff, int idx); extern int inode_u_size(void *obj, int startoff, int idx); +extern void xfs_inode_set_crc(struct xfs_buf *); extern void set_cur_inode(xfs_ino_t ino); diff --git a/db/io.c b/db/io.c index fd9b9f4b0..271625510 100644 --- a/db/io.c +++ b/db/io.c @@ -22,6 +22,7 @@ #include "faddr.h" #include "fprint.h" #include "field.h" +#include "dquot.h" #include "inode.h" #include "io.h" #include "output.h" @@ -465,28 +466,6 @@ xfs_dummy_verify( return; } -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_dquot_crc( - struct xfs_buf *bp) -{ - ASSERT((iocur_top->dquot_buf)); - ASSERT(iocur_top->bp == bp); - - xfs_update_cksum(iocur_top->data, sizeof(struct xfs_dqblk), - XFS_DQUOT_CRC_OFF); -} - void xfs_verify_recalc_crc( struct xfs_buf *bp) @@ -510,14 +489,10 @@ write_cur(void) skip_crc = true; if (!skip_crc) { - if (iocur_top->ino_buf) { - libxfs_dinode_calc_crc(mp, iocur_top->data); - iocur_top->ino_crc_ok = 1; - } else if (iocur_top->dquot_buf) { - xfs_update_cksum(iocur_top->data, - sizeof(struct xfs_dqblk), - XFS_DQUOT_CRC_OFF); - } + if (iocur_top->ino_buf) + xfs_inode_set_crc(iocur_top->bp); + else if (iocur_top->dquot_buf) + xfs_dquot_set_crc(iocur_top->bp); } if (iocur_top->bbmap) write_cur_bbs(); diff --git a/db/io.h b/db/io.h index df0fdd758..374dd84bd 100644 --- a/db/io.h +++ b/db/io.h @@ -64,8 +64,6 @@ extern void set_cur(const struct typ *type, xfs_daddr_t blknum, extern void ring_add(void); extern void set_iocur_type(const struct typ *type); 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_dquot_crc(struct xfs_buf *bp); extern void xfs_verify_recalc_crc(struct xfs_buf *bp); /* diff --git a/db/type.c b/db/type.c index 740adc014..0c1ed37c3 100644 --- a/db/type.c +++ b/db/type.c @@ -105,12 +105,12 @@ static const typ_t __typtab_crc[] = { { TYP_DIR2, "dir3", handle_struct, dir3_hfld, &xfs_dir3_db_buf_ops, TYP_F_CRC_FUNC, xfs_dir3_set_crc }, { TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld, - &xfs_dquot_buf_ops, TYP_F_NO_CRC_OFF }, + &xfs_dquot_buf_ops, TYP_F_CRC_FUNC, xfs_dquot_set_crc }, { TYP_INOBT, "inobt", handle_struct, inobt_crc_hfld, &xfs_inobt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF }, { TYP_INODATA, "inodata", NULL, NULL, NULL, TYP_F_NO_CRC_OFF }, { TYP_INODE, "inode", handle_struct, inode_crc_hfld, - &xfs_inode_buf_ops, TYP_F_NO_CRC_OFF }, + &xfs_inode_buf_ops, TYP_F_CRC_FUNC, xfs_inode_set_crc }, { TYP_LOG, "log", NULL, NULL, NULL, TYP_F_NO_CRC_OFF }, { TYP_RTBITMAP, "rtbitmap", NULL, NULL, NULL, TYP_F_NO_CRC_OFF }, { TYP_RTSUMMARY, "rtsummary", NULL, NULL, NULL, TYP_F_NO_CRC_OFF }, @@ -149,12 +149,12 @@ static const typ_t __typtab_spcrc[] = { { TYP_DIR2, "dir3", handle_struct, dir3_hfld, &xfs_dir3_db_buf_ops, TYP_F_CRC_FUNC, xfs_dir3_set_crc }, { TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld, - &xfs_dquot_buf_ops, TYP_F_NO_CRC_OFF }, + &xfs_dquot_buf_ops, TYP_F_CRC_FUNC, xfs_dquot_set_crc }, { TYP_INOBT, "inobt", handle_struct, inobt_spcrc_hfld, &xfs_inobt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF }, { TYP_INODATA, "inodata", NULL, NULL, NULL, TYP_F_NO_CRC_OFF }, { TYP_INODE, "inode", handle_struct, inode_crc_hfld, - &xfs_inode_buf_ops, TYP_F_NO_CRC_OFF }, + &xfs_inode_buf_ops, TYP_F_CRC_FUNC, xfs_inode_set_crc }, { TYP_LOG, "log", NULL, NULL, NULL, TYP_F_NO_CRC_OFF }, { TYP_RTBITMAP, "rtbitmap", NULL, NULL, NULL, TYP_F_NO_CRC_OFF }, { TYP_RTSUMMARY, "rtsummary", NULL, NULL, NULL, TYP_F_NO_CRC_OFF }, diff --git a/db/write.c b/db/write.c index 266bde470..9fc6d8eea 100644 --- a/db/write.c +++ b/db/write.c @@ -138,9 +138,7 @@ write_f( } if (invalid_data && - iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF && - !iocur_top->ino_buf && - !iocur_top->dquot_buf) { + iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF) { dbprintf(_("Cannot recalculate CRCs on this type of object\n")); return 0; } @@ -167,12 +165,6 @@ 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 if (iocur_top->dquot_buf) { - local_ops.verify_write = xfs_verify_recalc_dquot_crc; - dbprintf(_("Allowing write of corrupted dquot with good CRC\n")); } else if (iocur_top->typ->crc_off == TYP_F_CRC_FUNC) { local_ops.verify_write = iocur_top->typ->set_crc; dbprintf(_("Allowing write of corrupted data with good CRC\n"));