xfs
[Top] [All Lists]

[PATCH 2/9] db: verify buffer on type change

To: xfs@xxxxxxxxxxx
Subject: [PATCH 2/9] db: verify buffer on type change
From: Dave Chinner <david@xxxxxxxxxxxxx>
Date: Thu, 24 Apr 2014 15:01:55 +1000
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <1398315722-20870-1-git-send-email-david@xxxxxxxxxxxxx>
References: <1398315722-20870-1-git-send-email-david@xxxxxxxxxxxxx>
From: Dave Chinner <dchinner@xxxxxxxxxx>

Currently when the type command is run, we simply change the type
associated with the buffer, but don't verify it. This results in
unchecked CRCs being displayed. Hence when changing the type, run
the verifier associated with the type to determine if the buffer
contents is valid or not.

Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx>
---
 db/io.c   | 24 ++++++++++++++++++++++++
 db/io.h   |  1 +
 db/type.c |  9 +++++----
 3 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/db/io.c b/db/io.c
index 387f171..7f1b76a 100644
--- a/db/io.c
+++ b/db/io.c
@@ -552,6 +552,30 @@ set_cur(
                ring_add();
 }
 
+void
+set_iocur_type(
+       const typ_t     *t)
+{
+       struct xfs_buf  *bp = iocur_top->bp;
+
+       iocur_top->typ = t;
+
+       /* verify the buffer if the type has one. */
+       if (!bp)
+               return;
+       if (!t->bops) {
+               bp->b_ops = NULL;
+               bp->b_flags |= LIBXFS_B_UNCHECKED;
+               return;
+       }
+       if (!(bp->b_flags & LIBXFS_B_UPTODATE))
+               return;
+       bp->b_error = 0;
+       bp->b_ops = t->bops;
+       bp->b_ops->verify_read(bp);
+       bp->b_flags &= ~LIBXFS_B_UNCHECKED;
+}
+
 static void
 stack_help(void)
 {
diff --git a/db/io.h b/db/io.h
index 7875119..71082e6 100644
--- a/db/io.h
+++ b/db/io.h
@@ -62,6 +62,7 @@ extern void     write_cur(void);
 extern void    set_cur(const struct typ *t, __int64_t d, int c, int ring_add,
                        bbmap_t *bbmap);
 extern void     ring_add(void);
+extern void    set_iocur_type(const struct typ *t);
 
 /*
  * returns -1 for unchecked, 0 for bad and 1 for good
diff --git a/db/type.c b/db/type.c
index 04d0d56..b29f2a4 100644
--- a/db/type.c
+++ b/db/type.c
@@ -162,10 +162,11 @@ type_f(
                if (tt == NULL) {
                        dbprintf(_("no such type %s\n"), argv[1]);
                } else {
-                       if (iocur_top->typ == NULL) {
-                           dbprintf(_("no current object\n"));
-                       } else {
-                           iocur_top->typ = cur_typ = tt;
+                       if (iocur_top->typ == NULL)
+                               dbprintf(_("no current object\n"));
+                       else {
+                               cur_typ = tt;
+                               set_iocur_type(tt);
                        }
                }
        }
-- 
1.9.0

<Prev in Thread] Current Thread [Next in Thread>