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