]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs: make xfs_buf_get return an error code
authorDarrick J. Wong <darrick.wong@oracle.com>
Sat, 14 Mar 2020 03:01:00 +0000 (23:01 -0400)
committerEric Sandeen <sandeen@sandeen.net>
Sat, 14 Mar 2020 03:01:00 +0000 (23:01 -0400)
Source kernel commit: 841263e93310595c30653a9f530b2d7bbeed5aae

Convert xfs_buf_get() 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>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/libxfs_io.h
libxfs/rdwr.c
libxfs/xfs_attr_remote.c
libxfs/xfs_sb.c
repair/phase5.c

index 456e41cbcf2ab709582cddc1965ef1b47f8c0132..46d294ca571d85dd7a31b5e4d45f6011d5a01bd8 100644 (file)
@@ -139,9 +139,9 @@ extern struct cache_operations      libxfs_bcache_operations;
 #define libxfs_buf_mark_dirty(buf) \
        libxfs_trace_dirtybuf(__FUNCTION__, __FILE__, __LINE__, \
                              (buf))
-#define libxfs_buf_get(dev, daddr, len) \
+#define libxfs_buf_get(dev, daddr, len, bpp) \
        libxfs_trace_getbuf(__FUNCTION__, __FILE__, __LINE__, \
-                           (dev), (daddr), (len))
+                           (dev), (daddr), (len), (bpp))
 #define libxfs_buf_get_map(dev, map, nmaps, flags, bpp) \
        libxfs_trace_getbuf_map(__FUNCTION__, __FILE__, __LINE__, \
                            (dev), (map), (nmaps), (flags), (bpp))
@@ -157,9 +157,9 @@ int libxfs_trace_readbuf_map(const char *func, const char *file, int line,
                        const struct xfs_buf_ops *ops);
 void libxfs_trace_dirtybuf(const char *func, const char *file, int line,
                        struct xfs_buf *bp);
-struct xfs_buf *libxfs_trace_getbuf(const char *func, const char *file,
-                       int line, struct xfs_buftarg *btp, xfs_daddr_t daddr,
-                       size_t len);
+int libxfs_trace_getbuf(const char *func, const char *file, int line,
+                       struct xfs_buftarg *btp, xfs_daddr_t daddr,
+                       size_t len, struct xfs_buf **bpp);
 int libxfs_trace_getbuf_map(const char *func, const char *file, int line,
                        struct xfs_buftarg *btp, struct xfs_buf_map *map,
                        int nmaps, int flags, struct xfs_buf **bpp);
@@ -176,20 +176,16 @@ int libxfs_buf_get_map(struct xfs_buftarg *btp, struct xfs_buf_map *maps,
                        int nmaps, int flags, struct xfs_buf **bpp);
 void   libxfs_buf_relse(struct xfs_buf *bp);
 
-static inline struct xfs_buf*
+static inline int
 libxfs_buf_get(
        struct xfs_buftarg      *target,
        xfs_daddr_t             blkno,
-       size_t                  numblks)
+       size_t                  numblks,
+       struct xfs_buf          **bpp)
 {
-       struct xfs_buf          *bp;
-       int                     error;
        DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
 
-       error = libxfs_buf_get_map(target, &map, 1, 0, &bp);
-       if (error)
-               return NULL;
-       return bp;
+       return libxfs_buf_get_map(target, &map, 1, 0, bpp);
 }
 
 static inline struct xfs_buf*
index 4316007cf30c8aa2cbc2fafca6fd63ac7851e3b0..0bcc473045798bc5d3108339ecca5d216933f0d9 100644 (file)
@@ -226,21 +226,22 @@ libxfs_trace_dirtybuf(
        libxfs_buf_mark_dirty(bp);
 }
 
-struct xfs_buf *
+int
 libxfs_trace_getbuf(
        const char              *func,
        const char              *file,
        int                     line,
        struct xfs_buftarg      *btp,
        xfs_daddr_t             blkno,
-       size_t                  len)
+       size_t                  len,
+       struct xfs_buf          **bpp)
 {
-       struct xfs_buf          *bp;
+       int                     error;
        DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
 
-       libxfs_buf_get_map(target, &map, 1, 0, &bp);
+       error = libxfs_buf_get_map(target, &map, 1, 0, bpp);
        __add_trace(bp, func, file, line);
-       return bp;
+       return error;
 }
 
 int
