diff options
Diffstat (limited to 'fs/xfs/xfs_buf.h')
-rw-r--r-- | fs/xfs/xfs_buf.h | 96 |
1 files changed, 34 insertions, 62 deletions
diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 5bf3be45f543..7f1d1392ce37 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h | |||
@@ -32,11 +32,6 @@ | |||
32 | 32 | ||
33 | #define XFS_BUF_DADDR_NULL ((xfs_daddr_t) (-1LL)) | 33 | #define XFS_BUF_DADDR_NULL ((xfs_daddr_t) (-1LL)) |
34 | 34 | ||
35 | #define xfs_buf_ctob(pp) ((pp) * PAGE_CACHE_SIZE) | ||
36 | #define xfs_buf_btoc(dd) (((dd) + PAGE_CACHE_SIZE-1) >> PAGE_CACHE_SHIFT) | ||
37 | #define xfs_buf_btoct(dd) ((dd) >> PAGE_CACHE_SHIFT) | ||
38 | #define xfs_buf_poff(aa) ((aa) & ~PAGE_CACHE_MASK) | ||
39 | |||
40 | typedef enum { | 35 | typedef enum { |
41 | XBRW_READ = 1, /* transfer into target memory */ | 36 | XBRW_READ = 1, /* transfer into target memory */ |
42 | XBRW_WRITE = 2, /* transfer from target memory */ | 37 | XBRW_WRITE = 2, /* transfer from target memory */ |
@@ -46,11 +41,9 @@ typedef enum { | |||
46 | #define XBF_READ (1 << 0) /* buffer intended for reading from device */ | 41 | #define XBF_READ (1 << 0) /* buffer intended for reading from device */ |
47 | #define XBF_WRITE (1 << 1) /* buffer intended for writing to device */ | 42 | #define XBF_WRITE (1 << 1) /* buffer intended for writing to device */ |
48 | #define XBF_READ_AHEAD (1 << 2) /* asynchronous read-ahead */ | 43 | #define XBF_READ_AHEAD (1 << 2) /* asynchronous read-ahead */ |
49 | #define XBF_MAPPED (1 << 3) /* buffer mapped (b_addr valid) */ | ||
50 | #define XBF_ASYNC (1 << 4) /* initiator will not wait for completion */ | 44 | #define XBF_ASYNC (1 << 4) /* initiator will not wait for completion */ |
51 | #define XBF_DONE (1 << 5) /* all pages in the buffer uptodate */ | 45 | #define XBF_DONE (1 << 5) /* all pages in the buffer uptodate */ |
52 | #define XBF_DELWRI (1 << 6) /* buffer has dirty pages */ | 46 | #define XBF_STALE (1 << 6) /* buffer has been staled, do not find it */ |
53 | #define XBF_STALE (1 << 7) /* buffer has been staled, do not find it */ | ||
54 | 47 | ||
55 | /* I/O hints for the BIO layer */ | 48 | /* I/O hints for the BIO layer */ |
56 | #define XBF_SYNCIO (1 << 10)/* treat this buffer as synchronous I/O */ | 49 | #define XBF_SYNCIO (1 << 10)/* treat this buffer as synchronous I/O */ |
@@ -58,14 +51,13 @@ typedef enum { | |||
58 | #define XBF_FLUSH (1 << 12)/* flush the disk cache before a write */ | 51 | #define XBF_FLUSH (1 << 12)/* flush the disk cache before a write */ |
59 | 52 | ||
60 | /* flags used only as arguments to access routines */ | 53 | /* flags used only as arguments to access routines */ |
61 | #define XBF_LOCK (1 << 15)/* lock requested */ | ||
62 | #define XBF_TRYLOCK (1 << 16)/* lock requested, but do not wait */ | 54 | #define XBF_TRYLOCK (1 << 16)/* lock requested, but do not wait */ |
63 | #define XBF_DONT_BLOCK (1 << 17)/* do not block in current thread */ | 55 | #define XBF_UNMAPPED (1 << 17)/* do not map the buffer */ |
64 | 56 | ||
65 | /* flags used only internally */ | 57 | /* flags used only internally */ |
66 | #define _XBF_PAGES (1 << 20)/* backed by refcounted pages */ | 58 | #define _XBF_PAGES (1 << 20)/* backed by refcounted pages */ |
67 | #define _XBF_KMEM (1 << 21)/* backed by heap memory */ | 59 | #define _XBF_KMEM (1 << 21)/* backed by heap memory */ |
68 | #define _XBF_DELWRI_Q (1 << 22)/* buffer on delwri queue */ | 60 | #define _XBF_DELWRI_Q (1 << 22)/* buffer on a delwri queue */ |
69 | 61 | ||
70 | typedef unsigned int xfs_buf_flags_t; | 62 | typedef unsigned int xfs_buf_flags_t; |
71 | 63 | ||
@@ -73,25 +65,18 @@ typedef unsigned int xfs_buf_flags_t; | |||
73 | { XBF_READ, "READ" }, \ | 65 | { XBF_READ, "READ" }, \ |
74 | { XBF_WRITE, "WRITE" }, \ | 66 | { XBF_WRITE, "WRITE" }, \ |
75 | { XBF_READ_AHEAD, "READ_AHEAD" }, \ | 67 | { XBF_READ_AHEAD, "READ_AHEAD" }, \ |
76 | { XBF_MAPPED, "MAPPED" }, \ | ||
77 | { XBF_ASYNC, "ASYNC" }, \ | 68 | { XBF_ASYNC, "ASYNC" }, \ |
78 | { XBF_DONE, "DONE" }, \ | 69 | { XBF_DONE, "DONE" }, \ |
79 | { XBF_DELWRI, "DELWRI" }, \ | ||
80 | { XBF_STALE, "STALE" }, \ | 70 | { XBF_STALE, "STALE" }, \ |
81 | { XBF_SYNCIO, "SYNCIO" }, \ | 71 | { XBF_SYNCIO, "SYNCIO" }, \ |
82 | { XBF_FUA, "FUA" }, \ | 72 | { XBF_FUA, "FUA" }, \ |
83 | { XBF_FLUSH, "FLUSH" }, \ | 73 | { XBF_FLUSH, "FLUSH" }, \ |
84 | { XBF_LOCK, "LOCK" }, /* should never be set */\ | 74 | { XBF_TRYLOCK, "TRYLOCK" }, /* should never be set */\ |
85 | { XBF_TRYLOCK, "TRYLOCK" }, /* ditto */\ | 75 | { XBF_UNMAPPED, "UNMAPPED" }, /* ditto */\ |
86 | { XBF_DONT_BLOCK, "DONT_BLOCK" }, /* ditto */\ | ||
87 | { _XBF_PAGES, "PAGES" }, \ | 76 | { _XBF_PAGES, "PAGES" }, \ |
88 | { _XBF_KMEM, "KMEM" }, \ | 77 | { _XBF_KMEM, "KMEM" }, \ |
89 | { _XBF_DELWRI_Q, "DELWRI_Q" } | 78 | { _XBF_DELWRI_Q, "DELWRI_Q" } |
90 | 79 | ||
91 | typedef enum { | ||
92 | XBT_FORCE_FLUSH = 0, | ||
93 | } xfs_buftarg_flags_t; | ||
94 | |||
95 | typedef struct xfs_buftarg { | 80 | typedef struct xfs_buftarg { |
96 | dev_t bt_dev; | 81 | dev_t bt_dev; |
97 | struct block_device *bt_bdev; | 82 | struct block_device *bt_bdev; |
@@ -101,12 +86,6 @@ typedef struct xfs_buftarg { | |||
101 | unsigned int bt_sshift; | 86 | unsigned int bt_sshift; |
102 | size_t bt_smask; | 87 | size_t bt_smask; |
103 | 88 | ||
104 | /* per device delwri queue */ | ||
105 | struct task_struct *bt_task; | ||
106 | struct list_head bt_delwri_queue; | ||
107 | spinlock_t bt_delwri_lock; | ||
108 | unsigned long bt_flags; | ||
109 | |||
110 | /* LRU control structures */ | 89 | /* LRU control structures */ |
111 | struct shrinker bt_shrinker; | 90 | struct shrinker bt_shrinker; |
112 | struct list_head bt_lru; | 91 | struct list_head bt_lru; |
@@ -128,8 +107,8 @@ typedef struct xfs_buf { | |||
128 | * fast-path on locking. | 107 | * fast-path on locking. |
129 | */ | 108 | */ |
130 | struct rb_node b_rbnode; /* rbtree node */ | 109 | struct rb_node b_rbnode; /* rbtree node */ |
131 | xfs_off_t b_file_offset; /* offset in file */ | 110 | xfs_daddr_t b_bn; /* block number for I/O */ |
132 | size_t b_buffer_length;/* size of buffer in bytes */ | 111 | int b_length; /* size of buffer in BBs */ |
133 | atomic_t b_hold; /* reference count */ | 112 | atomic_t b_hold; /* reference count */ |
134 | atomic_t b_lru_ref; /* lru reclaim ref count */ | 113 | atomic_t b_lru_ref; /* lru reclaim ref count */ |
135 | xfs_buf_flags_t b_flags; /* status flags */ | 114 | xfs_buf_flags_t b_flags; /* status flags */ |
@@ -140,8 +119,6 @@ typedef struct xfs_buf { | |||
140 | struct list_head b_list; | 119 | struct list_head b_list; |
141 | struct xfs_perag *b_pag; /* contains rbtree root */ | 120 | struct xfs_perag *b_pag; /* contains rbtree root */ |
142 | xfs_buftarg_t *b_target; /* buffer target (device) */ | 121 | xfs_buftarg_t *b_target; /* buffer target (device) */ |
143 | xfs_daddr_t b_bn; /* block number for I/O */ | ||
144 | size_t b_count_desired;/* desired transfer size */ | ||
145 | void *b_addr; /* virtual address of buffer */ | 122 | void *b_addr; /* virtual address of buffer */ |
146 | struct work_struct b_iodone_work; | 123 | struct work_struct b_iodone_work; |
147 | xfs_buf_iodone_t b_iodone; /* I/O completion function */ | 124 | xfs_buf_iodone_t b_iodone; /* I/O completion function */ |
@@ -150,7 +127,7 @@ typedef struct xfs_buf { | |||
150 | struct xfs_trans *b_transp; | 127 | struct xfs_trans *b_transp; |
151 | struct page **b_pages; /* array of page pointers */ | 128 | struct page **b_pages; /* array of page pointers */ |
152 | struct page *b_page_array[XB_PAGES]; /* inline pages */ | 129 | struct page *b_page_array[XB_PAGES]; /* inline pages */ |
153 | unsigned long b_queuetime; /* time buffer was queued */ | 130 | int b_io_length; /* IO size in BBs */ |
154 | atomic_t b_pin_count; /* pin count */ | 131 | atomic_t b_pin_count; /* pin count */ |
155 | atomic_t b_io_remaining; /* #outstanding I/O requests */ | 132 | atomic_t b_io_remaining; /* #outstanding I/O requests */ |
156 | unsigned int b_page_count; /* size of page array */ | 133 | unsigned int b_page_count; /* size of page array */ |
@@ -163,26 +140,30 @@ typedef struct xfs_buf { | |||
163 | 140 | ||
164 | 141 | ||
165 | /* Finding and Reading Buffers */ | 142 | /* Finding and Reading Buffers */ |
166 | extern xfs_buf_t *_xfs_buf_find(xfs_buftarg_t *, xfs_off_t, size_t, | 143 | struct xfs_buf *_xfs_buf_find(struct xfs_buftarg *target, xfs_daddr_t blkno, |
167 | xfs_buf_flags_t, xfs_buf_t *); | 144 | size_t numblks, xfs_buf_flags_t flags, |
145 | struct xfs_buf *new_bp); | ||
168 | #define xfs_incore(buftarg,blkno,len,lockit) \ | 146 | #define xfs_incore(buftarg,blkno,len,lockit) \ |
169 | _xfs_buf_find(buftarg, blkno ,len, lockit, NULL) | 147 | _xfs_buf_find(buftarg, blkno ,len, lockit, NULL) |
170 | 148 | ||
171 | extern xfs_buf_t *xfs_buf_get(xfs_buftarg_t *, xfs_off_t, size_t, | 149 | struct xfs_buf *xfs_buf_get(struct xfs_buftarg *target, xfs_daddr_t blkno, |
172 | xfs_buf_flags_t); | 150 | size_t numblks, xfs_buf_flags_t flags); |
173 | extern xfs_buf_t *xfs_buf_read(xfs_buftarg_t *, xfs_off_t, size_t, | 151 | struct xfs_buf *xfs_buf_read(struct xfs_buftarg *target, xfs_daddr_t blkno, |
174 | xfs_buf_flags_t); | 152 | size_t numblks, xfs_buf_flags_t flags); |
175 | 153 | void xfs_buf_readahead(struct xfs_buftarg *target, xfs_daddr_t blkno, | |
176 | struct xfs_buf *xfs_buf_alloc(struct xfs_buftarg *, xfs_off_t, size_t, | 154 | size_t numblks); |
177 | xfs_buf_flags_t); | 155 | |
178 | extern void xfs_buf_set_empty(struct xfs_buf *bp, size_t len); | 156 | struct xfs_buf *xfs_buf_get_empty(struct xfs_buftarg *target, size_t numblks); |
179 | extern xfs_buf_t *xfs_buf_get_uncached(struct xfs_buftarg *, size_t, int); | 157 | struct xfs_buf *xfs_buf_alloc(struct xfs_buftarg *target, xfs_daddr_t blkno, |
180 | extern int xfs_buf_associate_memory(xfs_buf_t *, void *, size_t); | 158 | size_t numblks, xfs_buf_flags_t flags); |
181 | extern void xfs_buf_hold(xfs_buf_t *); | 159 | void xfs_buf_set_empty(struct xfs_buf *bp, size_t numblks); |
182 | extern void xfs_buf_readahead(xfs_buftarg_t *, xfs_off_t, size_t); | 160 | int xfs_buf_associate_memory(struct xfs_buf *bp, void *mem, size_t length); |
183 | struct xfs_buf *xfs_buf_read_uncached(struct xfs_mount *mp, | 161 | |
184 | struct xfs_buftarg *target, | 162 | struct xfs_buf *xfs_buf_get_uncached(struct xfs_buftarg *target, size_t numblks, |
185 | xfs_daddr_t daddr, size_t length, int flags); | 163 | int flags); |
164 | struct xfs_buf *xfs_buf_read_uncached(struct xfs_buftarg *target, | ||
165 | xfs_daddr_t daddr, size_t numblks, int flags); | ||
166 | void xfs_buf_hold(struct xfs_buf *bp); | ||
186 | 167 | ||
187 | /* Releasing Buffers */ | 168 | /* Releasing Buffers */ |
188 | extern void xfs_buf_free(xfs_buf_t *); | 169 | extern void xfs_buf_free(xfs_buf_t *); |
@@ -204,7 +185,7 @@ extern int xfs_bdstrat_cb(struct xfs_buf *); | |||
204 | extern void xfs_buf_ioend(xfs_buf_t *, int); | 185 | extern void xfs_buf_ioend(xfs_buf_t *, int); |
205 | extern void xfs_buf_ioerror(xfs_buf_t *, int); | 186 | extern void xfs_buf_ioerror(xfs_buf_t *, int); |
206 | extern void xfs_buf_ioerror_alert(struct xfs_buf *, const char *func); | 187 | extern void xfs_buf_ioerror_alert(struct xfs_buf *, const char *func); |
207 | extern int xfs_buf_iorequest(xfs_buf_t *); | 188 | extern void xfs_buf_iorequest(xfs_buf_t *); |
208 | extern int xfs_buf_iowait(xfs_buf_t *); | 189 | extern int xfs_buf_iowait(xfs_buf_t *); |
209 | extern void xfs_buf_iomove(xfs_buf_t *, size_t, size_t, void *, | 190 | extern void xfs_buf_iomove(xfs_buf_t *, size_t, size_t, void *, |
210 | xfs_buf_rw_t); | 191 | xfs_buf_rw_t); |
@@ -220,24 +201,22 @@ static inline int xfs_buf_geterror(xfs_buf_t *bp) | |||
220 | extern xfs_caddr_t xfs_buf_offset(xfs_buf_t *, size_t); | 201 | extern xfs_caddr_t xfs_buf_offset(xfs_buf_t *, size_t); |
221 | 202 | ||
222 | /* Delayed Write Buffer Routines */ | 203 | /* Delayed Write Buffer Routines */ |
223 | extern void xfs_buf_delwri_queue(struct xfs_buf *); | 204 | extern bool xfs_buf_delwri_queue(struct xfs_buf *, struct list_head *); |
224 | extern void xfs_buf_delwri_dequeue(struct xfs_buf *); | 205 | extern int xfs_buf_delwri_submit(struct list_head *); |
225 | extern void xfs_buf_delwri_promote(struct xfs_buf *); | 206 | extern int xfs_buf_delwri_submit_nowait(struct list_head *); |
226 | 207 | ||
227 | /* Buffer Daemon Setup Routines */ | 208 | /* Buffer Daemon Setup Routines */ |
228 | extern int xfs_buf_init(void); | 209 | extern int xfs_buf_init(void); |
229 | extern void xfs_buf_terminate(void); | 210 | extern void xfs_buf_terminate(void); |
230 | 211 | ||
231 | #define XFS_BUF_ZEROFLAGS(bp) \ | 212 | #define XFS_BUF_ZEROFLAGS(bp) \ |
232 | ((bp)->b_flags &= ~(XBF_READ|XBF_WRITE|XBF_ASYNC|XBF_DELWRI| \ | 213 | ((bp)->b_flags &= ~(XBF_READ|XBF_WRITE|XBF_ASYNC| \ |
233 | XBF_SYNCIO|XBF_FUA|XBF_FLUSH)) | 214 | XBF_SYNCIO|XBF_FUA|XBF_FLUSH)) |
234 | 215 | ||
235 | void xfs_buf_stale(struct xfs_buf *bp); | 216 | void xfs_buf_stale(struct xfs_buf *bp); |
236 | #define XFS_BUF_UNSTALE(bp) ((bp)->b_flags &= ~XBF_STALE) | 217 | #define XFS_BUF_UNSTALE(bp) ((bp)->b_flags &= ~XBF_STALE) |
237 | #define XFS_BUF_ISSTALE(bp) ((bp)->b_flags & XBF_STALE) | 218 | #define XFS_BUF_ISSTALE(bp) ((bp)->b_flags & XBF_STALE) |
238 | 219 | ||
239 | #define XFS_BUF_ISDELAYWRITE(bp) ((bp)->b_flags & XBF_DELWRI) | ||
240 | |||
241 | #define XFS_BUF_DONE(bp) ((bp)->b_flags |= XBF_DONE) | 220 | #define XFS_BUF_DONE(bp) ((bp)->b_flags |= XBF_DONE) |
242 | #define XFS_BUF_UNDONE(bp) ((bp)->b_flags &= ~XBF_DONE) | 221 | #define XFS_BUF_UNDONE(bp) ((bp)->b_flags &= ~XBF_DONE) |
243 | #define XFS_BUF_ISDONE(bp) ((bp)->b_flags & XBF_DONE) | 222 | #define XFS_BUF_ISDONE(bp) ((bp)->b_flags & XBF_DONE) |
@@ -256,12 +235,6 @@ void xfs_buf_stale(struct xfs_buf *bp); | |||
256 | 235 | ||
257 | #define XFS_BUF_ADDR(bp) ((bp)->b_bn) | 236 | #define XFS_BUF_ADDR(bp) ((bp)->b_bn) |
258 | #define XFS_BUF_SET_ADDR(bp, bno) ((bp)->b_bn = (xfs_daddr_t)(bno)) | 237 | #define XFS_BUF_SET_ADDR(bp, bno) ((bp)->b_bn = (xfs_daddr_t)(bno)) |
259 | #define XFS_BUF_OFFSET(bp) ((bp)->b_file_offset) | ||
260 | #define XFS_BUF_SET_OFFSET(bp, off) ((bp)->b_file_offset = (off)) | ||
261 | #define XFS_BUF_COUNT(bp) ((bp)->b_count_desired) | ||
262 | #define XFS_BUF_SET_COUNT(bp, cnt) ((bp)->b_count_desired = (cnt)) | ||
263 | #define XFS_BUF_SIZE(bp) ((bp)->b_buffer_length) | ||
264 | #define XFS_BUF_SET_SIZE(bp, cnt) ((bp)->b_buffer_length = (cnt)) | ||
265 | 238 | ||
266 | static inline void xfs_buf_set_ref(struct xfs_buf *bp, int lru_ref) | 239 | static inline void xfs_buf_set_ref(struct xfs_buf *bp, int lru_ref) |
267 | { | 240 | { |
@@ -287,7 +260,6 @@ extern xfs_buftarg_t *xfs_alloc_buftarg(struct xfs_mount *, | |||
287 | extern void xfs_free_buftarg(struct xfs_mount *, struct xfs_buftarg *); | 260 | extern void xfs_free_buftarg(struct xfs_mount *, struct xfs_buftarg *); |
288 | extern void xfs_wait_buftarg(xfs_buftarg_t *); | 261 | extern void xfs_wait_buftarg(xfs_buftarg_t *); |
289 | extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int, unsigned int); | 262 | extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int, unsigned int); |
290 | extern int xfs_flush_buftarg(xfs_buftarg_t *, int); | ||
291 | 263 | ||
292 | #define xfs_getsize_buftarg(buftarg) block_size((buftarg)->bt_bdev) | 264 | #define xfs_getsize_buftarg(buftarg) block_size((buftarg)->bt_bdev) |
293 | #define xfs_readonly_buftarg(buftarg) bdev_read_only((buftarg)->bt_bdev) | 265 | #define xfs_readonly_buftarg(buftarg) bdev_read_only((buftarg)->bt_bdev) |