11da177e4SLinus Torvalds /* 27b718769SNathan Scott * Copyright (c) 2000-2005 Silicon Graphics, Inc. 37b718769SNathan Scott * All Rights Reserved. 41da177e4SLinus Torvalds * 57b718769SNathan Scott * This program is free software; you can redistribute it and/or 67b718769SNathan Scott * modify it under the terms of the GNU General Public License as 71da177e4SLinus Torvalds * published by the Free Software Foundation. 81da177e4SLinus Torvalds * 97b718769SNathan Scott * This program is distributed in the hope that it would be useful, 107b718769SNathan Scott * but WITHOUT ANY WARRANTY; without even the implied warranty of 117b718769SNathan Scott * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 127b718769SNathan Scott * GNU General Public License for more details. 131da177e4SLinus Torvalds * 147b718769SNathan Scott * You should have received a copy of the GNU General Public License 157b718769SNathan Scott * along with this program; if not, write the Free Software Foundation, 167b718769SNathan Scott * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 171da177e4SLinus Torvalds */ 181da177e4SLinus Torvalds #ifndef __XFS_BUF_H__ 191da177e4SLinus Torvalds #define __XFS_BUF_H__ 201da177e4SLinus Torvalds 211da177e4SLinus Torvalds #include <linux/list.h> 221da177e4SLinus Torvalds #include <linux/types.h> 231da177e4SLinus Torvalds #include <linux/spinlock.h> 241da177e4SLinus Torvalds #include <linux/mm.h> 251da177e4SLinus Torvalds #include <linux/fs.h> 26c94c2acfSMatthew Wilcox #include <linux/dax.h> 271da177e4SLinus Torvalds #include <linux/buffer_head.h> 281da177e4SLinus Torvalds #include <linux/uio.h> 29e80dfa19SDave Chinner #include <linux/list_lru.h> 301da177e4SLinus Torvalds 311da177e4SLinus Torvalds /* 321da177e4SLinus Torvalds * Base types 331da177e4SLinus Torvalds */ 341da177e4SLinus Torvalds 351da177e4SLinus Torvalds #define XFS_BUF_DADDR_NULL ((xfs_daddr_t) (-1LL)) 361da177e4SLinus Torvalds 37ce8e922cSNathan Scott typedef enum { 38ce8e922cSNathan Scott XBRW_READ = 1, /* transfer into target memory */ 39ce8e922cSNathan Scott XBRW_WRITE = 2, /* transfer from target memory */ 40ce8e922cSNathan Scott XBRW_ZERO = 3, /* Zero target memory */ 41ce8e922cSNathan Scott } xfs_buf_rw_t; 421da177e4SLinus Torvalds 43807cbbdbSChristoph Hellwig #define XBF_READ (1 << 0) /* buffer intended for reading from device */ 44807cbbdbSChristoph Hellwig #define XBF_WRITE (1 << 1) /* buffer intended for writing to device */ 451d5ae5dfSChristoph Hellwig #define XBF_READ_AHEAD (1 << 2) /* asynchronous read-ahead */ 46807cbbdbSChristoph Hellwig #define XBF_ASYNC (1 << 4) /* initiator will not wait for completion */ 47807cbbdbSChristoph Hellwig #define XBF_DONE (1 << 5) /* all pages in the buffer uptodate */ 4843ff2122SChristoph Hellwig #define XBF_STALE (1 << 6) /* buffer has been staled, do not find it */ 49ac8809f9SDave Chinner #define XBF_WRITE_FAIL (1 << 24)/* async writes have failed on this buffer */ 501d5ae5dfSChristoph Hellwig 511d5ae5dfSChristoph Hellwig /* I/O hints for the BIO layer */ 521d5ae5dfSChristoph Hellwig #define XBF_SYNCIO (1 << 10)/* treat this buffer as synchronous I/O */ 531d5ae5dfSChristoph Hellwig #define XBF_FUA (1 << 11)/* force cache write through mode */ 541d5ae5dfSChristoph Hellwig #define XBF_FLUSH (1 << 12)/* flush the disk cache before a write */ 551da177e4SLinus Torvalds 561da177e4SLinus Torvalds /* flags used only as arguments to access routines */ 571d5ae5dfSChristoph Hellwig #define XBF_TRYLOCK (1 << 16)/* lock requested, but do not wait */ 58611c9946SDave Chinner #define XBF_UNMAPPED (1 << 17)/* do not map the buffer */ 591da177e4SLinus Torvalds 601da177e4SLinus Torvalds /* flags used only internally */ 611d5ae5dfSChristoph Hellwig #define _XBF_PAGES (1 << 20)/* backed by refcounted pages */ 621d5ae5dfSChristoph Hellwig #define _XBF_KMEM (1 << 21)/* backed by heap memory */ 6343ff2122SChristoph Hellwig #define _XBF_DELWRI_Q (1 << 22)/* buffer on a delwri queue */ 64cbb7baabSDave Chinner #define _XBF_COMPOUND (1 << 23)/* compound buffer */ 656ab455eeSChristoph Hellwig 66807cbbdbSChristoph Hellwig typedef unsigned int xfs_buf_flags_t; 671da177e4SLinus Torvalds 680b1b213fSChristoph Hellwig #define XFS_BUF_FLAGS \ 690b1b213fSChristoph Hellwig { XBF_READ, "READ" }, \ 700b1b213fSChristoph Hellwig { XBF_WRITE, "WRITE" }, \ 711d5ae5dfSChristoph Hellwig { XBF_READ_AHEAD, "READ_AHEAD" }, \ 720b1b213fSChristoph Hellwig { XBF_ASYNC, "ASYNC" }, \ 730b1b213fSChristoph Hellwig { XBF_DONE, "DONE" }, \ 740b1b213fSChristoph Hellwig { XBF_STALE, "STALE" }, \ 75ac8809f9SDave Chinner { XBF_WRITE_FAIL, "WRITE_FAIL" }, \ 761d5ae5dfSChristoph Hellwig { XBF_SYNCIO, "SYNCIO" }, \ 771d5ae5dfSChristoph Hellwig { XBF_FUA, "FUA" }, \ 781d5ae5dfSChristoph Hellwig { XBF_FLUSH, "FLUSH" }, \ 79a8acad70SDave Chinner { XBF_TRYLOCK, "TRYLOCK" }, /* should never be set */\ 80611c9946SDave Chinner { XBF_UNMAPPED, "UNMAPPED" }, /* ditto */\ 810b1b213fSChristoph Hellwig { _XBF_PAGES, "PAGES" }, \ 820e6e847fSDave Chinner { _XBF_KMEM, "KMEM" }, \ 83cbb7baabSDave Chinner { _XBF_DELWRI_Q, "DELWRI_Q" }, \ 84a4082357SDave Chinner { _XBF_COMPOUND, "COMPOUND" } 85a4082357SDave Chinner 86ac8809f9SDave Chinner 87a4082357SDave Chinner /* 88a4082357SDave Chinner * Internal state flags. 89a4082357SDave Chinner */ 90a4082357SDave Chinner #define XFS_BSTATE_DISPOSE (1 << 0) /* buffer being discarded */ 910b1b213fSChristoph Hellwig 927c71ee78SEric Sandeen /* 937c71ee78SEric Sandeen * The xfs_buftarg contains 2 notions of "sector size" - 947c71ee78SEric Sandeen * 957c71ee78SEric Sandeen * 1) The metadata sector size, which is the minimum unit and 967c71ee78SEric Sandeen * alignment of IO which will be performed by metadata operations. 977c71ee78SEric Sandeen * 2) The device logical sector size 987c71ee78SEric Sandeen * 997c71ee78SEric Sandeen * The first is specified at mkfs time, and is stored on-disk in the 1007c71ee78SEric Sandeen * superblock's sb_sectsize. 1017c71ee78SEric Sandeen * 1027c71ee78SEric Sandeen * The latter is derived from the underlying device, and controls direct IO 1037c71ee78SEric Sandeen * alignment constraints. 1047c71ee78SEric Sandeen */ 1051da177e4SLinus Torvalds typedef struct xfs_buftarg { 106ce8e922cSNathan Scott dev_t bt_dev; 107ce8e922cSNathan Scott struct block_device *bt_bdev; 1080e6e847fSDave Chinner struct backing_dev_info *bt_bdi; 109ebad861bSDave Chinner struct xfs_mount *bt_mount; 1106da54179SEric Sandeen unsigned int bt_meta_sectorsize; 1116da54179SEric Sandeen size_t bt_meta_sectormask; 1127c71ee78SEric Sandeen size_t bt_logical_sectorsize; 1137c71ee78SEric Sandeen size_t bt_logical_sectormask; 1141da177e4SLinus Torvalds 115ff57ab21SDave Chinner /* LRU control structures */ 116ff57ab21SDave Chinner struct shrinker bt_shrinker; 117e80dfa19SDave Chinner struct list_lru bt_lru; 1181da177e4SLinus Torvalds } xfs_buftarg_t; 1191da177e4SLinus Torvalds 1201da177e4SLinus Torvalds struct xfs_buf; 121ce8e922cSNathan Scott typedef void (*xfs_buf_iodone_t)(struct xfs_buf *); 1221da177e4SLinus Torvalds 123c3f8fc73SDave Chinner 124ce8e922cSNathan Scott #define XB_PAGES 2 1251da177e4SLinus Torvalds 126cbb7baabSDave Chinner struct xfs_buf_map { 127cbb7baabSDave Chinner xfs_daddr_t bm_bn; /* block number for I/O */ 128cbb7baabSDave Chinner int bm_len; /* size of I/O */ 129cbb7baabSDave Chinner }; 130cbb7baabSDave Chinner 1313e85c868SDave Chinner #define DEFINE_SINGLE_BUF_MAP(map, blkno, numblk) \ 1323e85c868SDave Chinner struct xfs_buf_map (map) = { .bm_bn = (blkno), .bm_len = (numblk) }; 1333e85c868SDave Chinner 1341813dd64SDave Chinner struct xfs_buf_ops { 1351813dd64SDave Chinner void (*verify_read)(struct xfs_buf *); 1361813dd64SDave Chinner void (*verify_write)(struct xfs_buf *); 1371813dd64SDave Chinner }; 1381813dd64SDave Chinner 1391da177e4SLinus Torvalds typedef struct xfs_buf { 14050f59e8eSDave Chinner /* 14150f59e8eSDave Chinner * first cacheline holds all the fields needed for an uncontended cache 14250f59e8eSDave Chinner * hit to be fully processed. The semaphore straddles the cacheline 14350f59e8eSDave Chinner * boundary, but the counter and lock sits on the first cacheline, 14450f59e8eSDave Chinner * which is the only bit that is touched if we hit the semaphore 14550f59e8eSDave Chinner * fast-path on locking. 14650f59e8eSDave Chinner */ 14774f75a0cSDave Chinner struct rb_node b_rbnode; /* rbtree node */ 148cbb7baabSDave Chinner xfs_daddr_t b_bn; /* block number of buffer */ 1494e94b71bSDave Chinner int b_length; /* size of buffer in BBs */ 15050f59e8eSDave Chinner atomic_t b_hold; /* reference count */ 151430cbeb8SDave Chinner atomic_t b_lru_ref; /* lru reclaim ref count */ 15250f59e8eSDave Chinner xfs_buf_flags_t b_flags; /* status flags */ 15350f59e8eSDave Chinner struct semaphore b_sema; /* semaphore for lockables */ 15450f59e8eSDave Chinner 1556fb8a90aSCarlos Maiolino /* 1566fb8a90aSCarlos Maiolino * concurrent access to b_lru and b_lru_flags are protected by 1576fb8a90aSCarlos Maiolino * bt_lru_lock and not by b_sema 1586fb8a90aSCarlos Maiolino */ 159430cbeb8SDave Chinner struct list_head b_lru; /* lru list */ 160a4082357SDave Chinner spinlock_t b_lock; /* internal state lock */ 161a4082357SDave Chinner unsigned int b_state; /* internal state flags */ 16261be9c52SDave Chinner int b_io_error; /* internal IO error state */ 16350f59e8eSDave Chinner wait_queue_head_t b_waiters; /* unpin waiters */ 16450f59e8eSDave Chinner struct list_head b_list; 16550f59e8eSDave Chinner struct xfs_perag *b_pag; /* contains rbtree root */ 16650f59e8eSDave Chinner xfs_buftarg_t *b_target; /* buffer target (device) */ 167ce8e922cSNathan Scott void *b_addr; /* virtual address of buffer */ 168b29c70f5SBrian Foster struct work_struct b_ioend_work; 169b29c70f5SBrian Foster struct workqueue_struct *b_ioend_wq; /* I/O completion wq */ 170ce8e922cSNathan Scott xfs_buf_iodone_t b_iodone; /* I/O completion function */ 171b4dd330bSDavid Chinner struct completion b_iowait; /* queue for I/O waiters */ 172ce8e922cSNathan Scott void *b_fspriv; 173bf9d9013SChristoph Hellwig struct xfs_trans *b_transp; 174ce8e922cSNathan Scott struct page **b_pages; /* array of page pointers */ 175ce8e922cSNathan Scott struct page *b_page_array[XB_PAGES]; /* inline pages */ 1763e85c868SDave Chinner struct xfs_buf_map *b_maps; /* compound buffer map */ 177d44d9bc6SMark Tinguely struct xfs_buf_map __b_map; /* inline compound buffer map */ 1783e85c868SDave Chinner int b_map_count; 179aa0e8833SDave Chinner int b_io_length; /* IO size in BBs */ 18050f59e8eSDave Chinner atomic_t b_pin_count; /* pin count */ 18150f59e8eSDave Chinner atomic_t b_io_remaining; /* #outstanding I/O requests */ 18250f59e8eSDave Chinner unsigned int b_page_count; /* size of page array */ 18350f59e8eSDave Chinner unsigned int b_offset; /* page offset in first page */ 1842451337dSDave Chinner int b_error; /* error code on I/O */ 1851813dd64SDave Chinner const struct xfs_buf_ops *b_ops; 186cfb02852SDave Chinner 187ce8e922cSNathan Scott #ifdef XFS_BUF_LOCK_TRACKING 188ce8e922cSNathan Scott int b_last_holder; 1891da177e4SLinus Torvalds #endif 1901da177e4SLinus Torvalds } xfs_buf_t; 1911da177e4SLinus Torvalds 1921da177e4SLinus Torvalds /* Finding and Reading Buffers */ 1933e85c868SDave Chinner struct xfs_buf *_xfs_buf_find(struct xfs_buftarg *target, 1943e85c868SDave Chinner struct xfs_buf_map *map, int nmaps, 1953e85c868SDave Chinner xfs_buf_flags_t flags, struct xfs_buf *new_bp); 1963e85c868SDave Chinner 1973e85c868SDave Chinner static inline struct xfs_buf * 1983e85c868SDave Chinner xfs_incore( 1993e85c868SDave Chinner struct xfs_buftarg *target, 2003e85c868SDave Chinner xfs_daddr_t blkno, 2013e85c868SDave Chinner size_t numblks, 2023e85c868SDave Chinner xfs_buf_flags_t flags) 2033e85c868SDave Chinner { 2043e85c868SDave Chinner DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); 2053e85c868SDave Chinner return _xfs_buf_find(target, &map, 1, flags, NULL); 2063e85c868SDave Chinner } 2073e85c868SDave Chinner 2083e85c868SDave Chinner struct xfs_buf *_xfs_buf_alloc(struct xfs_buftarg *target, 2093e85c868SDave Chinner struct xfs_buf_map *map, int nmaps, 2103e85c868SDave Chinner xfs_buf_flags_t flags); 2113e85c868SDave Chinner 2123e85c868SDave Chinner static inline struct xfs_buf * 2133e85c868SDave Chinner xfs_buf_alloc( 2143e85c868SDave Chinner struct xfs_buftarg *target, 2153e85c868SDave Chinner xfs_daddr_t blkno, 2163e85c868SDave Chinner size_t numblks, 2173e85c868SDave Chinner xfs_buf_flags_t flags) 2183e85c868SDave Chinner { 2193e85c868SDave Chinner DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); 2203e85c868SDave Chinner return _xfs_buf_alloc(target, &map, 1, flags); 2213e85c868SDave Chinner } 2221da177e4SLinus Torvalds 2236dde2707SDave Chinner struct xfs_buf *xfs_buf_get_map(struct xfs_buftarg *target, 2246dde2707SDave Chinner struct xfs_buf_map *map, int nmaps, 2256dde2707SDave Chinner xfs_buf_flags_t flags); 2266dde2707SDave Chinner struct xfs_buf *xfs_buf_read_map(struct xfs_buftarg *target, 2276dde2707SDave Chinner struct xfs_buf_map *map, int nmaps, 2281813dd64SDave Chinner xfs_buf_flags_t flags, 2291813dd64SDave Chinner const struct xfs_buf_ops *ops); 2306dde2707SDave Chinner void xfs_buf_readahead_map(struct xfs_buftarg *target, 231c3f8fc73SDave Chinner struct xfs_buf_map *map, int nmaps, 2321813dd64SDave Chinner const struct xfs_buf_ops *ops); 2336dde2707SDave Chinner 2346dde2707SDave Chinner static inline struct xfs_buf * 2356dde2707SDave Chinner xfs_buf_get( 2366dde2707SDave Chinner struct xfs_buftarg *target, 2376dde2707SDave Chinner xfs_daddr_t blkno, 2386dde2707SDave Chinner size_t numblks, 2396dde2707SDave Chinner xfs_buf_flags_t flags) 2406dde2707SDave Chinner { 2416dde2707SDave Chinner DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); 2426dde2707SDave Chinner return xfs_buf_get_map(target, &map, 1, flags); 2436dde2707SDave Chinner } 2446dde2707SDave Chinner 2456dde2707SDave Chinner static inline struct xfs_buf * 2466dde2707SDave Chinner xfs_buf_read( 2476dde2707SDave Chinner struct xfs_buftarg *target, 2486dde2707SDave Chinner xfs_daddr_t blkno, 2496dde2707SDave Chinner size_t numblks, 250c3f8fc73SDave Chinner xfs_buf_flags_t flags, 2511813dd64SDave Chinner const struct xfs_buf_ops *ops) 2526dde2707SDave Chinner { 2536dde2707SDave Chinner DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); 2541813dd64SDave Chinner return xfs_buf_read_map(target, &map, 1, flags, ops); 2556dde2707SDave Chinner } 2566dde2707SDave Chinner 2576dde2707SDave Chinner static inline void 2586dde2707SDave Chinner xfs_buf_readahead( 2596dde2707SDave Chinner struct xfs_buftarg *target, 2606dde2707SDave Chinner xfs_daddr_t blkno, 261c3f8fc73SDave Chinner size_t numblks, 2621813dd64SDave Chinner const struct xfs_buf_ops *ops) 2636dde2707SDave Chinner { 2646dde2707SDave Chinner DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); 2651813dd64SDave Chinner return xfs_buf_readahead_map(target, &map, 1, ops); 2666dde2707SDave Chinner } 2671da177e4SLinus Torvalds 268e70b73f8SDave Chinner struct xfs_buf *xfs_buf_get_empty(struct xfs_buftarg *target, size_t numblks); 269e70b73f8SDave Chinner void xfs_buf_set_empty(struct xfs_buf *bp, size_t numblks); 270e70b73f8SDave Chinner int xfs_buf_associate_memory(struct xfs_buf *bp, void *mem, size_t length); 271e70b73f8SDave Chinner 272e70b73f8SDave Chinner struct xfs_buf *xfs_buf_get_uncached(struct xfs_buftarg *target, size_t numblks, 273e70b73f8SDave Chinner int flags); 274ba372674SDave Chinner int xfs_buf_read_uncached(struct xfs_buftarg *target, xfs_daddr_t daddr, 275ba372674SDave Chinner size_t numblks, int flags, struct xfs_buf **bpp, 2761813dd64SDave Chinner const struct xfs_buf_ops *ops); 277e70b73f8SDave Chinner void xfs_buf_hold(struct xfs_buf *bp); 2781da177e4SLinus Torvalds 2791da177e4SLinus Torvalds /* Releasing Buffers */ 280ce8e922cSNathan Scott extern void xfs_buf_free(xfs_buf_t *); 281ce8e922cSNathan Scott extern void xfs_buf_rele(xfs_buf_t *); 2821da177e4SLinus Torvalds 2831da177e4SLinus Torvalds /* Locking and Unlocking Buffers */ 2840c842ad4SChristoph Hellwig extern int xfs_buf_trylock(xfs_buf_t *); 285ce8e922cSNathan Scott extern void xfs_buf_lock(xfs_buf_t *); 286ce8e922cSNathan Scott extern void xfs_buf_unlock(xfs_buf_t *); 2870c842ad4SChristoph Hellwig #define xfs_buf_islocked(bp) \ 2880c842ad4SChristoph Hellwig ((bp)->b_sema.count <= 0) 2891da177e4SLinus Torvalds 2901da177e4SLinus Torvalds /* Buffer Read and Write Routines */ 291c2b006c1SChristoph Hellwig extern int xfs_bwrite(struct xfs_buf *bp); 292e8aaba9aSDave Chinner extern void xfs_buf_ioend(struct xfs_buf *bp); 293ce8e922cSNathan Scott extern void xfs_buf_ioerror(xfs_buf_t *, int); 294901796afSChristoph Hellwig extern void xfs_buf_ioerror_alert(struct xfs_buf *, const char *func); 295595bff75SDave Chinner extern void xfs_buf_submit(struct xfs_buf *bp); 296595bff75SDave Chinner extern int xfs_buf_submit_wait(struct xfs_buf *bp); 297b9c48649SDave Chinner extern void xfs_buf_iomove(xfs_buf_t *, size_t, size_t, void *, 298ce8e922cSNathan Scott xfs_buf_rw_t); 2991a1a3e97SChristoph Hellwig #define xfs_buf_zero(bp, off, len) \ 3001a1a3e97SChristoph Hellwig xfs_buf_iomove((bp), (off), (len), NULL, XBRW_ZERO) 3011da177e4SLinus Torvalds 3021da177e4SLinus Torvalds /* Buffer Utility Routines */ 30388ee2df7SChristoph Hellwig extern void *xfs_buf_offset(struct xfs_buf *, size_t); 3041da177e4SLinus Torvalds 3051da177e4SLinus Torvalds /* Delayed Write Buffer Routines */ 30643ff2122SChristoph Hellwig extern bool xfs_buf_delwri_queue(struct xfs_buf *, struct list_head *); 30743ff2122SChristoph Hellwig extern int xfs_buf_delwri_submit(struct list_head *); 30843ff2122SChristoph Hellwig extern int xfs_buf_delwri_submit_nowait(struct list_head *); 3091da177e4SLinus Torvalds 3101da177e4SLinus Torvalds /* Buffer Daemon Setup Routines */ 311ce8e922cSNathan Scott extern int xfs_buf_init(void); 312ce8e922cSNathan Scott extern void xfs_buf_terminate(void); 3131da177e4SLinus Torvalds 3141d5ae5dfSChristoph Hellwig #define XFS_BUF_ZEROFLAGS(bp) \ 31543ff2122SChristoph Hellwig ((bp)->b_flags &= ~(XBF_READ|XBF_WRITE|XBF_ASYNC| \ 316ac8809f9SDave Chinner XBF_SYNCIO|XBF_FUA|XBF_FLUSH| \ 317ac8809f9SDave Chinner XBF_WRITE_FAIL)) 3181da177e4SLinus Torvalds 319430cbeb8SDave Chinner void xfs_buf_stale(struct xfs_buf *bp); 3200cadda1cSChristoph Hellwig #define XFS_BUF_UNSTALE(bp) ((bp)->b_flags &= ~XBF_STALE) 3210cadda1cSChristoph Hellwig #define XFS_BUF_ISSTALE(bp) ((bp)->b_flags & XBF_STALE) 3221da177e4SLinus Torvalds 323ce8e922cSNathan Scott #define XFS_BUF_DONE(bp) ((bp)->b_flags |= XBF_DONE) 324ce8e922cSNathan Scott #define XFS_BUF_UNDONE(bp) ((bp)->b_flags &= ~XBF_DONE) 325ce8e922cSNathan Scott #define XFS_BUF_ISDONE(bp) ((bp)->b_flags & XBF_DONE) 3261da177e4SLinus Torvalds 327ce8e922cSNathan Scott #define XFS_BUF_ASYNC(bp) ((bp)->b_flags |= XBF_ASYNC) 328ce8e922cSNathan Scott #define XFS_BUF_UNASYNC(bp) ((bp)->b_flags &= ~XBF_ASYNC) 329ce8e922cSNathan Scott #define XFS_BUF_ISASYNC(bp) ((bp)->b_flags & XBF_ASYNC) 3301da177e4SLinus Torvalds 331ce8e922cSNathan Scott #define XFS_BUF_READ(bp) ((bp)->b_flags |= XBF_READ) 332ce8e922cSNathan Scott #define XFS_BUF_UNREAD(bp) ((bp)->b_flags &= ~XBF_READ) 333ce8e922cSNathan Scott #define XFS_BUF_ISREAD(bp) ((bp)->b_flags & XBF_READ) 3341da177e4SLinus Torvalds 335ce8e922cSNathan Scott #define XFS_BUF_WRITE(bp) ((bp)->b_flags |= XBF_WRITE) 336ce8e922cSNathan Scott #define XFS_BUF_UNWRITE(bp) ((bp)->b_flags &= ~XBF_WRITE) 337ce8e922cSNathan Scott #define XFS_BUF_ISWRITE(bp) ((bp)->b_flags & XBF_WRITE) 3381da177e4SLinus Torvalds 339cbb7baabSDave Chinner /* 340cbb7baabSDave Chinner * These macros use the IO block map rather than b_bn. b_bn is now really 341cbb7baabSDave Chinner * just for the buffer cache index for cached buffers. As IO does not use b_bn 342cbb7baabSDave Chinner * anymore, uncached buffers do not use b_bn at all and hence must modify the IO 343cbb7baabSDave Chinner * map directly. Uncached buffers are not allowed to be discontiguous, so this 344cbb7baabSDave Chinner * is safe to do. 345cbb7baabSDave Chinner * 346cbb7baabSDave Chinner * In future, uncached buffers will pass the block number directly to the io 347cbb7baabSDave Chinner * request function and hence these macros will go away at that point. 348cbb7baabSDave Chinner */ 349d44d9bc6SMark Tinguely #define XFS_BUF_ADDR(bp) ((bp)->b_maps[0].bm_bn) 350d44d9bc6SMark Tinguely #define XFS_BUF_SET_ADDR(bp, bno) ((bp)->b_maps[0].bm_bn = (xfs_daddr_t)(bno)) 3511da177e4SLinus Torvalds 35238f23232SChristoph Hellwig static inline void xfs_buf_set_ref(struct xfs_buf *bp, int lru_ref) 353821eb21dSDave Chinner { 354821eb21dSDave Chinner atomic_set(&bp->b_lru_ref, lru_ref); 355821eb21dSDave Chinner } 3561da177e4SLinus Torvalds 357811e64c7SChandra Seetharaman static inline int xfs_buf_ispinned(struct xfs_buf *bp) 358811e64c7SChandra Seetharaman { 359811e64c7SChandra Seetharaman return atomic_read(&bp->b_pin_count); 360811e64c7SChandra Seetharaman } 3611da177e4SLinus Torvalds 3621da177e4SLinus Torvalds static inline void xfs_buf_relse(xfs_buf_t *bp) 3631da177e4SLinus Torvalds { 364ce8e922cSNathan Scott xfs_buf_unlock(bp); 365ce8e922cSNathan Scott xfs_buf_rele(bp); 3661da177e4SLinus Torvalds } 3671da177e4SLinus Torvalds 36851582170SEric Sandeen static inline int 36951582170SEric Sandeen xfs_buf_verify_cksum(struct xfs_buf *bp, unsigned long cksum_offset) 37051582170SEric Sandeen { 37151582170SEric Sandeen return xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), 37251582170SEric Sandeen cksum_offset); 37351582170SEric Sandeen } 37451582170SEric Sandeen 375f1dbcd7eSEric Sandeen static inline void 376f1dbcd7eSEric Sandeen xfs_buf_update_cksum(struct xfs_buf *bp, unsigned long cksum_offset) 377f1dbcd7eSEric Sandeen { 378f1dbcd7eSEric Sandeen xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), 379f1dbcd7eSEric Sandeen cksum_offset); 380f1dbcd7eSEric Sandeen } 381f1dbcd7eSEric Sandeen 3821da177e4SLinus Torvalds /* 3831da177e4SLinus Torvalds * Handling of buftargs. 3841da177e4SLinus Torvalds */ 385ebad861bSDave Chinner extern xfs_buftarg_t *xfs_alloc_buftarg(struct xfs_mount *, 38634dcefd7SEric Sandeen struct block_device *); 387c141b292SChristoph Hellwig extern void xfs_free_buftarg(struct xfs_mount *, struct xfs_buftarg *); 3881da177e4SLinus Torvalds extern void xfs_wait_buftarg(xfs_buftarg_t *); 389a96c4151SEric Sandeen extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int); 390d808f617SDave Chinner 391ce8e922cSNathan Scott #define xfs_getsize_buftarg(buftarg) block_size((buftarg)->bt_bdev) 392ce8e922cSNathan Scott #define xfs_readonly_buftarg(buftarg) bdev_read_only((buftarg)->bt_bdev) 393ce8e922cSNathan Scott 3941da177e4SLinus Torvalds #endif /* __XFS_BUF_H__ */ 395