#define xfs_btree_init_block libxfs_btree_init_block
#define xfs_buf_delwri_submit libxfs_buf_delwri_submit
#define xfs_buf_get libxfs_buf_get
+#define xfs_buf_get_uncached libxfs_buf_get_uncached
#define xfs_buf_read libxfs_buf_read
+#define xfs_buf_read_uncached libxfs_buf_read_uncached
#define xfs_buf_relse libxfs_buf_relse
#define xfs_bunmapi libxfs_bunmapi
#define xfs_bwrite libxfs_bwrite
return 0;
}
-/*
- * Allocate an uncached buffer that points nowhere. The refcount will be 1,
- * and the cache node hash list will be empty to indicate that it's uncached.
- */
-static inline struct xfs_buf *
-xfs_buf_get_uncached(struct xfs_buftarg *targ, size_t bblen, int flags)
-{
- struct xfs_buf *bp;
-
- bp = libxfs_getbufr(targ, XFS_BUF_DADDR_NULL, bblen);
- if (!bp)
- return NULL;
-
- INIT_LIST_HEAD(&bp->b_node.cn_hash);
- bp->b_node.cn_count = 1;
- return bp;
-}
+struct xfs_buf *libxfs_buf_get_uncached(struct xfs_buftarg *targ, size_t bblen,
+ int flags);
+int libxfs_buf_read_uncached(struct xfs_buftarg *targ, xfs_daddr_t daddr,
+ size_t bblen, int flags, struct xfs_buf **bpp,
+ const struct xfs_buf_ops *ops);
/* Push a single buffer on a delwri queue. */
static inline void
return bp;
}
+/* Allocate a raw uncached buffer. */
+static inline struct xfs_buf *
+libxfs_getbufr_uncached(
+ struct xfs_buftarg *targ,
+ xfs_daddr_t daddr,
+ size_t bblen)
+{
+ struct xfs_buf *bp;
+
+ bp = libxfs_getbufr(targ, daddr, bblen);
+ if (!bp)
+ return NULL;
+
+ INIT_LIST_HEAD(&bp->b_node.cn_hash);
+ bp->b_node.cn_count = 1;
+ return bp;
+}
+
+/*
+ * Allocate an uncached buffer that points nowhere. The refcount will be 1,
+ * and the cache node hash list will be empty to indicate that it's uncached.
+ */
+struct xfs_buf *
+libxfs_buf_get_uncached(
+ struct xfs_buftarg *targ,
+ size_t bblen,
+ int flags)
+{
+ return libxfs_getbufr_uncached(targ, XFS_BUF_DADDR_NULL, bblen);
+}
+
+/*
+ * Allocate and read an uncached buffer. The refcount will be 1, and the cache
+ * node hash list will be empty to indicate that it's uncached.
+ */
+int
+libxfs_buf_read_uncached(
+ struct xfs_buftarg *targ,
+ xfs_daddr_t daddr,
+ size_t bblen,
+ int flags,
+ struct xfs_buf **bpp,
+ const struct xfs_buf_ops *ops)
+{
+ struct xfs_buf *bp;
+ int error;
+
+ *bpp = NULL;
+ bp = libxfs_getbufr_uncached(targ, daddr, bblen);
+ if (!bp)
+ return -ENOMEM;
+
+ error = libxfs_readbufr(targ, daddr, bp, bblen, flags);
+ if (error)
+ goto err;
+
+ error = libxfs_readbuf_verify(bp, ops);
+ if (error)
+ goto err;
+
+ *bpp = bp;
+ return 0;
+err:
+ libxfs_buf_relse(bp);
+ return error;
+}
+
static int
__write_buf(int fd, void *buf, int len, off64_t offset, int flags)
{