]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
xfs: pass inode number to xfs_scrub_ino_set_{preen,warning}
authorDarrick J. Wong <darrick.wong@oracle.com>
Mon, 6 Nov 2017 19:46:15 +0000 (11:46 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Thu, 9 Nov 2017 17:10:45 +0000 (09:10 -0800)
There are two ways to scrub an inode -- calling xfs_iget and checking
the raw inode core, or by loading the inode cluster buffer and checking
the on-disk contents directly.  The second method is only useful if
_iget fails the verifiers; when this is the case, sc->ip is NULL and
calling the tracepoint will cause a system crash.

Therefore, pass the raw inode number directly into the _preen and
_warning functions.

Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
fs/xfs/scrub/attr.c
fs/xfs/scrub/common.c
fs/xfs/scrub/common.h
fs/xfs/scrub/inode.c

index 5cf30deb8144fee048700edfa897eff4a6d78b60..4ed80474f54551de61d1190fecf56ee1c5e66a45 100644 (file)
@@ -98,7 +98,7 @@ xfs_scrub_xattr_listent(
 
        if (flags & XFS_ATTR_INCOMPLETE) {
                /* Incomplete attr key, just mark the inode for preening. */
-               xfs_scrub_ino_set_preen(sx->sc, NULL);
+               xfs_scrub_ino_set_preen(sx->sc, context->dp->i_ino, NULL);
                return;
        }
 
index 318dd97c70b565d22a1506b6a9017e116eb9288f..ac95fe911d96aacfd545aaa0ff594f3c783e5009 100644 (file)
@@ -165,10 +165,11 @@ xfs_scrub_block_set_preen(
 void
 xfs_scrub_ino_set_preen(
        struct xfs_scrub_context        *sc,
+       xfs_ino_t                       ino,
        struct xfs_buf                  *bp)
 {
        sc->sm->sm_flags |= XFS_SCRUB_OFLAG_PREEN;
-       trace_xfs_scrub_ino_preen(sc, sc->ip->i_ino, bp ? bp->b_bn : 0,
+       trace_xfs_scrub_ino_preen(sc, ino, bp ? bp->b_bn : 0,
                        __return_address);
 }
 
@@ -215,10 +216,11 @@ xfs_scrub_fblock_set_corrupt(
 void
 xfs_scrub_ino_set_warning(
        struct xfs_scrub_context        *sc,
+       xfs_ino_t                       ino,
        struct xfs_buf                  *bp)
 {
        sc->sm->sm_flags |= XFS_SCRUB_OFLAG_WARNING;
-       trace_xfs_scrub_ino_warning(sc, sc->ip->i_ino, bp ? bp->b_bn : 0,
+       trace_xfs_scrub_ino_warning(sc, ino, bp ? bp->b_bn : 0,
                        __return_address);
 }
 
index 0409ec2e1300c95035e48e540fd00a7a4687ab3a..5c043855570e43b0eaf11f52e22e57d985040ab0 100644 (file)
@@ -58,7 +58,8 @@ bool xfs_scrub_fblock_process_error(struct xfs_scrub_context *sc, int whichfork,
 
 void xfs_scrub_block_set_preen(struct xfs_scrub_context *sc,
                struct xfs_buf *bp);
-void xfs_scrub_ino_set_preen(struct xfs_scrub_context *sc, struct xfs_buf *bp);
+void xfs_scrub_ino_set_preen(struct xfs_scrub_context *sc, xfs_ino_t ino,
+               struct xfs_buf *bp);
 
 void xfs_scrub_block_set_corrupt(struct xfs_scrub_context *sc,
                struct xfs_buf *bp);
@@ -67,7 +68,7 @@ void xfs_scrub_ino_set_corrupt(struct xfs_scrub_context *sc, xfs_ino_t ino,
 void xfs_scrub_fblock_set_corrupt(struct xfs_scrub_context *sc, int whichfork,
                xfs_fileoff_t offset);
 
-void xfs_scrub_ino_set_warning(struct xfs_scrub_context *sc,
+void xfs_scrub_ino_set_warning(struct xfs_scrub_context *sc, xfs_ino_t ino,
                struct xfs_buf *bp);
 void xfs_scrub_fblock_set_warning(struct xfs_scrub_context *sc, int whichfork,
                xfs_fileoff_t offset);
index f275dd25264e44edc08f8c5b6d5bf28c3b5f6304..637b7a892313de51ed28f584b2b2b17f8e32a40c 100644 (file)
@@ -328,7 +328,7 @@ xfs_scrub_dinode(
                 * We autoconvert v1 inodes into v2 inodes on writeout,
                 * so just mark this inode for preening.
                 */
-               xfs_scrub_ino_set_preen(sc, bp);
+               xfs_scrub_ino_set_preen(sc, ino, bp);
                break;
        case 2:
        case 3:
@@ -353,7 +353,7 @@ xfs_scrub_dinode(
         */
        if (dip->di_uid == cpu_to_be32(-1U) ||
            dip->di_gid == cpu_to_be32(-1U))
-               xfs_scrub_ino_set_warning(sc, bp);
+               xfs_scrub_ino_set_warning(sc, ino, bp);
 
        /* di_format */
        switch (dip->di_format) {
@@ -408,7 +408,7 @@ xfs_scrub_dinode(
         * overly large offsets, flag the inode for admin review.
         */
        if (isize >= mp->m_super->s_maxbytes)
-               xfs_scrub_ino_set_warning(sc, bp);
+               xfs_scrub_ino_set_warning(sc, ino, bp);
 
        /* di_nblocks */
        if (flags2 & XFS_DIFLAG2_REFLINK) {
@@ -601,7 +601,7 @@ xfs_scrub_inode(
                                XFS_INO_TO_AGBNO(mp, ino), &error))
                        goto out;
                if (!has_shared)
-                       xfs_scrub_ino_set_preen(sc, bp);
+                       xfs_scrub_ino_set_preen(sc, ino, bp);
        }
 
 out: