]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blame - libxfs/libxfs_io.h
xfs: convert a few more directory asserts to corruption
[thirdparty/xfsprogs-dev.git] / libxfs / libxfs_io.h
CommitLineData
b626fb59
DC
1/*
2 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
3 * All Rights Reserved.
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it would be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write the Free Software Foundation,
16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19#ifndef __LIBXFS_IO_H_
20#define __LIBXFS_IO_H_
21
22/*
23 * Kernel equivalent buffer based I/O interface
24 */
25
26struct xfs_buf;
27struct xfs_mount;
28struct xfs_perag;
29
30/*
31 * IO verifier callbacks need the xfs_mount pointer, so we have to behave
32 * somewhat like the kernel now for userspace IO in terms of having buftarg
33 * based devices...
34 */
35struct xfs_buftarg {
36 struct xfs_mount *bt_mount;
37 dev_t dev;
38};
39
40extern void libxfs_buftarg_init(struct xfs_mount *mp, dev_t ddev,
41 dev_t logdev, dev_t rtdev);
42
43#define LIBXFS_BBTOOFF64(bbs) (((xfs_off_t)(bbs)) << BBSHIFT)
44
45#define XB_PAGES 2
46struct xfs_buf_map {
47 xfs_daddr_t bm_bn; /* block number for I/O */
48 int bm_len; /* size of I/O */
49};
50
51#define DEFINE_SINGLE_BUF_MAP(map, blkno, numblk) \
52 struct xfs_buf_map (map) = { .bm_bn = (blkno), .bm_len = (numblk) };
53
54struct xfs_buf_ops {
a3fac935 55 char *name;
b626fb59
DC
56 void (*verify_read)(struct xfs_buf *);
57 void (*verify_write)(struct xfs_buf *);
95d9582b 58 xfs_failaddr_t (*verify_struct)(struct xfs_buf *);
b626fb59
DC
59};
60
61typedef struct xfs_buf {
62 struct cache_node b_node;
63 unsigned int b_flags;
64 xfs_daddr_t b_bn;
65 unsigned b_bcount;
66 unsigned int b_length;
67 struct xfs_buftarg *b_target;
68#define b_dev b_target->dev
69 pthread_mutex_t b_lock;
70 pthread_t b_holder;
71 unsigned int b_recur;
37d086ca 72 void *b_log_item;
cfc06b60 73 void *b_transp;
b626fb59
DC
74 void *b_addr;
75 int b_error;
76 const struct xfs_buf_ops *b_ops;
77 struct xfs_perag *b_pag;
85428dd2 78 struct xfs_buf_map *b_maps;
2c6c6328 79 struct xfs_buf_map __b_map;
b626fb59
DC
80 int b_nmaps;
81#ifdef XFS_BUF_TRACING
82 struct list_head b_lock_list;
83 const char *b_func;
84 const char *b_file;
85 int b_line;
86#endif
87} xfs_buf_t;
88
89enum xfs_buf_flags_t { /* b_flags bits */
90 LIBXFS_B_EXIT = 0x0001, /* ==LIBXFS_EXIT_ON_FAILURE */
91 LIBXFS_B_DIRTY = 0x0002, /* buffer has been modified */
92 LIBXFS_B_STALE = 0x0004, /* buffer marked as invalid */
93 LIBXFS_B_UPTODATE = 0x0008, /* buffer is sync'd to disk */
94 LIBXFS_B_DISCONTIG = 0x0010, /* discontiguous buffer */
95 LIBXFS_B_UNCHECKED = 0x0020, /* needs verification */
96};
97
98#define XFS_BUF_DADDR_NULL ((xfs_daddr_t) (-1LL))
99
100#define XFS_BUF_PTR(bp) ((char *)(bp)->b_addr)
92acb899 101#define xfs_buf_offset(bp, offset) ((bp)->b_addr + (offset))
b626fb59
DC
102#define XFS_BUF_ADDR(bp) ((bp)->b_bn)
103#define XFS_BUF_SIZE(bp) ((bp)->b_bcount)
104#define XFS_BUF_COUNT(bp) ((bp)->b_bcount)
105#define XFS_BUF_TARGET(bp) ((bp)->b_dev)
b626fb59
DC
106
107#define XFS_BUF_SET_ADDR(bp,blk) ((bp)->b_bn = (blk))
108#define XFS_BUF_SET_COUNT(bp,cnt) ((bp)->b_bcount = (cnt))
109
b626fb59
DC
110#define XFS_BUF_SET_PRIORITY(bp,pri) cache_node_set_priority( \
111 libxfs_bcache, \
112 (struct cache_node *)(bp), \
113 (pri))
114#define XFS_BUF_PRIORITY(bp) (cache_node_get_priority( \
115 (struct cache_node *)(bp)))
116#define xfs_buf_set_ref(bp,ref) ((void) 0)
117#define xfs_buf_ioerror(bp,err) ((bp)->b_error = (err))
118
119#define xfs_daddr_to_agno(mp,d) \
120 ((xfs_agnumber_t)(XFS_BB_TO_FSBT(mp, d) / (mp)->m_sb.sb_agblocks))
121#define xfs_daddr_to_agbno(mp,d) \
122 ((xfs_agblock_t)(XFS_BB_TO_FSBT(mp, d) % (mp)->m_sb.sb_agblocks))
123
124/* Buffer Cache Interfaces */
125
126extern struct cache *libxfs_bcache;
127extern struct cache_operations libxfs_bcache_operations;
128
129#define LIBXFS_GETBUF_TRYLOCK (1 << 0)
130
131#ifdef XFS_BUF_TRACING
132
133#define libxfs_readbuf(dev, daddr, len, flags, ops) \
134 libxfs_trace_readbuf(__FUNCTION__, __FILE__, __LINE__, \
135 (dev), (daddr), (len), (flags), (ops))
136#define libxfs_readbuf_map(dev, map, nmaps, flags, ops) \
137 libxfs_trace_readbuf_map(__FUNCTION__, __FILE__, __LINE__, \
138 (dev), (map), (nmaps), (flags), (ops))
139#define libxfs_writebuf(buf, flags) \
140 libxfs_trace_writebuf(__FUNCTION__, __FILE__, __LINE__, \
141 (buf), (flags))
142#define libxfs_getbuf(dev, daddr, len) \
143 libxfs_trace_getbuf(__FUNCTION__, __FILE__, __LINE__, \
144 (dev), (daddr), (len))
145#define libxfs_getbuf_map(dev, map, nmaps, flags) \
146 libxfs_trace_getbuf_map(__FUNCTION__, __FILE__, __LINE__, \
147 (dev), (map), (nmaps), (flags))
148#define libxfs_getbuf_flags(dev, daddr, len, flags) \
149 libxfs_trace_getbuf_flags(__FUNCTION__, __FILE__, __LINE__, \
150 (dev), (daddr), (len), (flags))
151#define libxfs_putbuf(buf) \
152 libxfs_trace_putbuf(__FUNCTION__, __FILE__, __LINE__, (buf))
153
154extern xfs_buf_t *libxfs_trace_readbuf(const char *, const char *, int,
155 struct xfs_buftarg *, xfs_daddr_t, int, int,
156 const struct xfs_buf_ops *);
157extern xfs_buf_t *libxfs_trace_readbuf_map(const char *, const char *, int,
158 struct xfs_buftarg *, struct xfs_buf_map *, int, int,
159 const struct xfs_buf_ops *);
160extern int libxfs_trace_writebuf(const char *, const char *, int,
161 xfs_buf_t *, int);
162extern xfs_buf_t *libxfs_trace_getbuf(const char *, const char *, int,
163 struct xfs_buftarg *, xfs_daddr_t, int);
164extern xfs_buf_t *libxfs_trace_getbuf_map(const char *, const char *, int,
165 struct xfs_buftarg *, struct xfs_buf_map *, int, int);
166extern xfs_buf_t *libxfs_trace_getbuf_flags(const char *, const char *, int,
167 struct xfs_buftarg *, xfs_daddr_t, int, unsigned int);
168extern void libxfs_trace_putbuf (const char *, const char *, int,
169 xfs_buf_t *);
170
171#else
172
173extern xfs_buf_t *libxfs_readbuf(struct xfs_buftarg *, xfs_daddr_t, int, int,
174 const struct xfs_buf_ops *);
175extern xfs_buf_t *libxfs_readbuf_map(struct xfs_buftarg *, struct xfs_buf_map *,
176 int, int, const struct xfs_buf_ops *);
177extern int libxfs_writebuf(xfs_buf_t *, int);
178extern xfs_buf_t *libxfs_getbuf(struct xfs_buftarg *, xfs_daddr_t, int);
179extern xfs_buf_t *libxfs_getbuf_map(struct xfs_buftarg *,
180 struct xfs_buf_map *, int, int);
181extern xfs_buf_t *libxfs_getbuf_flags(struct xfs_buftarg *, xfs_daddr_t,
182 int, unsigned int);
183extern void libxfs_putbuf (xfs_buf_t *);
184
185#endif
186
187extern void libxfs_readbuf_verify(struct xfs_buf *bp,
188 const struct xfs_buf_ops *ops);
189extern xfs_buf_t *libxfs_getsb(struct xfs_mount *, int);
190extern void libxfs_bcache_purge(void);
864028ed 191extern void libxfs_bcache_free(void);
b626fb59
DC
192extern void libxfs_bcache_flush(void);
193extern void libxfs_purgebuf(xfs_buf_t *);
194extern int libxfs_bcache_overflowed(void);
195extern int libxfs_bcache_usage(void);
196
197/* Buffer (Raw) Interfaces */
198extern xfs_buf_t *libxfs_getbufr(struct xfs_buftarg *, xfs_daddr_t, int);
199extern void libxfs_putbufr(xfs_buf_t *);
200
201extern int libxfs_writebuf_int(xfs_buf_t *, int);
202extern int libxfs_writebufr(struct xfs_buf *);
203extern int libxfs_readbufr(struct xfs_buftarg *, xfs_daddr_t, xfs_buf_t *, int, int);
204extern int libxfs_readbufr_map(struct xfs_buftarg *, struct xfs_buf *, int);
205
9542ae13
DC
206extern int libxfs_device_zero(struct xfs_buftarg *, xfs_daddr_t, uint);
207
b626fb59
DC
208extern int libxfs_bhash_size;
209
210#define LIBXFS_BREAD 0x1
211#define LIBXFS_BWRITE 0x2
212#define LIBXFS_BZERO 0x4
213
214extern void libxfs_iomove (xfs_buf_t *, uint, int, void *, int);
215
216static inline int
217xfs_buf_verify_cksum(struct xfs_buf *bp, unsigned long cksum_offset)
218{
219 return xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length),
220 cksum_offset);
221}
222
223static inline void
224xfs_buf_update_cksum(struct xfs_buf *bp, unsigned long cksum_offset)
225{
226 xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length),
227 cksum_offset);
228}
229
fc9f709f
ES
230static inline int
231xfs_buf_associate_memory(struct xfs_buf *bp, void *mem, size_t len)
232{
233 bp->b_addr = mem;
234 bp->b_bcount = len;
235 return 0;
236}
237
b626fb59 238#endif /* __LIBXFS_IO_H__ */