xref: /netbsd-src/sys/ufs/lfs/lfs_extern.h (revision 9bf46809165dbc5e69e70487ac78e5e8db0403e2)
1*9bf46809Sriastradh /*	$NetBSD: lfs_extern.h,v 1.118 2020/02/23 08:49:46 riastradh Exp $	*/
2fccfa11aScgd 
3264b874cSmycroft /*-
4b397c875Sperseant  * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc.
51b8f5ea3Sperseant  * All rights reserved.
61b8f5ea3Sperseant  *
71b8f5ea3Sperseant  * This code is derived from software contributed to The NetBSD Foundation
81b8f5ea3Sperseant  * by Konrad E. Schroder <perseant@hhhh.org>.
91b8f5ea3Sperseant  *
101b8f5ea3Sperseant  * Redistribution and use in source and binary forms, with or without
111b8f5ea3Sperseant  * modification, are permitted provided that the following conditions
121b8f5ea3Sperseant  * are met:
131b8f5ea3Sperseant  * 1. Redistributions of source code must retain the above copyright
141b8f5ea3Sperseant  *    notice, this list of conditions and the following disclaimer.
151b8f5ea3Sperseant  * 2. Redistributions in binary form must reproduce the above copyright
161b8f5ea3Sperseant  *    notice, this list of conditions and the following disclaimer in the
171b8f5ea3Sperseant  *    documentation and/or other materials provided with the distribution.
181b8f5ea3Sperseant  *
191b8f5ea3Sperseant  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
201b8f5ea3Sperseant  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
211b8f5ea3Sperseant  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
221b8f5ea3Sperseant  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
231b8f5ea3Sperseant  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
241b8f5ea3Sperseant  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
251b8f5ea3Sperseant  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
261b8f5ea3Sperseant  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
271b8f5ea3Sperseant  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
281b8f5ea3Sperseant  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
291b8f5ea3Sperseant  * POSSIBILITY OF SUCH DAMAGE.
301b8f5ea3Sperseant  */
311b8f5ea3Sperseant /*-
32264b874cSmycroft  * Copyright (c) 1991, 1993, 1994
33264b874cSmycroft  *	The Regents of the University of California.  All rights reserved.
34264b874cSmycroft  *
35264b874cSmycroft  * Redistribution and use in source and binary forms, with or without
36264b874cSmycroft  * modification, are permitted provided that the following conditions
37264b874cSmycroft  * are met:
38264b874cSmycroft  * 1. Redistributions of source code must retain the above copyright
39264b874cSmycroft  *    notice, this list of conditions and the following disclaimer.
40264b874cSmycroft  * 2. Redistributions in binary form must reproduce the above copyright
41264b874cSmycroft  *    notice, this list of conditions and the following disclaimer in the
42264b874cSmycroft  *    documentation and/or other materials provided with the distribution.
43aad01611Sagc  * 3. Neither the name of the University nor the names of its contributors
44264b874cSmycroft  *    may be used to endorse or promote products derived from this software
45264b874cSmycroft  *    without specific prior written permission.
46264b874cSmycroft  *
47264b874cSmycroft  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
48264b874cSmycroft  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
49264b874cSmycroft  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
50264b874cSmycroft  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
51264b874cSmycroft  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
52264b874cSmycroft  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
53264b874cSmycroft  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
54264b874cSmycroft  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
55264b874cSmycroft  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
56264b874cSmycroft  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
57264b874cSmycroft  * SUCH DAMAGE.
58264b874cSmycroft  *
59e5bc90f4Sfvdl  *	@(#)lfs_extern.h	8.6 (Berkeley) 5/8/95
60264b874cSmycroft  */
61264b874cSmycroft 
6260db16d1Smatt #ifndef _UFS_LFS_LFS_EXTERN_H_
6360db16d1Smatt #define _UFS_LFS_LFS_EXTERN_H_
6460db16d1Smatt 
65f1eeaa90Stron #ifdef _KERNEL
66b1934809Sthorpej #include <sys/mallocvar.h>
67f1eeaa90Stron 
68b1934809Sthorpej MALLOC_DECLARE(M_SEGMENT);
69f1eeaa90Stron #endif
70b1934809Sthorpej 
7190b9d9b5Sperseant /* Copied from ext2fs for ITIMES.  XXX This is a bogus use of v_tag. */
7290b9d9b5Sperseant #define IS_LFS_VNODE(vp)   (vp->v_tag == VT_LFS)
7390b9d9b5Sperseant 
741b8f5ea3Sperseant /*
751b8f5ea3Sperseant  * Sysctl values for LFS.
761b8f5ea3Sperseant  */
771b8f5ea3Sperseant #define LFS_WRITEINDIR	 1 /* flush indirect blocks on non-checkpoint writes */
781b8f5ea3Sperseant #define LFS_CLEAN_VNHEAD 2 /* put prev unrefed cleaned vnodes on head of free list */
791b8f5ea3Sperseant #define LFS_DOSTATS	 3
80b397c875Sperseant #define LFS_MAXPAGES	 4
8125f49c3cSperseant #define LFS_FS_PAGETRIP	 5
82eefd94b8Sperseant #define LFS_STATS	 6
83eefd94b8Sperseant #define LFS_DO_RFW	 7
84eefd94b8Sperseant #define LFS_DEBUGLOG	 8
859be0ebd9Sperseant #define LFS_IGNORE_LAZY_SYNC	9
861b8f5ea3Sperseant 
87b1828e0bSdholland /* not ours */
88264b874cSmycroft struct fid;
89264b874cSmycroft struct mount;
90264b874cSmycroft struct nameidata;
91264b874cSmycroft struct proc;
926bd1d6d4Schristos struct statvfs;
93264b874cSmycroft struct timeval;
94264b874cSmycroft struct uio;
95264b874cSmycroft struct mbuf;
967bd9e243Schristos struct buf;
977bd9e243Schristos struct vnode;
98b1828e0bSdholland 
99b1828e0bSdholland /* ours */
100b1828e0bSdholland struct inode;
101b1828e0bSdholland union lfs_dinode;
10239b86955Sperseant struct dlfs;
1037bd9e243Schristos struct lfs;
1047bd9e243Schristos struct segment;
10595137c84Sperseant struct block_info;
106264b874cSmycroft 
107f3103aadSjoerg __BEGIN_DECLS
108f3103aadSjoerg 
109fc9422c9Selad #if defined(_KERNEL)
110fc9422c9Selad 
1118f5758dbSmaya extern kcondvar_t lfs_allclean_wakeup;
11238cf17f4Sthorpej extern struct pool lfs_inode_pool;		/* memory pool for inodes */
11342614ed3Sfvdl extern struct pool lfs_dinode_pool;		/* memory pool for dinodes */
114b397c875Sperseant extern struct pool lfs_inoext_pool;	/* memory pool for inode extension */
11525f49c3cSperseant extern struct pool lfs_lbnentry_pool;   /* memory pool for balloc accounting */
11638cf17f4Sthorpej 
1173852db20Syamt extern int locked_queue_count;
1183852db20Syamt extern long locked_queue_bytes;
1193852db20Syamt extern int lfs_subsys_pages;
1203852db20Syamt extern int lfs_dirvcount;
1214a780c9aSad extern kmutex_t lfs_lock;
122eefd94b8Sperseant extern int lfs_debug_log_subsys[];
1234a780c9aSad extern kcondvar_t lfs_writing_cv;
1244a780c9aSad extern kcondvar_t locked_queue_cv;
1253852db20Syamt 
1267bd9e243Schristos /* lfs_alloc.c */
127d8868b1eShannken int lfs_valloc(struct vnode *, int, kauth_cred_t, ino_t *, int *);
128d8868b1eShannken int lfs_valloc_fixed(struct lfs *, ino_t, int);
129a748ea88Syamt int lfs_vfree(struct vnode *, ino_t, int);
130*9bf46809Sriastradh void lfs_order_freelist(struct lfs *, ino_t **, size_t *);
13183771be8Sperseant int lfs_extend_ifile(struct lfs *, kauth_cred_t);
132437e8552Sperseant void lfs_orphan(struct lfs *, ino_t);
133*9bf46809Sriastradh void lfs_free_orphans(struct lfs *, ino_t *, size_t);
13425f49c3cSperseant 
13525f49c3cSperseant /* lfs_balloc.c */
136fc9422c9Selad int lfs_balloc(struct vnode *, off_t, int, kauth_cred_t, int, struct buf **);
13725f49c3cSperseant void lfs_register_block(struct vnode *, daddr_t);
13825f49c3cSperseant void lfs_deregister_block(struct vnode *, daddr_t);
1395ed792ecSperseant void lfs_deregister_all(struct vnode *);
14025f49c3cSperseant 
1417bd9e243Schristos /* lfs_bio.c */
1424e3fced9Sperseant int lfs_availwait(struct lfs *, int);
1434e3fced9Sperseant int lfs_bwrite_ext(struct buf *, int);
1444e3fced9Sperseant int lfs_fits(struct lfs *, int);
1454e3fced9Sperseant void lfs_flush_fs(struct lfs *, int);
14625f49c3cSperseant void lfs_flush(struct lfs *, int, int);
147a3ff3a30Sfvdl int lfs_check(struct vnode *, daddr_t, int);
148b397c875Sperseant void lfs_freebuf(struct lfs *, struct buf *);
149b397c875Sperseant struct buf *lfs_newbuf(struct lfs *, struct vnode *, daddr_t, size_t, int);
150273df636Schristos void lfs_countlocked(int *, long *, const char *);
15159be5399Syamt int lfs_reserve(struct lfs *, struct vnode *, struct vnode *, int);
152ec5ea71aSchs int lfs_max_bufs(void);
153ec5ea71aSchs int lfs_wait_bufs(void);
1547bd9e243Schristos 
1557bd9e243Schristos /* lfs_debug.c */
1567bd9e243Schristos #ifdef DEBUG
157273df636Schristos int lfs_bwrite_log(struct buf *, const char *, int);
1588886b0f4Sperseant void lfs_dumplog(void);
1594e3fced9Sperseant void lfs_dump_super(struct lfs *);
160b1828e0bSdholland void lfs_dump_dinode(struct lfs *, union lfs_dinode *);
1614e3fced9Sperseant void lfs_check_bpp(struct lfs *, struct segment *, char *, int);
1624e3fced9Sperseant void lfs_check_segsum(struct lfs *, struct segment *, char *, int);
163eefd94b8Sperseant void lfs_debug_log(int, const char *, ...);
1641b8f5ea3Sperseant #endif /* DEBUG */
1657bd9e243Schristos 
1667bd9e243Schristos /* lfs_inode.c */
167a748ea88Syamt int lfs_update(struct vnode *, const struct timespec *, const struct timespec *,
168a748ea88Syamt     int);
169db06a930Spooka int lfs_truncate(struct vnode *, off_t, int, kauth_cred_t);
170b1828e0bSdholland union lfs_dinode *lfs_ifind(struct lfs *, ino_t, struct buf *);
171481da54fSperseant void lfs_finalize_ino_seguse(struct lfs *, struct inode *);
172481da54fSperseant void lfs_finalize_fs_seguse(struct lfs *);
1737bd9e243Schristos 
1740e93cfc3Sdholland /* lfs_rename.c */
1750e93cfc3Sdholland int lfs_rename(void *);
1760e93cfc3Sdholland 
17783771be8Sperseant /* lfs_rfw.c */
17883771be8Sperseant int lfs_rf_valloc(struct lfs *, ino_t, int, struct lwp *, struct vnode **);
17983771be8Sperseant void lfs_roll_forward(struct lfs *, struct mount *, struct lwp *);
18083771be8Sperseant 
1817bd9e243Schristos /* lfs_segment.c */
1824e3fced9Sperseant void lfs_imtime(struct lfs *);
1834e3fced9Sperseant int lfs_vflush(struct vnode *);
1844e3fced9Sperseant int lfs_segwrite(struct mount *, int);
185dddf5c51Sperseant int lfs_writefile(struct lfs *, struct segment *, struct vnode *);
1864e3fced9Sperseant int lfs_writeinode(struct lfs *, struct segment *, struct inode *);
1874a780c9aSad int lfs_gatherblock(struct segment *, struct buf *, kmutex_t *);
1884e3fced9Sperseant int lfs_gather(struct lfs *, struct segment *, struct vnode *, int (*match )(struct lfs *, struct buf *));
189cc716087Syamt void lfs_update_single(struct lfs *, struct segment *, struct vnode *,
190078ffcb8Sdholland     daddr_t, daddr_t, int);
1914e3fced9Sperseant void lfs_updatemeta(struct segment *);
1922f695b54Sperseant int lfs_rewind(struct lfs *, int);
1932f695b54Sperseant void lfs_unset_inval_all(struct lfs *);
1944e3fced9Sperseant int lfs_initseg(struct lfs *);
1954e3fced9Sperseant int lfs_writeseg(struct lfs *, struct segment *);
1964e3fced9Sperseant void lfs_writesuper(struct lfs *, daddr_t);
1974e3fced9Sperseant int lfs_match_data(struct lfs *, struct buf *);
1984e3fced9Sperseant int lfs_match_indir(struct lfs *, struct buf *);
1994e3fced9Sperseant int lfs_match_dindir(struct lfs *, struct buf *);
2004e3fced9Sperseant int lfs_match_tindir(struct lfs *, struct buf *);
2015232c510Schs void lfs_free_aiodone(struct buf *);
2026e53d31fSperseant void lfs_acquire_finfo(struct lfs *fs, ino_t, int);
2036e53d31fSperseant void lfs_release_finfo(struct lfs *fs);
2047bd9e243Schristos 
2057bd9e243Schristos /* lfs_subr.c */
206b397c875Sperseant void lfs_setup_resblks(struct lfs *);
20795137c84Sperseant void lfs_pad_check(unsigned char *, int, char *, int);
208b397c875Sperseant void lfs_free_resblks(struct lfs *);
209b397c875Sperseant void *lfs_malloc(struct lfs *, size_t, int);
210b397c875Sperseant void lfs_free(struct lfs *, void *, int);
211b397c875Sperseant int lfs_seglock(struct lfs *, unsigned long);
2124e3fced9Sperseant void lfs_segunlock(struct lfs *);
213dddf5c51Sperseant void lfs_segunlock_relock(struct lfs *);
2143c3d9e74Sriastradh void lfs_writer_enter(struct lfs *, const char *);
2155fc5b909Sriastradh int lfs_writer_tryenter(struct lfs *);
216102c8a6aSyamt void lfs_writer_leave(struct lfs *);
217b99e4c82Sperseant void lfs_wakeup_cleaner(struct lfs *);
2187bd9e243Schristos 
2197bd9e243Schristos /* lfs_syscalls.c */
220b397c875Sperseant int lfs_do_segclean(struct lfs *, unsigned long);
22195137c84Sperseant int lfs_segwait(fsid_t *, struct timeval *);
222104ce729Sdholland int lfs_bmapv(struct lwp *, fsid_t *, struct block_info *, int);
223104ce729Sdholland int lfs_markv(struct lwp *, fsid_t *, struct block_info *, int);
2247bd9e243Schristos 
2257bd9e243Schristos /* lfs_vfsops.c */
226c063d4ccShannken VFS_PROTOS(lfs);
2272f695b54Sperseant void lfs_vinit(struct mount *, struct vnode **);
2282f695b54Sperseant int lfs_resize_fs(struct lfs *, int);
2297bd9e243Schristos 
23039b86955Sperseant /* lfs_vnops.c */
23167a55598Syamt void lfs_mark_vnode(struct vnode *);
2324e3fced9Sperseant void lfs_unmark_vnode(struct vnode *);
233fc9422c9Selad int lfs_gop_alloc(struct vnode *, off_t, off_t, int, kauth_cred_t);
234b397c875Sperseant void lfs_gop_size(struct vnode *, off_t, off_t *, int);
235b397c875Sperseant int lfs_putpages_ext(void *, int);
236b397c875Sperseant int lfs_gatherpages(struct vnode *);
237f9b3466dSperseant int lfs_flush_dirops(struct lfs *);
238f9b3466dSperseant int lfs_flush_pchain(struct lfs *);
2397bd9e243Schristos 
2404e3fced9Sperseant int lfs_bwrite	 (void *);
2414e3fced9Sperseant int lfs_fsync	 (void *);
2424e3fced9Sperseant int lfs_symlink	 (void *);
2434e3fced9Sperseant int lfs_mknod	 (void *);
2444e3fced9Sperseant int lfs_create	 (void *);
2454e3fced9Sperseant int lfs_mkdir	 (void *);
2464e3fced9Sperseant int lfs_read	 (void *);
2474e3fced9Sperseant int lfs_remove	 (void *);
2484e3fced9Sperseant int lfs_rmdir	 (void *);
2494e3fced9Sperseant int lfs_link	 (void *);
250b397c875Sperseant int lfs_mmap	 (void *);
2514e3fced9Sperseant int lfs_rename	 (void *);
2524e3fced9Sperseant int lfs_getattr	 (void *);
253f4135861Sperseant int lfs_setattr	 (void *);
2544e3fced9Sperseant int lfs_close	 (void *);
255ddfb1dbbSperseant int lfsspec_close(void *);
256ddfb1dbbSperseant int lfsfifo_close(void *);
2576f5626d1Sperseant int lfs_fcntl	 (void *);
2584e3fced9Sperseant int lfs_inactive (void *);
2594e3fced9Sperseant int lfs_reclaim	 (void *);
2604b4f884bSperseant int lfs_strategy (void *);
2614e3fced9Sperseant int lfs_write	 (void *);
2620d70d731Schs int lfs_getpages (void *);
2630d70d731Schs int lfs_putpages (void *);
2647bd9e243Schristos 
2655a2d83e0Sriastradh int lfs_bufrd(struct vnode *, struct uio *, int, kauth_cred_t);
2665a2d83e0Sriastradh int lfs_bufwr(struct vnode *, struct uio *, int, kauth_cred_t);
2675a2d83e0Sriastradh 
268e5bc90f4Sfvdl extern int lfs_mount_type;
2694e3fced9Sperseant extern int (**lfs_vnodeop_p)(void *);
2704e3fced9Sperseant extern int (**lfs_specop_p)(void *);
2714e3fced9Sperseant extern int (**lfs_fifoop_p)(void *);
27244d128faSyamt extern const struct genfs_ops lfs_genfsops;
27360db16d1Smatt 
274fc9422c9Selad #endif /* defined(_KERNEL) */
275fc9422c9Selad 
276fc9422c9Selad /* lfs_cksum.c */
2778859f77eSdholland uint32_t cksum(void *, size_t);
2788859f77eSdholland uint32_t lfs_cksum_part(void *, size_t, uint32_t);
279fc9422c9Selad #define lfs_cksum_fold(sum)	(sum)
2808859f77eSdholland uint32_t lfs_sb_cksum(struct lfs *);
281fc9422c9Selad 
282fc9422c9Selad __END_DECLS
283fc9422c9Selad 
28460db16d1Smatt #endif /* !_UFS_LFS_LFS_EXTERN_H_ */
285