| 1 | /* $NetBSD: cnode.h,v 1.20 2014/12/13 15:59:30 hannken Exp $ */ |
| 2 | |
| 3 | /* |
| 4 | * |
| 5 | * Coda: an Experimental Distributed File System |
| 6 | * Release 3.1 |
| 7 | * |
| 8 | * Copyright (c) 1987-1998 Carnegie Mellon University |
| 9 | * All Rights Reserved |
| 10 | * |
| 11 | * Permission to use, copy, modify and distribute this software and its |
| 12 | * documentation is hereby granted, provided that both the copyright |
| 13 | * notice and this permission notice appear in all copies of the |
| 14 | * software, derivative works or modified versions, and any portions |
| 15 | * thereof, and that both notices appear in supporting documentation, and |
| 16 | * that credit is given to Carnegie Mellon University in all documents |
| 17 | * and publicity pertaining to direct or indirect use of this code or its |
| 18 | * derivatives. |
| 19 | * |
| 20 | * CODA IS AN EXPERIMENTAL SOFTWARE SYSTEM AND IS KNOWN TO HAVE BUGS, |
| 21 | * SOME OF WHICH MAY HAVE SERIOUS CONSEQUENCES. CARNEGIE MELLON ALLOWS |
| 22 | * FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION. CARNEGIE MELLON |
| 23 | * DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER |
| 24 | * RESULTING DIRECTLY OR INDIRECTLY FROM THE USE OF THIS SOFTWARE OR OF |
| 25 | * ANY DERIVATIVE WORK. |
| 26 | * |
| 27 | * Carnegie Mellon encourages users of this software to return any |
| 28 | * improvements or extensions that they make, and to grant Carnegie |
| 29 | * Mellon the rights to redistribute these changes without encumbrance. |
| 30 | * |
| 31 | * @(#) coda/cnode.h,v 1.1.1.1 1998/08/29 21:26:46 rvb Exp $ |
| 32 | */ |
| 33 | |
| 34 | /* |
| 35 | * Mach Operating System |
| 36 | * Copyright (c) 1990 Carnegie-Mellon University |
| 37 | * Copyright (c) 1989 Carnegie-Mellon University |
| 38 | * All rights reserved. The CMU software License Agreement specifies |
| 39 | * the terms and conditions for use and redistribution. |
| 40 | */ |
| 41 | |
| 42 | /* |
| 43 | * This code was written for the Coda file system at Carnegie Mellon University. |
| 44 | * Contributers include David Steere, James Kistler, and M. Satyanarayanan. |
| 45 | */ |
| 46 | |
| 47 | #ifndef _CNODE_H_ |
| 48 | #define _CNODE_H_ |
| 49 | |
| 50 | #include <sys/vnode.h> |
| 51 | #ifdef _KERNEL |
| 52 | #include <sys/mallocvar.h> |
| 53 | |
| 54 | MALLOC_DECLARE(M_CODA); |
| 55 | #endif |
| 56 | |
| 57 | /* |
| 58 | * Cnode lookup stuff. |
| 59 | * NOTE: CODA_CACHESIZE must be a power of 2 for cfshash to work! |
| 60 | */ |
| 61 | #define CODA_CACHESIZE 512 |
| 62 | |
| 63 | #define CODA_ALLOC(ptr, cast, size) \ |
| 64 | do { \ |
| 65 | ptr = (cast)malloc((unsigned long) size, M_CODA, M_WAITOK); \ |
| 66 | if (ptr == 0) { \ |
| 67 | panic("kernel malloc returns 0 at %s:%d\n", __FILE__, __LINE__); \ |
| 68 | } \ |
| 69 | } while (/*CONSTCOND*/ 0) |
| 70 | |
| 71 | #define CODA_FREE(ptr, size) free((ptr), M_CODA) |
| 72 | |
| 73 | /* |
| 74 | * global cache state control |
| 75 | */ |
| 76 | extern int coda_nc_use; |
| 77 | |
| 78 | /* |
| 79 | * Used to select debugging statements throughout the cfs code. |
| 80 | */ |
| 81 | extern int codadebug; |
| 82 | extern int coda_nc_debug; |
| 83 | extern int coda_printf_delay; |
| 84 | extern int coda_vnop_print_entry; |
| 85 | extern int coda_psdev_print_entry; |
| 86 | extern int coda_vfsop_print_entry; |
| 87 | |
| 88 | #define CODADBGMSK(N) (1 << N) |
| 89 | #define CODADEBUG(N, STMT) { if (codadebug & CODADBGMSK(N)) { STMT } } |
| 90 | #define myprintf(args) \ |
| 91 | do { \ |
| 92 | if (coda_printf_delay) \ |
| 93 | DELAY(coda_printf_delay);\ |
| 94 | printf args ; \ |
| 95 | } while (/*CONSTCOND*/ 0) |
| 96 | |
| 97 | struct cnode { |
| 98 | struct vnode *c_vnode; |
| 99 | u_short c_flags; /* flags (see below) */ |
| 100 | CodaFid c_fid; /* file handle */ |
| 101 | struct vnode *c_ovp; /* open vnode pointer */ |
| 102 | u_short c_ocount; /* count of openers */ |
| 103 | u_short c_owrite; /* count of open for write */ |
| 104 | struct vattr c_vattr; /* attributes */ |
| 105 | char *c_symlink; /* pointer to symbolic link */ |
| 106 | u_short c_symlen; /* length of symbolic link */ |
| 107 | dev_t c_device; /* associated vnode device */ |
| 108 | ino_t c_inode; /* associated vnode inode */ |
| 109 | kmutex_t c_lock; |
| 110 | }; |
| 111 | #define VTOC(vp) ((struct cnode *)(vp)->v_data) |
| 112 | #define SET_VTOC(vp) ((vp)->v_data) |
| 113 | #define CTOV(cp) ((struct vnode *)((cp)->c_vnode)) |
| 114 | |
| 115 | /* flags */ |
| 116 | #define C_VATTR 0x01 /* Validity of vattr in the cnode */ |
| 117 | #define C_SYMLINK 0x02 /* Validity of symlink pointer in the Code */ |
| 118 | #define C_UNMOUNTING 0X20 /* Set if unmounting */ |
| 119 | #define C_PURGING 0x40 /* Set if purging a fid */ |
| 120 | |
| 121 | #define VALID_VATTR(cp) ((cp->c_flags) & C_VATTR) |
| 122 | #define VALID_SYMLINK(cp) ((cp->c_flags) & C_SYMLINK) |
| 123 | #define IS_UNMOUNTING(cp) ((cp)->c_flags & C_UNMOUNTING) |
| 124 | |
| 125 | struct vmsg; |
| 126 | |
| 127 | struct vcomm { |
| 128 | u_long vc_seq; |
| 129 | int vc_open; |
| 130 | struct selinfo vc_selproc; |
| 131 | TAILQ_HEAD(,vmsg) vc_requests; |
| 132 | TAILQ_HEAD(,vmsg) vc_replies; |
| 133 | }; |
| 134 | |
| 135 | #define VC_OPEN(vcp) ((vcp)->vc_open == 1) |
| 136 | #define MARK_VC_CLOSED(vcp) ((vcp)->vc_open = 0) |
| 137 | #define MARK_VC_OPEN(vcp) ((vcp)->vc_open = 1) |
| 138 | |
| 139 | struct coda_clstat { |
| 140 | int ncalls; /* client requests */ |
| 141 | int nbadcalls; /* upcall failures */ |
| 142 | int reqs[CODA_NCALLS]; /* count of each request */ |
| 143 | }; |
| 144 | extern struct coda_clstat coda_clstat; |
| 145 | |
| 146 | /* |
| 147 | * CODA structure to hold mount/file system information |
| 148 | */ |
| 149 | struct coda_mntinfo { |
| 150 | struct vnode *mi_rootvp; |
| 151 | struct mount *mi_vfsp; |
| 152 | struct vcomm mi_vcomm; |
| 153 | int mi_started; |
| 154 | }; |
| 155 | extern struct coda_mntinfo coda_mnttbl[]; /* indexed by minor device number */ |
| 156 | |
| 157 | /* |
| 158 | * vfs pointer to mount info |
| 159 | */ |
| 160 | #define vftomi(vfsp) ((struct coda_mntinfo *)(vfsp->mnt_data)) |
| 161 | #define CODA_MOUNTED(vfsp) ((vftomi(vfsp) != (struct coda_mntinfo *)0) \ |
| 162 | && (vftomi(vfsp)->mi_started)) |
| 163 | |
| 164 | /* |
| 165 | * vnode pointer to mount info |
| 166 | */ |
| 167 | #define vtomi(vp) ((struct coda_mntinfo *)(vp->v_mount->mnt_data)) |
| 168 | |
| 169 | /* |
| 170 | * Used for identifying usage of "Control" object |
| 171 | */ |
| 172 | extern struct vnode *coda_ctlvp; |
| 173 | #define IS_CTL_VP(vp) ((vp) == coda_ctlvp) |
| 174 | #define IS_CTL_NAME(vp, name, l)((l == CODA_CONTROLLEN) \ |
| 175 | && ((vp) == vtomi((vp))->mi_rootvp) \ |
| 176 | && strncmp(name, CODA_CONTROL, l) == 0) |
| 177 | |
| 178 | /* |
| 179 | * An enum to tell us whether something that will remove a reference |
| 180 | * to a cnode was a downcall or not |
| 181 | */ |
| 182 | enum dc_status { |
| 183 | IS_DOWNCALL = 6, |
| 184 | NOT_DOWNCALL = 7 |
| 185 | }; |
| 186 | |
| 187 | /* cfs_psdev.h */ |
| 188 | extern int coda_call(struct coda_mntinfo *, int, int *, void *); |
| 189 | extern int coda_kernel_version; |
| 190 | |
| 191 | /* cfs_subr.h */ |
| 192 | extern int handleDownCall(int, union outputArgs *); |
| 193 | extern void coda_unmounting(struct mount *); |
| 194 | extern int coda_vmflush(struct cnode *); |
| 195 | |
| 196 | /* cfs_vnodeops.h */ |
| 197 | extern struct cnode *make_coda_node(CodaFid *, struct mount *, short); |
| 198 | extern int coda_vnodeopstats_init(void); |
| 199 | |
| 200 | /* coda_vfsops.h */ |
| 201 | extern struct mount *devtomp(dev_t); |
| 202 | |
| 203 | /* sigh */ |
| 204 | #define CODA_RDWR ((u_long) 31) |
| 205 | |
| 206 | #endif /* _CNODE_H_ */ |
| 207 | |
| 208 | |