]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
xfs: make xfs_buf_get_map return an error code
authorDarrick J. Wong <darrick.wong@oracle.com>
Fri, 24 Jan 2020 01:01:15 +0000 (17:01 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Sun, 26 Jan 2020 22:32:25 +0000 (14:32 -0800)
Convert xfs_buf_get_map() to return numeric error codes like most
everywhere else in xfs.

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

index f9a6cf71f4abffc6940ba79c3fcb059fb926a9b3..5c07b4a7002695910c94843c2fd75bfd8aa978bd 100644 (file)
@@ -685,53 +685,39 @@ xfs_buf_incore(
  * cache hits, as metadata intensive workloads will see 3 orders of magnitude
  * more hits than misses.
  */
-struct xfs_buf *
+int
 xfs_buf_get_map(
        struct xfs_buftarg      *target,
        struct xfs_buf_map      *map,
        int                     nmaps,
-       xfs_buf_flags_t         flags)
+       xfs_buf_flags_t         flags,
+       struct xfs_buf          **bpp)
 {
        struct xfs_buf          *bp;
        struct xfs_buf          *new_bp;
        int                     error = 0;
 
+       *bpp = NULL;
        error = xfs_buf_find(target, map, nmaps, flags, NULL, &bp);
-
-       switch (error) {
-       case 0:
-               /* cache hit */
+       if (!error)
                goto found;
-       case -EAGAIN:
-               /* cache hit, trylock failure, caller handles failure */
-               ASSERT(flags & XBF_TRYLOCK);
-               return NULL;
-       case -ENOENT:
-               /* cache miss, go for insert */
-               break;
-       case -EFSCORRUPTED:
-       default:
-               /*
-                * None of the higher layers understand failure types
-                * yet, so return NULL to signal a fatal lookup error.
-                */
-               return NULL;
-       }
+       if (error != -ENOENT)
+               return error;
 
        error = _xfs_buf_alloc(target, map, nmaps, flags, &new_bp);
        if (error)
-               return NULL;
+               return error;
 
        error = xfs_buf_allocate_memory(new_bp, flags);
        if (error) {
                xfs_buf_free(new_bp);
-               return NULL;
+               return error;
        }
 
        error = xfs_buf_find(target, map, nmaps, flags, new_bp, &bp);
        if (error) {
                xfs_buf_free(new_bp);
-               return NULL;
+               return error;
        }
 
        if (bp != new_bp)
@@ -744,7 +730,7 @@ xfs_buf_get_map(
                        xfs_warn(target->bt_mount,
                                "%s: failed to map pagesn", __func__);
                        xfs_buf_relse(bp);
-                       return NULL;
+                       return error;
                }
        }
 
@@ -757,7 +743,8 @@ xfs_buf_get_map(
 
        XFS_STATS_INC(target->bt_mount, xb_get);
        trace_xfs_buf_get(bp, flags, _RET_IP_);
-       return bp;
+       *bpp = bp;
+       return 0;
 }
 
 STATIC int
@@ -818,11 +805,12 @@ xfs_buf_read_map(
        const struct xfs_buf_ops *ops)
 {
        struct xfs_buf          *bp;
+       int                     error;
 
        flags |= XBF_READ;
 
-       bp = xfs_buf_get_map(target, map, nmaps, flags);
-       if (!bp)
+       error = xfs_buf_get_map(target, map, nmaps, flags, &bp);
+       if (error)
                return NULL;
 
        trace_xfs_buf_read(bp, flags, _RET_IP_);
index 56e081dd1d968600feb7621ee4b611c3e57f771e..25dd2aa4322b1cde7faf1feeff076c95e14808ef 100644 (file)
@@ -192,9 +192,8 @@ struct xfs_buf *xfs_buf_incore(struct xfs_buftarg *target,
                           xfs_daddr_t blkno, size_t numblks,
                           xfs_buf_flags_t flags);
 
-struct xfs_buf *xfs_buf_get_map(struct xfs_buftarg *target,
-                              struct xfs_buf_map *map, int nmaps,
-                              xfs_buf_flags_t flags);
+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);
 struct xfs_buf *xfs_buf_read_map(struct xfs_buftarg *target,
                               struct xfs_buf_map *map, int nmaps,
                               xfs_buf_flags_t flags,
@@ -209,8 +208,14 @@ xfs_buf_get(
        xfs_daddr_t             blkno,
        size_t                  numblks)
 {
+       struct xfs_buf          *bp;
+       int                     error;
        DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
-       return xfs_buf_get_map(target, &map, 1, 0);
+
+       error = xfs_buf_get_map(target, &map, 1, 0, &bp);
+       if (error)
+               return NULL;
+       return bp;
 }
 
 static inline struct xfs_buf *
index b5b3a78ef31c41e0f057d8f8ab752a21ec8e910e..288333fef13adc5f3b4bcd4b5559427136af0b39 100644 (file)
@@ -122,9 +122,14 @@ xfs_trans_get_buf_map(
 {
        xfs_buf_t               *bp;
        struct xfs_buf_log_item *bip;
+       int                     error;
 
-       if (!tp)
-               return xfs_buf_get_map(target, map, nmaps, flags);
+       if (!tp) {
+               error = xfs_buf_get_map(target, map, nmaps, flags, &bp);
+               if (error)
+                       return NULL;
+               return bp;
+       }
 
        /*
         * If we find the buffer in the cache with this transaction
@@ -149,10 +154,9 @@ xfs_trans_get_buf_map(
                return bp;
        }
 
-       bp = xfs_buf_get_map(target, map, nmaps, flags);
-       if (bp == NULL) {
+       error = xfs_buf_get_map(target, map, nmaps, flags, &bp);
+       if (error)
                return NULL;
-       }
 
        ASSERT(!bp->b_error);