Index: src/sys/gnu/ext2fs/ext2_vnops.c =================================================================== --- src/sys/gnu/ext2fs/ext2_vnops.c (revision 161) +++ src/sys/gnu/ext2fs/ext2_vnops.c (working copy) @@ -502,7 +502,6 @@ return (EROFS); error = ext2_chmod(vp, (int)vap->va_mode, cred, td); } - VN_KNOTE_UNLOCKED(vp, NOTE_ATTRIB); return (error); } Index: src/sys/ufs/ufs/ufs_vnops.c =================================================================== --- src/sys/ufs/ufs/ufs_vnops.c (revision 161) +++ src/sys/ufs/ufs/ufs_vnops.c (working copy) @@ -57,7 +57,6 @@ #include #include #include -#include #include #include #include @@ -109,11 +108,6 @@ static vop_whiteout_t ufs_whiteout; static vop_close_t ufsfifo_close; static vop_kqfilter_t ufsfifo_kqfilter; -static int filt_ufsread(struct knote *kn, long hint); -static int filt_ufswrite(struct knote *kn, long hint); -static int filt_ufsvnode(struct knote *kn, long hint); -static void filt_ufsdetach(struct knote *kn); -static vop_kqfilter_t ufs_kqfilter; /* * A virgin directory (no blushing please). @@ -179,7 +173,6 @@ ap->a_dvp, ap->a_vpp, ap->a_cnp); if (error) return (error); - VN_KNOTE_UNLOCKED(ap->a_dvp, NOTE_WRITE); return (0); } @@ -206,7 +199,6 @@ ap->a_dvp, vpp, ap->a_cnp); if (error) return (error); - VN_KNOTE_UNLOCKED(ap->a_dvp, NOTE_WRITE); ip = VTOI(*vpp); ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE; if (vap->va_rdev != VNOVAL) { @@ -579,7 +571,6 @@ return (EPERM); error = ufs_chmod(vp, (int)vap->va_mode, cred, td); } - VN_KNOTE_UNLOCKED(vp, NOTE_ATTRIB); return (error); } @@ -763,8 +754,6 @@ error = ufs_dirremove(dvp, ip, ap->a_cnp->cn_flags, 0); if (ip->i_nlink <= 0) vp->v_vflag |= VV_NOSYNC; - VN_KNOTE_UNLOCKED(vp, NOTE_DELETE); - VN_KNOTE_UNLOCKED(dvp, NOTE_WRITE); out: return (error); } @@ -825,8 +814,6 @@ softdep_change_linkcnt(ip); } out: - VN_KNOTE_UNLOCKED(vp, NOTE_LINK); - VN_KNOTE_UNLOCKED(tdvp, NOTE_WRITE); return (error); } @@ -1001,7 +988,6 @@ oldparent = dp->i_number; doingdirectory = 1; } - VN_KNOTE_UNLOCKED(fdvp, NOTE_WRITE); /* XXX right place? */ vrele(fdvp); /* @@ -1110,7 +1096,6 @@ } goto bad; } - VN_KNOTE_UNLOCKED(tdvp, NOTE_WRITE); vput(tdvp); } else { if (xp->i_dev != dp->i_dev || xp->i_dev != ip->i_dev) @@ -1194,9 +1179,7 @@ tcnp->cn_cred, tcnp->cn_thread)) != 0) goto bad; } - VN_KNOTE_UNLOCKED(tdvp, NOTE_WRITE); vput(tdvp); - VN_KNOTE_UNLOCKED(tvp, NOTE_DELETE); vput(tvp); xp = NULL; } @@ -1266,7 +1249,6 @@ error = ufs_dirremove(fdvp, xp, fcnp->cn_flags, 0); xp->i_flag &= ~IN_RENAME; } - VN_KNOTE_UNLOCKED(fvp, NOTE_RENAME); if (dp) vput(fdvp); if (xp) @@ -1584,7 +1566,6 @@ bad: if (error == 0) { - VN_KNOTE_UNLOCKED(dvp, NOTE_WRITE | NOTE_LINK); *ap->a_vpp = tvp; } else { dp->i_effnlink--; @@ -1677,7 +1658,6 @@ } goto out; } - VN_KNOTE_UNLOCKED(dvp, NOTE_WRITE | NOTE_LINK); cache_purge(dvp); /* * Truncate inode. The only stuff left in the directory is "." and @@ -1706,7 +1686,6 @@ ufsdirhash_free(ip); #endif out: - VN_KNOTE_UNLOCKED(vp, NOTE_DELETE); return (error); } @@ -1731,7 +1710,6 @@ vpp, ap->a_cnp); if (error) return (error); - VN_KNOTE_UNLOCKED(ap->a_dvp, NOTE_WRITE); vp = *vpp; len = strlen(ap->a_target); if (len < vp->v_mount->mnt_maxsymlinklen) { @@ -1988,7 +1966,7 @@ error = fifo_specops.vop_kqfilter(ap); if (error) - error = ufs_kqfilter(ap); + error = vfs_kqfilter(ap); return (error); } @@ -2372,106 +2350,6 @@ return (error); } -static struct filterops ufsread_filtops = - { 1, NULL, filt_ufsdetach, filt_ufsread }; -static struct filterops ufswrite_filtops = - { 1, NULL, filt_ufsdetach, filt_ufswrite }; -static struct filterops ufsvnode_filtops = - { 1, NULL, filt_ufsdetach, filt_ufsvnode }; - -static int -ufs_kqfilter(ap) - struct vop_kqfilter_args /* { - struct vnode *a_vp; - struct knote *a_kn; - } */ *ap; -{ - struct vnode *vp = ap->a_vp; - struct knote *kn = ap->a_kn; - - switch (kn->kn_filter) { - case EVFILT_READ: - kn->kn_fop = &ufsread_filtops; - break; - case EVFILT_WRITE: - kn->kn_fop = &ufswrite_filtops; - break; - case EVFILT_VNODE: - kn->kn_fop = &ufsvnode_filtops; - break; - default: - return (1); - } - - kn->kn_hook = (caddr_t)vp; - - if (vp->v_pollinfo == NULL) - v_addpollinfo(vp); - if (vp->v_pollinfo == NULL) - return ENOMEM; - knlist_add(&vp->v_pollinfo->vpi_selinfo.si_note, kn, 0); - - return (0); -} - -static void -filt_ufsdetach(struct knote *kn) -{ - struct vnode *vp = (struct vnode *)kn->kn_hook; - - KASSERT(vp->v_pollinfo != NULL, ("Mising v_pollinfo")); - knlist_remove(&vp->v_pollinfo->vpi_selinfo.si_note, kn, 0); -} - -/*ARGSUSED*/ -static int -filt_ufsread(struct knote *kn, long hint) -{ - struct vnode *vp = (struct vnode *)kn->kn_hook; - struct inode *ip = VTOI(vp); - - /* - * filesystem is gone, so set the EOF flag and schedule - * the knote for deletion. - */ - if (hint == NOTE_REVOKE) { - kn->kn_flags |= (EV_EOF | EV_ONESHOT); - return (1); - } - - kn->kn_data = ip->i_size - kn->kn_fp->f_offset; - return (kn->kn_data != 0); -} - -/*ARGSUSED*/ -static int -filt_ufswrite(struct knote *kn, long hint) -{ - - /* - * filesystem is gone, so set the EOF flag and schedule - * the knote for deletion. - */ - if (hint == NOTE_REVOKE) - kn->kn_flags |= (EV_EOF | EV_ONESHOT); - - kn->kn_data = 0; - return (1); -} - -static int -filt_ufsvnode(struct knote *kn, long hint) -{ - - if (kn->kn_sfflags & hint) - kn->kn_fflags |= hint; - if (hint == NOTE_REVOKE) { - kn->kn_flags |= EV_EOF; - return (1); - } - return (kn->kn_fflags != 0); -} - /* Global vfs data structures for ufs. */ struct vop_vector ufs_vnodeops = { .vop_default = &default_vnodeops, @@ -2494,7 +2372,6 @@ .vop_open = ufs_open, .vop_pathconf = ufs_pathconf, .vop_poll = vop_stdpoll, - .vop_kqfilter = ufs_kqfilter, .vop_print = ufs_print, .vop_readdir = ufs_readdir, .vop_readlink = ufs_readlink, Index: src/sys/ufs/ffs/ffs_vnops.c =================================================================== --- src/sys/ufs/ffs/ffs_vnops.c (revision 161) +++ src/sys/ufs/ffs/ffs_vnops.c (working copy) @@ -572,7 +572,7 @@ ufs_lbn_t lbn; off_t osize; int seqcount; - int blkoffset, error, extended, flags, ioflag, resid, size, xfersize; + int blkoffset, error, flags, ioflag, resid, size, xfersize; vp = ap->a_vp; uio = ap->a_uio; @@ -584,7 +584,6 @@ panic("ffs_write+IO_EXT"); #endif - extended = 0; seqcount = ap->a_ioflag >> IO_SEQSHIFT; ip = VTOI(vp); @@ -681,7 +680,6 @@ if (uio->uio_offset + xfersize > ip->i_size) { ip->i_size = uio->uio_offset + xfersize; DIP_SET(ip, i_size, ip->i_size); - extended = 1; } size = blksize(fs, ip, lbn) - bp->b_resid; @@ -737,8 +735,6 @@ ip->i_mode &= ~(ISUID | ISGID); DIP_SET(ip, i_mode, ip->i_mode); } - if (resid > uio->uio_resid) - VN_KNOTE_UNLOCKED(vp, NOTE_WRITE | (extended ? NOTE_EXTEND : 0)); if (error) { if (ioflag & IO_UNIT) { (void)ffs_truncate(vp, osize, Index: src/sys/kern/vfs_default.c =================================================================== --- src/sys/kern/vfs_default.c (revision 161) +++ src/sys/kern/vfs_default.c (working copy) @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -82,6 +83,7 @@ .vop_getwritemount = vop_stdgetwritemount, .vop_inactive = VOP_NULL, .vop_ioctl = VOP_ENOTTY, + .vop_kqfilter = vop_stdkqfilter, .vop_islocked = vop_stdislocked, .vop_lease = VOP_NULL, .vop_lock = vop_stdlock, @@ -472,6 +474,12 @@ ap->a_count, ap->a_reqpage); } +int +vop_stdkqfilter(struct vop_kqfilter_args *ap) +{ + return vfs_kqfilter(ap); +} + /* XXX Needs good comment and more info in the manpage (VOP_PUTPAGES(9)). */ int vop_stdputpages(ap) Index: src/sys/kern/vnode_if.src =================================================================== --- src/sys/kern/vnode_if.src (revision 161) +++ src/sys/kern/vnode_if.src (working copy) @@ -95,6 +95,7 @@ # #% create dvp L L L #% create vpp - L - +#! create post vop_create_post # vop_create { IN struct vnode *dvp; @@ -115,6 +116,7 @@ # #% mknod dvp L L L #% mknod vpp - L - +#! mknod post vop_mknod_post # vop_mknod { IN struct vnode *dvp; @@ -166,6 +168,7 @@ # #% setattr vp L L L +#! setattr post vop_setattr_post # vop_setattr { IN struct vnode *vp; @@ -186,6 +189,8 @@ # #% write vp L L L +#! write pre VOP_WRITE_PRE +#! write post VOP_WRITE_POST # vop_write { IN struct vnode *vp; @@ -254,6 +259,7 @@ # #% remove dvp L L L #% remove vp L L L +#! remove post vop_remove_post # vop_remove { IN struct vnode *dvp; @@ -264,6 +270,7 @@ # #% link tdvp L L L #% link vp L L L +#! link post vop_link_post # vop_link { IN struct vnode *tdvp; @@ -277,6 +284,7 @@ # rename tdvp L U U # rename tvp X U U #! rename pre vop_rename_pre +#! rename post vop_rename_post # vop_rename { IN WILLRELE struct vnode *fdvp; @@ -290,6 +298,7 @@ # #% mkdir dvp L L L #% mkdir vpp - L - +#! mkdir post vop_mkdir_post # vop_mkdir { IN struct vnode *dvp; @@ -301,6 +310,7 @@ # #% rmdir dvp L L L #% rmdir vp L L L +#! rmdir post vop_rmdir_post # vop_rmdir { IN struct vnode *dvp; @@ -311,6 +321,7 @@ # #% symlink dvp L L L #% symlink vpp - L - +#! symlink post vop_symlink_post # vop_symlink { IN struct vnode *dvp; Index: src/sys/kern/vfs_subr.c =================================================================== --- src/sys/kern/vfs_subr.c (revision 161) +++ src/sys/kern/vfs_subr.c (working copy) @@ -52,6 +52,7 @@ #include #include #include +#include #include #include #include @@ -3268,10 +3269,12 @@ vfs_badlock("is not locked shared but should be", str, vp); } #endif /* 0 */ +#endif /* DEBUG_VFS_LOCKS */ void vop_rename_pre(void *ap) { +#ifdef DEBUG_VFS_LOCKS struct vop_rename_args *a = ap; if (a->a_tvp) @@ -3290,11 +3293,13 @@ if (a->a_tvp) ASSERT_VOP_LOCKED(a->a_tvp, "vop_rename: tvp not locked"); ASSERT_VOP_LOCKED(a->a_tdvp, "vop_rename: tdvp not locked"); +#endif } void vop_strategy_pre(void *ap) { +#ifdef DEBUG_VFS_LOCKS struct vop_strategy_args *a; struct buf *bp; @@ -3314,11 +3319,13 @@ if (vfs_badlock_ddb) kdb_enter("lock violation"); } +#endif } void vop_lookup_pre(void *ap) { +#ifdef DEBUG_VFS_LOCKS struct vop_lookup_args *a; struct vnode *dvp; @@ -3326,11 +3333,13 @@ dvp = a->a_dvp; ASSERT_VI_UNLOCKED(dvp, "VOP_LOOKUP"); ASSERT_VOP_LOCKED(dvp, "VOP_LOOKUP"); +#endif } void vop_lookup_post(void *ap, int rc) { +#ifdef DEBUG_VFS_LOCKS struct vop_lookup_args *a; struct componentname *cnp; struct vnode *dvp; @@ -3354,49 +3363,149 @@ if (!rc) ASSERT_VOP_LOCKED(vp, "VOP_LOOKUP (child)"); +#endif } void vop_lock_pre(void *ap) { +#ifdef DEBUG_VFS_LOCKS struct vop_lock_args *a = ap; if ((a->a_flags & LK_INTERLOCK) == 0) ASSERT_VI_UNLOCKED(a->a_vp, "VOP_LOCK"); else ASSERT_VI_LOCKED(a->a_vp, "VOP_LOCK"); +#endif } void vop_lock_post(void *ap, int rc) { +#ifdef DEBUG_VFS_LOCKS struct vop_lock_args *a = ap; ASSERT_VI_UNLOCKED(a->a_vp, "VOP_LOCK"); if (rc == 0) ASSERT_VOP_LOCKED(a->a_vp, "VOP_LOCK"); +#endif } void vop_unlock_pre(void *ap) { +#ifdef DEBUG_VFS_LOCKS struct vop_unlock_args *a = ap; if (a->a_flags & LK_INTERLOCK) ASSERT_VI_LOCKED(a->a_vp, "VOP_UNLOCK"); ASSERT_VOP_LOCKED(a->a_vp, "VOP_UNLOCK"); +#endif } void vop_unlock_post(void *ap, int rc) { +#ifdef DEBUG_VFS_LOCKS struct vop_unlock_args *a = ap; if (a->a_flags & LK_INTERLOCK) ASSERT_VI_UNLOCKED(a->a_vp, "VOP_UNLOCK"); +#endif } -#endif /* DEBUG_VFS_LOCKS */ +void +vop_create_post(void *ap, int rc) +{ + struct vop_create_args *a = ap; + + if (!rc) + VFS_SEND_KNOTE(a->a_dvp, NOTE_WRITE); +} + +void +vop_link_post(void *ap, int rc) +{ + struct vop_link_args *a = ap; + + if (!rc) { + VFS_SEND_KNOTE(a->a_vp, NOTE_LINK); + VFS_SEND_KNOTE(a->a_tdvp, NOTE_WRITE); + } +} + +void +vop_mkdir_post(void *ap, int rc) +{ + struct vop_mkdir_args *a = ap; + + if (!rc) + VFS_SEND_KNOTE(a->a_dvp, NOTE_WRITE | NOTE_LINK); +} + +void +vop_mknod_post(void *ap, int rc) +{ + struct vop_mknod_args *a = ap; + + if (!rc) + VFS_SEND_KNOTE(a->a_dvp, NOTE_WRITE); +} + +void +vop_remove_post(void *ap, int rc) +{ + struct vop_remove_args *a = ap; + + if (!rc) { + VFS_SEND_KNOTE(a->a_dvp, NOTE_WRITE); + VFS_SEND_KNOTE(a->a_vp, NOTE_DELETE); + } +} + +void +vop_rename_post(void *ap, int rc) +{ + struct vop_rename_args *a = ap; + + if (!rc) { + VFS_SEND_KNOTE(a->a_fdvp, NOTE_WRITE); + VFS_SEND_KNOTE(a->a_tdvp, NOTE_WRITE); + VFS_SEND_KNOTE(a->a_fvp, NOTE_RENAME); + if (a->a_tvp) + VFS_SEND_KNOTE(a->a_tvp, NOTE_DELETE); + } +} + +void +vop_rmdir_post(void *ap, int rc) +{ + struct vop_rmdir_args *a = ap; + + if (!rc) { + VFS_SEND_KNOTE(a->a_dvp, NOTE_WRITE | NOTE_LINK); + VFS_SEND_KNOTE(a->a_vp, NOTE_DELETE); + } +} + +void +vop_setattr_post(void *ap, int rc) +{ + struct vop_setattr_args *a = ap; + + if (!rc) + VFS_SEND_KNOTE(a->a_vp, NOTE_ATTRIB); +} + +void +vop_symlink_post(void *ap, int rc) +{ + struct vop_symlink_args *a = ap; + + if (!rc) + VFS_SEND_KNOTE(a->a_dvp, NOTE_WRITE); +} + static struct knlist fs_knlist; static void @@ -3484,3 +3593,108 @@ getbinuptime(&bt); return (((u_quad_t)bt.sec << 32LL) | (bt.frac >> 32LL)); } + +static int filt_vfsread(struct knote *kn, long hint); +static int filt_vfswrite(struct knote *kn, long hint); +static int filt_vfsvnode(struct knote *kn, long hint); +static void filt_vfsdetach(struct knote *kn); + +static struct filterops vfsread_filtops = + { 1, NULL, filt_vfsdetach, filt_vfsread }; +static struct filterops vfswrite_filtops = + { 1, NULL, filt_vfsdetach, filt_vfswrite }; +static struct filterops vfsvnode_filtops = + { 1, NULL, filt_vfsdetach, filt_vfsvnode }; + +int +vfs_kqfilter(struct vop_kqfilter_args *ap) +{ + struct vnode *vp = ap->a_vp; + struct knote *kn = ap->a_kn; + + switch (kn->kn_filter) { + case EVFILT_READ: + kn->kn_fop = &vfsread_filtops; + break; + case EVFILT_WRITE: + kn->kn_fop = &vfswrite_filtops; + break; + case EVFILT_VNODE: + kn->kn_fop = &vfsvnode_filtops; + break; + default: + return (1); + } + + kn->kn_hook = (caddr_t)vp; + + if (vp->v_pollinfo == NULL) + v_addpollinfo(vp); + if (vp->v_pollinfo == NULL) + return (ENOMEM); + knlist_add(&vp->v_pollinfo->vpi_selinfo.si_note, kn, 0); + + return (0); +} + +/* + * Detach knote from vnode + */ +static void +filt_vfsdetach(struct knote *kn) +{ + struct vnode *vp = (struct vnode *)kn->kn_hook; + + KASSERT(vp->v_pollinfo != NULL, ("Missing v_pollinfo")); + knlist_remove(&vp->v_pollinfo->vpi_selinfo.si_note, kn, 0); +} + +/*ARGSUSED*/ +static int +filt_vfsread(struct knote *kn, long hint) +{ + struct vnode *vp = (struct vnode *)kn->kn_hook; + struct vattr va; + + /* + * filesystem is gone, so set the EOF flag and schedule + * the knote for deletion. + */ + if (hint == NOTE_REVOKE) { + kn->kn_flags |= (EV_EOF | EV_ONESHOT); + return (1); + } + + if (VOP_GETATTR(vp, &va, curthread->td_ucred, curthread)) + return (0); + + kn->kn_data = va.va_size - kn->kn_fp->f_offset; + return (kn->kn_data != 0); +} + +/*ARGSUSED*/ +static int +filt_vfswrite(struct knote *kn, long hint) +{ + /* + * filesystem is gone, so set the EOF flag and schedule + * the knote for deletion. + */ + if (hint == NOTE_REVOKE) + kn->kn_flags |= (EV_EOF | EV_ONESHOT); + + kn->kn_data = 0; + return (1); +} + +static int +filt_vfsvnode(struct knote *kn, long hint) +{ + if (kn->kn_sfflags & hint) + kn->kn_fflags |= hint; + if (hint == NOTE_REVOKE) { + kn->kn_flags |= EV_EOF; + return (1); + } + return (kn->kn_fflags != 0); +} Index: src/sys/tools/vnode_if.awk =================================================================== --- src/sys/tools/vnode_if.awk (revision 161) +++ src/sys/tools/vnode_if.awk (working copy) @@ -87,21 +87,17 @@ } } -function add_debug_pre(name) +function add_pre(name) { if (lockdata[name, "pre"]) { - printc("#ifdef DEBUG_VFS_LOCKS"); printc("\t"lockdata[name, "pre"]"(a);"); - printc("#endif"); } } -function add_debug_post(name) +function add_post(name) { if (lockdata[name, "post"]) { - printc("#ifdef DEBUG_VFS_LOCKS"); printc("\t"lockdata[name, "post"]"(a, rc);"); - printc("#endif"); } } @@ -172,9 +168,10 @@ if (cfile) { printc(common_head \ "#include \n" \ + "#include \n" \ + "#include \n" \ "#include \n" \ "#include \n" \ - "#include \n" \ "\n" \ "struct vnodeop_desc vop_default_desc = {\n" \ " \"default\",\n" \ @@ -367,7 +364,7 @@ printc("\tVNASSERT(vop != NULL, a->a_" args[0]", (\"No "name"(%p, %p)\", a->a_" args[0]", a));") for (i = 0; i < numargs; ++i) add_debug_code(name, args[i], "Entry", "\t"); - add_debug_pre(name); + add_pre(name); printc("\tif (vop->"name" != NULL)") printc("\t\trc = vop->"name"(a);") printc("\telse") @@ -380,7 +377,7 @@ for (i = 0; i < numargs; ++i) add_debug_code(name, args[i], "Error", "\t\t"); printc("\t}"); - add_debug_post(name); + add_post(name); printc("\treturn (rc);"); printc("}\n"); Index: src/sys/sys/mount.h =================================================================== --- src/sys/sys/mount.h (revision 161) +++ src/sys/sys/mount.h (working copy) @@ -270,6 +270,7 @@ #define MNTK_SUSPEND 0x08000000 /* request write suspension */ #define MNTK_SUSPENDED 0x10000000 /* write operations are suspended */ #define MNTK_MPSAFE 0x20000000 /* Filesystem is MPSAFE. */ +#define MNTK_NOKNOTE 0x80000000 /* Don't send KNOTEs from VOP hooks */ /* * Sysctl CTL_VFS definitions. @@ -549,6 +550,13 @@ mtx_assert(&Giant, MA_OWNED); \ } while (0) +#define VFS_SEND_KNOTE(vp, hint) do \ +{ \ + if ((vp)->v_mount && \ + ((vp)->v_mount->mnt_kern_flag & MNTK_NOKNOTE) == 0) \ + VN_KNOTE_UNLOCKED((vp), (hint)); \ +} while (0) + #include /* Index: src/sys/sys/vnode.h =================================================================== --- src/sys/sys/vnode.h (revision 161) +++ src/sys/sys/vnode.h (working copy) @@ -488,16 +488,6 @@ #endif void assert_vop_unlocked(struct vnode *vp, const char *str); -/* These are called from within the actual VOPS. */ -void vop_lock_pre(void *a); -void vop_lock_post(void *a, int rc); -void vop_lookup_post(void *a, int rc); -void vop_lookup_pre(void *a); -void vop_rename_pre(void *a); -void vop_strategy_pre(void *a); -void vop_unlock_post(void *a, int rc); -void vop_unlock_pre(void *a); - #define ASSERT_VI_LOCKED(vp, str) assert_vi_locked((vp), (str)) #define ASSERT_VI_UNLOCKED(vp, str) assert_vi_unlocked((vp), (str)) #if 0 @@ -658,6 +648,7 @@ int vop_stdgetpages(struct vop_getpages_args *); int vop_stdinactive(struct vop_inactive_args *); int vop_stdislocked(struct vop_islocked_args *); +int vop_stdkqfilter(struct vop_kqfilter_args *); int vop_stdlock(struct vop_lock_args *); int vop_stdputpages(struct vop_putpages_args *); int vop_stdunlock(struct vop_unlock_args *); @@ -671,6 +662,40 @@ int vop_null(struct vop_generic_args *ap); int vop_panic(struct vop_generic_args *ap); +/* These are called from within the actual VOPS. */ +void vop_create_post(void *a, int rc); +void vop_link_post(void *a, int rc); +void vop_lock_pre(void *a); +void vop_lock_post(void *a, int rc); +void vop_lookup_post(void *a, int rc); +void vop_lookup_pre(void *a); +void vop_mkdir_post(void *a, int rc); +void vop_mknod_post(void *a, int rc); +void vop_remove_post(void *a, int rc); +void vop_rename_post(void *a, int rc); +void vop_rename_pre(void *a); +void vop_rmdir_post(void *a, int rc); +void vop_setattr_post(void *a, int rc); +void vop_strategy_pre(void *a); +void vop_symlink_post(void *a, int rc); +void vop_unlock_post(void *a, int rc); +void vop_unlock_pre(void *a); + +#define VOP_WRITE_PRE(ap) \ + struct vattr va; \ + int error, extended; \ + \ + error = VOP_GETATTR((ap)->a_vp, &va, (ap)->a_cred, curthread); \ + if (error) \ + return (error); \ + extended = (ap)->a_uio->uio_offset + (ap)->a_uio->uio_resid \ + > va.va_size + +#define VOP_WRITE_POST(ap, ret) \ + if (!(ret)) \ + VFS_SEND_KNOTE((ap)->a_vp, NOTE_WRITE \ + | ((extended) ? NOTE_EXTEND : 0)) + void vput(struct vnode *vp); void vrele(struct vnode *vp); void vref(struct vnode *vp); @@ -699,6 +724,8 @@ void vfs_hash_rehash(struct vnode *vp, u_int hash); void vfs_hash_remove(struct vnode *vp); +int vfs_kqfilter(struct vop_kqfilter_args *); + #endif /* _KERNEL */ #endif /* !_SYS_VNODE_H_ */