index 00371bdcfb38fb105a4ca3f19d5db873a1bf9dd7..88163ea88895cec2edcc7c58d9728991c09b6b86 100644 (file)
@@ -544,9 +544,9 @@ xfs_attr_rmtval_set(
                dblkno = XFS_FSB_TO_DADDR(mp, map.br_startblock),
                dblkcnt = XFS_FSB_TO_BB(mp, map.br_blockcount);
 
-               bp = xfs_buf_get(mp->m_ddev_targp, dblkno, dblkcnt);
-               if (!bp)
-                       return -ENOMEM;
+               error = xfs_buf_get(mp->m_ddev_targp, dblkno, dblkcnt, &bp);
+               if (error)
+                       return error;
                bp->b_ops = &xfs_attr3_rmt_buf_ops;
 
                xfs_attr_rmtval_copyin(mp, bp, args->dp->i_ino, &offset,
index 4f750d19d9299c04f50c3c306661c9da060f86bd..d3d5e11dc188d19d4f25f761068999777eaab662 100644 (file)
@@ -962,9 +962,9 @@ xfs_update_secondary_sbs(
        for (agno = 1; agno < mp->m_sb.sb_agcount; agno++) {
                struct xfs_buf          *bp;
 
-               bp = xfs_buf_get(mp->m_ddev_targp,
+               error = xfs_buf_get(mp->m_ddev_targp,
                                 XFS_AG_DADDR(mp, agno, XFS_SB_DADDR),
-                                XFS_FSS_TO_BB(mp, 1));
+                                XFS_FSS_TO_BB(mp, 1), &bp);
                /*
                 * If we get an error reading or writing alternate superblocks,
                 * continue.  xfs_repair chooses the "best" superblock based
@@ -972,12 +972,12 @@ xfs_update_secondary_sbs(
                 * superblocks un-updated than updated, and xfs_repair may
                 * pick them over the properly-updated primary.
                 */
-               if (!bp) {
+               if (error) {
                        xfs_warn(mp,
                "error allocating secondary superblock for ag %d",
                                agno);
                        if (!saved_error)
-                               saved_error = -ENOMEM;
+                               saved_error = error;
                        continue;
                }
 
index 7ec58f88776bf4839bd80c96b5ba8cfb7e54a02e..abae8a086a1be4b2f173c0604d9b6deedb9c75e4 100644 (file)
@@ -652,6 +652,7 @@ prop_freespace_cursor(xfs_mount_t *mp, xfs_agnumber_t agno,
        xfs_agblock_t           agbno;
        bt_stat_level_t         *lptr;
        const struct xfs_buf_ops *ops = btnum_to_ops(btnum);
+       int                     error;
 
        ASSERT(btnum == XFS_BTNUM_BNO || btnum == XFS_BTNUM_CNT);
 
@@ -692,9 +693,13 @@ prop_freespace_cursor(xfs_mount_t *mp, xfs_agnumber_t agno,
 
                bt_hdr->bb_u.s.bb_rightsib = cpu_to_be32(agbno);
 
-               lptr->buf_p = libxfs_buf_get(mp->m_dev,
-                                       XFS_AGB_TO_DADDR(mp, agno, agbno),
-                                       XFS_FSB_TO_BB(mp, 1));
+               error = -libxfs_buf_get(mp->m_dev,
+                               XFS_AGB_TO_DADDR(mp, agno, agbno),
+                               XFS_FSB_TO_BB(mp, 1), &lptr->buf_p);
+               if (error)
+                       do_error(
+       _("Cannot grab free space btree buffer, err=%d"),
+                                       error);
                lptr->agbno = agbno;
 
                if (lptr->modulo)
@@ -752,6 +757,7 @@ build_freespace_tree(xfs_mount_t *mp, xfs_agnumber_t agno,
        bt_stat_level_t         *lptr;
        xfs_extlen_t            freeblks;
        const struct xfs_buf_ops *ops = btnum_to_ops(btnum);
+       int                     error;
 
        ASSERT(btnum == XFS_BTNUM_BNO || btnum == XFS_BTNUM_CNT);
 
@@ -770,9 +776,13 @@ build_freespace_tree(xfs_mount_t *mp, xfs_agnumber_t agno,
                lptr = &btree_curs->level[i];
 
                agbno = get_next_blockaddr(agno, i, btree_curs);
-               lptr->buf_p = libxfs_buf_get(mp->m_dev,
-                                       XFS_AGB_TO_DADDR(mp, agno, agbno),
-                                       XFS_FSB_TO_BB(mp, 1));
+               error = -libxfs_buf_get(mp->m_dev,
+                               XFS_AGB_TO_DADDR(mp, agno, agbno),
+                               XFS_FSB_TO_BB(mp, 1), &lptr->buf_p);
+               if (error)
+                       do_error(
+       _("Cannot grab free space btree buffer, err=%d"),
+                                       error);
 
                if (i == btree_curs->num_levels - 1)
                        btree_curs->root = agbno;
@@ -881,9 +891,14 @@ build_freespace_tree(xfs_mount_t *mp, xfs_agnumber_t agno,
                        lptr->agbno = get_next_blockaddr(agno, 0, btree_curs);
                        bt_hdr->bb_u.s.bb_rightsib = cpu_to_be32(lptr->agbno);
 
-                       lptr->buf_p = libxfs_buf_get(mp->m_dev,
+                       error = -libxfs_buf_get(mp->m_dev,
                                        XFS_AGB_TO_DADDR(mp, agno, lptr->agbno),
-                                       XFS_FSB_TO_BB(mp, 1));
+                                       XFS_FSB_TO_BB(mp, 1),
+                                       &lptr->buf_p);
+                       if (error)
+                               do_error(
+       _("Cannot grab free space btree buffer, err=%d"),
+                                               error);
                }
        }
 
@@ -1021,6 +1036,7 @@ prop_ino_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs,
        xfs_agblock_t           agbno;
        bt_stat_level_t         *lptr;
        const struct xfs_buf_ops *ops = btnum_to_ops(btnum);
+       int                     error;
 
        level++;
 
@@ -1059,9 +1075,12 @@ prop_ino_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs,
 
                bt_hdr->bb_u.s.bb_rightsib = cpu_to_be32(agbno);
 
-               lptr->buf_p = libxfs_buf_get(mp->m_dev,
-                                       XFS_AGB_TO_DADDR(mp, agno, agbno),
-                                       XFS_FSB_TO_BB(mp, 1));
+               error = -libxfs_buf_get(mp->m_dev,
+                               XFS_AGB_TO_DADDR(mp, agno, agbno),
+                               XFS_FSB_TO_BB(mp, 1), &lptr->buf_p);
+               if (error)
+                       do_error(_("Cannot grab inode btree buffer, err=%d"),
+                                       error);
                lptr->agbno = agbno;
 
                if (lptr->modulo)
@@ -1108,10 +1127,14 @@ build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs,
        xfs_buf_t       *agi_buf;
        xfs_agi_t       *agi;
        int             i;
+       int             error;
 
-       agi_buf = libxfs_buf_get(mp->m_dev,
+       error = -libxfs_buf_get(mp->m_dev,
                        XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)),
-                       mp->m_sb.sb_sectsize/BBSIZE);
+                       mp->m_sb.sb_sectsize / BBSIZE, &agi_buf);
+       if (error)
+               do_error(_("Cannot grab AG %u AGI buffer, err=%d"),
+                               agno, error);
        agi_buf->b_ops = &xfs_agi_buf_ops;
        agi = XFS_BUF_TO_AGI(agi_buf);
        memset(agi, 0, mp->m_sb.sb_sectsize);
@@ -1173,6 +1196,7 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno,
        int                     spmask;
        uint64_t                sparse;
        uint16_t                holemask;
+       int                     error;
 
        ASSERT(btnum == XFS_BTNUM_INO || btnum == XFS_BTNUM_FINO);
 
@@ -1180,9 +1204,12 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno,
                lptr = &btree_curs->level[i];
 
                agbno = get_next_blockaddr(agno, i, btree_curs);
-               lptr->buf_p = libxfs_buf_get(mp->m_dev,
-                                       XFS_AGB_TO_DADDR(mp, agno, agbno),
-                                       XFS_FSB_TO_BB(mp, 1));
+               error = -libxfs_buf_get(mp->m_dev,
+                               XFS_AGB_TO_DADDR(mp, agno, agbno),
+                               XFS_FSB_TO_BB(mp, 1), &lptr->buf_p);
+               if (error)
+                       do_error(_("Cannot grab inode btree buffer, err=%d"),
+                                       error);
 
                if (i == btree_curs->num_levels - 1)
                        btree_curs->root = agbno;
@@ -1313,9 +1340,14 @@ nextrec:
                        lptr->agbno = get_next_blockaddr(agno, 0, btree_curs);
                        bt_hdr->bb_u.s.bb_rightsib = cpu_to_be32(lptr->agbno);
 
-                       lptr->buf_p = libxfs_buf_get(mp->m_dev,
+                       error = -libxfs_buf_get(mp->m_dev,
                                        XFS_AGB_TO_DADDR(mp, agno, lptr->agbno),
-                                       XFS_FSB_TO_BB(mp, 1));
+                                       XFS_FSB_TO_BB(mp, 1),
+                                       &lptr->buf_p);
+                       if (error)
+                               do_error(
+       _("Cannot grab inode btree buffer, err=%d"),
+                                               error);
                }
        }
 
@@ -1429,6 +1461,7 @@ prop_rmap_cursor(
        xfs_agblock_t           agbno;
        struct bt_stat_level    *lptr;
        const struct xfs_buf_ops *ops = btnum_to_ops(XFS_BTNUM_RMAP);
+       int                     error;
 
        level++;
 
@@ -1467,9 +1500,12 @@ prop_rmap_cursor(
 
                bt_hdr->bb_u.s.bb_rightsib = cpu_to_be32(agbno);
 
-               lptr->buf_p = libxfs_buf_get(mp->m_dev,
-                                       XFS_AGB_TO_DADDR(mp, agno, agbno),
-                                       XFS_FSB_TO_BB(mp, 1));
+               error = -libxfs_buf_get(mp->m_dev,
+                               XFS_AGB_TO_DADDR(mp, agno, agbno),
+                               XFS_FSB_TO_BB(mp, 1), &lptr->buf_p);
+               if (error)
+                       do_error(_("Cannot grab rmapbt buffer, err=%d"),
+                                       error);
                lptr->agbno = agbno;
 
                if (lptr->modulo)
@@ -1577,9 +1613,12 @@ build_rmap_tree(
                lptr = &btree_curs->level[i];
 
                agbno = get_next_blockaddr(agno, i, btree_curs);
-               lptr->buf_p = libxfs_buf_get(mp->m_dev,
-                                       XFS_AGB_TO_DADDR(mp, agno, agbno),
-                                       XFS_FSB_TO_BB(mp, 1));
+               error = -libxfs_buf_get(mp->m_dev,
+                               XFS_AGB_TO_DADDR(mp, agno, agbno),
+                               XFS_FSB_TO_BB(mp, 1), &lptr->buf_p);
+               if (error)
+                       do_error(_("Cannot grab rmapbt buffer, err=%d"),
+                                       error);
 
                if (i == btree_curs->num_levels - 1)
                        btree_curs->root = agbno;
@@ -1677,9 +1716,14 @@ _("Insufficient memory to construct reverse-map cursor."));
                        lptr->agbno = get_next_blockaddr(agno, 0, btree_curs);
                        bt_hdr->bb_u.s.bb_rightsib = cpu_to_be32(lptr->agbno);
 
-                       lptr->buf_p = libxfs_buf_get(mp->m_dev,
+                       error = -libxfs_buf_get(mp->m_dev,
                                        XFS_AGB_TO_DADDR(mp, agno, lptr->agbno),
-                                       XFS_FSB_TO_BB(mp, 1));
+                                       XFS_FSB_TO_BB(mp, 1),
+                                       &lptr->buf_p);
+                       if (error)
+                               do_error(
+       _("Cannot grab rmapbt buffer, err=%d"),
+                                               error);
                }
        }
        free_slab_cursor(&rmap_cur);
@@ -1781,6 +1825,7 @@ prop_refc_cursor(
        xfs_agblock_t           agbno;
        struct bt_stat_level    *lptr;
        const struct xfs_buf_ops *ops = btnum_to_ops(XFS_BTNUM_REFC);
+       int                     error;
 
        level++;
 
@@ -1819,9 +1864,12 @@ prop_refc_cursor(
 
                bt_hdr->bb_u.s.bb_rightsib = cpu_to_be32(agbno);
 
-               lptr->buf_p = libxfs_buf_get(mp->m_dev,
-                                       XFS_AGB_TO_DADDR(mp, agno, agbno),
-                                       XFS_FSB_TO_BB(mp, 1));
+               error = -libxfs_buf_get(mp->m_dev,
+                               XFS_AGB_TO_DADDR(mp, agno, agbno),
+                               XFS_FSB_TO_BB(mp, 1), &lptr->buf_p);
+               if (error)
+                       do_error(_("Cannot grab refcountbt buffer, err=%d"),
+                                       error);
                lptr->agbno = agbno;
 
                if (lptr->modulo)
@@ -1884,9 +1932,12 @@ build_refcount_tree(
                lptr = &btree_curs->level[i];
 
                agbno = get_next_blockaddr(agno, i, btree_curs);
-               lptr->buf_p = libxfs_buf_get(mp->m_dev,
-                                       XFS_AGB_TO_DADDR(mp, agno, agbno),
-                                       XFS_FSB_TO_BB(mp, 1));
+               error = -libxfs_buf_get(mp->m_dev,
+                               XFS_AGB_TO_DADDR(mp, agno, agbno),
+                               XFS_FSB_TO_BB(mp, 1), &lptr->buf_p);
+               if (error)
+                       do_error(_("Cannot grab refcountbt buffer, err=%d"),
+                                       error);
 
                if (i == btree_curs->num_levels - 1)
                        btree_curs->root = agbno;
@@ -1972,9 +2023,14 @@ _("Insufficient memory to construct refcount cursor."));
                        lptr->agbno = get_next_blockaddr(agno, 0, btree_curs);
                        bt_hdr->bb_u.s.bb_rightsib = cpu_to_be32(lptr->agbno);
 
-                       lptr->buf_p = libxfs_buf_get(mp->m_dev,
+                       error = -libxfs_buf_get(mp->m_dev,
                                        XFS_AGB_TO_DADDR(mp, agno, lptr->agbno),
-                                       XFS_FSB_TO_BB(mp, 1));
+                                       XFS_FSB_TO_BB(mp, 1),
+                                       &lptr->buf_p);
+                       if (error)
+                               do_error(
+       _("Cannot grab refcountbt buffer, err=%d"),
+                                               error);
                }
        }
        free_slab_cursor(&refc_cur);
@@ -2007,9 +2063,12 @@ build_agf_agfl(
        __be32                  *freelist;
        int                     error;
 
-       agf_buf = libxfs_buf_get(mp->m_dev,
+       error = -libxfs_buf_get(mp->m_dev,
                        XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)),
-                       mp->m_sb.sb_sectsize/BBSIZE);
+                       mp->m_sb.sb_sectsize / BBSIZE, &agf_buf);
+       if (error)
+               do_error(_("Cannot grab AG %u AGF buffer, err=%d"),
+                               agno, error);
        agf_buf->b_ops = &xfs_agf_buf_ops;
        agf = XFS_BUF_TO_AGF(agf_buf);
        memset(agf, 0, mp->m_sb.sb_sectsize);
@@ -2079,9 +2138,12 @@ build_agf_agfl(
                platform_uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_meta_uuid);
 
        /* initialise the AGFL, then fill it if there are blocks left over. */
-       agfl_buf = libxfs_buf_get(mp->m_dev,
+       error = -libxfs_buf_get(mp->m_dev,
                        XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)),
-                       mp->m_sb.sb_sectsize/BBSIZE);
+                       mp->m_sb.sb_sectsize / BBSIZE, &agfl_buf);
+       if (error)
+               do_error(_("Cannot grab AG %u AGFL buffer, err=%d"),
+                               agno, error);
        agfl_buf->b_ops = &xfs_agfl_buf_ops;
        agfl = XFS_BUF_TO_AGFL(agfl_buf);