]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
xfs: fix xfs_buf_ioerror_alert location reporting
authorDarrick J. Wong <darrick.wong@oracle.com>
Fri, 24 Jan 2020 01:01:20 +0000 (17:01 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Sun, 26 Jan 2020 22:32:27 +0000 (14:32 -0800)
Instead of passing __func__ to the error reporting function, let's use
the return address builtins so that the messages actually tell you which
higher level function called the buffer functions.  This was previously
true for the xfs_buf_read callers, but not for the xfs_trans_read_buf
callers.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/xfs_buf.c
fs/xfs/xfs_buf.h
fs/xfs/xfs_buf_item.c
fs/xfs/xfs_log_recover.c
fs/xfs/xfs_trans_buf.c

index b420e865b32edbc8edb85464b0b66eadac80c1d6..217e4f82a44a2601351c8e46f7503512b9a5cc31 100644 (file)
@@ -803,7 +803,8 @@ xfs_buf_read_map(
        int                     nmaps,
        xfs_buf_flags_t         flags,
        struct xfs_buf          **bpp,
-       const struct xfs_buf_ops *ops)
+       const struct xfs_buf_ops *ops,
+       xfs_failaddr_t          fa)
 {
        struct xfs_buf          *bp;
        int                     error;
@@ -852,7 +853,7 @@ xfs_buf_read_map(
         */
        if (error) {
                if (!XFS_FORCED_SHUTDOWN(target->bt_mount))
-                       xfs_buf_ioerror_alert(bp, __func__);
+                       xfs_buf_ioerror_alert(bp, fa);
 
                bp->b_flags &= ~XBF_DONE;
                xfs_buf_stale(bp);
@@ -885,7 +886,8 @@ xfs_buf_readahead_map(
                return;
 
        xfs_buf_read_map(target, map, nmaps,
-                    XBF_TRYLOCK | XBF_ASYNC | XBF_READ_AHEAD, &bp, ops);
+                    XBF_TRYLOCK | XBF_ASYNC | XBF_READ_AHEAD, &bp, ops,
+                    __this_address);
 }
 
 /*
@@ -1234,10 +1236,10 @@ __xfs_buf_ioerror(
 void
 xfs_buf_ioerror_alert(
        struct xfs_buf          *bp,
-       const char              *func)
+       xfs_failaddr_t          func)
 {
        xfs_alert(bp->b_mount,
-"metadata I/O error in \"%s\" at daddr 0x%llx len %d error %d",
+"metadata I/O error in \"%pS\" at daddr 0x%llx len %d error %d",
                        func, (uint64_t)XFS_BUF_ADDR(bp), bp->b_length,
                        -bp->b_error);
 }
index aa145ad25e9ad27c8d358cc0a4a11229f7caf540..d79a1fe5d738df70f8b08c453fdcc74c9549e779 100644 (file)
@@ -196,7 +196,7 @@ int xfs_buf_get_map(struct xfs_buftarg *target, struct xfs_buf_map *map,
                int nmaps, xfs_buf_flags_t flags, struct xfs_buf **bpp);
 int xfs_buf_read_map(struct xfs_buftarg *target, struct xfs_buf_map *map,
                int nmaps, xfs_buf_flags_t flags, struct xfs_buf **bpp,
-               const struct xfs_buf_ops *ops);
+               const struct xfs_buf_ops *ops, xfs_failaddr_t fa);
 void xfs_buf_readahead_map(struct xfs_buftarg *target,
                               struct xfs_buf_map *map, int nmaps,
                               const struct xfs_buf_ops *ops);
@@ -224,7 +224,8 @@ xfs_buf_read(
 {
        DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
 
-       return xfs_buf_read_map(target, &map, 1, flags, bpp, ops);
+       return xfs_buf_read_map(target, &map, 1, flags, bpp, ops,
+                       __builtin_return_address(0));
 }
 
 static inline void
@@ -261,7 +262,7 @@ extern void xfs_buf_ioend(struct xfs_buf *bp);
 extern void __xfs_buf_ioerror(struct xfs_buf *bp, int error,
                xfs_failaddr_t failaddr);
 #define xfs_buf_ioerror(bp, err) __xfs_buf_ioerror((bp), (err), __this_address)
-extern void xfs_buf_ioerror_alert(struct xfs_buf *, const char *func);
+extern void xfs_buf_ioerror_alert(struct xfs_buf *bp, xfs_failaddr_t fa);
 
 extern int __xfs_buf_submit(struct xfs_buf *bp, bool);
 static inline int xfs_buf_submit(struct xfs_buf *bp)
index 5be8973a452c915a0a77e4635856be468789e137..663810e6cd5997df58a678e24b68b50794c0ab3b 100644 (file)
@@ -1113,7 +1113,7 @@ xfs_buf_iodone_callback_error(
        if (bp->b_target != lasttarg ||
            time_after(jiffies, (lasttime + 5*HZ))) {
                lasttime = jiffies;
-               xfs_buf_ioerror_alert(bp, __func__);
+               xfs_buf_ioerror_alert(bp, __this_address);
        }
        lasttarg = bp->b_target;
 
index ac79537d3275dde3079852920923019aa20d98fb..25cfc85dbaa7bd5e6f54d3fdcb050bac579d928d 100644 (file)
@@ -294,7 +294,7 @@ xlog_recover_iodone(
                 * this during recovery. One strike!
                 */
                if (!XFS_FORCED_SHUTDOWN(bp->b_mount)) {
-                       xfs_buf_ioerror_alert(bp, __func__);
+                       xfs_buf_ioerror_alert(bp, __this_address);
                        xfs_force_shutdown(bp->b_mount, SHUTDOWN_META_IO_ERROR);
                }
        }
@@ -5627,7 +5627,7 @@ xlog_do_recover(
        error = xfs_buf_submit(bp);
        if (error) {
                if (!XFS_FORCED_SHUTDOWN(mp)) {
-                       xfs_buf_ioerror_alert(bp, __func__);
+                       xfs_buf_ioerror_alert(bp, __this_address);
                        ASSERT(0);
                }
                xfs_buf_relse(bp);
index 83470998f87b2f283295f8cae4e2fde86ac37879..08174ffa2118935a4c00493c8e8d77aefdd215d9 100644 (file)
@@ -280,7 +280,7 @@ xfs_trans_read_buf_map(
                ASSERT(bp->b_ops != NULL);
                error = xfs_buf_reverify(bp, ops);
                if (error) {
-                       xfs_buf_ioerror_alert(bp, __func__);
+                       xfs_buf_ioerror_alert(bp, __return_address);
 
                        if (tp->t_flags & XFS_TRANS_DIRTY)
                                xfs_force_shutdown(tp->t_mountp,
@@ -302,7 +302,8 @@ xfs_trans_read_buf_map(
                return 0;
        }
 
-       error = xfs_buf_read_map(target, map, nmaps, flags, &bp, ops);
+       error = xfs_buf_read_map(target, map, nmaps, flags, &bp, ops,
+                       __return_address);
        switch (error) {
        case 0:
                break;