]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_db: allow write -d to dqblks
authorEric Sandeen <sandeen@sandeen.net>
Tue, 2 May 2017 16:12:50 +0000 (11:12 -0500)
committerEric Sandeen <sandeen@redhat.com>
Tue, 2 May 2017 16:12:50 +0000 (11:12 -0500)
Allow write -d to write bad data and recalculate CRC
for dqblks.

Inspired-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
db/io.c
db/io.h
db/write.c

diff --git a/db/io.c b/db/io.c
index 67ed5f9e0921bd8ee34e96a9702e2caebaccb158..9918a51d04a1ed2d3f3c61891216950fb98ee227 100644 (file)
--- a/db/io.c
+++ b/db/io.c
@@ -475,6 +475,17 @@ xfs_verify_recalc_inode_crc(
        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)
diff --git a/db/io.h b/db/io.h
index 12d96c2a58eb5fd588c5b1c187156f84291fa2ee..b415b82d19f02696b6154053d8f14e18d9f8e431 100644 (file)
--- a/db/io.h
+++ b/db/io.h
@@ -65,6 +65,7 @@ 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_dquot_crc(struct xfs_buf *bp);
 extern void    xfs_verify_recalc_crc(struct xfs_buf *bp);
 
 /*
index 70c986561308d6420ba69fac8a08fc10c19cac75..d24ea05943aeacaaaced3fbd021f24fd47c7d3e2 100644 (file)
@@ -139,7 +139,8 @@ write_f(
 
        if (invalid_data &&
            iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF &&
-           !iocur_top->ino_buf) {
+           !iocur_top->ino_buf &&
+           !iocur_top->dquot_buf) {
                dbprintf(_("Cannot recalculate CRCs on this type of object\n"));
                return 0;
        }
@@ -169,6 +170,9 @@ write_f(
        } 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 { /* invalid data */
                local_ops.verify_write = xfs_verify_recalc_crc;
                dbprintf(_("Allowing write of corrupted data with good CRC\n"));