1 0 stevel /* 2 0 stevel * CDDL HEADER START 3 0 stevel * 4 0 stevel * The contents of this file are subject to the terms of the 5 1925 rsb * Common Development and Distribution License (the "License"). 6 1925 rsb * You may not use this file except in compliance with the License. 7 0 stevel * 8 0 stevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 0 stevel * or http://www.opensolaris.org/os/licensing. 10 0 stevel * See the License for the specific language governing permissions 11 0 stevel * and limitations under the License. 12 0 stevel * 13 0 stevel * When distributing Covered Code, include this CDDL HEADER in each 14 0 stevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 0 stevel * If applicable, add the following below this CDDL HEADER, with the 16 0 stevel * fields enclosed by brackets "[]" replaced with your own identifying 17 0 stevel * information: Portions Copyright [yyyy] [name of copyright owner] 18 0 stevel * 19 0 stevel * CDDL HEADER END 20 0 stevel */ 21 0 stevel /* 22 6264 rm15945 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23 0 stevel * Use is subject to license terms. 24 0 stevel */ 25 0 stevel #pragma ident "%Z%%M% %I% %E% SMI" 26 0 stevel 27 0 stevel #include <sys/types.h> 28 0 stevel #include <sys/atomic.h> 29 0 stevel #include <sys/kmem.h> 30 0 stevel #include <sys/mutex.h> 31 0 stevel #include <sys/errno.h> 32 0 stevel #include <sys/param.h> 33 0 stevel #include <sys/sysmacros.h> 34 0 stevel #include <sys/systm.h> 35 0 stevel #include <sys/cmn_err.h> 36 0 stevel #include <sys/debug.h> 37 0 stevel 38 0 stevel #include <sys/fem.h> 39 0 stevel #include <sys/vfs.h> 40 0 stevel #include <sys/vnode.h> 41 3898 rsb #include <sys/vfs_opreg.h> 42 0 stevel 43 0 stevel #define NNODES_DEFAULT 8 /* Default number of nodes in a fem_list */ 44 0 stevel /* 45 0 stevel * fl_ntob(n) - Fem_list: number of nodes to bytes 46 0 stevel * Given the number of nodes in a fem_list return the size, in bytes, 47 0 stevel * of the fem_list structure. 48 0 stevel */ 49 0 stevel #define fl_ntob(n) (sizeof (struct fem_list) + \ 50 0 stevel ((n) - 1) * sizeof (struct fem_node)) 51 0 stevel 52 0 stevel typedef enum { 53 0 stevel FEMTYPE_NULL, /* Uninitialized */ 54 0 stevel FEMTYPE_VNODE, 55 0 stevel FEMTYPE_VFS, 56 0 stevel FEMTYPE_NTYPES 57 0 stevel } femtype_t; 58 0 stevel 59 0 stevel #define FEM_HEAD(_t) femtype[(_t)].head.fn_op.anon 60 0 stevel #define FEM_GUARD(_t) femtype[(_t)].guard 61 0 stevel 62 0 stevel static struct fem_type_info { 63 0 stevel struct fem_node head; 64 0 stevel struct fem_node guard; 65 0 stevel femop_t *errf; 66 0 stevel } femtype[FEMTYPE_NTYPES]; 67 0 stevel 68 0 stevel 69 0 stevel /* 70 0 stevel * For each type, two tables - the translation offset definition, which 71 0 stevel * is used by fs_build_vector to layout the operation(s) vector; and the 72 0 stevel * guard_operation_vector which protects from stack under-run. 73 0 stevel */ 74 0 stevel 75 0 stevel int fem_err(); 76 0 stevel int fsem_err(); 77 0 stevel 78 0 stevel 79 0 stevel #define _FEMOPDEF(name, member) \ 80 3898 rsb { VOPNAME_##name, offsetof(fem_t, femop_##member), NULL, fem_err } 81 0 stevel 82 0 stevel static fs_operation_trans_def_t fem_opdef[] = { 83 0 stevel _FEMOPDEF(OPEN, open), 84 0 stevel _FEMOPDEF(CLOSE, close), 85 0 stevel _FEMOPDEF(READ, read), 86 0 stevel _FEMOPDEF(WRITE, write), 87 0 stevel _FEMOPDEF(IOCTL, ioctl), 88 0 stevel _FEMOPDEF(SETFL, setfl), 89 0 stevel _FEMOPDEF(GETATTR, getattr), 90 0 stevel _FEMOPDEF(SETATTR, setattr), 91 0 stevel _FEMOPDEF(ACCESS, access), 92 0 stevel _FEMOPDEF(LOOKUP, lookup), 93 0 stevel _FEMOPDEF(CREATE, create), 94 0 stevel _FEMOPDEF(REMOVE, remove), 95 0 stevel _FEMOPDEF(LINK, link), 96 0 stevel _FEMOPDEF(RENAME, rename), 97 0 stevel _FEMOPDEF(MKDIR, mkdir), 98 0 stevel _FEMOPDEF(RMDIR, rmdir), 99 0 stevel _FEMOPDEF(READDIR, readdir), 100 0 stevel _FEMOPDEF(SYMLINK, symlink), 101 0 stevel _FEMOPDEF(READLINK, readlink), 102 0 stevel _FEMOPDEF(FSYNC, fsync), 103 0 stevel _FEMOPDEF(INACTIVE, inactive), 104 0 stevel _FEMOPDEF(FID, fid), 105 0 stevel _FEMOPDEF(RWLOCK, rwlock), 106 0 stevel _FEMOPDEF(RWUNLOCK, rwunlock), 107 0 stevel _FEMOPDEF(SEEK, seek), 108 0 stevel _FEMOPDEF(CMP, cmp), 109 0 stevel _FEMOPDEF(FRLOCK, frlock), 110 0 stevel _FEMOPDEF(SPACE, space), 111 0 stevel _FEMOPDEF(REALVP, realvp), 112 0 stevel _FEMOPDEF(GETPAGE, getpage), 113 0 stevel _FEMOPDEF(PUTPAGE, putpage), 114 0 stevel _FEMOPDEF(MAP, map), 115 0 stevel _FEMOPDEF(ADDMAP, addmap), 116 0 stevel _FEMOPDEF(DELMAP, delmap), 117 0 stevel _FEMOPDEF(POLL, poll), 118 0 stevel _FEMOPDEF(DUMP, dump), 119 0 stevel _FEMOPDEF(PATHCONF, pathconf), 120 0 stevel _FEMOPDEF(PAGEIO, pageio), 121 0 stevel _FEMOPDEF(DUMPCTL, dumpctl), 122 0 stevel _FEMOPDEF(DISPOSE, dispose), 123 0 stevel _FEMOPDEF(SETSECATTR, setsecattr), 124 0 stevel _FEMOPDEF(GETSECATTR, getsecattr), 125 0 stevel _FEMOPDEF(SHRLOCK, shrlock), 126 0 stevel _FEMOPDEF(VNEVENT, vnevent), 127 0 stevel { NULL, 0, NULL, NULL } 128 0 stevel }; 129 0 stevel 130 0 stevel 131 0 stevel #define _FEMGUARD(name, ignore) \ 132 0 stevel { VOPNAME_##name, (femop_t *)fem_err } 133 0 stevel 134 0 stevel static struct fs_operation_def fem_guard_ops[] = { 135 0 stevel _FEMGUARD(OPEN, open), 136 0 stevel _FEMGUARD(CLOSE, close), 137 0 stevel _FEMGUARD(READ, read), 138 0 stevel _FEMGUARD(WRITE, write), 139 0 stevel _FEMGUARD(IOCTL, ioctl), 140 0 stevel _FEMGUARD(SETFL, setfl), 141 0 stevel _FEMGUARD(GETATTR, getattr), 142 0 stevel _FEMGUARD(SETATTR, setattr), 143 0 stevel _FEMGUARD(ACCESS, access), 144 0 stevel _FEMGUARD(LOOKUP, lookup), 145 0 stevel _FEMGUARD(CREATE, create), 146 0 stevel _FEMGUARD(REMOVE, remove), 147 0 stevel _FEMGUARD(LINK, link), 148 0 stevel _FEMGUARD(RENAME, rename), 149 0 stevel _FEMGUARD(MKDIR, mkdir), 150 0 stevel _FEMGUARD(RMDIR, rmdir), 151 0 stevel _FEMGUARD(READDIR, readdir), 152 0 stevel _FEMGUARD(SYMLINK, symlink), 153 0 stevel _FEMGUARD(READLINK, readlink), 154 0 stevel _FEMGUARD(FSYNC, fsync), 155 0 stevel _FEMGUARD(INACTIVE, inactive), 156 0 stevel _FEMGUARD(FID, fid), 157 0 stevel _FEMGUARD(RWLOCK, rwlock), 158 0 stevel _FEMGUARD(RWUNLOCK, rwunlock), 159 0 stevel _FEMGUARD(SEEK, seek), 160 0 stevel _FEMGUARD(CMP, cmp), 161 0 stevel _FEMGUARD(FRLOCK, frlock), 162 0 stevel _FEMGUARD(SPACE, space), 163 0 stevel _FEMGUARD(REALVP, realvp), 164 0 stevel _FEMGUARD(GETPAGE, getpage), 165 0 stevel _FEMGUARD(PUTPAGE, putpage), 166 0 stevel _FEMGUARD(MAP, map), 167 0 stevel _FEMGUARD(ADDMAP, addmap), 168 0 stevel _FEMGUARD(DELMAP, delmap), 169 0 stevel _FEMGUARD(POLL, poll), 170 0 stevel _FEMGUARD(DUMP, dump), 171 0 stevel _FEMGUARD(PATHCONF, pathconf), 172 0 stevel _FEMGUARD(PAGEIO, pageio), 173 0 stevel _FEMGUARD(DUMPCTL, dumpctl), 174 0 stevel _FEMGUARD(DISPOSE, dispose), 175 0 stevel _FEMGUARD(SETSECATTR, setsecattr), 176 0 stevel _FEMGUARD(GETSECATTR, getsecattr), 177 0 stevel _FEMGUARD(SHRLOCK, shrlock), 178 0 stevel _FEMGUARD(VNEVENT, vnevent), 179 0 stevel { NULL, NULL } 180 0 stevel }; 181 0 stevel 182 0 stevel 183 0 stevel #define _FSEMOPDEF(name, member) \ 184 3898 rsb { VFSNAME_##name, offsetof(fsem_t, fsemop_##member), NULL, fsem_err } 185 0 stevel 186 0 stevel static fs_operation_trans_def_t fsem_opdef[] = { 187 0 stevel _FSEMOPDEF(MOUNT, mount), 188 0 stevel _FSEMOPDEF(UNMOUNT, unmount), 189 0 stevel _FSEMOPDEF(ROOT, root), 190 0 stevel _FSEMOPDEF(STATVFS, statvfs), 191 0 stevel _FSEMOPDEF(SYNC, sync), 192 0 stevel _FSEMOPDEF(VGET, vget), 193 0 stevel _FSEMOPDEF(MOUNTROOT, mountroot), 194 0 stevel _FSEMOPDEF(FREEVFS, freevfs), 195 0 stevel _FSEMOPDEF(VNSTATE, vnstate), 196 0 stevel { NULL, 0, NULL, NULL } 197 0 stevel }; 198 0 stevel 199 0 stevel #define _FSEMGUARD(name, ignore) \ 200 0 stevel { VFSNAME_##name, (femop_t *)fsem_err } 201 0 stevel 202 0 stevel static struct fs_operation_def fsem_guard_ops[] = { 203 0 stevel _FSEMGUARD(MOUNT, mount), 204 0 stevel _FSEMGUARD(UNMOUNT, unmount), 205 0 stevel _FSEMGUARD(ROOT, root), 206 0 stevel _FSEMGUARD(STATVFS, statvfs), 207 0 stevel _FSEMGUARD(SYNC, sync), 208 0 stevel _FSEMGUARD(VGET, vget), 209 0 stevel _FSEMGUARD(MOUNTROOT, mountroot), 210 0 stevel _FSEMGUARD(FREEVFS, freevfs), 211 0 stevel _FSEMGUARD(VNSTATE, vnstate), 212 0 stevel { NULL, NULL} 213 0 stevel }; 214 0 stevel 215 0 stevel 216 0 stevel /* 217 0 stevel * vsop_find, vfsop_find - 218 0 stevel * 219 0 stevel * These macros descend the stack until they find either a basic 220 0 stevel * vnode/vfs operation [ indicated by a null fn_available ] or a 221 0 stevel * stacked item where this method is non-null [_vsop]. 222 0 stevel * 223 0 stevel * The DEBUG one is written with a single function which manually applies 224 0 stevel * the structure offsets. It can have additional debugging support. 225 0 stevel */ 226 0 stevel 227 0 stevel #ifndef DEBUG 228 0 stevel 229 0 stevel #define vsop_find(ap, func, funct, arg0, _vop, _vsop) \ 230 0 stevel for (;;) { \ 231 0 stevel if ((ap)->fa_fnode->fn_available == NULL) { \ 232 0 stevel *(func) = (funct (*)())((ap)->fa_fnode->fn_op.vnode->_vop); \ 233 0 stevel *(arg0) = (void *)(ap)->fa_vnode.vp; \ 234 0 stevel break; \ 235 0 stevel } else if ((*(func) = (funct (*)())((ap)->fa_fnode->fn_op.fem->_vsop))\ 236 0 stevel != NULL) { \ 237 0 stevel *(arg0) = (void *) (ap); \ 238 0 stevel break; \ 239 0 stevel } else { \ 240 0 stevel (ap)->fa_fnode--; \ 241 0 stevel } \ 242 0 stevel } \ 243 0 stevel 244 0 stevel #define vfsop_find(ap, func, funct, arg0, _vop, _vsop) \ 245 0 stevel for (;;) { \ 246 0 stevel if ((ap)->fa_fnode->fn_available == NULL) { \ 247 0 stevel *(func) = (funct (*)())((ap)->fa_fnode->fn_op.vfs->_vop); \ 248 0 stevel *(arg0) = (void *)(ap)->fa_vnode.vp; \ 249 0 stevel break; \ 250 0 stevel } else if ((*(func) = (funct (*)())((ap)->fa_fnode->fn_op.fsem->_vsop))\ 251 0 stevel != NULL) { \ 252 0 stevel *(arg0) = (void *) (ap); \ 253 0 stevel break; \ 254 0 stevel } else { \ 255 0 stevel (ap)->fa_fnode--; \ 256 0 stevel } \ 257 0 stevel } \ 258 0 stevel 259 0 stevel #else 260 0 stevel 261 0 stevel #define vsop_find(ap, func, funct, arg0, _vop, _vsop) \ 262 0 stevel *(arg0) = _op_find((ap), (void **)(func), \ 263 0 stevel offsetof(vnodeops_t, _vop), offsetof(fem_t, _vsop)) 264 0 stevel 265 0 stevel #define vfsop_find(ap, func, funct, arg0, _fop, _fsop) \ 266 0 stevel *(arg0) = _op_find((ap), (void **)(func), \ 267 0 stevel offsetof(vfsops_t, _fop), offsetof(fsem_t, _fsop)) 268 0 stevel 269 0 stevel static void * 270 0 stevel _op_find(femarg_t *ap, void **fp, int offs0, int offs1) 271 0 stevel { 272 0 stevel void *ptr; 273 0 stevel for (;;) { 274 0 stevel struct fem_node *fnod = ap->fa_fnode; 275 0 stevel if (fnod->fn_available == NULL) { 276 0 stevel *fp = *(void **)((char *)fnod->fn_op.anon + offs0); 277 0 stevel ptr = (void *)(ap->fa_vnode.anon); 278 0 stevel break; 279 0 stevel } else if ((*fp = *(void **)((char *)fnod->fn_op.anon+offs1)) 280 6264 rm15945 != NULL) { 281 0 stevel ptr = (void *)(ap); 282 0 stevel break; 283 0 stevel } else { 284 0 stevel ap->fa_fnode--; 285 0 stevel } 286 0 stevel } 287 0 stevel return (ptr); 288 0 stevel } 289 0 stevel #endif 290 0 stevel 291 0 stevel static fem_t * 292 0 stevel fem_alloc() 293 0 stevel { 294 0 stevel fem_t *p; 295 0 stevel 296 0 stevel p = (fem_t *)kmem_alloc(sizeof (*p), KM_SLEEP); 297 0 stevel return (p); 298 0 stevel } 299 0 stevel 300 0 stevel void 301 0 stevel fem_free(fem_t *p) 302 0 stevel { 303 0 stevel kmem_free(p, sizeof (*p)); 304 0 stevel } 305 0 stevel 306 0 stevel static fsem_t * 307 0 stevel fsem_alloc() 308 0 stevel { 309 0 stevel fsem_t *p; 310 0 stevel 311 0 stevel p = (fsem_t *)kmem_alloc(sizeof (*p), KM_SLEEP); 312 0 stevel return (p); 313 0 stevel } 314 0 stevel 315 0 stevel void 316 0 stevel fsem_free(fsem_t *p) 317 0 stevel { 318 0 stevel kmem_free(p, sizeof (*p)); 319 0 stevel } 320 0 stevel 321 0 stevel 322 0 stevel /* 323 0 stevel * fem_get, fem_release - manage reference counts on the stack. 324 0 stevel * 325 0 stevel * The list of monitors can be updated while operations are in 326 0 stevel * progress on the object. 327 0 stevel * 328 0 stevel * The reference count facilitates this by counting the number of 329 0 stevel * current accessors, and deconstructing the list when it is exhausted. 330 0 stevel * 331 0 stevel * fem_lock() is required to: 332 0 stevel * look at femh_list 333 0 stevel * update what femh_list points to 334 0 stevel * update femh_list 335 0 stevel * increase femh_list->feml_refc. 336 0 stevel * 337 0 stevel * the feml_refc can decrement without holding the lock; 338 0 stevel * when feml_refc becomes zero, the list is destroyed. 339 0 stevel * 340 0 stevel */ 341 0 stevel 342 0 stevel static struct fem_list * 343 0 stevel fem_lock(struct fem_head *fp) 344 0 stevel { 345 0 stevel struct fem_list *sp = NULL; 346 0 stevel 347 0 stevel ASSERT(fp != NULL); 348 0 stevel mutex_enter(&fp->femh_lock); 349 0 stevel sp = fp->femh_list; 350 0 stevel return (sp); 351 0 stevel } 352 0 stevel 353 0 stevel static void 354 0 stevel fem_unlock(struct fem_head *fp) 355 0 stevel { 356 0 stevel ASSERT(fp != NULL); 357 0 stevel mutex_exit(&fp->femh_lock); 358 0 stevel } 359 0 stevel 360 0 stevel /* 361 0 stevel * Addref can only be called while its head->lock is held. 362 0 stevel */ 363 0 stevel 364 0 stevel static void 365 0 stevel fem_addref(struct fem_list *sp) 366 0 stevel { 367 0 stevel atomic_add_32(&sp->feml_refc, 1); 368 0 stevel } 369 0 stevel 370 1927 jwahlig static uint32_t 371 0 stevel fem_delref(struct fem_list *sp) 372 0 stevel { 373 1927 jwahlig return (atomic_add_32_nv(&sp->feml_refc, -1)); 374 0 stevel } 375 0 stevel 376 0 stevel static struct fem_list * 377 0 stevel fem_get(struct fem_head *fp) 378 0 stevel { 379 0 stevel struct fem_list *sp = NULL; 380 0 stevel 381 0 stevel if (fp != NULL) { 382 0 stevel if ((sp = fem_lock(fp)) != NULL) { 383 0 stevel fem_addref(sp); 384 0 stevel } 385 0 stevel fem_unlock(fp); 386 0 stevel } 387 0 stevel return (sp); 388 0 stevel } 389 0 stevel 390 0 stevel static void 391 0 stevel fem_release(struct fem_list *sp) 392 0 stevel { 393 0 stevel int i; 394 0 stevel 395 1927 jwahlig ASSERT(sp->feml_refc != 0); 396 1927 jwahlig if (fem_delref(sp) == 0) { 397 0 stevel /* 398 0 stevel * Before freeing the list, we need to release the 399 0 stevel * caller-provided data. 400 0 stevel */ 401 0 stevel for (i = sp->feml_tos; i > 0; i--) { 402 0 stevel struct fem_node *fnp = &sp->feml_nodes[i]; 403 0 stevel 404 0 stevel if (fnp->fn_av_rele) 405 0 stevel (*(fnp->fn_av_rele))(fnp->fn_available); 406 0 stevel } 407 0 stevel kmem_free(sp, fl_ntob(sp->feml_ssize)); 408 0 stevel } 409 0 stevel } 410 0 stevel 411 0 stevel 412 0 stevel /* 413 0 stevel * These are the 'head' operations which perform the interposition. 414 0 stevel * 415 0 stevel * This set must be 1:1, onto with the (vnodeops, vfsos). 416 0 stevel * 417 0 stevel * If there is a desire to globally disable interposition for a particular 418 0 stevel * method, the corresponding 'head' routine should unearth the base method 419 0 stevel * and invoke it directly rather than bypassing the function. 420 0 stevel * 421 0 stevel * All the functions are virtually the same, save for names, types & args. 422 0 stevel * 1. get a reference to the monitor stack for this object. 423 0 stevel * 2. store the top of stack into the femarg structure. 424 0 stevel * 3. store the basic object (vnode *, vnode **, vfs *) in the femarg struc. 425 0 stevel * 4. invoke the "top" method for this object. 426 0 stevel * 5. release the reference to the monitor stack. 427 0 stevel * 428 0 stevel */ 429 0 stevel 430 0 stevel static int 431 5331 amw vhead_open(vnode_t **vpp, int mode, cred_t *cr, caller_context_t *ct) 432 0 stevel { 433 0 stevel femarg_t farg; 434 0 stevel struct fem_list *femsp; 435 0 stevel int (*func)(); 436 0 stevel void *arg0; 437 0 stevel int errc; 438 0 stevel 439 0 stevel if ((femsp = fem_lock((*vpp)->v_femhead)) == NULL) { 440 0 stevel func = (int (*)()) ((*vpp)->v_op->vop_open); 441 0 stevel arg0 = (void *)vpp; 442 0 stevel fem_unlock((*vpp)->v_femhead); 443 5331 amw errc = (*func)(arg0, mode, cr, ct); 444 0 stevel } else { 445 0 stevel fem_addref(femsp); 446 0 stevel fem_unlock((*vpp)->v_femhead); 447 0 stevel farg.fa_vnode.vpp = vpp; 448 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 449 3898 rsb vsop_find(&farg, &func, int, &arg0, vop_open, femop_open); 450 5331 amw errc = (*func)(arg0, mode, cr, ct); 451 0 stevel fem_release(femsp); 452 0 stevel } 453 0 stevel return (errc); 454 0 stevel } 455 0 stevel 456 0 stevel static int 457 5331 amw vhead_close(vnode_t *vp, int flag, int count, offset_t offset, cred_t *cr, 458 5331 amw caller_context_t *ct) 459 0 stevel { 460 0 stevel femarg_t farg; 461 0 stevel struct fem_list *femsp; 462 0 stevel int (*func)(); 463 0 stevel void *arg0; 464 0 stevel int errc; 465 0 stevel 466 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 467 0 stevel func = (int (*)()) (vp->v_op->vop_close); 468 0 stevel arg0 = vp; 469 0 stevel fem_unlock(vp->v_femhead); 470 5331 amw errc = (*func)(arg0, flag, count, offset, cr, ct); 471 0 stevel } else { 472 0 stevel fem_addref(femsp); 473 0 stevel fem_unlock(vp->v_femhead); 474 0 stevel farg.fa_vnode.vp = vp; 475 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 476 3898 rsb vsop_find(&farg, &func, int, &arg0, vop_close, femop_close); 477 5331 amw errc = (*func)(arg0, flag, count, offset, cr, ct); 478 0 stevel fem_release(femsp); 479 0 stevel } 480 0 stevel return (errc); 481 0 stevel } 482 0 stevel 483 0 stevel static int 484 0 stevel vhead_read(vnode_t *vp, uio_t *uiop, int ioflag, cred_t *cr, 485 5331 amw caller_context_t *ct) 486 0 stevel { 487 0 stevel femarg_t farg; 488 0 stevel struct fem_list *femsp; 489 0 stevel int (*func)(); 490 0 stevel void *arg0; 491 0 stevel int errc; 492 0 stevel 493 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 494 0 stevel func = (int (*)()) (vp->v_op->vop_read); 495 0 stevel arg0 = vp; 496 0 stevel fem_unlock(vp->v_femhead); 497 0 stevel errc = (*func)(arg0, uiop, ioflag, cr, ct); 498 0 stevel } else { 499 0 stevel fem_addref(femsp); 500 0 stevel fem_unlock(vp->v_femhead); 501 0 stevel farg.fa_vnode.vp = vp; 502 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 503 3898 rsb vsop_find(&farg, &func, int, &arg0, vop_read, femop_read); 504 0 stevel errc = (*func)(arg0, uiop, ioflag, cr, ct); 505 0 stevel fem_release(femsp); 506 0 stevel } 507 0 stevel return (errc); 508 0 stevel } 509 0 stevel 510 0 stevel static int 511 0 stevel vhead_write(vnode_t *vp, uio_t *uiop, int ioflag, cred_t *cr, 512 5331 amw caller_context_t *ct) 513 0 stevel { 514 0 stevel femarg_t farg; 515 0 stevel struct fem_list *femsp; 516 0 stevel int (*func)(); 517 0 stevel void *arg0; 518 0 stevel int errc; 519 0 stevel 520 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 521 0 stevel func = (int (*)()) (vp->v_op->vop_write); 522 0 stevel arg0 = vp; 523 0 stevel fem_unlock(vp->v_femhead); 524 0 stevel errc = (*func)(arg0, uiop, ioflag, cr, ct); 525 0 stevel } else { 526 0 stevel fem_addref(femsp); 527 0 stevel fem_unlock(vp->v_femhead); 528 0 stevel farg.fa_vnode.vp = vp; 529 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 530 3898 rsb vsop_find(&farg, &func, int, &arg0, vop_write, femop_write); 531 0 stevel errc = (*func)(arg0, uiop, ioflag, cr, ct); 532 0 stevel fem_release(femsp); 533 0 stevel } 534 0 stevel return (errc); 535 0 stevel } 536 0 stevel 537 0 stevel static int 538 0 stevel vhead_ioctl(vnode_t *vp, int cmd, intptr_t arg, int flag, cred_t *cr, 539 5331 amw int *rvalp, caller_context_t *ct) 540 0 stevel { 541 0 stevel femarg_t farg; 542 0 stevel struct fem_list *femsp; 543 0 stevel int (*func)(); 544 0 stevel void *arg0; 545 0 stevel int errc; 546 0 stevel 547 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 548 0 stevel func = (int (*)()) (vp->v_op->vop_ioctl); 549 0 stevel arg0 = vp; 550 0 stevel fem_unlock(vp->v_femhead); 551 5331 amw errc = (*func)(arg0, cmd, arg, flag, cr, rvalp, ct); 552 0 stevel } else { 553 0 stevel fem_addref(femsp); 554 0 stevel fem_unlock(vp->v_femhead); 555 0 stevel farg.fa_vnode.vp = vp; 556 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 557 3898 rsb vsop_find(&farg, &func, int, &arg0, vop_ioctl, femop_ioctl); 558 5331 amw errc = (*func)(arg0, cmd, arg, flag, cr, rvalp, ct); 559 0 stevel fem_release(femsp); 560 0 stevel } 561 0 stevel return (errc); 562 0 stevel } 563 0 stevel 564 0 stevel static int 565 5331 amw vhead_setfl(vnode_t *vp, int oflags, int nflags, cred_t *cr, 566 5331 amw caller_context_t *ct) 567 0 stevel { 568 0 stevel femarg_t farg; 569 0 stevel struct fem_list *femsp; 570 0 stevel int (*func)(); 571 0 stevel void *arg0; 572 0 stevel int errc; 573 0 stevel 574 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 575 0 stevel func = (int (*)()) (vp->v_op->vop_setfl); 576 0 stevel arg0 = vp; 577 0 stevel fem_unlock(vp->v_femhead); 578 5331 amw errc = (*func)(arg0, oflags, nflags, cr, ct); 579 0 stevel } else { 580 0 stevel fem_addref(femsp); 581 0 stevel fem_unlock(vp->v_femhead); 582 0 stevel farg.fa_vnode.vp = vp; 583 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 584 3898 rsb vsop_find(&farg, &func, int, &arg0, vop_setfl, femop_setfl); 585 5331 amw errc = (*func)(arg0, oflags, nflags, cr, ct); 586 0 stevel fem_release(femsp); 587 0 stevel } 588 0 stevel return (errc); 589 0 stevel } 590 0 stevel 591 0 stevel static int 592 5331 amw vhead_getattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *cr, 593 5331 amw caller_context_t *ct) 594 0 stevel { 595 0 stevel femarg_t farg; 596 0 stevel struct fem_list *femsp; 597 0 stevel int (*func)(); 598 0 stevel void *arg0; 599 0 stevel int errc; 600 0 stevel 601 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 602 0 stevel func = (int (*)()) (vp->v_op->vop_getattr); 603 0 stevel arg0 = vp; 604 0 stevel fem_unlock(vp->v_femhead); 605 5331 amw errc = (*func)(arg0, vap, flags, cr, ct); 606 0 stevel } else { 607 0 stevel fem_addref(femsp); 608 0 stevel fem_unlock(vp->v_femhead); 609 0 stevel farg.fa_vnode.vp = vp; 610 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 611 0 stevel vsop_find(&farg, &func, int, &arg0, vop_getattr, 612 6264 rm15945 femop_getattr); 613 5331 amw errc = (*func)(arg0, vap, flags, cr, ct); 614 0 stevel fem_release(femsp); 615 0 stevel } 616 0 stevel return (errc); 617 0 stevel } 618 0 stevel 619 0 stevel static int 620 0 stevel vhead_setattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *cr, 621 0 stevel caller_context_t *ct) 622 0 stevel { 623 0 stevel femarg_t farg; 624 0 stevel struct fem_list *femsp; 625 0 stevel int (*func)(); 626 0 stevel void *arg0; 627 0 stevel int errc; 628 0 stevel 629 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 630 0 stevel func = (int (*)()) (vp->v_op->vop_setattr); 631 0 stevel arg0 = vp; 632 0 stevel fem_unlock(vp->v_femhead); 633 0 stevel errc = (*func)(arg0, vap, flags, cr, ct); 634 0 stevel } else { 635 0 stevel fem_addref(femsp); 636 0 stevel fem_unlock(vp->v_femhead); 637 0 stevel farg.fa_vnode.vp = vp; 638 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 639 0 stevel vsop_find(&farg, &func, int, &arg0, vop_setattr, 640 6264 rm15945 femop_setattr); 641 0 stevel errc = (*func)(arg0, vap, flags, cr, ct); 642 0 stevel fem_release(femsp); 643 0 stevel } 644 0 stevel return (errc); 645 0 stevel } 646 0 stevel 647 0 stevel static int 648 5331 amw vhead_access(vnode_t *vp, int mode, int flags, cred_t *cr, 649 5331 amw caller_context_t *ct) 650 0 stevel { 651 0 stevel femarg_t farg; 652 0 stevel struct fem_list *femsp; 653 0 stevel int (*func)(); 654 0 stevel void *arg0; 655 0 stevel int errc; 656 0 stevel 657 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 658 0 stevel func = (int (*)()) (vp->v_op->vop_access); 659 0 stevel arg0 = vp; 660 0 stevel fem_unlock(vp->v_femhead); 661 5331 amw errc = (*func)(arg0, mode, flags, cr, ct); 662 0 stevel } else { 663 0 stevel fem_addref(femsp); 664 0 stevel fem_unlock(vp->v_femhead); 665 0 stevel farg.fa_vnode.vp = vp; 666 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 667 0 stevel vsop_find(&farg, &func, int, &arg0, vop_access, 668 6264 rm15945 femop_access); 669 5331 amw errc = (*func)(arg0, mode, flags, cr, ct); 670 0 stevel fem_release(femsp); 671 0 stevel } 672 0 stevel return (errc); 673 0 stevel } 674 0 stevel 675 0 stevel static int 676 0 stevel vhead_lookup(vnode_t *dvp, char *nm, vnode_t **vpp, pathname_t *pnp, 677 5331 amw int flags, vnode_t *rdir, cred_t *cr, caller_context_t *ct, 678 5331 amw int *direntflags, pathname_t *realpnp) 679 0 stevel { 680 0 stevel femarg_t farg; 681 0 stevel struct fem_list *femsp; 682 0 stevel int (*func)(); 683 0 stevel void *arg0; 684 0 stevel int errc; 685 0 stevel 686 0 stevel if ((femsp = fem_lock(dvp->v_femhead)) == NULL) { 687 0 stevel func = (int (*)()) (dvp->v_op->vop_lookup); 688 0 stevel arg0 = dvp; 689 0 stevel fem_unlock(dvp->v_femhead); 690 5331 amw errc = (*func)(arg0, nm, vpp, pnp, flags, rdir, cr, ct, 691 6264 rm15945 direntflags, realpnp); 692 0 stevel } else { 693 0 stevel fem_addref(femsp); 694 0 stevel fem_unlock(dvp->v_femhead); 695 0 stevel farg.fa_vnode.vp = dvp; 696 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 697 0 stevel vsop_find(&farg, &func, int, &arg0, vop_lookup, 698 6264 rm15945 femop_lookup); 699 5331 amw errc = (*func)(arg0, nm, vpp, pnp, flags, rdir, cr, ct, 700 6264 rm15945 direntflags, realpnp); 701 0 stevel fem_release(femsp); 702 0 stevel } 703 0 stevel return (errc); 704 0 stevel } 705 0 stevel 706 0 stevel static int 707 0 stevel vhead_create(vnode_t *dvp, char *name, vattr_t *vap, vcexcl_t excl, 708 5331 amw int mode, vnode_t **vpp, cred_t *cr, int flag, caller_context_t *ct, 709 5331 amw vsecattr_t *vsecp) 710 0 stevel { 711 0 stevel femarg_t farg; 712 0 stevel struct fem_list *femsp; 713 0 stevel int (*func)(); 714 0 stevel void *arg0; 715 0 stevel int errc; 716 0 stevel 717 0 stevel if ((femsp = fem_lock(dvp->v_femhead)) == NULL) { 718 0 stevel func = (int (*)()) (dvp->v_op->vop_create); 719 0 stevel arg0 = dvp; 720 0 stevel fem_unlock(dvp->v_femhead); 721 5331 amw errc = (*func)(arg0, name, vap, excl, mode, vpp, cr, flag, 722 6264 rm15945 ct, vsecp); 723 0 stevel } else { 724 0 stevel fem_addref(femsp); 725 0 stevel fem_unlock(dvp->v_femhead); 726 0 stevel farg.fa_vnode.vp = dvp; 727 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 728 0 stevel vsop_find(&farg, &func, int, &arg0, vop_create, 729 6264 rm15945 femop_create); 730 5331 amw errc = (*func)(arg0, name, vap, excl, mode, vpp, cr, flag, 731 6264 rm15945 ct, vsecp); 732 0 stevel fem_release(femsp); 733 0 stevel } 734 0 stevel return (errc); 735 0 stevel } 736 0 stevel 737 0 stevel static int 738 5331 amw vhead_remove(vnode_t *dvp, char *nm, cred_t *cr, caller_context_t *ct, 739 5331 amw int flags) 740 0 stevel { 741 0 stevel femarg_t farg; 742 0 stevel struct fem_list *femsp; 743 0 stevel int (*func)(); 744 0 stevel void *arg0; 745 0 stevel int errc; 746 0 stevel 747 0 stevel if ((femsp = fem_lock(dvp->v_femhead)) == NULL) { 748 0 stevel func = (int (*)()) (dvp->v_op->vop_remove); 749 0 stevel arg0 = dvp; 750 0 stevel fem_unlock(dvp->v_femhead); 751 5331 amw errc = (*func)(arg0, nm, cr, ct, flags); 752 0 stevel } else { 753 0 stevel fem_addref(femsp); 754 0 stevel fem_unlock(dvp->v_femhead); 755 0 stevel farg.fa_vnode.vp = dvp; 756 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 757 0 stevel vsop_find(&farg, &func, int, &arg0, vop_remove, 758 6264 rm15945 femop_remove); 759 5331 amw errc = (*func)(arg0, nm, cr, ct, flags); 760 0 stevel fem_release(femsp); 761 0 stevel } 762 0 stevel return (errc); 763 0 stevel } 764 0 stevel 765 0 stevel static int 766 5331 amw vhead_link(vnode_t *tdvp, vnode_t *svp, char *tnm, cred_t *cr, 767 5331 amw caller_context_t *ct, int flags) 768 0 stevel { 769 0 stevel femarg_t farg; 770 0 stevel struct fem_list *femsp; 771 0 stevel int (*func)(); 772 0 stevel void *arg0; 773 0 stevel int errc; 774 0 stevel 775 0 stevel if ((femsp = fem_lock(tdvp->v_femhead)) == NULL) { 776 0 stevel func = (int (*)()) (tdvp->v_op->vop_link); 777 0 stevel arg0 = tdvp; 778 0 stevel fem_unlock(tdvp->v_femhead); 779 5331 amw errc = (*func)(arg0, svp, tnm, cr, ct, flags); 780 0 stevel } else { 781 0 stevel fem_addref(femsp); 782 0 stevel fem_unlock(tdvp->v_femhead); 783 0 stevel farg.fa_vnode.vp = tdvp; 784 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 785 3898 rsb vsop_find(&farg, &func, int, &arg0, vop_link, femop_link); 786 5331 amw errc = (*func)(arg0, svp, tnm, cr, ct, flags); 787 0 stevel fem_release(femsp); 788 0 stevel } 789 0 stevel return (errc); 790 0 stevel } 791 0 stevel 792 0 stevel static int 793 0 stevel vhead_rename(vnode_t *sdvp, char *snm, vnode_t *tdvp, char *tnm, 794 5331 amw cred_t *cr, caller_context_t *ct, int flags) 795 0 stevel { 796 0 stevel femarg_t farg; 797 0 stevel struct fem_list *femsp; 798 0 stevel int (*func)(); 799 0 stevel void *arg0; 800 0 stevel int errc; 801 0 stevel 802 0 stevel if ((femsp = fem_lock(sdvp->v_femhead)) == NULL) { 803 0 stevel func = (int (*)()) (sdvp->v_op->vop_rename); 804 0 stevel arg0 = sdvp; 805 0 stevel fem_unlock(sdvp->v_femhead); 806 5331 amw errc = (*func)(arg0, snm, tdvp, tnm, cr, ct, flags); 807 0 stevel } else { 808 0 stevel fem_addref(femsp); 809 0 stevel fem_unlock(sdvp->v_femhead); 810 0 stevel farg.fa_vnode.vp = sdvp; 811 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 812 0 stevel vsop_find(&farg, &func, int, &arg0, vop_rename, 813 6264 rm15945 femop_rename); 814 5331 amw errc = (*func)(arg0, snm, tdvp, tnm, cr, ct, flags); 815 0 stevel fem_release(femsp); 816 0 stevel } 817 0 stevel return (errc); 818 0 stevel } 819 0 stevel 820 0 stevel static int 821 0 stevel vhead_mkdir(vnode_t *dvp, char *dirname, vattr_t *vap, vnode_t **vpp, 822 5331 amw cred_t *cr, caller_context_t *ct, int flags, vsecattr_t *vsecp) 823 0 stevel { 824 0 stevel femarg_t farg; 825 0 stevel struct fem_list *femsp; 826 0 stevel int (*func)(); 827 0 stevel void *arg0; 828 0 stevel int errc; 829 0 stevel 830 0 stevel if ((femsp = fem_lock(dvp->v_femhead)) == NULL) { 831 0 stevel func = (int (*)()) (dvp->v_op->vop_mkdir); 832 0 stevel arg0 = dvp; 833 0 stevel fem_unlock(dvp->v_femhead); 834 5331 amw errc = (*func)(arg0, dirname, vap, vpp, cr, ct, flags, vsecp); 835 0 stevel } else { 836 0 stevel fem_addref(femsp); 837 0 stevel fem_unlock(dvp->v_femhead); 838 0 stevel farg.fa_vnode.vp = dvp; 839 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 840 3898 rsb vsop_find(&farg, &func, int, &arg0, vop_mkdir, femop_mkdir); 841 5331 amw errc = (*func)(arg0, dirname, vap, vpp, cr, ct, flags, vsecp); 842 0 stevel fem_release(femsp); 843 0 stevel } 844 0 stevel return (errc); 845 0 stevel } 846 0 stevel 847 0 stevel static int 848 5331 amw vhead_rmdir(vnode_t *dvp, char *nm, vnode_t *cdir, cred_t *cr, 849 5331 amw caller_context_t *ct, int flags) 850 0 stevel { 851 0 stevel femarg_t farg; 852 0 stevel struct fem_list *femsp; 853 0 stevel int (*func)(); 854 0 stevel void *arg0; 855 0 stevel int errc; 856 0 stevel 857 0 stevel if ((femsp = fem_lock(dvp->v_femhead)) == NULL) { 858 0 stevel func = (int (*)()) (dvp->v_op->vop_rmdir); 859 0 stevel arg0 = dvp; 860 0 stevel fem_unlock(dvp->v_femhead); 861 5331 amw errc = (*func)(arg0, nm, cdir, cr, ct, flags); 862 0 stevel } else { 863 0 stevel fem_addref(femsp); 864 0 stevel fem_unlock(dvp->v_femhead); 865 0 stevel farg.fa_vnode.vp = dvp; 866 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 867 3898 rsb vsop_find(&farg, &func, int, &arg0, vop_rmdir, femop_rmdir); 868 5331 amw errc = (*func)(arg0, nm, cdir, cr, ct, flags); 869 0 stevel fem_release(femsp); 870 0 stevel } 871 0 stevel return (errc); 872 0 stevel } 873 0 stevel 874 0 stevel static int 875 5331 amw vhead_readdir(vnode_t *vp, uio_t *uiop, cred_t *cr, int *eofp, 876 5331 amw caller_context_t *ct, int flags) 877 0 stevel { 878 0 stevel femarg_t farg; 879 0 stevel struct fem_list *femsp; 880 0 stevel int (*func)(); 881 0 stevel void *arg0; 882 0 stevel int errc; 883 0 stevel 884 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 885 0 stevel func = (int (*)()) (vp->v_op->vop_readdir); 886 0 stevel arg0 = vp; 887 0 stevel fem_unlock(vp->v_femhead); 888 5331 amw errc = (*func)(arg0, uiop, cr, eofp, ct, flags); 889 0 stevel } else { 890 0 stevel fem_addref(femsp); 891 0 stevel fem_unlock(vp->v_femhead); 892 0 stevel farg.fa_vnode.vp = vp; 893 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 894 0 stevel vsop_find(&farg, &func, int, &arg0, vop_readdir, 895 6264 rm15945 femop_readdir); 896 5331 amw errc = (*func)(arg0, uiop, cr, eofp, ct, flags); 897 0 stevel fem_release(femsp); 898 0 stevel } 899 0 stevel return (errc); 900 0 stevel } 901 0 stevel 902 0 stevel static int 903 0 stevel vhead_symlink(vnode_t *dvp, char *linkname, vattr_t *vap, char *target, 904 5331 amw cred_t *cr, caller_context_t *ct, int flags) 905 0 stevel { 906 0 stevel femarg_t farg; 907 0 stevel struct fem_list *femsp; 908 0 stevel int (*func)(); 909 0 stevel void *arg0; 910 0 stevel int errc; 911 0 stevel 912 0 stevel if ((femsp = fem_lock(dvp->v_femhead)) == NULL) { 913 0 stevel func = (int (*)()) (dvp->v_op->vop_symlink); 914 0 stevel arg0 = dvp; 915 0 stevel fem_unlock(dvp->v_femhead); 916 5331 amw errc = (*func)(arg0, linkname, vap, target, cr, ct, flags); 917 0 stevel } else { 918 0 stevel fem_addref(femsp); 919 0 stevel fem_unlock(dvp->v_femhead); 920 0 stevel farg.fa_vnode.vp = dvp; 921 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 922 0 stevel vsop_find(&farg, &func, int, &arg0, vop_symlink, 923 6264 rm15945 femop_symlink); 924 5331 amw errc = (*func)(arg0, linkname, vap, target, cr, ct, flags); 925 0 stevel fem_release(femsp); 926 0 stevel } 927 0 stevel return (errc); 928 0 stevel } 929 0 stevel 930 0 stevel static int 931 5331 amw vhead_readlink(vnode_t *vp, uio_t *uiop, cred_t *cr, caller_context_t *ct) 932 0 stevel { 933 0 stevel femarg_t farg; 934 0 stevel struct fem_list *femsp; 935 0 stevel int (*func)(); 936 0 stevel void *arg0; 937 0 stevel int errc; 938 0 stevel 939 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 940 0 stevel func = (int (*)()) (vp->v_op->vop_readlink); 941 0 stevel arg0 = vp; 942 0 stevel fem_unlock(vp->v_femhead); 943 5331 amw errc = (*func)(arg0, uiop, cr, ct); 944 0 stevel } else { 945 0 stevel fem_addref(femsp); 946 0 stevel fem_unlock(vp->v_femhead); 947 0 stevel farg.fa_vnode.vp = vp; 948 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 949 0 stevel vsop_find(&farg, &func, int, &arg0, vop_readlink, 950 6264 rm15945 femop_readlink); 951 5331 amw errc = (*func)(arg0, uiop, cr, ct); 952 0 stevel fem_release(femsp); 953 0 stevel } 954 0 stevel return (errc); 955 0 stevel } 956 0 stevel 957 0 stevel static int 958 5331 amw vhead_fsync(vnode_t *vp, int syncflag, cred_t *cr, caller_context_t *ct) 959 0 stevel { 960 0 stevel femarg_t farg; 961 0 stevel struct fem_list *femsp; 962 0 stevel int (*func)(); 963 0 stevel void *arg0; 964 0 stevel int errc; 965 0 stevel 966 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 967 0 stevel func = (int (*)()) (vp->v_op->vop_fsync); 968 0 stevel arg0 = vp; 969 0 stevel fem_unlock(vp->v_femhead); 970 5331 amw errc = (*func)(arg0, syncflag, cr, ct); 971 0 stevel } else { 972 0 stevel fem_addref(femsp); 973 0 stevel fem_unlock(vp->v_femhead); 974 0 stevel farg.fa_vnode.vp = vp; 975 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 976 3898 rsb vsop_find(&farg, &func, int, &arg0, vop_fsync, femop_fsync); 977 5331 amw errc = (*func)(arg0, syncflag, cr, ct); 978 0 stevel fem_release(femsp); 979 0 stevel } 980 0 stevel return (errc); 981 0 stevel } 982 0 stevel 983 0 stevel static void 984 5331 amw vhead_inactive(vnode_t *vp, cred_t *cr, caller_context_t *ct) 985 0 stevel { 986 0 stevel femarg_t farg; 987 0 stevel struct fem_list *femsp; 988 0 stevel void (*func)(); 989 0 stevel void *arg0; 990 0 stevel 991 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 992 0 stevel func = (void (*)()) (vp->v_op->vop_inactive); 993 0 stevel arg0 = vp; 994 0 stevel fem_unlock(vp->v_femhead); 995 5331 amw (*func)(arg0, cr, ct); 996 0 stevel } else { 997 0 stevel fem_addref(femsp); 998 0 stevel fem_unlock(vp->v_femhead); 999 0 stevel farg.fa_vnode.vp = vp; 1000 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1001 0 stevel vsop_find(&farg, &func, void, &arg0, vop_inactive, 1002 6264 rm15945 femop_inactive); 1003 5331 amw (*func)(arg0, cr, ct); 1004 0 stevel fem_release(femsp); 1005 0 stevel } 1006 0 stevel } 1007 0 stevel 1008 0 stevel static int 1009 5331 amw vhead_fid(vnode_t *vp, fid_t *fidp, caller_context_t *ct) 1010 0 stevel { 1011 0 stevel femarg_t farg; 1012 0 stevel struct fem_list *femsp; 1013 0 stevel int (*func)(); 1014 0 stevel void *arg0; 1015 0 stevel int errc; 1016 0 stevel 1017 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1018 0 stevel func = (int (*)()) (vp->v_op->vop_fid); 1019 0 stevel arg0 = vp; 1020 0 stevel fem_unlock(vp->v_femhead); 1021 5331 amw errc = (*func)(arg0, fidp, ct); 1022 0 stevel } else { 1023 0 stevel fem_addref(femsp); 1024 0 stevel fem_unlock(vp->v_femhead); 1025 0 stevel farg.fa_vnode.vp = vp; 1026 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1027 3898 rsb vsop_find(&farg, &func, int, &arg0, vop_fid, femop_fid); 1028 5331 amw errc = (*func)(arg0, fidp, ct); 1029 0 stevel fem_release(femsp); 1030 0 stevel } 1031 0 stevel return (errc); 1032 0 stevel } 1033 0 stevel 1034 0 stevel static int 1035 0 stevel vhead_rwlock(vnode_t *vp, int write_lock, caller_context_t *ct) 1036 0 stevel { 1037 0 stevel femarg_t farg; 1038 0 stevel struct fem_list *femsp; 1039 0 stevel int (*func)(); 1040 0 stevel void *arg0; 1041 0 stevel int errc; 1042 0 stevel 1043 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1044 0 stevel func = (int (*)()) (vp->v_op->vop_rwlock); 1045 0 stevel arg0 = vp; 1046 0 stevel fem_unlock(vp->v_femhead); 1047 0 stevel errc = (*func)(arg0, write_lock, ct); 1048 0 stevel } else { 1049 0 stevel fem_addref(femsp); 1050 0 stevel fem_unlock(vp->v_femhead); 1051 0 stevel farg.fa_vnode.vp = vp; 1052 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1053 0 stevel vsop_find(&farg, &func, int, &arg0, vop_rwlock, 1054 6264 rm15945 femop_rwlock); 1055 0 stevel errc = (*func)(arg0, write_lock, ct); 1056 0 stevel fem_release(femsp); 1057 0 stevel } 1058 0 stevel return (errc); 1059 0 stevel } 1060 0 stevel 1061 0 stevel static void 1062 0 stevel vhead_rwunlock(vnode_t *vp, int write_lock, caller_context_t *ct) 1063 0 stevel { 1064 0 stevel femarg_t farg; 1065 0 stevel struct fem_list *femsp; 1066 0 stevel void (*func)(); 1067 0 stevel void *arg0; 1068 0 stevel 1069 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1070 0 stevel func = (void (*)()) (vp->v_op->vop_rwunlock); 1071 0 stevel arg0 = vp; 1072 0 stevel fem_unlock(vp->v_femhead); 1073 0 stevel (*func)(arg0, write_lock, ct); 1074 0 stevel } else { 1075 0 stevel fem_addref(femsp); 1076 0 stevel fem_unlock(vp->v_femhead); 1077 0 stevel farg.fa_vnode.vp = vp; 1078 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1079 0 stevel vsop_find(&farg, &func, void, &arg0, vop_rwunlock, 1080 6264 rm15945 femop_rwunlock); 1081 0 stevel (*func)(arg0, write_lock, ct); 1082 0 stevel fem_release(femsp); 1083 0 stevel } 1084 0 stevel } 1085 0 stevel 1086 0 stevel static int 1087 5331 amw vhead_seek(vnode_t *vp, offset_t ooff, offset_t *noffp, caller_context_t *ct) 1088 0 stevel { 1089 0 stevel femarg_t farg; 1090 0 stevel struct fem_list *femsp; 1091 0 stevel int (*func)(); 1092 0 stevel void *arg0; 1093 0 stevel int errc; 1094 0 stevel 1095 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1096 0 stevel func = (int (*)()) (vp->v_op->vop_seek); 1097 0 stevel arg0 = vp; 1098 0 stevel fem_unlock(vp->v_femhead); 1099 5331 amw errc = (*func)(arg0, ooff, noffp, ct); 1100 0 stevel } else { 1101 0 stevel fem_addref(femsp); 1102 0 stevel fem_unlock(vp->v_femhead); 1103 0 stevel farg.fa_vnode.vp = vp; 1104 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1105 3898 rsb vsop_find(&farg, &func, int, &arg0, vop_seek, femop_seek); 1106 5331 amw errc = (*func)(arg0, ooff, noffp, ct); 1107 0 stevel fem_release(femsp); 1108 0 stevel } 1109 0 stevel return (errc); 1110 0 stevel } 1111 0 stevel 1112 0 stevel static int 1113 5331 amw vhead_cmp(vnode_t *vp1, vnode_t *vp2, caller_context_t *ct) 1114 0 stevel { 1115 0 stevel femarg_t farg; 1116 0 stevel struct fem_list *femsp; 1117 0 stevel int (*func)(); 1118 0 stevel void *arg0; 1119 0 stevel int errc; 1120 0 stevel 1121 0 stevel if ((femsp = fem_lock(vp1->v_femhead)) == NULL) { 1122 0 stevel func = (int (*)()) (vp1->v_op->vop_cmp); 1123 0 stevel arg0 = vp1; 1124 0 stevel fem_unlock(vp1->v_femhead); 1125 5331 amw errc = (*func)(arg0, vp2, ct); 1126 0 stevel } else { 1127 0 stevel fem_addref(femsp); 1128 0 stevel fem_unlock(vp1->v_femhead); 1129 0 stevel farg.fa_vnode.vp = vp1; 1130 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1131 3898 rsb vsop_find(&farg, &func, int, &arg0, vop_cmp, femop_cmp); 1132 5331 amw errc = (*func)(arg0, vp2, ct); 1133 0 stevel fem_release(femsp); 1134 0 stevel } 1135 0 stevel return (errc); 1136 0 stevel } 1137 0 stevel 1138 0 stevel static int 1139 0 stevel vhead_frlock(vnode_t *vp, int cmd, struct flock64 *bfp, int flag, 1140 5331 amw offset_t offset, struct flk_callback *flk_cbp, cred_t *cr, 1141 5331 amw caller_context_t *ct) 1142 0 stevel { 1143 0 stevel femarg_t farg; 1144 0 stevel struct fem_list *femsp; 1145 0 stevel int (*func)(); 1146 0 stevel void *arg0; 1147 0 stevel int errc; 1148 0 stevel 1149 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1150 0 stevel func = (int (*)()) (vp->v_op->vop_frlock); 1151 0 stevel arg0 = vp; 1152 0 stevel fem_unlock(vp->v_femhead); 1153 5331 amw errc = (*func)(arg0, cmd, bfp, flag, offset, flk_cbp, cr, ct); 1154 0 stevel } else { 1155 0 stevel fem_addref(femsp); 1156 0 stevel fem_unlock(vp->v_femhead); 1157 0 stevel farg.fa_vnode.vp = vp; 1158 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1159 0 stevel vsop_find(&farg, &func, int, &arg0, vop_frlock, 1160 6264 rm15945 femop_frlock); 1161 5331 amw errc = (*func)(arg0, cmd, bfp, flag, offset, flk_cbp, cr, ct); 1162 0 stevel fem_release(femsp); 1163 0 stevel } 1164 0 stevel return (errc); 1165 0 stevel } 1166 0 stevel 1167 0 stevel static int 1168 0 stevel vhead_space(vnode_t *vp, int cmd, struct flock64 *bfp, int flag, 1169 0 stevel offset_t offset, cred_t *cr, caller_context_t *ct) 1170 0 stevel { 1171 0 stevel femarg_t farg; 1172 0 stevel struct fem_list *femsp; 1173 0 stevel int (*func)(); 1174 0 stevel void *arg0; 1175 0 stevel int errc; 1176 0 stevel 1177 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1178 0 stevel func = (int (*)()) (vp->v_op->vop_space); 1179 0 stevel arg0 = vp; 1180 0 stevel fem_unlock(vp->v_femhead); 1181 0 stevel errc = (*func)(arg0, cmd, bfp, flag, offset, cr, ct); 1182 0 stevel } else { 1183 0 stevel fem_addref(femsp); 1184 0 stevel fem_unlock(vp->v_femhead); 1185 0 stevel farg.fa_vnode.vp = vp; 1186 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1187 3898 rsb vsop_find(&farg, &func, int, &arg0, vop_space, femop_space); 1188 0 stevel errc = (*func)(arg0, cmd, bfp, flag, offset, cr, ct); 1189 0 stevel fem_release(femsp); 1190 0 stevel } 1191 0 stevel return (errc); 1192 0 stevel } 1193 0 stevel 1194 0 stevel static int 1195 5331 amw vhead_realvp(vnode_t *vp, vnode_t **vpp, caller_context_t *ct) 1196 0 stevel { 1197 0 stevel femarg_t farg; 1198 0 stevel struct fem_list *femsp; 1199 0 stevel int (*func)(); 1200 0 stevel void *arg0; 1201 0 stevel int errc; 1202 0 stevel 1203 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1204 0 stevel func = (int (*)()) (vp->v_op->vop_realvp); 1205 0 stevel arg0 = vp; 1206 0 stevel fem_unlock(vp->v_femhead); 1207 5331 amw errc = (*func)(arg0, vpp, ct); 1208 0 stevel } else { 1209 0 stevel fem_addref(femsp); 1210 0 stevel fem_unlock(vp->v_femhead); 1211 0 stevel farg.fa_vnode.vp = vp; 1212 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1213 0 stevel vsop_find(&farg, &func, int, &arg0, vop_realvp, 1214 6264 rm15945 femop_realvp); 1215 5331 amw errc = (*func)(arg0, vpp, ct); 1216 0 stevel fem_release(femsp); 1217 0 stevel } 1218 0 stevel return (errc); 1219 0 stevel } 1220 0 stevel 1221 0 stevel static int 1222 0 stevel vhead_getpage(vnode_t *vp, offset_t off, size_t len, uint_t *protp, 1223 0 stevel struct page **plarr, size_t plsz, struct seg *seg, caddr_t addr, 1224 5331 amw enum seg_rw rw, cred_t *cr, caller_context_t *ct) 1225 0 stevel { 1226 0 stevel femarg_t farg; 1227 0 stevel struct fem_list *femsp; 1228 0 stevel int (*func)(); 1229 0 stevel void *arg0; 1230 0 stevel int errc; 1231 0 stevel 1232 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1233 0 stevel func = (int (*)()) (vp->v_op->vop_getpage); 1234 0 stevel arg0 = vp; 1235 0 stevel fem_unlock(vp->v_femhead); 1236 0 stevel errc = (*func)(arg0, off, len, protp, plarr, plsz, seg, 1237 6264 rm15945 addr, rw, cr, ct); 1238 0 stevel } else { 1239 0 stevel fem_addref(femsp); 1240 0 stevel fem_unlock(vp->v_femhead); 1241 0 stevel farg.fa_vnode.vp = vp; 1242 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1243 0 stevel vsop_find(&farg, &func, int, &arg0, vop_getpage, 1244 6264 rm15945 femop_getpage); 1245 0 stevel errc = (*func)(arg0, off, len, protp, plarr, plsz, seg, 1246 6264 rm15945 addr, rw, cr, ct); 1247 0 stevel fem_release(femsp); 1248 0 stevel } 1249 0 stevel return (errc); 1250 0 stevel } 1251 0 stevel 1252 0 stevel static int 1253 5331 amw vhead_putpage(vnode_t *vp, offset_t off, size_t len, int flags, cred_t *cr, 1254 5331 amw caller_context_t *ct) 1255 0 stevel { 1256 0 stevel femarg_t farg; 1257 0 stevel struct fem_list *femsp; 1258 0 stevel int (*func)(); 1259 0 stevel void *arg0; 1260 0 stevel int errc; 1261 0 stevel 1262 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1263 0 stevel func = (int (*)()) (vp->v_op->vop_putpage); 1264 0 stevel arg0 = vp; 1265 0 stevel fem_unlock(vp->v_femhead); 1266 5331 amw errc = (*func)(arg0, off, len, flags, cr, ct); 1267 0 stevel } else { 1268 0 stevel fem_addref(femsp); 1269 0 stevel fem_unlock(vp->v_femhead); 1270 0 stevel farg.fa_vnode.vp = vp; 1271 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1272 0 stevel vsop_find(&farg, &func, int, &arg0, vop_putpage, 1273 6264 rm15945 femop_putpage); 1274 5331 amw errc = (*func)(arg0, off, len, flags, cr, ct); 1275 0 stevel fem_release(femsp); 1276 0 stevel } 1277 0 stevel return (errc); 1278 0 stevel } 1279 0 stevel 1280 0 stevel static int 1281 0 stevel vhead_map(vnode_t *vp, offset_t off, struct as *as, caddr_t *addrp, 1282 0 stevel size_t len, uchar_t prot, uchar_t maxprot, uint_t flags, 1283 5331 amw cred_t *cr, caller_context_t *ct) 1284 0 stevel { 1285 0 stevel femarg_t farg; 1286 0 stevel struct fem_list *femsp; 1287 0 stevel int (*func)(); 1288 0 stevel void *arg0; 1289 0 stevel int errc; 1290 0 stevel 1291 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1292 0 stevel func = (int (*)()) (vp->v_op->vop_map); 1293 0 stevel arg0 = vp; 1294 0 stevel fem_unlock(vp->v_femhead); 1295 0 stevel errc = (*func)(arg0, off, as, addrp, len, prot, maxprot, 1296 6264 rm15945 flags, cr, ct); 1297 0 stevel } else { 1298 0 stevel fem_addref(femsp); 1299 0 stevel fem_unlock(vp->v_femhead); 1300 0 stevel farg.fa_vnode.vp = vp; 1301 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1302 3898 rsb vsop_find(&farg, &func, int, &arg0, vop_map, femop_map); 1303 0 stevel errc = (*func)(arg0, off, as, addrp, len, prot, maxprot, 1304 6264 rm15945 flags, cr, ct); 1305 0 stevel fem_release(femsp); 1306 0 stevel } 1307 0 stevel return (errc); 1308 0 stevel } 1309 0 stevel 1310 0 stevel static int 1311 0 stevel vhead_addmap(vnode_t *vp, offset_t off, struct as *as, caddr_t addr, 1312 0 stevel size_t len, uchar_t prot, uchar_t maxprot, uint_t flags, 1313 5331 amw cred_t *cr, caller_context_t *ct) 1314 0 stevel { 1315 0 stevel femarg_t farg; 1316 0 stevel struct fem_list *femsp; 1317 0 stevel int (*func)(); 1318 0 stevel void *arg0; 1319 0 stevel int errc; 1320 0 stevel 1321 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1322 0 stevel func = (int (*)()) (vp->v_op->vop_addmap); 1323 0 stevel arg0 = vp; 1324 0 stevel fem_unlock(vp->v_femhead); 1325 0 stevel errc = (*func)(arg0, off, as, addr, len, prot, maxprot, 1326 6264 rm15945 flags, cr, ct); 1327 0 stevel } else { 1328 0 stevel fem_addref(femsp); 1329 0 stevel fem_unlock(vp->v_femhead); 1330 0 stevel farg.fa_vnode.vp = vp; 1331 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1332 0 stevel vsop_find(&farg, &func, int, &arg0, vop_addmap, 1333 6264 rm15945 femop_addmap); 1334 0 stevel errc = (*func)(arg0, off, as, addr, len, prot, maxprot, 1335 6264 rm15945 flags, cr, ct); 1336 0 stevel fem_release(femsp); 1337 0 stevel } 1338 0 stevel return (errc); 1339 0 stevel } 1340 0 stevel 1341 0 stevel static int 1342 0 stevel vhead_delmap(vnode_t *vp, offset_t off, struct as *as, caddr_t addr, 1343 5331 amw size_t len, uint_t prot, uint_t maxprot, uint_t flags, cred_t *cr, 1344 5331 amw caller_context_t *ct) 1345 0 stevel { 1346 0 stevel femarg_t farg; 1347 0 stevel struct fem_list *femsp; 1348 0 stevel int (*func)(); 1349 0 stevel void *arg0; 1350 0 stevel int errc; 1351 0 stevel 1352 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1353 0 stevel func = (int (*)()) (vp->v_op->vop_delmap); 1354 0 stevel arg0 = vp; 1355 0 stevel fem_unlock(vp->v_femhead); 1356 0 stevel errc = (*func)(arg0, off, as, addr, len, prot, maxprot, 1357 6264 rm15945 flags, cr, ct); 1358 0 stevel } else { 1359 0 stevel fem_addref(femsp); 1360 0 stevel fem_unlock(vp->v_femhead); 1361 0 stevel farg.fa_vnode.vp = vp; 1362 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1363 0 stevel vsop_find(&farg, &func, int, &arg0, vop_delmap, 1364 6264 rm15945 femop_delmap); 1365 0 stevel errc = (*func)(arg0, off, as, addr, len, prot, maxprot, 1366 6264 rm15945 flags, cr, ct); 1367 0 stevel fem_release(femsp); 1368 0 stevel } 1369 0 stevel return (errc); 1370 0 stevel } 1371 0 stevel 1372 0 stevel static int 1373 0 stevel vhead_poll(vnode_t *vp, short events, int anyyet, short *reventsp, 1374 5331 amw struct pollhead **phpp, caller_context_t *ct) 1375 0 stevel { 1376 0 stevel femarg_t farg; 1377 0 stevel struct fem_list *femsp; 1378 0 stevel int (*func)(); 1379 0 stevel void *arg0; 1380 0 stevel int errc; 1381 0 stevel 1382 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1383 0 stevel func = (int (*)()) (vp->v_op->vop_poll); 1384 0 stevel arg0 = vp; 1385 0 stevel fem_unlock(vp->v_femhead); 1386 5331 amw errc = (*func)(arg0, events, anyyet, reventsp, phpp, ct); 1387 0 stevel } else { 1388 0 stevel fem_addref(femsp); 1389 0 stevel fem_unlock(vp->v_femhead); 1390 0 stevel farg.fa_vnode.vp = vp; 1391 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1392 3898 rsb vsop_find(&farg, &func, int, &arg0, vop_poll, femop_poll); 1393 5331 amw errc = (*func)(arg0, events, anyyet, reventsp, phpp, ct); 1394 0 stevel fem_release(femsp); 1395 0 stevel } 1396 0 stevel return (errc); 1397 0 stevel } 1398 0 stevel 1399 0 stevel static int 1400 6264 rm15945 vhead_dump(vnode_t *vp, caddr_t addr, offset_t lbdn, offset_t dblks, 1401 6264 rm15945 caller_context_t *ct) 1402 0 stevel { 1403 0 stevel femarg_t farg; 1404 0 stevel struct fem_list *femsp; 1405 0 stevel int (*func)(); 1406 0 stevel void *arg0; 1407 0 stevel int errc; 1408 0 stevel 1409 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1410 0 stevel func = (int (*)()) (vp->v_op->vop_dump); 1411 0 stevel arg0 = vp; 1412 0 stevel fem_unlock(vp->v_femhead); 1413 5331 amw errc = (*func)(arg0, addr, lbdn, dblks, ct); 1414 0 stevel } else { 1415 0 stevel fem_addref(femsp); 1416 0 stevel fem_unlock(vp->v_femhead); 1417 0 stevel farg.fa_vnode.vp = vp; 1418 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1419 3898 rsb vsop_find(&farg, &func, int, &arg0, vop_dump, femop_dump); 1420 5331 amw errc = (*func)(arg0, addr, lbdn, dblks, ct); 1421 0 stevel fem_release(femsp); 1422 0 stevel } 1423 0 stevel return (errc); 1424 0 stevel } 1425 0 stevel 1426 0 stevel static int 1427 5331 amw vhead_pathconf(vnode_t *vp, int cmd, ulong_t *valp, cred_t *cr, 1428 5331 amw caller_context_t *ct) 1429 0 stevel { 1430 0 stevel femarg_t farg; 1431 0 stevel struct fem_list *femsp; 1432 0 stevel int (*func)(); 1433 0 stevel void *arg0; 1434 0 stevel int errc; 1435 0 stevel 1436 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1437 0 stevel func = (int (*)()) (vp->v_op->vop_pathconf); 1438 0 stevel arg0 = vp; 1439 0 stevel fem_unlock(vp->v_femhead); 1440 5331 amw errc = (*func)(arg0, cmd, valp, cr, ct); 1441 0 stevel } else { 1442 0 stevel fem_addref(femsp); 1443 0 stevel fem_unlock(vp->v_femhead); 1444 0 stevel farg.fa_vnode.vp = vp; 1445 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1446 0 stevel vsop_find(&farg, &func, int, &arg0, vop_pathconf, 1447 6264 rm15945 femop_pathconf); 1448 5331 amw errc = (*func)(arg0, cmd, valp, cr, ct); 1449 0 stevel fem_release(femsp); 1450 0 stevel } 1451 0 stevel return (errc); 1452 0 stevel } 1453 0 stevel 1454 0 stevel static int 1455 0 stevel vhead_pageio(vnode_t *vp, struct page *pp, u_offset_t io_off, 1456 5331 amw size_t io_len, int flags, cred_t *cr, caller_context_t *ct) 1457 0 stevel { 1458 0 stevel femarg_t farg; 1459 0 stevel struct fem_list *femsp; 1460 0 stevel int (*func)(); 1461 0 stevel void *arg0; 1462 0 stevel int errc; 1463 0 stevel 1464 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1465 0 stevel func = (int (*)()) (vp->v_op->vop_pageio); 1466 0 stevel arg0 = vp; 1467 0 stevel fem_unlock(vp->v_femhead); 1468 5331 amw errc = (*func)(arg0, pp, io_off, io_len, flags, cr, ct); 1469 0 stevel } else { 1470 0 stevel fem_addref(femsp); 1471 0 stevel fem_unlock(vp->v_femhead); 1472 0 stevel farg.fa_vnode.vp = vp; 1473 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1474 0 stevel vsop_find(&farg, &func, int, &arg0, vop_pageio, 1475 6264 rm15945 femop_pageio); 1476 5331 amw errc = (*func)(arg0, pp, io_off, io_len, flags, cr, ct); 1477 0 stevel fem_release(femsp); 1478 0 stevel } 1479 0 stevel return (errc); 1480 0 stevel } 1481 0 stevel 1482 0 stevel static int 1483 6264 rm15945 vhead_dumpctl(vnode_t *vp, int action, offset_t *blkp, caller_context_t *ct) 1484 0 stevel { 1485 0 stevel femarg_t farg; 1486 0 stevel struct fem_list *femsp; 1487 0 stevel int (*func)(); 1488 0 stevel void *arg0; 1489 0 stevel int errc; 1490 0 stevel 1491 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1492 0 stevel func = (int (*)()) (vp->v_op->vop_dumpctl); 1493 0 stevel arg0 = vp; 1494 0 stevel fem_unlock(vp->v_femhead); 1495 5331 amw errc = (*func)(arg0, action, blkp, ct); 1496 0 stevel } else { 1497 0 stevel fem_addref(femsp); 1498 0 stevel fem_unlock(vp->v_femhead); 1499 0 stevel farg.fa_vnode.vp = vp; 1500 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1501 0 stevel vsop_find(&farg, &func, int, &arg0, vop_dumpctl, 1502 6264 rm15945 femop_dumpctl); 1503 5331 amw errc = (*func)(arg0, action, blkp, ct); 1504 0 stevel fem_release(femsp); 1505 0 stevel } 1506 0 stevel return (errc); 1507 0 stevel } 1508 0 stevel 1509 0 stevel static void 1510 5331 amw vhead_dispose(vnode_t *vp, struct page *pp, int flag, int dn, cred_t *cr, 1511 5331 amw caller_context_t *ct) 1512 0 stevel { 1513 0 stevel femarg_t farg; 1514 0 stevel struct fem_list *femsp; 1515 0 stevel void (*func)(); 1516 0 stevel void *arg0; 1517 0 stevel 1518 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1519 0 stevel func = (void (*)()) (vp->v_op->vop_dispose); 1520 0 stevel arg0 = vp; 1521 0 stevel fem_unlock(vp->v_femhead); 1522 5331 amw (*func)(arg0, pp, flag, dn, cr, ct); 1523 0 stevel } else { 1524 0 stevel fem_addref(femsp); 1525 0 stevel fem_unlock(vp->v_femhead); 1526 0 stevel farg.fa_vnode.vp = vp; 1527 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1528 0 stevel vsop_find(&farg, &func, void, &arg0, vop_dispose, 1529 6264 rm15945 femop_dispose); 1530 5331 amw (*func)(arg0, pp, flag, dn, cr, ct); 1531 0 stevel fem_release(femsp); 1532 0 stevel } 1533 0 stevel } 1534 0 stevel 1535 0 stevel static int 1536 5331 amw vhead_setsecattr(vnode_t *vp, vsecattr_t *vsap, int flag, cred_t *cr, 1537 5331 amw caller_context_t *ct) 1538 0 stevel { 1539 0 stevel femarg_t farg; 1540 0 stevel struct fem_list *femsp; 1541 0 stevel int (*func)(); 1542 0 stevel void *arg0; 1543 0 stevel int errc; 1544 0 stevel 1545 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1546 0 stevel func = (int (*)()) (vp->v_op->vop_setsecattr); 1547 0 stevel arg0 = vp; 1548 0 stevel fem_unlock(vp->v_femhead); 1549 5331 amw errc = (*func)(arg0, vsap, flag, cr, ct); 1550 0 stevel } else { 1551 0 stevel fem_addref(femsp); 1552 0 stevel fem_unlock(vp->v_femhead); 1553 0 stevel farg.fa_vnode.vp = vp; 1554 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1555 0 stevel vsop_find(&farg, &func, int, &arg0, vop_setsecattr, 1556 6264 rm15945 femop_setsecattr); 1557 5331 amw errc = (*func)(arg0, vsap, flag, cr, ct); 1558 0 stevel fem_release(femsp); 1559 0 stevel } 1560 0 stevel return (errc); 1561 0 stevel } 1562 0 stevel 1563 0 stevel static int 1564 5331 amw vhead_getsecattr(vnode_t *vp, vsecattr_t *vsap, int flag, cred_t *cr, 1565 5331 amw caller_context_t *ct) 1566 0 stevel { 1567 0 stevel femarg_t farg; 1568 0 stevel struct fem_list *femsp; 1569 0 stevel int (*func)(); 1570 0 stevel void *arg0; 1571 0 stevel int errc; 1572 0 stevel 1573 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1574 0 stevel func = (int (*)()) (vp->v_op->vop_getsecattr); 1575 0 stevel arg0 = vp; 1576 0 stevel fem_unlock(vp->v_femhead); 1577 5331 amw errc = (*func)(arg0, vsap, flag, cr, ct); 1578 0 stevel } else { 1579 0 stevel fem_addref(femsp); 1580 0 stevel fem_unlock(vp->v_femhead); 1581 0 stevel farg.fa_vnode.vp = vp; 1582 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1583 0 stevel vsop_find(&farg, &func, int, &arg0, vop_getsecattr, 1584 6264 rm15945 femop_getsecattr); 1585 5331 amw errc = (*func)(arg0, vsap, flag, cr, ct); 1586 0 stevel fem_release(femsp); 1587 0 stevel } 1588 0 stevel return (errc); 1589 0 stevel } 1590 0 stevel 1591 0 stevel static int 1592 0 stevel vhead_shrlock(vnode_t *vp, int cmd, struct shrlock *shr, int flag, 1593 5331 amw cred_t *cr, caller_context_t *ct) 1594 0 stevel { 1595 0 stevel femarg_t farg; 1596 0 stevel struct fem_list *femsp; 1597 0 stevel int (*func)(); 1598 0 stevel void *arg0; 1599 0 stevel int errc; 1600 0 stevel 1601 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1602 0 stevel func = (int (*)()) (vp->v_op->vop_shrlock); 1603 0 stevel arg0 = vp; 1604 0 stevel fem_unlock(vp->v_femhead); 1605 5331 amw errc = (*func)(arg0, cmd, shr, flag, cr, ct); 1606 0 stevel } else { 1607 0 stevel fem_addref(femsp); 1608 0 stevel fem_unlock(vp->v_femhead); 1609 0 stevel farg.fa_vnode.vp = vp; 1610 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1611 0 stevel vsop_find(&farg, &func, int, &arg0, vop_shrlock, 1612 6264 rm15945 femop_shrlock); 1613 5331 amw errc = (*func)(arg0, cmd, shr, flag, cr, ct); 1614 0 stevel fem_release(femsp); 1615 0 stevel } 1616 0 stevel return (errc); 1617 0 stevel } 1618 0 stevel 1619 0 stevel static int 1620 5331 amw vhead_vnevent(vnode_t *vp, vnevent_t vnevent, vnode_t *dvp, char *cname, 1621 5331 amw caller_context_t *ct) 1622 0 stevel { 1623 0 stevel femarg_t farg; 1624 0 stevel struct fem_list *femsp; 1625 0 stevel int (*func)(); 1626 0 stevel void *arg0; 1627 0 stevel int errc; 1628 0 stevel 1629 0 stevel if ((femsp = fem_lock(vp->v_femhead)) == NULL) { 1630 0 stevel func = (int (*)()) (vp->v_op->vop_vnevent); 1631 0 stevel arg0 = vp; 1632 0 stevel fem_unlock(vp->v_femhead); 1633 5331 amw errc = (*func)(arg0, vnevent, dvp, cname, ct); 1634 0 stevel } else { 1635 0 stevel fem_addref(femsp); 1636 0 stevel fem_unlock(vp->v_femhead); 1637 0 stevel farg.fa_vnode.vp = vp; 1638 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1639 0 stevel vsop_find(&farg, &func, int, &arg0, vop_vnevent, 1640 6264 rm15945 femop_vnevent); 1641 5331 amw errc = (*func)(arg0, vnevent, dvp, cname, ct); 1642 0 stevel fem_release(femsp); 1643 0 stevel } 1644 0 stevel return (errc); 1645 0 stevel } 1646 0 stevel 1647 0 stevel static int 1648 0 stevel fshead_mount(vfs_t *vfsp, vnode_t *mvp, struct mounta *uap, cred_t *cr) 1649 0 stevel { 1650 0 stevel fsemarg_t farg; 1651 0 stevel struct fem_list *femsp; 1652 0 stevel int (*func)(); 1653 0 stevel void *arg0; 1654 0 stevel int errc; 1655 0 stevel 1656 1925 rsb ASSERT(vfsp->vfs_implp); 1657 1925 rsb 1658 0 stevel if ((femsp = fem_lock(vfsp->vfs_femhead)) == NULL) { 1659 0 stevel func = (int (*)()) vfsp->vfs_op->vfs_mount; 1660 0 stevel fem_unlock(vfsp->vfs_femhead); 1661 0 stevel errc = (*func)(vfsp, mvp, uap, cr); 1662 0 stevel } else { 1663 0 stevel fem_addref(femsp); 1664 0 stevel fem_unlock(vfsp->vfs_femhead); 1665 0 stevel farg.fa_vnode.vfsp = vfsp; 1666 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1667 0 stevel vfsop_find(&farg, &func, int, &arg0, vfs_mount, 1668 6264 rm15945 fsemop_mount); 1669 0 stevel errc = (*func)(arg0, mvp, uap, cr); 1670 0 stevel fem_release(femsp); 1671 0 stevel } 1672 0 stevel return (errc); 1673 0 stevel } 1674 0 stevel 1675 0 stevel static int 1676 0 stevel fshead_unmount(vfs_t *vfsp, int flag, cred_t *cr) 1677 0 stevel { 1678 0 stevel fsemarg_t farg; 1679 0 stevel struct fem_list *femsp; 1680 0 stevel int (*func)(); 1681 0 stevel void *arg0; 1682 0 stevel int errc; 1683 1925 rsb 1684 1925 rsb ASSERT(vfsp->vfs_implp); 1685 0 stevel 1686 0 stevel if ((femsp = fem_lock(vfsp->vfs_femhead)) == NULL) { 1687 0 stevel func = (int (*)()) vfsp->vfs_op->vfs_unmount; 1688 0 stevel fem_unlock(vfsp->vfs_femhead); 1689 0 stevel errc = (*func)(vfsp, flag, cr); 1690 0 stevel } else { 1691 0 stevel fem_addref(femsp); 1692 0 stevel fem_unlock(vfsp->vfs_femhead); 1693 0 stevel farg.fa_vnode.vfsp = vfsp; 1694 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1695 0 stevel vfsop_find(&farg, &func, int, &arg0, vfs_unmount, 1696 6264 rm15945 fsemop_unmount); 1697 0 stevel errc = (*func)(arg0, flag, cr); 1698 0 stevel fem_release(femsp); 1699 0 stevel } 1700 0 stevel return (errc); 1701 0 stevel } 1702 0 stevel 1703 0 stevel static int 1704 0 stevel fshead_root(vfs_t *vfsp, vnode_t **vpp) 1705 0 stevel { 1706 0 stevel fsemarg_t farg; 1707 0 stevel struct fem_list *femsp; 1708 0 stevel int (*func)(); 1709 0 stevel void *arg0; 1710 0 stevel int errc; 1711 0 stevel 1712 1925 rsb ASSERT(vfsp->vfs_implp); 1713 1925 rsb 1714 0 stevel if ((femsp = fem_lock(vfsp->vfs_femhead)) == NULL) { 1715 0 stevel func = (int (*)()) vfsp->vfs_op->vfs_root; 1716 0 stevel fem_unlock(vfsp->vfs_femhead); 1717 0 stevel errc = (*func)(vfsp, vpp); 1718 0 stevel } else { 1719 0 stevel fem_addref(femsp); 1720 0 stevel fem_unlock(vfsp->vfs_femhead); 1721 0 stevel farg.fa_vnode.vfsp = vfsp; 1722 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1723 3898 rsb vfsop_find(&farg, &func, int, &arg0, vfs_root, fsemop_root); 1724 0 stevel errc = (*func)(arg0, vpp); 1725 0 stevel fem_release(femsp); 1726 0 stevel } 1727 0 stevel return (errc); 1728 0 stevel } 1729 0 stevel 1730 0 stevel static int 1731 0 stevel fshead_statvfs(vfs_t *vfsp, statvfs64_t *sp) 1732 0 stevel { 1733 0 stevel fsemarg_t farg; 1734 0 stevel struct fem_list *femsp; 1735 0 stevel int (*func)(); 1736 0 stevel void *arg0; 1737 0 stevel int errc; 1738 1925 rsb 1739 1925 rsb ASSERT(vfsp->vfs_implp); 1740 0 stevel 1741 0 stevel if ((femsp = fem_lock(vfsp->vfs_femhead)) == NULL) { 1742 0 stevel func = (int (*)()) vfsp->vfs_op->vfs_statvfs; 1743 0 stevel fem_unlock(vfsp->vfs_femhead); 1744 0 stevel errc = (*func)(vfsp, sp); 1745 0 stevel } else { 1746 0 stevel fem_addref(femsp); 1747 0 stevel fem_unlock(vfsp->vfs_femhead); 1748 0 stevel farg.fa_vnode.vfsp = vfsp; 1749 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1750 0 stevel vfsop_find(&farg, &func, int, &arg0, vfs_statvfs, 1751 6264 rm15945 fsemop_statvfs); 1752 0 stevel errc = (*func)(arg0, sp); 1753 0 stevel fem_release(femsp); 1754 0 stevel } 1755 0 stevel return (errc); 1756 0 stevel } 1757 0 stevel 1758 0 stevel static int 1759 0 stevel fshead_sync(vfs_t *vfsp, short flag, cred_t *cr) 1760 0 stevel { 1761 0 stevel fsemarg_t farg; 1762 0 stevel struct fem_list *femsp; 1763 0 stevel int (*func)(); 1764 0 stevel void *arg0; 1765 0 stevel int errc; 1766 0 stevel 1767 1925 rsb ASSERT(vfsp->vfs_implp); 1768 1925 rsb 1769 0 stevel if ((femsp = fem_lock(vfsp->vfs_femhead)) == NULL) { 1770 0 stevel func = (int (*)()) vfsp->vfs_op->vfs_sync; 1771 0 stevel fem_unlock(vfsp->vfs_femhead); 1772 0 stevel errc = (*func)(vfsp, flag, cr); 1773 0 stevel } else { 1774 0 stevel fem_addref(femsp); 1775 0 stevel fem_unlock(vfsp->vfs_femhead); 1776 0 stevel farg.fa_vnode.vfsp = vfsp; 1777 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1778 3898 rsb vfsop_find(&farg, &func, int, &arg0, vfs_sync, fsemop_sync); 1779 0 stevel errc = (*func)(arg0, flag, cr); 1780 0 stevel fem_release(femsp); 1781 0 stevel } 1782 0 stevel return (errc); 1783 0 stevel } 1784 0 stevel 1785 0 stevel static int 1786 0 stevel fshead_vget(vfs_t *vfsp, vnode_t **vpp, fid_t *fidp) 1787 0 stevel { 1788 0 stevel fsemarg_t farg; 1789 0 stevel struct fem_list *femsp; 1790 0 stevel int (*func)(); 1791 0 stevel void *arg0; 1792 0 stevel int errc; 1793 1925 rsb 1794 1925 rsb ASSERT(vfsp->vfs_implp); 1795 0 stevel 1796 0 stevel if ((femsp = fem_lock(vfsp->vfs_femhead)) == NULL) { 1797 0 stevel func = (int (*)()) vfsp->vfs_op->vfs_vget; 1798 0 stevel fem_unlock(vfsp->vfs_femhead); 1799 0 stevel errc = (*func)(vfsp, vpp, fidp); 1800 0 stevel } else { 1801 0 stevel fem_addref(femsp); 1802 0 stevel fem_unlock(vfsp->vfs_femhead); 1803 0 stevel farg.fa_vnode.vfsp = vfsp; 1804 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1805 3898 rsb vfsop_find(&farg, &func, int, &arg0, vfs_vget, fsemop_vget); 1806 0 stevel errc = (*func)(arg0, vpp, fidp); 1807 0 stevel fem_release(femsp); 1808 0 stevel } 1809 0 stevel return (errc); 1810 0 stevel } 1811 0 stevel 1812 0 stevel static int 1813 0 stevel fshead_mountroot(vfs_t *vfsp, enum whymountroot reason) 1814 0 stevel { 1815 0 stevel fsemarg_t farg; 1816 0 stevel struct fem_list *femsp; 1817 0 stevel int (*func)(); 1818 0 stevel void *arg0; 1819 0 stevel int errc; 1820 0 stevel 1821 1925 rsb ASSERT(vfsp->vfs_implp); 1822 1925 rsb 1823 0 stevel if ((femsp = fem_lock(vfsp->vfs_femhead)) == NULL) { 1824 0 stevel func = (int (*)()) vfsp->vfs_op->vfs_mountroot; 1825 0 stevel fem_unlock(vfsp->vfs_femhead); 1826 0 stevel errc = (*func)(vfsp, reason); 1827 0 stevel } else { 1828 0 stevel fem_addref(femsp); 1829 0 stevel fem_unlock(vfsp->vfs_femhead); 1830 0 stevel farg.fa_vnode.vfsp = vfsp; 1831 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1832 0 stevel vfsop_find(&farg, &func, int, &arg0, vfs_mountroot, 1833 6264 rm15945 fsemop_mountroot); 1834 0 stevel errc = (*func)(arg0, reason); 1835 0 stevel fem_release(femsp); 1836 0 stevel } 1837 0 stevel return (errc); 1838 0 stevel } 1839 0 stevel 1840 0 stevel static void 1841 0 stevel fshead_freevfs(vfs_t *vfsp) 1842 0 stevel { 1843 0 stevel fsemarg_t farg; 1844 0 stevel struct fem_list *femsp; 1845 0 stevel void (*func)(); 1846 0 stevel void *arg0; 1847 0 stevel 1848 1925 rsb ASSERT(vfsp->vfs_implp); 1849 1925 rsb 1850 0 stevel if ((femsp = fem_lock(vfsp->vfs_femhead)) == NULL) { 1851 0 stevel func = (void (*)()) vfsp->vfs_op->vfs_freevfs; 1852 0 stevel fem_unlock(vfsp->vfs_femhead); 1853 0 stevel (*func)(vfsp); 1854 0 stevel } else { 1855 0 stevel fem_addref(femsp); 1856 0 stevel fem_unlock(vfsp->vfs_femhead); 1857 0 stevel farg.fa_vnode.vfsp = vfsp; 1858 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1859 0 stevel vfsop_find(&farg, &func, void, &arg0, vfs_freevfs, 1860 6264 rm15945 fsemop_freevfs); 1861 0 stevel (*func)(arg0); 1862 0 stevel fem_release(femsp); 1863 0 stevel } 1864 0 stevel } 1865 0 stevel 1866 0 stevel static int 1867 0 stevel fshead_vnstate(vfs_t *vfsp, vnode_t *vp, vntrans_t nstate) 1868 0 stevel { 1869 0 stevel fsemarg_t farg; 1870 0 stevel struct fem_list *femsp; 1871 0 stevel int (*func)(); 1872 0 stevel void *arg0; 1873 0 stevel int errc; 1874 1925 rsb 1875 1925 rsb ASSERT(vfsp->vfs_implp); 1876 0 stevel 1877 0 stevel if ((femsp = fem_lock(vfsp->vfs_femhead)) == NULL) { 1878 0 stevel func = (int (*)()) vfsp->vfs_op->vfs_vnstate; 1879 0 stevel fem_unlock(vfsp->vfs_femhead); 1880 0 stevel errc = (*func)(vfsp, vp, nstate); 1881 0 stevel } else { 1882 0 stevel fem_addref(femsp); 1883 0 stevel fem_unlock(vfsp->vfs_femhead); 1884 0 stevel farg.fa_vnode.vfsp = vfsp; 1885 0 stevel farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos; 1886 0 stevel vfsop_find(&farg, &func, int, &arg0, vfs_vnstate, 1887 6264 rm15945 fsemop_vnstate); 1888 0 stevel errc = (*func)(arg0, vp, nstate); 1889 0 stevel fem_release(femsp); 1890 0 stevel } 1891 0 stevel return (errc); 1892 0 stevel } 1893 0 stevel 1894 0 stevel 1895 0 stevel /* 1896 0 stevel * specification table for the vhead vnode operations. 1897 0 stevel * It is an error for any operations to be missing. 1898 0 stevel */ 1899 0 stevel 1900 0 stevel static struct fs_operation_def fhead_vn_spec[] = { 1901 0 stevel { VOPNAME_OPEN, (femop_t *)vhead_open }, 1902 0 stevel { VOPNAME_CLOSE, (femop_t *)vhead_close }, 1903 0 stevel { VOPNAME_READ, (femop_t *)vhead_read }, 1904 0 stevel { VOPNAME_WRITE, (femop_t *)vhead_write }, 1905 0 stevel { VOPNAME_IOCTL, (femop_t *)vhead_ioctl }, 1906 0 stevel { VOPNAME_SETFL, (femop_t *)vhead_setfl }, 1907 0 stevel { VOPNAME_GETATTR, (femop_t *)vhead_getattr }, 1908 0 stevel { VOPNAME_SETATTR, (femop_t *)vhead_setattr }, 1909 0 stevel { VOPNAME_ACCESS, (femop_t *)vhead_access }, 1910 0 stevel { VOPNAME_LOOKUP, (femop_t *)vhead_lookup }, 1911 0 stevel { VOPNAME_CREATE, (femop_t *)vhead_create }, 1912 0 stevel { VOPNAME_REMOVE, (femop_t *)vhead_remove }, 1913 0 stevel { VOPNAME_LINK, (femop_t *)vhead_link }, 1914 0 stevel { VOPNAME_RENAME, (femop_t *)vhead_rename }, 1915 0 stevel { VOPNAME_MKDIR, (femop_t *)vhead_mkdir }, 1916 0 stevel { VOPNAME_RMDIR, (femop_t *)vhead_rmdir }, 1917 0 stevel { VOPNAME_READDIR, (femop_t *)vhead_readdir }, 1918 0 stevel { VOPNAME_SYMLINK, (femop_t *)vhead_symlink }, 1919 0 stevel { VOPNAME_READLINK, (femop_t *)vhead_readlink }, 1920 0 stevel { VOPNAME_FSYNC, (femop_t *)vhead_fsync }, 1921 0 stevel { VOPNAME_INACTIVE, (femop_t *)vhead_inactive }, 1922 0 stevel { VOPNAME_FID, (femop_t *)vhead_fid }, 1923 0 stevel { VOPNAME_RWLOCK, (femop_t *)vhead_rwlock }, 1924 0 stevel { VOPNAME_RWUNLOCK, (femop_t *)vhead_rwunlock }, 1925 0 stevel { VOPNAME_SEEK, (femop_t *)vhead_seek }, 1926 0 stevel { VOPNAME_CMP, (femop_t *)vhead_cmp }, 1927 0 stevel { VOPNAME_FRLOCK, (femop_t *)vhead_frlock }, 1928 0 stevel { VOPNAME_SPACE, (femop_t *)vhead_space }, 1929 0 stevel { VOPNAME_REALVP, (femop_t *)vhead_realvp }, 1930 0 stevel { VOPNAME_GETPAGE, (femop_t *)vhead_getpage }, 1931 0 stevel { VOPNAME_PUTPAGE, (femop_t *)vhead_putpage }, 1932 0 stevel { VOPNAME_MAP, (femop_t *)vhead_map }, 1933 0 stevel { VOPNAME_ADDMAP, (femop_t *)vhead_addmap }, 1934 0 stevel { VOPNAME_DELMAP, (femop_t *)vhead_delmap }, 1935 0 stevel { VOPNAME_POLL, (femop_t *)vhead_poll }, 1936 0 stevel { VOPNAME_DUMP, (femop_t *)vhead_dump }, 1937 0 stevel { VOPNAME_PATHCONF, (femop_t *)vhead_pathconf }, 1938 0 stevel { VOPNAME_PAGEIO, (femop_t *)vhead_pageio }, 1939 0 stevel { VOPNAME_DUMPCTL, (femop_t *)vhead_dumpctl }, 1940 0 stevel { VOPNAME_DISPOSE, (femop_t *)vhead_dispose }, 1941 0 stevel { VOPNAME_SETSECATTR, (femop_t *)vhead_setsecattr }, 1942 0 stevel { VOPNAME_GETSECATTR, (femop_t *)vhead_getsecattr }, 1943 0 stevel { VOPNAME_SHRLOCK, (femop_t *)vhead_shrlock }, 1944 0 stevel { VOPNAME_VNEVENT, (femop_t *)vhead_vnevent }, 1945 0 stevel { NULL, NULL } 1946 0 stevel }; 1947 0 stevel 1948 0 stevel /* 1949 0 stevel * specification table for the vfshead vnode operations. 1950 0 stevel * It is an error for any operations to be missing. 1951 0 stevel */ 1952 0 stevel 1953 0 stevel static struct fs_operation_def fshead_vfs_spec[] = { 1954 0 stevel { VFSNAME_MOUNT, (femop_t *)fshead_mount }, 1955 0 stevel { VFSNAME_UNMOUNT, (femop_t *)fshead_unmount }, 1956 0 stevel { VFSNAME_ROOT, (femop_t *)fshead_root }, 1957 0 stevel { VFSNAME_STATVFS, (femop_t *)fshead_statvfs }, 1958 0 stevel { VFSNAME_SYNC, (femop_t *)fshead_sync }, 1959 0 stevel { VFSNAME_VGET, (femop_t *)fshead_vget }, 1960 0 stevel { VFSNAME_MOUNTROOT, (femop_t *)fshead_mountroot }, 1961 0 stevel { VFSNAME_FREEVFS, (femop_t *)fshead_freevfs }, 1962 0 stevel { VFSNAME_VNSTATE, (femop_t *)fshead_vnstate }, 1963 0 stevel { NULL, NULL } 1964 0 stevel }; 1965 0 stevel 1966 0 stevel /* 1967 0 stevel * This set of routines transfer control to the next stacked monitor. 1968 0 stevel * 1969 0 stevel * Each routine is identical except for naming, types and arguments. 1970 0 stevel * 1971 0 stevel * The basic steps are: 1972 0 stevel * 1. Decrease the stack pointer by one. 1973 0 stevel * 2. If the current item is a base operation (vnode, vfs), goto 5. 1974 0 stevel * 3. If the current item does not have a corresponding operation, goto 1 1975 0 stevel * 4. Return by invoking the current item with the argument handle. 1976 0 stevel * 5. Return by invoking the base operation with the base object. 1977 0 stevel * 1978 0 stevel * for each classification, there needs to be at least one "next" operation 1979 0 stevel * for each "head"operation. 1980 0 stevel * 1981 0 stevel */ 1982 0 stevel 1983 0 stevel int 1984 5331 amw vnext_open(femarg_t *vf, int mode, cred_t *cr, caller_context_t *ct) 1985 0 stevel { 1986 0 stevel int (*func)() = NULL; 1987 0 stevel void *arg0 = NULL; 1988 0 stevel 1989 0 stevel ASSERT(vf != NULL); 1990 0 stevel vf->fa_fnode--; 1991 3898 rsb vsop_find(vf, &func, int, &arg0, vop_open, femop_open); 1992 0 stevel ASSERT(func != NULL); 1993 0 stevel ASSERT(arg0 != NULL); 1994 5331 amw return ((*func)(arg0, mode, cr, ct)); 1995 0 stevel } 1996 0 stevel 1997 0 stevel int 1998 5331 amw vnext_close(femarg_t *vf, int flag, int count, offset_t offset, cred_t *cr, 1999 5331 amw caller_context_t *ct) 2000 0 stevel { 2001 0 stevel int (*func)() = NULL; 2002 0 stevel void *arg0 = NULL; 2003 0 stevel 2004 0 stevel ASSERT(vf != NULL); 2005 0 stevel vf->fa_fnode--; 2006 3898 rsb vsop_find(vf, &func, int, &arg0, vop_close, femop_close); 2007 0 stevel ASSERT(func != NULL); 2008 0 stevel ASSERT(arg0 != NULL); 2009 5331 amw return ((*func)(arg0, flag, count, offset, cr, ct)); 2010 0 stevel } 2011 0 stevel 2012 0 stevel int 2013 0 stevel vnext_read(femarg_t *vf, uio_t *uiop, int ioflag, cred_t *cr, 2014 5331 amw caller_context_t *ct) 2015 0 stevel { 2016 0 stevel int (*func)() = NULL; 2017 0 stevel void *arg0 = NULL; 2018 0 stevel 2019 0 stevel ASSERT(vf != NULL); 2020 0 stevel vf->fa_fnode--; 2021 3898 rsb vsop_find(vf, &func, int, &arg0, vop_read, femop_read); 2022 0 stevel ASSERT(func != NULL); 2023 0 stevel ASSERT(arg0 != NULL); 2024 0 stevel return ((*func)(arg0, uiop, ioflag, cr, ct)); 2025 0 stevel } 2026 0 stevel 2027 0 stevel int 2028 0 stevel vnext_write(femarg_t *vf, uio_t *uiop, int ioflag, cred_t *cr, 2029 5331 amw caller_context_t *ct) 2030 0 stevel { 2031 0 stevel int (*func)() = NULL; 2032 0 stevel void *arg0 = NULL; 2033 0 stevel 2034 0 stevel ASSERT(vf != NULL); 2035 0 stevel vf->fa_fnode--; 2036 3898 rsb vsop_find(vf, &func, int, &arg0, vop_write, femop_write); 2037 0 stevel ASSERT(func != NULL); 2038 0 stevel ASSERT(arg0 != NULL); 2039 0 stevel return ((*func)(arg0, uiop, ioflag, cr, ct)); 2040 0 stevel } 2041 0 stevel 2042 0 stevel int 2043 0 stevel vnext_ioctl(femarg_t *vf, int cmd, intptr_t arg, int flag, cred_t *cr, 2044 5331 amw int *rvalp, caller_context_t *ct) 2045 0 stevel { 2046 0 stevel int (*func)() = NULL; 2047 0 stevel void *arg0 = NULL; 2048 0 stevel 2049 0 stevel ASSERT(vf != NULL); 2050 0 stevel vf->fa_fnode--; 2051 3898 rsb vsop_find(vf, &func, int, &arg0, vop_ioctl, femop_ioctl); 2052 0 stevel ASSERT(func != NULL); 2053 0 stevel ASSERT(arg0 != NULL); 2054 5331 amw return ((*func)(arg0, cmd, arg, flag, cr, rvalp, ct)); 2055 0 stevel } 2056 0 stevel 2057 0 stevel int 2058 5331 amw vnext_setfl(femarg_t *vf, int oflags, int nflags, cred_t *cr, 2059 5331 amw caller_context_t *ct) 2060 0 stevel { 2061 0 stevel int (*func)() = NULL; 2062 0 stevel void *arg0 = NULL; 2063 0 stevel 2064 0 stevel ASSERT(vf != NULL); 2065 0 stevel vf->fa_fnode--; 2066 3898 rsb vsop_find(vf, &func, int, &arg0, vop_setfl, femop_setfl); 2067 0 stevel ASSERT(func != NULL); 2068 0 stevel ASSERT(arg0 != NULL); 2069 5331 amw return ((*func)(arg0, oflags, nflags, cr, ct)); 2070 0 stevel } 2071 0 stevel 2072 0 stevel int 2073 5331 amw vnext_getattr(femarg_t *vf, vattr_t *vap, int flags, cred_t *cr, 2074 5331 amw caller_context_t *ct) 2075 0 stevel { 2076 0 stevel int (*func)() = NULL; 2077 0 stevel void *arg0 = NULL; 2078 0 stevel 2079 0 stevel ASSERT(vf != NULL); 2080 0 stevel vf->fa_fnode--; 2081 3898 rsb vsop_find(vf, &func, int, &arg0, vop_getattr, femop_getattr); 2082 0 stevel ASSERT(func != NULL); 2083 0 stevel ASSERT(arg0 != NULL); 2084 5331 amw return ((*func)(arg0, vap, flags, cr, ct)); 2085 0 stevel } 2086 0 stevel 2087 0 stevel int 2088 0 stevel vnext_setattr(femarg_t *vf, vattr_t *vap, int flags, cred_t *cr, 2089 0 stevel caller_context_t *ct) 2090 0 stevel { 2091 0 stevel int (*func)() = NULL; 2092 0 stevel void *arg0 = NULL; 2093 0 stevel 2094 0 stevel ASSERT(vf != NULL); 2095 0 stevel vf->fa_fnode--; 2096 3898 rsb vsop_find(vf, &func, int, &arg0, vop_setattr, femop_setattr); 2097 0 stevel ASSERT(func != NULL); 2098 0 stevel ASSERT(arg0 != NULL); 2099 0 stevel return ((*func)(arg0, vap, flags, cr, ct)); 2100 0 stevel } 2101 0 stevel 2102 0 stevel int 2103 5331 amw vnext_access(femarg_t *vf, int mode, int flags, cred_t *cr, 2104 5331 amw caller_context_t *ct) 2105 0 stevel { 2106 0 stevel int (*func)() = NULL; 2107 0 stevel void *arg0 = NULL; 2108 0 stevel 2109 0 stevel ASSERT(vf != NULL); 2110 0 stevel vf->fa_fnode--; 2111 3898 rsb vsop_find(vf, &func, int, &arg0, vop_access, femop_access); 2112 0 stevel ASSERT(func != NULL); 2113 0 stevel ASSERT(arg0 != NULL); 2114 5331 amw return ((*func)(arg0, mode, flags, cr, ct)); 2115 0 stevel } 2116 0 stevel 2117 0 stevel int 2118 0 stevel vnext_lookup(femarg_t *vf, char *nm, vnode_t **vpp, pathname_t *pnp, 2119 5331 amw int flags, vnode_t *rdir, cred_t *cr, caller_context_t *ct, 2120 5331 amw int *direntflags, pathname_t *realpnp) 2121 0 stevel { 2122 0 stevel int (*func)() = NULL; 2123 0 stevel void *arg0 = NULL; 2124 0 stevel 2125 0 stevel ASSERT(vf != NULL); 2126 0 stevel vf->fa_fnode--; 2127 3898 rsb vsop_find(vf, &func, int, &arg0, vop_lookup, femop_lookup); 2128 0 stevel ASSERT(func != NULL); 2129 0 stevel ASSERT(arg0 != NULL); 2130 5331 amw return ((*func)(arg0, nm, vpp, pnp, flags, rdir, cr, ct, 2131 6264 rm15945 direntflags, realpnp)); 2132 0 stevel } 2133 0 stevel 2134 0 stevel int 2135 0 stevel vnext_create(femarg_t *vf, char *name, vattr_t *vap, vcexcl_t excl, 2136 5331 amw int mode, vnode_t **vpp, cred_t *cr, int flag, caller_context_t *ct, 2137 5331 amw vsecattr_t *vsecp) 2138 0 stevel { 2139 0 stevel int (*func)() = NULL; 2140 0 stevel void *arg0 = NULL; 2141 0 stevel 2142 0 stevel ASSERT(vf != NULL); 2143 0 stevel vf->fa_fnode--; 2144 3898 rsb vsop_find(vf, &func, int, &arg0, vop_create, femop_create); 2145 0 stevel ASSERT(func != NULL); 2146 0 stevel ASSERT(arg0 != NULL); 2147 5331 amw return ((*func)(arg0, name, vap, excl, mode, vpp, cr, flag, ct, vsecp)); 2148 0 stevel } 2149 0 stevel 2150 0 stevel int 2151 5331 amw vnext_remove(femarg_t *vf, char *nm, cred_t *cr, caller_context_t *ct, 2152 5331 amw int flags) 2153 0 stevel { 2154 0 stevel int (*func)() = NULL; 2155 0 stevel void *arg0 = NULL; 2156 0 stevel 2157 0 stevel ASSERT(vf != NULL); 2158 0 stevel vf->fa_fnode--; 2159 3898 rsb vsop_find(vf, &func, int, &arg0, vop_remove, femop_remove); 2160 0 stevel ASSERT(func != NULL); 2161 0 stevel ASSERT(arg0 != NULL); 2162 5331 amw return ((*func)(arg0, nm, cr, ct, flags)); 2163 0 stevel } 2164 0 stevel 2165 0 stevel int 2166 5331 amw vnext_link(femarg_t *vf, vnode_t *svp, char *tnm, cred_t *cr, 2167 5331 amw caller_context_t *ct, int flags) 2168 0 stevel { 2169 0 stevel int (*func)() = NULL; 2170 0 stevel void *arg0 = NULL; 2171 0 stevel 2172 0 stevel ASSERT(vf != NULL); 2173 0 stevel vf->fa_fnode--; 2174 3898 rsb vsop_find(vf, &func, int, &arg0, vop_link, femop_link); 2175 0 stevel ASSERT(func != NULL); 2176 0 stevel ASSERT(arg0 != NULL); 2177 5331 amw return ((*func)(arg0, svp, tnm, cr, ct, flags)); 2178 0 stevel } 2179 0 stevel 2180 0 stevel int 2181 5331 amw vnext_rename(femarg_t *vf, char *snm, vnode_t *tdvp, char *tnm, cred_t *cr, 2182 5331 amw caller_context_t *ct, int flags) 2183 0 stevel { 2184 0 stevel int (*func)() = NULL; 2185 0 stevel void *arg0 = NULL; 2186 0 stevel 2187 0 stevel ASSERT(vf != NULL); 2188 0 stevel vf->fa_fnode--; 2189 3898 rsb vsop_find(vf, &func, int, &arg0, vop_rename, femop_rename); 2190 0 stevel ASSERT(func != NULL); 2191 0 stevel ASSERT(arg0 != NULL); 2192 5331 amw return ((*func)(arg0, snm, tdvp, tnm, cr, ct, flags)); 2193 0 stevel } 2194 0 stevel 2195 0 stevel int 2196 0 stevel vnext_mkdir(femarg_t *vf, char *dirname, vattr_t *vap, vnode_t **vpp, 2197 5331 amw cred_t *cr, caller_context_t *ct, int flags, vsecattr_t *vsecp) 2198 0 stevel { 2199 0 stevel int (*func)() = NULL; 2200 0 stevel void *arg0 = NULL; 2201 0 stevel 2202 0 stevel ASSERT(vf != NULL); 2203 0 stevel vf->fa_fnode--; 2204 3898 rsb vsop_find(vf, &func, int, &arg0, vop_mkdir, femop_mkdir); 2205 0 stevel ASSERT(func != NULL); 2206 0 stevel ASSERT(arg0 != NULL); 2207 5331 amw return ((*func)(arg0, dirname, vap, vpp, cr, ct, flags, vsecp)); 2208 0 stevel } 2209 0 stevel 2210 0 stevel int 2211 5331 amw vnext_rmdir(femarg_t *vf, char *nm, vnode_t *cdir, cred_t *cr, 2212 5331 amw caller_context_t *ct, int flags) 2213 0 stevel { 2214 0 stevel int (*func)() = NULL; 2215 0 stevel void *arg0 = NULL; 2216 0 stevel 2217 0 stevel ASSERT(vf != NULL); 2218 0 stevel vf->fa_fnode--; 2219 3898 rsb vsop_find(vf, &func, int, &arg0, vop_rmdir, femop_rmdir); 2220 0 stevel ASSERT(func != NULL); 2221 0 stevel ASSERT(arg0 != NULL); 2222 5331 amw return ((*func)(arg0, nm, cdir, cr, ct, flags)); 2223 0 stevel } 2224 0 stevel 2225 0 stevel int 2226 5331 amw vnext_readdir(femarg_t *vf, uio_t *uiop, cred_t *cr, int *eofp, 2227 5331 amw caller_context_t *ct, int flags) 2228 0 stevel { 2229 0 stevel int (*func)() = NULL; 2230 0 stevel void *arg0 = NULL; 2231 0 stevel 2232 0 stevel ASSERT(vf != NULL); 2233 0 stevel vf->fa_fnode--; 2234 3898 rsb vsop_find(vf, &func, int, &arg0, vop_readdir, femop_readdir); 2235 0 stevel ASSERT(func != NULL); 2236 0 stevel ASSERT(arg0 != NULL); 2237 5331 amw return ((*func)(arg0, uiop, cr, eofp, ct, flags)); 2238 0 stevel } 2239 0 stevel 2240 0 stevel int 2241 0 stevel vnext_symlink(femarg_t *vf, char *linkname, vattr_t *vap, char *target, 2242 5331 amw cred_t *cr, caller_context_t *ct, int flags) 2243 0 stevel { 2244 0 stevel int (*func)() = NULL; 2245 0 stevel void *arg0 = NULL; 2246 0 stevel 2247 0 stevel ASSERT(vf != NULL); 2248 0 stevel vf->fa_fnode--; 2249 3898 rsb vsop_find(vf, &func, int, &arg0, vop_symlink, femop_symlink); 2250 0 stevel ASSERT(func != NULL); 2251 0 stevel ASSERT(arg0 != NULL); 2252 5331 amw return ((*func)(arg0, linkname, vap, target, cr, ct, flags)); 2253 0 stevel } 2254 0 stevel 2255 0 stevel int 2256 5331 amw vnext_readlink(femarg_t *vf, uio_t *uiop, cred_t *cr, caller_context_t *ct) 2257 0 stevel { 2258 0 stevel int (*func)() = NULL; 2259 0 stevel void *arg0 = NULL; 2260 0 stevel 2261 0 stevel ASSERT(vf != NULL); 2262 0 stevel vf->fa_fnode--; 2263 3898 rsb vsop_find(vf, &func, int, &arg0, vop_readlink, femop_readlink); 2264 0 stevel ASSERT(func != NULL); 2265 0 stevel ASSERT(arg0 != NULL); 2266 5331 amw return ((*func)(arg0, uiop, cr, ct)); 2267 0 stevel } 2268 0 stevel 2269 0 stevel int 2270 5331 amw vnext_fsync(femarg_t *vf, int syncflag, cred_t *cr, caller_context_t *ct) 2271 0 stevel { 2272 0 stevel int (*func)() = NULL; 2273 0 stevel void *arg0 = NULL; 2274 0 stevel 2275 0 stevel ASSERT(vf != NULL); 2276 0 stevel vf->fa_fnode--; 2277 3898 rsb vsop_find(vf, &func, int, &arg0, vop_fsync, femop_fsync); 2278 0 stevel ASSERT(func != NULL); 2279 0 stevel ASSERT(arg0 != NULL); 2280 5331 amw return ((*func)(arg0, syncflag, cr, ct)); 2281 0 stevel } 2282 0 stevel 2283 0 stevel void 2284 5331 amw vnext_inactive(femarg_t *vf, cred_t *cr, caller_context_t *ct) 2285 0 stevel { 2286 0 stevel void (*func)() = NULL; 2287 0 stevel void *arg0 = NULL; 2288 0 stevel 2289 0 stevel ASSERT(vf != NULL); 2290 0 stevel vf->fa_fnode--; 2291 3898 rsb vsop_find(vf, &func, void, &arg0, vop_inactive, femop_inactive); 2292 0 stevel ASSERT(func != NULL); 2293 0 stevel ASSERT(arg0 != NULL); 2294 5331 amw (*func)(arg0, cr, ct); 2295 0 stevel } 2296 0 stevel 2297 0 stevel int 2298 5331 amw vnext_fid(femarg_t *vf, fid_t *fidp, caller_context_t *ct) 2299 0 stevel { 2300 0 stevel int (*func)() = NULL; 2301 0 stevel void *arg0 = NULL; 2302 0 stevel 2303 0 stevel ASSERT(vf != NULL); 2304 0 stevel vf->fa_fnode--; 2305 3898 rsb vsop_find(vf, &func, int, &arg0, vop_fid, femop_fid); 2306 0 stevel ASSERT(func != NULL); 2307 0 stevel ASSERT(arg0 != NULL); 2308 5331 amw return ((*func)(arg0, fidp, ct)); 2309 0 stevel } 2310 0 stevel 2311 0 stevel int 2312 0 stevel vnext_rwlock(femarg_t *vf, int write_lock, caller_context_t *ct) 2313 0 stevel { 2314 0 stevel int (*func)() = NULL; 2315 0 stevel void *arg0 = NULL; 2316 0 stevel 2317 0 stevel ASSERT(vf != NULL); 2318 0 stevel vf->fa_fnode--; 2319 3898 rsb vsop_find(vf, &func, int, &arg0, vop_rwlock, femop_rwlock); 2320 0 stevel ASSERT(func != NULL); 2321 0 stevel ASSERT(arg0 != NULL); 2322 0 stevel return ((*func)(arg0, write_lock, ct)); 2323 0 stevel } 2324 0 stevel 2325 0 stevel void 2326 0 stevel vnext_rwunlock(femarg_t *vf, int write_lock, caller_context_t *ct) 2327 0 stevel { 2328 0 stevel void (*func)() = NULL; 2329 0 stevel void *arg0 = NULL; 2330 0 stevel 2331 0 stevel ASSERT(vf != NULL); 2332 0 stevel vf->fa_fnode--; 2333 3898 rsb vsop_find(vf, &func, void, &arg0, vop_rwunlock, femop_rwunlock); 2334 0 stevel ASSERT(func != NULL); 2335 0 stevel ASSERT(arg0 != NULL); 2336 0 stevel (*func)(arg0, write_lock, ct); 2337 0 stevel } 2338 0 stevel 2339 0 stevel int 2340 5331 amw vnext_seek(femarg_t *vf, offset_t ooff, offset_t *noffp, caller_context_t *ct) 2341 0 stevel { 2342 0 stevel int (*func)() = NULL; 2343 0 stevel void *arg0 = NULL; 2344 0 stevel 2345 0 stevel ASSERT(vf != NULL); 2346 0 stevel vf->fa_fnode--; 2347 3898 rsb vsop_find(vf, &func, int, &arg0, vop_seek, femop_seek); 2348 0 stevel ASSERT(func != NULL); 2349 0 stevel ASSERT(arg0 != NULL); 2350 5331 amw return ((*func)(arg0, ooff, noffp, ct)); 2351 0 stevel } 2352 0 stevel 2353 0 stevel int 2354 5331 amw vnext_cmp(femarg_t *vf, vnode_t *vp2, caller_context_t *ct) 2355 0 stevel { 2356 0 stevel int (*func)() = NULL; 2357 0 stevel void *arg0 = NULL; 2358 0 stevel 2359 0 stevel ASSERT(vf != NULL); 2360 0 stevel vf->fa_fnode--; 2361 3898 rsb vsop_find(vf, &func, int, &arg0, vop_cmp, femop_cmp); 2362 0 stevel ASSERT(func != NULL); 2363 0 stevel ASSERT(arg0 != NULL); 2364 5331 amw return ((*func)(arg0, vp2, ct)); 2365 0 stevel } 2366 0 stevel 2367 0 stevel int 2368 0 stevel vnext_frlock(femarg_t *vf, int cmd, struct flock64 *bfp, int flag, 2369 5331 amw offset_t offset, struct flk_callback *flk_cbp, cred_t *cr, 2370 5331 amw caller_context_t *ct) 2371 0 stevel { 2372 0 stevel int (*func)() = NULL; 2373 0 stevel void *arg0 = NULL; 2374 0 stevel 2375 0 stevel ASSERT(vf != NULL); 2376 0 stevel vf->fa_fnode--; 2377 3898 rsb vsop_find(vf, &func, int, &arg0, vop_frlock, femop_frlock); 2378 0 stevel ASSERT(func != NULL); 2379 0 stevel ASSERT(arg0 != NULL); 2380 5331 amw return ((*func)(arg0, cmd, bfp, flag, offset, flk_cbp, cr, ct)); 2381 0 stevel } 2382 0 stevel 2383 0 stevel int 2384 0 stevel vnext_space(femarg_t *vf, int cmd, struct flock64 *bfp, int flag, 2385 0 stevel offset_t offset, cred_t *cr, caller_context_t *ct) 2386 0 stevel { 2387 0 stevel int (*func)() = NULL; 2388 0 stevel void *arg0 = NULL; 2389 0 stevel 2390 0 stevel ASSERT(vf != NULL); 2391 0 stevel vf->fa_fnode--; 2392 3898 rsb vsop_find(vf, &func, int, &arg0, vop_space, femop_space); 2393 0 stevel ASSERT(func != NULL); 2394 0 stevel ASSERT(arg0 != NULL); 2395 0 stevel return ((*func)(arg0, cmd, bfp, flag, offset, cr, ct)); 2396 0 stevel } 2397 0 stevel 2398 0 stevel int 2399 5331 amw vnext_realvp(femarg_t *vf, vnode_t **vpp, caller_context_t *ct) 2400 0 stevel { 2401 0 stevel int (*func)() = NULL; 2402 0 stevel void *arg0 = NULL; 2403 0 stevel 2404 0 stevel ASSERT(vf != NULL); 2405 0 stevel vf->fa_fnode--; 2406 3898 rsb vsop_find(vf, &func, int, &arg0, vop_realvp, femop_realvp); 2407 0 stevel ASSERT(func != NULL); 2408 0 stevel ASSERT(arg0 != NULL); 2409 5331 amw return ((*func)(arg0, vpp, ct)); 2410 0 stevel } 2411 0 stevel 2412 0 stevel int 2413 0 stevel vnext_getpage(femarg_t *vf, offset_t off, size_t len, uint_t *protp, 2414 0 stevel struct page **plarr, size_t plsz, struct seg *seg, caddr_t addr, 2415 5331 amw enum seg_rw rw, cred_t *cr, caller_context_t *ct) 2416 0 stevel { 2417 0 stevel int (*func)() = NULL; 2418 0 stevel void *arg0 = NULL; 2419 0 stevel 2420 0 stevel ASSERT(vf != NULL); 2421 0 stevel vf->fa_fnode--; 2422 3898 rsb vsop_find(vf, &func, int, &arg0, vop_getpage, femop_getpage); 2423 0 stevel ASSERT(func != NULL); 2424 0 stevel ASSERT(arg0 != NULL); 2425 0 stevel return ((*func)(arg0, off, len, protp, plarr, plsz, seg, addr, rw, 2426 6264 rm15945 cr, ct)); 2427 0 stevel } 2428 0 stevel 2429 0 stevel int 2430 0 stevel vnext_putpage(femarg_t *vf, offset_t off, size_t len, int flags, 2431 5331 amw cred_t *cr, caller_context_t *ct) 2432 0 stevel { 2433 0 stevel int (*func)() = NULL; 2434 0 stevel void *arg0 = NULL; 2435 0 stevel 2436 0 stevel ASSERT(vf != NULL); 2437 0 stevel vf->fa_fnode--; 2438 3898 rsb vsop_find(vf, &func, int, &arg0, vop_putpage, femop_putpage); 2439 0 stevel ASSERT(func != NULL); 2440 0 stevel ASSERT(arg0 != NULL); 2441 5331 amw return ((*func)(arg0, off, len, flags, cr, ct)); 2442 0 stevel } 2443 0 stevel 2444 0 stevel int 2445 0 stevel vnext_map(femarg_t *vf, offset_t off, struct as *as, caddr_t *addrp, 2446 0 stevel size_t len, uchar_t prot, uchar_t maxprot, uint_t flags, 2447 5331 amw cred_t *cr, caller_context_t *ct) 2448 0 stevel { 2449 0 stevel int (*func)() = NULL; 2450 0 stevel void *arg0 = NULL; 2451 0 stevel 2452 0 stevel ASSERT(vf != NULL); 2453 0 stevel vf->fa_fnode--; 2454 3898 rsb vsop_find(vf, &func, int, &arg0, vop_map, femop_map); 2455 0 stevel ASSERT(func != NULL); 2456 0 stevel ASSERT(arg0 != NULL); 2457 0 stevel return ((*func)(arg0, off, as, addrp, len, prot, maxprot, flags, 2458 6264 rm15945 cr, ct)); 2459 0 stevel } 2460 0 stevel 2461 0 stevel int 2462 0 stevel vnext_addmap(femarg_t *vf, offset_t off, struct as *as, caddr_t addr, 2463 0 stevel size_t len, uchar_t prot, uchar_t maxprot, uint_t flags, 2464 5331 amw cred_t *cr, caller_context_t *ct) 2465 0 stevel { 2466 0 stevel int (*func)() = NULL; 2467 0 stevel void *arg0 = NULL; 2468 0 stevel 2469 0 stevel ASSERT(vf != NULL); 2470 0 stevel vf->fa_fnode--; 2471 3898 rsb vsop_find(vf, &func, int, &arg0, vop_addmap, femop_addmap); 2472 0 stevel ASSERT(func != NULL); 2473 0 stevel ASSERT(arg0 != NULL); 2474 5331 amw return ((*func)(arg0, off, as, addr, len, prot, maxprot, flags, 2475 6264 rm15945 cr, ct)); 2476 0 stevel } 2477 0 stevel 2478 0 stevel int 2479 0 stevel vnext_delmap(femarg_t *vf, offset_t off, struct as *as, caddr_t addr, 2480 5331 amw size_t len, uint_t prot, uint_t maxprot, uint_t flags, 2481 5331 amw cred_t *cr, caller_context_t *ct) 2482 0 stevel { 2483 0 stevel int (*func)() = NULL; 2484 0 stevel void *arg0 = NULL; 2485 0 stevel 2486 0 stevel ASSERT(vf != NULL); 2487 0 stevel vf->fa_fnode--; 2488 3898 rsb vsop_find(vf, &func, int, &arg0, vop_delmap, femop_delmap); 2489 0 stevel ASSERT(func != NULL); 2490 0 stevel ASSERT(arg0 != NULL); 2491 5331 amw return ((*func)(arg0, off, as, addr, len, prot, maxprot, flags, 2492 6264 rm15945 cr, ct)); 2493 0 stevel } 2494 0 stevel 2495 0 stevel int 2496 0 stevel vnext_poll(femarg_t *vf, short events, int anyyet, short *reventsp, 2497 5331 amw struct pollhead **phpp, caller_context_t *ct) 2498 0 stevel { 2499 0 stevel int (*func)() = NULL; 2500 0 stevel void *arg0 = NULL; 2501 0 stevel 2502 0 stevel ASSERT(vf != NULL); 2503 0 stevel vf->fa_fnode--; 2504 3898 rsb vsop_find(vf, &func, int, &arg0, vop_poll, femop_poll); 2505 0 stevel ASSERT(func != NULL); 2506 0 stevel ASSERT(arg0 != NULL); 2507 5331 amw return ((*func)(arg0, events, anyyet, reventsp, phpp, ct)); 2508 0 stevel } 2509 0 stevel 2510 0 stevel int 2511 6264 rm15945 vnext_dump(femarg_t *vf, caddr_t addr, offset_t lbdn, offset_t dblks, 2512 5331 amw caller_context_t *ct) 2513 0 stevel { 2514 0 stevel int (*func)() = NULL; 2515 0 stevel void *arg0 = NULL; 2516 0 stevel 2517 0 stevel ASSERT(vf != NULL); 2518 0 stevel vf->fa_fnode--; 2519 3898 rsb vsop_find(vf, &func, int, &arg0, vop_dump, femop_dump); 2520 0 stevel ASSERT(func != NULL); 2521 0 stevel ASSERT(arg0 != NULL); 2522 5331 amw return ((*func)(arg0, addr, lbdn, dblks, ct)); 2523 0 stevel } 2524 0 stevel 2525 0 stevel int 2526 5331 amw vnext_pathconf(femarg_t *vf, int cmd, ulong_t *valp, cred_t *cr, 2527 5331 amw caller_context_t *ct) 2528 0 stevel { 2529 0 stevel int (*func)() = NULL; 2530 0 stevel void *arg0 = NULL; 2531 0 stevel 2532 0 stevel ASSERT(vf != NULL); 2533 0 stevel vf->fa_fnode--; 2534 3898 rsb vsop_find(vf, &func, int, &arg0, vop_pathconf, femop_pathconf); 2535 0 stevel ASSERT(func != NULL); 2536 0 stevel ASSERT(arg0 != NULL); 2537 5331 amw return ((*func)(arg0, cmd, valp, cr, ct)); 2538 0 stevel } 2539 0 stevel 2540 0 stevel int 2541 0 stevel vnext_pageio(femarg_t *vf, struct page *pp, u_offset_t io_off, 2542 5331 amw size_t io_len, int flags, cred_t *cr, caller_context_t *ct) 2543 0 stevel { 2544 0 stevel int (*func)() = NULL; 2545 0 stevel void *arg0 = NULL; 2546 0 stevel 2547 0 stevel ASSERT(vf != NULL); 2548 0 stevel vf->fa_fnode--; 2549 3898 rsb vsop_find(vf, &func, int, &arg0, vop_pageio, femop_pageio); 2550 0 stevel ASSERT(func != NULL); 2551 0 stevel ASSERT(arg0 != NULL); 2552 5331 amw return ((*func)(arg0, pp, io_off, io_len, flags, cr, ct)); 2553 0 stevel } 2554 0 stevel 2555 0 stevel int 2556 6264 rm15945 vnext_dumpctl(femarg_t *vf, int action, offset_t *blkp, caller_context_t *ct) 2557 0 stevel { 2558 0 stevel int (*func)() = NULL; 2559 0 stevel void *arg0 = NULL; 2560 0 stevel 2561 0 stevel ASSERT(vf != NULL); 2562 0 stevel vf->fa_fnode--; 2563 3898 rsb vsop_find(vf, &func, int, &arg0, vop_dumpctl, femop_dumpctl); 2564 0 stevel ASSERT(func != NULL); 2565 0 stevel ASSERT(arg0 != NULL); 2566 5331 amw return ((*func)(arg0, action, blkp, ct)); 2567 0 stevel } 2568 0 stevel 2569 0 stevel void 2570 5331 amw vnext_dispose(femarg_t *vf, struct page *pp, int flag, int dn, cred_t *cr, 2571 5331 amw caller_context_t *ct) 2572 0 stevel { 2573 0 stevel void (*func)() = NULL; 2574 0 stevel void *arg0 = NULL; 2575 0 stevel 2576 0 stevel ASSERT(vf != NULL); 2577 0 stevel vf->fa_fnode--; 2578 3898 rsb vsop_find(vf, &func, void, &arg0, vop_dispose, femop_dispose); 2579 0 stevel ASSERT(func != NULL); 2580 0 stevel ASSERT(arg0 != NULL); 2581 5331 amw (*func)(arg0, pp, flag, dn, cr, ct); 2582 0 stevel } 2583 0 stevel 2584 0 stevel int 2585 5331 amw vnext_setsecattr(femarg_t *vf, vsecattr_t *vsap, int flag, cred_t *cr, 2586 5331 amw caller_context_t *ct) 2587 0 stevel { 2588 0 stevel int (*func)() = NULL; 2589 0 stevel void *arg0 = NULL; 2590 0 stevel 2591 0 stevel ASSERT(vf != NULL); 2592 0 stevel vf->fa_fnode--; 2593 3898 rsb vsop_find(vf, &func, int, &arg0, vop_setsecattr, femop_setsecattr); 2594 0 stevel ASSERT(func != NULL); 2595 0 stevel ASSERT(arg0 != NULL); 2596 5331 amw return ((*func)(arg0, vsap, flag, cr, ct)); 2597 0 stevel } 2598 0 stevel 2599 0 stevel int 2600 5331 amw vnext_getsecattr(femarg_t *vf, vsecattr_t *vsap, int flag, cred_t *cr, 2601 5331 amw caller_context_t *ct) 2602 0 stevel { 2603 0 stevel int (*func)() = NULL; 2604 0 stevel void *arg0 = NULL; 2605 0 stevel 2606 0 stevel ASSERT(vf != NULL); 2607 0 stevel vf->fa_fnode--; 2608 3898 rsb vsop_find(vf, &func, int, &arg0, vop_getsecattr, femop_getsecattr); 2609 0 stevel ASSERT(func != NULL); 2610 0 stevel ASSERT(arg0 != NULL); 2611 5331 amw return ((*func)(arg0, vsap, flag, cr, ct)); 2612 0 stevel } 2613 0 stevel 2614 0 stevel int 2615 0 stevel vnext_shrlock(femarg_t *vf, int cmd, struct shrlock *shr, int flag, 2616 5331 amw cred_t *cr, caller_context_t *ct) 2617 0 stevel { 2618 0 stevel int (*func)() = NULL; 2619 0 stevel void *arg0 = NULL; 2620 0 stevel 2621 0 stevel ASSERT(vf != NULL); 2622 0 stevel vf->fa_fnode--; 2623 3898 rsb vsop_find(vf, &func, int, &arg0, vop_shrlock, femop_shrlock); 2624 0 stevel ASSERT(func != NULL); 2625 0 stevel ASSERT(arg0 != NULL); 2626 5331 amw return ((*func)(arg0, cmd, shr, flag, cr, ct)); 2627 0 stevel } 2628 0 stevel 2629 0 stevel int 2630 5331 amw vnext_vnevent(femarg_t *vf, vnevent_t vnevent, vnode_t *dvp, char *cname, 2631 5331 amw caller_context_t *ct) 2632 0 stevel { 2633 0 stevel int (*func)() = NULL; 2634 0 stevel void *arg0 = NULL; 2635 0 stevel 2636 0 stevel ASSERT(vf != NULL); 2637 0 stevel vf->fa_fnode--; 2638 3898 rsb vsop_find(vf, &func, int, &arg0, vop_vnevent, femop_vnevent); 2639 0 stevel ASSERT(func != NULL); 2640 0 stevel ASSERT(arg0 != NULL); 2641 5331 amw return ((*func)(arg0, vnevent, dvp, cname, ct)); 2642 0 stevel } 2643 0 stevel 2644 0 stevel int 2645 0 stevel vfsnext_mount(fsemarg_t *vf, vnode_t *mvp, struct mounta *uap, cred_t *cr) 2646 0 stevel { 2647 0 stevel int (*func)() = NULL; 2648 0 stevel void *arg0 = NULL; 2649 0 stevel 2650 0 stevel ASSERT(vf != NULL); 2651 0 stevel vf->fa_fnode--; 2652 3898 rsb vfsop_find(vf, &func, int, &arg0, vfs_mount, fsemop_mount); 2653 0 stevel ASSERT(func != NULL); 2654 0 stevel ASSERT(arg0 != NULL); 2655 0 stevel return ((*func)(arg0, mvp, uap, cr)); 2656 0 stevel } 2657 0 stevel 2658 0 stevel int 2659 0 stevel vfsnext_unmount(fsemarg_t *vf, int flag, cred_t *cr) 2660 0 stevel { 2661 0 stevel int (*func)() = NULL; 2662 0 stevel void *arg0 = NULL; 2663 0 stevel 2664 0 stevel ASSERT(vf != NULL); 2665 0 stevel vf->fa_fnode--; 2666 3898 rsb vfsop_find(vf, &func, int, &arg0, vfs_unmount, fsemop_unmount); 2667 0 stevel ASSERT(func != NULL); 2668 0 stevel ASSERT(arg0 != NULL); 2669 0 stevel return ((*func)(arg0, flag, cr)); 2670 0 stevel } 2671 0 stevel 2672 0 stevel int 2673 0 stevel vfsnext_root(fsemarg_t *vf, vnode_t **vpp) 2674 0 stevel { 2675 0 stevel int (*func)() = NULL; 2676 0 stevel void *arg0 = NULL; 2677 0 stevel 2678 0 stevel ASSERT(vf != NULL); 2679 0 stevel vf->fa_fnode--; 2680 3898 rsb vfsop_find(vf, &func, int, &arg0, vfs_root, fsemop_root); 2681 0 stevel ASSERT(func != NULL); 2682 0 stevel ASSERT(arg0 != NULL); 2683 0 stevel return ((*func)(arg0, vpp)); 2684 0 stevel } 2685 0 stevel 2686 0 stevel int 2687 0 stevel vfsnext_statvfs(fsemarg_t *vf, statvfs64_t *sp) 2688 0 stevel { 2689 0 stevel int (*func)() = NULL; 2690 0 stevel void *arg0 = NULL; 2691 0 stevel 2692 0 stevel ASSERT(vf != NULL); 2693 0 stevel vf->fa_fnode--; 2694 3898 rsb vfsop_find(vf, &func, int, &arg0, vfs_statvfs, fsemop_statvfs); 2695 0 stevel ASSERT(func != NULL); 2696 0 stevel ASSERT(arg0 != NULL); 2697 0 stevel return ((*func)(arg0, sp)); 2698 0 stevel } 2699 0 stevel 2700 0 stevel int 2701 0 stevel vfsnext_sync(fsemarg_t *vf, short flag, cred_t *cr) 2702 0 stevel { 2703 0 stevel int (*func)() = NULL; 2704 0 stevel void *arg0 = NULL; 2705 0 stevel 2706 0 stevel ASSERT(vf != NULL); 2707 0 stevel vf->fa_fnode--; 2708 3898 rsb vfsop_find(vf, &func, int, &arg0, vfs_sync, fsemop_sync); 2709 0 stevel ASSERT(func != NULL); 2710 0 stevel ASSERT(arg0 != NULL); 2711 0 stevel return ((*func)(arg0, flag, cr)); 2712 0 stevel } 2713 0 stevel 2714 0 stevel int 2715 0 stevel vfsnext_vget(fsemarg_t *vf, vnode_t **vpp, fid_t *fidp) 2716 0 stevel { 2717 0 stevel int (*func)() = NULL; 2718 0 stevel void *arg0 = NULL; 2719 0 stevel 2720 0 stevel ASSERT(vf != NULL); 2721 0 stevel vf->fa_fnode--; 2722 3898 rsb vfsop_find(vf, &func, int, &arg0, vfs_vget, fsemop_vget); 2723 0 stevel ASSERT(func != NULL); 2724 0 stevel ASSERT(arg0 != NULL); 2725 0 stevel return ((*func)(arg0, vpp, fidp)); 2726 0 stevel } 2727 0 stevel 2728 0 stevel int 2729 0 stevel vfsnext_mountroot(fsemarg_t *vf, enum whymountroot reason) 2730 0 stevel { 2731 0 stevel int (*func)() = NULL; 2732 0 stevel void *arg0 = NULL; 2733 0 stevel 2734 0 stevel ASSERT(vf != NULL); 2735 0 stevel vf->fa_fnode--; 2736 3898 rsb vfsop_find(vf, &func, int, &arg0, vfs_mountroot, fsemop_mountroot); 2737 0 stevel ASSERT(func != NULL); 2738 0 stevel ASSERT(arg0 != NULL); 2739 0 stevel return ((*func)(arg0, reason)); 2740 0 stevel } 2741 0 stevel 2742 0 stevel void 2743 0 stevel vfsnext_freevfs(fsemarg_t *vf) 2744 0 stevel { 2745 0 stevel void (*func)() = NULL; 2746 0 stevel void *arg0 = NULL; 2747 0 stevel 2748 0 stevel ASSERT(vf != NULL); 2749 0 stevel vf->fa_fnode--; 2750 3898 rsb vfsop_find(vf, &func, void, &arg0, vfs_freevfs, fsemop_freevfs); 2751 0 stevel ASSERT(func != NULL); 2752 0 stevel ASSERT(arg0 != NULL); 2753 0 stevel (*func)(arg0); 2754 0 stevel } 2755 0 stevel 2756 0 stevel int 2757 0 stevel vfsnext_vnstate(fsemarg_t *vf, vnode_t *vp, vntrans_t nstate) 2758 0 stevel { 2759 0 stevel int (*func)() = NULL; 2760 0 stevel void *arg0 = NULL; 2761 0 stevel 2762 0 stevel ASSERT(vf != NULL); 2763 0 stevel vf->fa_fnode--; 2764 3898 rsb vfsop_find(vf, &func, int, &arg0, vfs_vnstate, fsemop_vnstate); 2765 0 stevel ASSERT(func != NULL); 2766 0 stevel ASSERT(arg0 != NULL); 2767 0 stevel return ((*func)(arg0, vp, nstate)); 2768 0 stevel } 2769 0 stevel 2770 0 stevel 2771 0 stevel /* 2772 0 stevel * Create a new fem_head and associate with the vnode. 2773 0 stevel * To keep the unaugmented vnode access path lock free, we spin 2774 0 stevel * update this - create a new one, then try and install it. If 2775 0 stevel * we fail to install, release the old one and pretend we succeeded. 2776 0 stevel */ 2777 0 stevel 2778 0 stevel static struct fem_head * 2779 0 stevel new_femhead(struct fem_head **hp) 2780 0 stevel { 2781 0 stevel struct fem_head *head; 2782 0 stevel 2783 0 stev