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