Annotation of sys/kern/vfs_default.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: vfs_default.c,v 1.34 2007/06/01 23:47:56 deraadt Exp $ */
! 2:
! 3: /*
! 4: * Portions of this code are:
! 5: *
! 6: * Copyright (c) 1989, 1993
! 7: * The Regents of the University of California. All rights reserved.
! 8: * (c) UNIX System Laboratories, Inc.
! 9: * All or some portions of this file are derived from material licensed
! 10: * to the University of California by American Telephone and Telegraph
! 11: * Co. or Unix System Laboratories, Inc. and are reproduced herein with
! 12: * the permission of UNIX System Laboratories, Inc.
! 13: *
! 14: * Redistribution and use in source and binary forms, with or without
! 15: * modification, are permitted provided that the following conditions
! 16: * are met:
! 17: * 1. Redistributions of source code must retain the above copyright
! 18: * notice, this list of conditions and the following disclaimer.
! 19: * 2. Redistributions in binary form must reproduce the above copyright
! 20: * notice, this list of conditions and the following disclaimer in the
! 21: * documentation and/or other materials provided with the distribution.
! 22: * 3. Neither the name of the University nor the names of its contributors
! 23: * may be used to endorse or promote products derived from this software
! 24: * without specific prior written permission.
! 25: *
! 26: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
! 27: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 28: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 29: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 30: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 31: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 32: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 33: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 34: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 35: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 36: * SUCH DAMAGE.
! 37: */
! 38:
! 39: #include <sys/param.h>
! 40: #include <sys/systm.h>
! 41: #include <sys/proc.h>
! 42: #include <sys/mount.h>
! 43: #include <sys/vnode.h>
! 44: #include <sys/namei.h>
! 45: #include <sys/malloc.h>
! 46: #include <sys/pool.h>
! 47: #include <sys/event.h>
! 48: #include <miscfs/specfs/specdev.h>
! 49:
! 50: int filt_generic_readwrite(struct knote *, long);
! 51: void filt_generic_detach(struct knote *);
! 52:
! 53: /*
! 54: * Eliminate all activity associated with the requested vnode
! 55: * and with all vnodes aliased to the requested vnode.
! 56: */
! 57: int
! 58: vop_generic_revoke(void *v)
! 59: {
! 60: struct vop_revoke_args *ap = v;
! 61: struct vnode *vp, *vq;
! 62: struct proc *p = curproc;
! 63:
! 64: #ifdef DIAGNOSTIC
! 65: if ((ap->a_flags & REVOKEALL) == 0)
! 66: panic("vop_generic_revoke");
! 67: #endif
! 68:
! 69: vp = ap->a_vp;
! 70:
! 71: if (vp->v_flag & VALIASED) {
! 72: /*
! 73: * If a vgone (or vclean) is already in progress,
! 74: * wait until it is done and return.
! 75: */
! 76: if (vp->v_flag & VXLOCK) {
! 77: vp->v_flag |= VXWANT;
! 78: tsleep(vp, PINOD, "vop_generic_revokeall", 0);
! 79:
! 80: return(0);
! 81: }
! 82:
! 83: /*
! 84: * Ensure that vp will not be vgone'd while we
! 85: * are eliminating its aliases.
! 86: */
! 87: vp->v_flag |= VXLOCK;
! 88: while (vp->v_flag & VALIASED) {
! 89: for (vq = *vp->v_hashchain; vq; vq = vq->v_specnext) {
! 90: if (vq->v_rdev != vp->v_rdev ||
! 91: vq->v_type != vp->v_type || vp == vq)
! 92: continue;
! 93: vgone(vq);
! 94: break;
! 95: }
! 96: }
! 97:
! 98: /*
! 99: * Remove the lock so that vgone below will
! 100: * really eliminate the vnode after which time
! 101: * vgone will awaken any sleepers.
! 102: */
! 103: vp->v_flag &= ~VXLOCK;
! 104: }
! 105:
! 106: vgonel(vp, p);
! 107:
! 108: return (0);
! 109: }
! 110:
! 111: int
! 112: vop_generic_bwrite(void *v)
! 113: {
! 114: struct vop_bwrite_args *ap = v;
! 115:
! 116: return (bwrite(ap->a_bp));
! 117: }
! 118:
! 119: int
! 120: vop_generic_abortop(void *v)
! 121: {
! 122: struct vop_abortop_args *ap = v;
! 123:
! 124: if ((ap->a_cnp->cn_flags & (HASBUF | SAVESTART)) == HASBUF)
! 125: pool_put(&namei_pool, ap->a_cnp->cn_pnbuf);
! 126:
! 127: return (0);
! 128: }
! 129:
! 130: /*
! 131: * Stubs to use when there is no locking to be done on the underlying object.
! 132: * A minimal shared lock is necessary to ensure that the underlying object
! 133: * is not revoked while an operation is in progress. So, an active shared
! 134: * count should be maintained in an auxiliary vnode lock structure. However,
! 135: * that's not done now.
! 136: */
! 137: int
! 138: vop_generic_lock(void *v)
! 139: {
! 140: return (0);
! 141: }
! 142:
! 143: /*
! 144: * Decrement the active use count. (Not done currently)
! 145: */
! 146: int
! 147: vop_generic_unlock(void *v)
! 148: {
! 149: return (0);
! 150: }
! 151:
! 152: /*
! 153: * Return whether or not the node is in use. (Not done currently)
! 154: */
! 155: int
! 156: vop_generic_islocked(void *v)
! 157: {
! 158: return (0);
! 159: }
! 160:
! 161: struct filterops generic_filtops =
! 162: { 1, NULL, filt_generic_detach, filt_generic_readwrite };
! 163:
! 164: int
! 165: vop_generic_kqfilter(void *v)
! 166: {
! 167: struct vop_kqfilter_args *ap = v;
! 168: struct knote *kn = ap->a_kn;
! 169:
! 170: switch (kn->kn_filter) {
! 171: case EVFILT_READ:
! 172: case EVFILT_WRITE:
! 173: kn->kn_fop = &generic_filtops;
! 174: break;
! 175: default:
! 176: return (1);
! 177: }
! 178:
! 179: return (0);
! 180: }
! 181:
! 182: void
! 183: filt_generic_detach(struct knote *kn)
! 184: {
! 185: }
! 186:
! 187: int
! 188: filt_generic_readwrite(struct knote *kn, long hint)
! 189: {
! 190: /*
! 191: * filesystem is gone, so set the EOF flag and schedule
! 192: * the knote for deletion.
! 193: */
! 194: if (hint == NOTE_REVOKE) {
! 195: kn->kn_flags |= (EV_EOF | EV_ONESHOT);
! 196: return (1);
! 197: }
! 198:
! 199: kn->kn_data = 0;
! 200:
! 201: return (1);
! 202: }
CVSweb