aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_inode.h
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 18:20:36 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 18:20:36 -0400
commit1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch)
tree0bba044c4ce775e45a88a51686b5d9f90697ea9d /fs/xfs/xfs_inode.h
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip!
Diffstat (limited to 'fs/xfs/xfs_inode.h')
-rw-r--r--fs/xfs/xfs_inode.h554
1 files changed, 554 insertions, 0 deletions
diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h
new file mode 100644
index 000000000000..a53b1ccf6070
--- /dev/null
+++ b/fs/xfs/xfs_inode.h
@@ -0,0 +1,554 @@
1/*
2 * Copyright (c) 2000-2003 Silicon Graphics, Inc. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of version 2 of the GNU General Public License as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it would be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11 *
12 * Further, this software is distributed without any warranty that it is
13 * free of the rightful claim of any third person regarding infringement
14 * or the like. Any license provided herein, whether implied or
15 * otherwise, applies only to this software file. Patent licenses, if
16 * any, provided herein do not apply to combinations of this program with
17 * other software, or any other product whatsoever.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write the Free Software Foundation, Inc., 59
21 * Temple Place - Suite 330, Boston MA 02111-1307, USA.
22 *
23 * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
24 * Mountain View, CA 94043, or:
25 *
26 * http://www.sgi.com
27 *
28 * For further information regarding this notice, see:
29 *
30 * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
31 */
32#ifndef __XFS_INODE_H__
33#define __XFS_INODE_H__
34
35/*
36 * File incore extent information, present for each of data & attr forks.
37 */
38#define XFS_INLINE_EXTS 2
39#define XFS_INLINE_DATA 32
40typedef struct xfs_ifork {
41 int if_bytes; /* bytes in if_u1 */
42 int if_real_bytes; /* bytes allocated in if_u1 */
43 xfs_bmbt_block_t *if_broot; /* file's incore btree root */
44 short if_broot_bytes; /* bytes allocated for root */
45 unsigned char if_flags; /* per-fork flags */
46 unsigned char if_ext_max; /* max # of extent records */
47 xfs_extnum_t if_lastex; /* last if_extents used */
48 union {
49 xfs_bmbt_rec_t *if_extents; /* linear map file exts */
50 char *if_data; /* inline file data */
51 } if_u1;
52 union {
53 xfs_bmbt_rec_t if_inline_ext[XFS_INLINE_EXTS];
54 /* very small file extents */
55 char if_inline_data[XFS_INLINE_DATA];
56 /* very small file data */
57 xfs_dev_t if_rdev; /* dev number if special */
58 uuid_t if_uuid; /* mount point value */
59 } if_u2;
60} xfs_ifork_t;
61
62/*
63 * Flags for xfs_ichgtime().
64 */
65#define XFS_ICHGTIME_MOD 0x1 /* data fork modification timestamp */
66#define XFS_ICHGTIME_ACC 0x2 /* data fork access timestamp */
67#define XFS_ICHGTIME_CHG 0x4 /* inode field change timestamp */
68
69/*
70 * Per-fork incore inode flags.
71 */
72#define XFS_IFINLINE 0x0001 /* Inline data is read in */
73#define XFS_IFEXTENTS 0x0002 /* All extent pointers are read in */
74#define XFS_IFBROOT 0x0004 /* i_broot points to the bmap b-tree root */
75
76/*
77 * Flags for xfs_imap() and xfs_dilocate().
78 */
79#define XFS_IMAP_LOOKUP 0x1
80
81/*
82 * Maximum number of extent pointers in if_u1.if_extents.
83 */
84#define XFS_MAX_INCORE_EXTENTS 32768
85
86
87#ifdef __KERNEL__
88struct bhv_desc;
89struct cred;
90struct ktrace;
91struct vnode;
92struct xfs_buf;
93struct xfs_bmap_free;
94struct xfs_bmbt_irec;
95struct xfs_bmbt_block;
96struct xfs_inode;
97struct xfs_inode_log_item;
98struct xfs_mount;
99struct xfs_trans;
100struct xfs_dquot;
101
102#if defined(XFS_ILOCK_TRACE)
103#define XFS_ILOCK_KTRACE_SIZE 32
104extern ktrace_t *xfs_ilock_trace_buf;
105extern void xfs_ilock_trace(struct xfs_inode *, int, unsigned int, inst_t *);
106#else
107#define xfs_ilock_trace(i,n,f,ra)
108#endif
109
110/*
111 * This structure is used to communicate which extents of a file
112 * were holes when a write started from xfs_write_file() to
113 * xfs_strat_read(). This is necessary so that we can know which
114 * blocks need to be zeroed when they are read in in xfs_strat_read()
115 * if they weren\'t allocated when the buffer given to xfs_strat_read()
116 * was mapped.
117 *
118 * We keep a list of these attached to the inode. The list is
119 * protected by the inode lock and the fact that the io lock is
120 * held exclusively by writers.
121 */
122typedef struct xfs_gap {
123 struct xfs_gap *xg_next;
124 xfs_fileoff_t xg_offset_fsb;
125 xfs_extlen_t xg_count_fsb;
126} xfs_gap_t;
127
128typedef struct dm_attrs_s {
129 __uint32_t da_dmevmask; /* DMIG event mask */
130 __uint16_t da_dmstate; /* DMIG state info */
131 __uint16_t da_pad; /* DMIG extra padding */
132} dm_attrs_t;
133
134typedef struct xfs_iocore {
135 void *io_obj; /* pointer to container
136 * inode or dcxvn structure */
137 struct xfs_mount *io_mount; /* fs mount struct ptr */
138#ifdef DEBUG
139 mrlock_t *io_lock; /* inode IO lock */
140 mrlock_t *io_iolock; /* inode IO lock */
141#endif
142
143 /* I/O state */
144 xfs_fsize_t io_new_size; /* sz when write completes */
145
146 /* Miscellaneous state. */
147 unsigned int io_flags; /* IO related flags */
148
149 /* DMAPI state */
150 dm_attrs_t io_dmattrs;
151
152} xfs_iocore_t;
153
154#define io_dmevmask io_dmattrs.da_dmevmask
155#define io_dmstate io_dmattrs.da_dmstate
156
157#define XFS_IO_INODE(io) ((xfs_inode_t *) ((io)->io_obj))
158#define XFS_IO_DCXVN(io) ((dcxvn_t *) ((io)->io_obj))
159
160/*
161 * Flags in the flags field
162 */
163
164#define XFS_IOCORE_RT 0x1
165
166/*
167 * xfs_iocore prototypes
168 */
169
170extern void xfs_iocore_inode_init(struct xfs_inode *);
171extern void xfs_iocore_inode_reinit(struct xfs_inode *);
172
173
174/*
175 * This is the type used in the xfs inode hash table.
176 * An array of these is allocated for each mounted
177 * file system to hash the inodes for that file system.
178 */
179typedef struct xfs_ihash {
180 struct xfs_inode *ih_next;
181 rwlock_t ih_lock;
182 uint ih_version;
183} xfs_ihash_t;
184
185#define XFS_IHASH(mp,ino) ((mp)->m_ihash + (((uint)(ino)) % (mp)->m_ihsize))
186
187/*
188 * This is the xfs inode cluster hash. This hash is used by xfs_iflush to
189 * find inodes that share a cluster and can be flushed to disk at the same
190 * time.
191 */
192typedef struct xfs_chashlist {
193 struct xfs_chashlist *chl_next;
194 struct xfs_inode *chl_ip;
195 xfs_daddr_t chl_blkno; /* starting block number of
196 * the cluster */
197 struct xfs_buf *chl_buf; /* the inode buffer */
198} xfs_chashlist_t;
199
200typedef struct xfs_chash {
201 xfs_chashlist_t *ch_list;
202 lock_t ch_lock;
203} xfs_chash_t;
204
205#define XFS_CHASH(mp,blk) ((mp)->m_chash + (((uint)blk) % (mp)->m_chsize))
206
207
208/*
209 * This is the xfs in-core inode structure.
210 * Most of the on-disk inode is embedded in the i_d field.
211 *
212 * The extent pointers/inline file space, however, are managed
213 * separately. The memory for this information is pointed to by
214 * the if_u1 unions depending on the type of the data.
215 * This is used to linearize the array of extents for fast in-core
216 * access. This is used until the file's number of extents
217 * surpasses XFS_MAX_INCORE_EXTENTS, at which point all extent pointers
218 * are accessed through the buffer cache.
219 *
220 * Other state kept in the in-core inode is used for identification,
221 * locking, transactional updating, etc of the inode.
222 *
223 * Generally, we do not want to hold the i_rlock while holding the
224 * i_ilock. Hierarchy is i_iolock followed by i_rlock.
225 *
226 * xfs_iptr_t contains all the inode fields upto and including the
227 * i_mnext and i_mprev fields, it is used as a marker in the inode
228 * chain off the mount structure by xfs_sync calls.
229 */
230
231typedef struct {
232 struct xfs_ihash *ip_hash; /* pointer to hash header */
233 struct xfs_inode *ip_next; /* inode hash link forw */
234 struct xfs_inode *ip_mnext; /* next inode in mount list */
235 struct xfs_inode *ip_mprev; /* ptr to prev inode */
236 struct xfs_inode **ip_prevp; /* ptr to prev i_next */
237 struct xfs_mount *ip_mount; /* fs mount struct ptr */
238} xfs_iptr_t;
239
240typedef struct xfs_inode {
241 /* Inode linking and identification information. */
242 struct xfs_ihash *i_hash; /* pointer to hash header */
243 struct xfs_inode *i_next; /* inode hash link forw */
244 struct xfs_inode *i_mnext; /* next inode in mount list */
245 struct xfs_inode *i_mprev; /* ptr to prev inode */
246 struct xfs_inode **i_prevp; /* ptr to prev i_next */
247 struct xfs_mount *i_mount; /* fs mount struct ptr */
248 struct list_head i_reclaim; /* reclaim list */
249 struct bhv_desc i_bhv_desc; /* inode behavior descriptor*/
250 struct xfs_dquot *i_udquot; /* user dquot */
251 struct xfs_dquot *i_gdquot; /* group dquot */
252
253 /* Inode location stuff */
254 xfs_ino_t i_ino; /* inode number (agno/agino)*/
255 xfs_daddr_t i_blkno; /* blkno of inode buffer */
256 ushort i_len; /* len of inode buffer */
257 ushort i_boffset; /* off of inode in buffer */
258
259 /* Extent information. */
260 xfs_ifork_t *i_afp; /* attribute fork pointer */
261 xfs_ifork_t i_df; /* data fork */
262
263 /* Transaction and locking information. */
264 struct xfs_trans *i_transp; /* ptr to owning transaction*/
265 struct xfs_inode_log_item *i_itemp; /* logging information */
266 mrlock_t i_lock; /* inode lock */
267 mrlock_t i_iolock; /* inode IO lock */
268 sema_t i_flock; /* inode flush lock */
269 atomic_t i_pincount; /* inode pin count */
270 wait_queue_head_t i_ipin_wait; /* inode pinning wait queue */
271#ifdef HAVE_REFCACHE
272 struct xfs_inode **i_refcache; /* ptr to entry in ref cache */
273 struct xfs_inode *i_release; /* inode to unref */
274#endif
275 /* I/O state */
276 xfs_iocore_t i_iocore; /* I/O core */
277
278 /* Miscellaneous state. */
279 unsigned short i_flags; /* see defined flags below */
280 unsigned char i_update_core; /* timestamps/size is dirty */
281 unsigned char i_update_size; /* di_size field is dirty */
282 unsigned int i_gen; /* generation count */
283 unsigned int i_delayed_blks; /* count of delay alloc blks */
284
285 xfs_dinode_core_t i_d; /* most of ondisk inode */
286 xfs_chashlist_t *i_chash; /* cluster hash list header */
287 struct xfs_inode *i_cnext; /* cluster hash link forward */
288 struct xfs_inode *i_cprev; /* cluster hash link backward */
289
290 /* Trace buffers per inode. */
291#ifdef XFS_BMAP_TRACE
292 struct ktrace *i_xtrace; /* inode extent list trace */
293#endif
294#ifdef XFS_BMBT_TRACE
295 struct ktrace *i_btrace; /* inode bmap btree trace */
296#endif
297#ifdef XFS_RW_TRACE
298 struct ktrace *i_rwtrace; /* inode read/write trace */
299#endif
300#ifdef XFS_ILOCK_TRACE
301 struct ktrace *i_lock_trace; /* inode lock/unlock trace */
302#endif
303#ifdef XFS_DIR2_TRACE
304 struct ktrace *i_dir_trace; /* inode directory trace */
305#endif
306} xfs_inode_t;
307
308#endif /* __KERNEL__ */
309
310
311/*
312 * Fork handling.
313 */
314#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_IFORK_PTR)
315xfs_ifork_t *xfs_ifork_ptr(xfs_inode_t *ip, int w);
316#define XFS_IFORK_PTR(ip,w) xfs_ifork_ptr(ip,w)
317#else
318#define XFS_IFORK_PTR(ip,w) ((w) == XFS_DATA_FORK ? &(ip)->i_df : (ip)->i_afp)
319#endif
320#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_IFORK_Q)
321int xfs_ifork_q(xfs_inode_t *ip);
322#define XFS_IFORK_Q(ip) xfs_ifork_q(ip)
323#else
324#define XFS_IFORK_Q(ip) XFS_CFORK_Q(&(ip)->i_d)
325#endif
326#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_IFORK_DSIZE)
327int xfs_ifork_dsize(xfs_inode_t *ip);
328#define XFS_IFORK_DSIZE(ip) xfs_ifork_dsize(ip)
329#else
330#define XFS_IFORK_DSIZE(ip) XFS_CFORK_DSIZE(&ip->i_d, ip->i_mount)
331#endif
332#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_IFORK_ASIZE)
333int xfs_ifork_asize(xfs_inode_t *ip);
334#define XFS_IFORK_ASIZE(ip) xfs_ifork_asize(ip)
335#else
336#define XFS_IFORK_ASIZE(ip) XFS_CFORK_ASIZE(&ip->i_d, ip->i_mount)
337#endif
338#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_IFORK_SIZE)
339int xfs_ifork_size(xfs_inode_t *ip, int w);
340#define XFS_IFORK_SIZE(ip,w) xfs_ifork_size(ip,w)
341#else
342#define XFS_IFORK_SIZE(ip,w) XFS_CFORK_SIZE(&ip->i_d, ip->i_mount, w)
343#endif
344#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_IFORK_FORMAT)
345int xfs_ifork_format(xfs_inode_t *ip, int w);
346#define XFS_IFORK_FORMAT(ip,w) xfs_ifork_format(ip,w)
347#else
348#define XFS_IFORK_FORMAT(ip,w) XFS_CFORK_FORMAT(&ip->i_d, w)
349#endif
350#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_IFORK_FMT_SET)
351void xfs_ifork_fmt_set(xfs_inode_t *ip, int w, int n);
352#define XFS_IFORK_FMT_SET(ip,w,n) xfs_ifork_fmt_set(ip,w,n)
353#else
354#define XFS_IFORK_FMT_SET(ip,w,n) XFS_CFORK_FMT_SET(&ip->i_d, w, n)
355#endif
356#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_IFORK_NEXTENTS)
357int xfs_ifork_nextents(xfs_inode_t *ip, int w);
358#define XFS_IFORK_NEXTENTS(ip,w) xfs_ifork_nextents(ip,w)
359#else
360#define XFS_IFORK_NEXTENTS(ip,w) XFS_CFORK_NEXTENTS(&ip->i_d, w)
361#endif
362#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_IFORK_NEXT_SET)
363void xfs_ifork_next_set(xfs_inode_t *ip, int w, int n);
364#define XFS_IFORK_NEXT_SET(ip,w,n) xfs_ifork_next_set(ip,w,n)
365#else
366#define XFS_IFORK_NEXT_SET(ip,w,n) XFS_CFORK_NEXT_SET(&ip->i_d, w, n)
367#endif
368
369
370#ifdef __KERNEL__
371
372/*
373 * In-core inode flags.
374 */
375#define XFS_IGRIO 0x0001 /* inode used for guaranteed rate i/o */
376#define XFS_IUIOSZ 0x0002 /* inode i/o sizes have been explicitly set */
377#define XFS_IQUIESCE 0x0004 /* we have started quiescing for this inode */
378#define XFS_IRECLAIM 0x0008 /* we have started reclaiming this inode */
379#define XFS_ISTALE 0x0010 /* inode has been staled */
380#define XFS_IRECLAIMABLE 0x0020 /* inode can be reclaimed */
381#define XFS_INEW 0x0040
382
383/*
384 * Flags for inode locking.
385 */
386#define XFS_IOLOCK_EXCL 0x001
387#define XFS_IOLOCK_SHARED 0x002
388#define XFS_ILOCK_EXCL 0x004
389#define XFS_ILOCK_SHARED 0x008
390#define XFS_IUNLOCK_NONOTIFY 0x010
391#define XFS_EXTENT_TOKEN_RD 0x040
392#define XFS_SIZE_TOKEN_RD 0x080
393#define XFS_EXTSIZE_RD (XFS_EXTENT_TOKEN_RD|XFS_SIZE_TOKEN_RD)
394#define XFS_WILLLEND 0x100 /* Always acquire tokens for lending */
395#define XFS_EXTENT_TOKEN_WR (XFS_EXTENT_TOKEN_RD | XFS_WILLLEND)
396#define XFS_SIZE_TOKEN_WR (XFS_SIZE_TOKEN_RD | XFS_WILLLEND)
397#define XFS_EXTSIZE_WR (XFS_EXTSIZE_RD | XFS_WILLLEND)
398
399
400#define XFS_LOCK_MASK \
401 (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED | XFS_ILOCK_EXCL | \
402 XFS_ILOCK_SHARED | XFS_EXTENT_TOKEN_RD | XFS_SIZE_TOKEN_RD | \
403 XFS_WILLLEND)
404
405/*
406 * Flags for xfs_iflush()
407 */
408#define XFS_IFLUSH_DELWRI_ELSE_SYNC 1
409#define XFS_IFLUSH_DELWRI_ELSE_ASYNC 2
410#define XFS_IFLUSH_SYNC 3
411#define XFS_IFLUSH_ASYNC 4
412#define XFS_IFLUSH_DELWRI 5
413
414/*
415 * Flags for xfs_iflush_all.
416 */
417#define XFS_FLUSH_ALL 0x1
418
419/*
420 * Flags for xfs_itruncate_start().
421 */
422#define XFS_ITRUNC_DEFINITE 0x1
423#define XFS_ITRUNC_MAYBE 0x2
424
425#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_ITOV)
426struct vnode *xfs_itov(xfs_inode_t *ip);
427#define XFS_ITOV(ip) xfs_itov(ip)
428#else
429#define XFS_ITOV(ip) BHV_TO_VNODE(XFS_ITOBHV(ip))
430#endif
431#define XFS_ITOV_NULL(ip) BHV_TO_VNODE_NULL(XFS_ITOBHV(ip))
432#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_ITOBHV)
433struct bhv_desc *xfs_itobhv(xfs_inode_t *ip);
434#define XFS_ITOBHV(ip) xfs_itobhv(ip)
435#else
436#define XFS_ITOBHV(ip) ((struct bhv_desc *)(&((ip)->i_bhv_desc)))
437#endif
438#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BHVTOI)
439xfs_inode_t *xfs_bhvtoi(struct bhv_desc *bhvp);
440#define XFS_BHVTOI(bhvp) xfs_bhvtoi(bhvp)
441#else
442#define XFS_BHVTOI(bhvp) \
443 ((xfs_inode_t *)((char *)(bhvp) - \
444 (char *)&(((xfs_inode_t *)0)->i_bhv_desc)))
445#endif
446
447#define BHV_IS_XFS(bdp) (BHV_OPS(bdp) == &xfs_vnodeops)
448
449/*
450 * For multiple groups support: if S_ISGID bit is set in the parent
451 * directory, group of new file is set to that of the parent, and
452 * new subdirectory gets S_ISGID bit from parent.
453 */
454#define XFS_INHERIT_GID(pip, vfsp) \
455 (((vfsp)->vfs_flag & VFS_GRPID) || ((pip)->i_d.di_mode & S_ISGID))
456
457/*
458 * xfs_iget.c prototypes.
459 */
460
461#define IGET_CREATE 1
462
463void xfs_ihash_init(struct xfs_mount *);
464void xfs_ihash_free(struct xfs_mount *);
465void xfs_chash_init(struct xfs_mount *);
466void xfs_chash_free(struct xfs_mount *);
467xfs_inode_t *xfs_inode_incore(struct xfs_mount *, xfs_ino_t,
468 struct xfs_trans *);
469void xfs_inode_lock_init(xfs_inode_t *, struct vnode *);
470int xfs_iget(struct xfs_mount *, struct xfs_trans *, xfs_ino_t,
471 uint, uint, xfs_inode_t **, xfs_daddr_t);
472void xfs_iput(xfs_inode_t *, uint);
473void xfs_iput_new(xfs_inode_t *, uint);
474void xfs_ilock(xfs_inode_t *, uint);
475int xfs_ilock_nowait(xfs_inode_t *, uint);
476void xfs_iunlock(xfs_inode_t *, uint);
477void xfs_ilock_demote(xfs_inode_t *, uint);
478void xfs_iflock(xfs_inode_t *);
479int xfs_iflock_nowait(xfs_inode_t *);
480uint xfs_ilock_map_shared(xfs_inode_t *);
481void xfs_iunlock_map_shared(xfs_inode_t *, uint);
482void xfs_ifunlock(xfs_inode_t *);
483void xfs_ireclaim(xfs_inode_t *);
484int xfs_finish_reclaim(xfs_inode_t *, int, int);
485int xfs_finish_reclaim_all(struct xfs_mount *, int);
486
487/*
488 * xfs_inode.c prototypes.
489 */
490int xfs_inotobp(struct xfs_mount *, struct xfs_trans *, xfs_ino_t,
491 xfs_dinode_t **, struct xfs_buf **, int *);
492int xfs_itobp(struct xfs_mount *, struct xfs_trans *,
493 xfs_inode_t *, xfs_dinode_t **, struct xfs_buf **,
494 xfs_daddr_t);
495int xfs_iread(struct xfs_mount *, struct xfs_trans *, xfs_ino_t,
496 xfs_inode_t **, xfs_daddr_t);
497int xfs_iread_extents(struct xfs_trans *, xfs_inode_t *, int);
498int xfs_ialloc(struct xfs_trans *, xfs_inode_t *, mode_t, nlink_t,
499 xfs_dev_t, struct cred *, xfs_prid_t, int,
500 struct xfs_buf **, boolean_t *, xfs_inode_t **);
501void xfs_xlate_dinode_core(xfs_caddr_t, struct xfs_dinode_core *,
502 int);
503uint xfs_ip2xflags(struct xfs_inode *);
504uint xfs_dic2xflags(struct xfs_dinode_core *);
505int xfs_ifree(struct xfs_trans *, xfs_inode_t *,
506 struct xfs_bmap_free *);
507void xfs_itruncate_start(xfs_inode_t *, uint, xfs_fsize_t);
508int xfs_itruncate_finish(struct xfs_trans **, xfs_inode_t *,
509 xfs_fsize_t, int, int);
510int xfs_iunlink(struct xfs_trans *, xfs_inode_t *);
511int xfs_igrow_start(xfs_inode_t *, xfs_fsize_t, struct cred *);
512void xfs_igrow_finish(struct xfs_trans *, xfs_inode_t *,
513 xfs_fsize_t, int);
514
515void xfs_idestroy_fork(xfs_inode_t *, int);
516void xfs_idestroy(xfs_inode_t *);
517void xfs_idata_realloc(xfs_inode_t *, int, int);
518void xfs_iextract(xfs_inode_t *);
519void xfs_iext_realloc(xfs_inode_t *, int, int);
520void xfs_iroot_realloc(xfs_inode_t *, int, int);
521void xfs_ipin(xfs_inode_t *);
522void xfs_iunpin(xfs_inode_t *);
523int xfs_iextents_copy(xfs_inode_t *, xfs_bmbt_rec_t *, int);
524int xfs_iflush(xfs_inode_t *, uint);
525int xfs_iflush_all(struct xfs_mount *, int);
526int xfs_iaccess(xfs_inode_t *, mode_t, cred_t *);
527uint xfs_iroundup(uint);
528void xfs_ichgtime(xfs_inode_t *, int);
529xfs_fsize_t xfs_file_last_byte(xfs_inode_t *);
530void xfs_lock_inodes(xfs_inode_t **, int, int, uint);
531
532#define xfs_ipincount(ip) ((unsigned int) atomic_read(&ip->i_pincount))
533
534#ifdef DEBUG
535void xfs_isize_check(struct xfs_mount *, xfs_inode_t *, xfs_fsize_t);
536#else /* DEBUG */
537#define xfs_isize_check(mp, ip, isize)
538#endif /* DEBUG */
539
540#if defined(DEBUG)
541void xfs_inobp_check(struct xfs_mount *, struct xfs_buf *);
542#else
543#define xfs_inobp_check(mp, bp)
544#endif /* DEBUG */
545
546extern struct kmem_zone *xfs_chashlist_zone;
547extern struct kmem_zone *xfs_ifork_zone;
548extern struct kmem_zone *xfs_inode_zone;
549extern struct kmem_zone *xfs_ili_zone;
550extern struct vnodeops xfs_vnodeops;
551
552#endif /* __KERNEL__ */
553
554#endif /* __XFS_INODE_H__ */