Commit cdbcf82b authored by Darrick J. Wong's avatar Darrick J. Wong

xfs: fix xfs_buf_ioerror_alert location reporting

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: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent 706b8c5b
...@@ -803,7 +803,8 @@ xfs_buf_read_map( ...@@ -803,7 +803,8 @@ xfs_buf_read_map(
int nmaps, int nmaps,
xfs_buf_flags_t flags, xfs_buf_flags_t flags,
struct xfs_buf **bpp, struct xfs_buf **bpp,
const struct xfs_buf_ops *ops) const struct xfs_buf_ops *ops,
xfs_failaddr_t fa)
{ {
struct xfs_buf *bp; struct xfs_buf *bp;
int error; int error;
...@@ -852,7 +853,7 @@ xfs_buf_read_map( ...@@ -852,7 +853,7 @@ xfs_buf_read_map(
*/ */
if (error) { if (error) {
if (!XFS_FORCED_SHUTDOWN(target->bt_mount)) if (!XFS_FORCED_SHUTDOWN(target->bt_mount))
xfs_buf_ioerror_alert(bp, __func__); xfs_buf_ioerror_alert(bp, fa);
bp->b_flags &= ~XBF_DONE; bp->b_flags &= ~XBF_DONE;
xfs_buf_stale(bp); xfs_buf_stale(bp);
...@@ -885,7 +886,8 @@ xfs_buf_readahead_map( ...@@ -885,7 +886,8 @@ xfs_buf_readahead_map(
return; return;
xfs_buf_read_map(target, map, nmaps, 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( ...@@ -1234,10 +1236,10 @@ __xfs_buf_ioerror(
void void
xfs_buf_ioerror_alert( xfs_buf_ioerror_alert(
struct xfs_buf *bp, struct xfs_buf *bp,
const char *func) xfs_failaddr_t func)
{ {
xfs_alert(bp->b_mount, 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, func, (uint64_t)XFS_BUF_ADDR(bp), bp->b_length,
-bp->b_error); -bp->b_error);
} }
......
...@@ -196,7 +196,7 @@ int xfs_buf_get_map(struct xfs_buftarg *target, struct xfs_buf_map *map, ...@@ -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 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 xfs_buf_read_map(struct xfs_buftarg *target, struct xfs_buf_map *map,
int nmaps, xfs_buf_flags_t flags, struct xfs_buf **bpp, 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, void xfs_buf_readahead_map(struct xfs_buftarg *target,
struct xfs_buf_map *map, int nmaps, struct xfs_buf_map *map, int nmaps,
const struct xfs_buf_ops *ops); const struct xfs_buf_ops *ops);
...@@ -224,7 +224,8 @@ xfs_buf_read( ...@@ -224,7 +224,8 @@ xfs_buf_read(
{ {
DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); 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 static inline void
...@@ -261,7 +262,7 @@ extern void xfs_buf_ioend(struct xfs_buf *bp); ...@@ -261,7 +262,7 @@ extern void xfs_buf_ioend(struct xfs_buf *bp);
extern void __xfs_buf_ioerror(struct xfs_buf *bp, int error, extern void __xfs_buf_ioerror(struct xfs_buf *bp, int error,
xfs_failaddr_t failaddr); xfs_failaddr_t failaddr);
#define xfs_buf_ioerror(bp, err) __xfs_buf_ioerror((bp), (err), __this_address) #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); extern int __xfs_buf_submit(struct xfs_buf *bp, bool);
static inline int xfs_buf_submit(struct xfs_buf *bp) static inline int xfs_buf_submit(struct xfs_buf *bp)
......
...@@ -1113,7 +1113,7 @@ xfs_buf_iodone_callback_error( ...@@ -1113,7 +1113,7 @@ xfs_buf_iodone_callback_error(
if (bp->b_target != lasttarg || if (bp->b_target != lasttarg ||
time_after(jiffies, (lasttime + 5*HZ))) { time_after(jiffies, (lasttime + 5*HZ))) {
lasttime = jiffies; lasttime = jiffies;
xfs_buf_ioerror_alert(bp, __func__); xfs_buf_ioerror_alert(bp, __this_address);
} }
lasttarg = bp->b_target; lasttarg = bp->b_target;
......
...@@ -294,7 +294,7 @@ xlog_recover_iodone( ...@@ -294,7 +294,7 @@ xlog_recover_iodone(
* this during recovery. One strike! * this during recovery. One strike!
*/ */
if (!XFS_FORCED_SHUTDOWN(bp->b_mount)) { 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); xfs_force_shutdown(bp->b_mount, SHUTDOWN_META_IO_ERROR);
} }
} }
...@@ -5627,7 +5627,7 @@ xlog_do_recover( ...@@ -5627,7 +5627,7 @@ xlog_do_recover(
error = xfs_buf_submit(bp); error = xfs_buf_submit(bp);
if (error) { if (error) {
if (!XFS_FORCED_SHUTDOWN(mp)) { if (!XFS_FORCED_SHUTDOWN(mp)) {
xfs_buf_ioerror_alert(bp, __func__); xfs_buf_ioerror_alert(bp, __this_address);
ASSERT(0); ASSERT(0);
} }
xfs_buf_relse(bp); xfs_buf_relse(bp);
......
...@@ -280,7 +280,7 @@ xfs_trans_read_buf_map( ...@@ -280,7 +280,7 @@ xfs_trans_read_buf_map(
ASSERT(bp->b_ops != NULL); ASSERT(bp->b_ops != NULL);
error = xfs_buf_reverify(bp, ops); error = xfs_buf_reverify(bp, ops);
if (error) { if (error) {
xfs_buf_ioerror_alert(bp, __func__); xfs_buf_ioerror_alert(bp, __return_address);
if (tp->t_flags & XFS_TRANS_DIRTY) if (tp->t_flags & XFS_TRANS_DIRTY)
xfs_force_shutdown(tp->t_mountp, xfs_force_shutdown(tp->t_mountp,
...@@ -302,7 +302,8 @@ xfs_trans_read_buf_map( ...@@ -302,7 +302,8 @@ xfs_trans_read_buf_map(
return 0; 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) { switch (error) {
case 0: case 0:
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment