|
@@ -638,6 +638,40 @@ xfs_buf_readahead(
|
|
|
xfs_buf_read(target, ioff, isize, flags);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Read an uncached buffer from disk. Allocates and returns a locked
|
|
|
+ * buffer containing the disk contents or nothing.
|
|
|
+ */
|
|
|
+struct xfs_buf *
|
|
|
+xfs_buf_read_uncached(
|
|
|
+ struct xfs_mount *mp,
|
|
|
+ struct xfs_buftarg *target,
|
|
|
+ xfs_daddr_t daddr,
|
|
|
+ size_t length,
|
|
|
+ int flags)
|
|
|
+{
|
|
|
+ xfs_buf_t *bp;
|
|
|
+ int error;
|
|
|
+
|
|
|
+ bp = xfs_buf_get_uncached(target, length, flags);
|
|
|
+ if (!bp)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ /* set up the buffer for a read IO */
|
|
|
+ xfs_buf_lock(bp);
|
|
|
+ XFS_BUF_SET_ADDR(bp, daddr);
|
|
|
+ XFS_BUF_READ(bp);
|
|
|
+ XFS_BUF_BUSY(bp);
|
|
|
+
|
|
|
+ xfsbdstrat(mp, bp);
|
|
|
+ error = xfs_iowait(bp);
|
|
|
+ if (error || bp->b_error) {
|
|
|
+ xfs_buf_relse(bp);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ return bp;
|
|
|
+}
|
|
|
+
|
|
|
xfs_buf_t *
|
|
|
xfs_buf_get_empty(
|
|
|
size_t len,
|