diff --git a/sys/cddl/compat/opensolaris/kern/opensolaris_kobj.c b/sys/cddl/compat/opensolaris/kern/opensolaris_kobj.c index cf1b390..9ff798a 100644 --- a/sys/cddl/compat/opensolaris/kern/opensolaris_kobj.c +++ b/sys/cddl/compat/opensolaris/kern/opensolaris_kobj.c @@ -69,7 +69,7 @@ kobj_open_file_vnode(const char *file) struct thread *td = curthread; struct filedesc *fd; struct nameidata nd; - int error, flags, vfslocked; + int error, flags; fd = td->td_proc->p_fd; FILEDESC_XLOCK(fd); @@ -84,15 +84,13 @@ kobj_open_file_vnode(const char *file) FILEDESC_XUNLOCK(fd); flags = FREAD | O_NOFOLLOW; - NDINIT(&nd, LOOKUP, MPSAFE, UIO_SYSSPACE, file, td); + NDINIT(&nd, LOOKUP, 0, UIO_SYSSPACE, file, td); error = vn_open_cred(&nd, &flags, 0, 0, curthread->td_ucred, NULL); if (error != 0) return (NULL); - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); /* We just unlock so we hold a reference. */ VOP_UNLOCK(nd.ni_vp, 0); - VFS_UNLOCK_GIANT(vfslocked); return (nd.ni_vp); } @@ -130,15 +128,13 @@ kobj_get_filesize_vnode(struct _buf *file, uint64_t *size) { struct vnode *vp = file->ptr; struct vattr va; - int error, vfslocked; + int error; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_SHARED | LK_RETRY); error = VOP_GETATTR(vp, &va, curthread->td_ucred); VOP_UNLOCK(vp, 0); if (error == 0) *size = (uint64_t)va.va_size; - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -171,7 +167,7 @@ kobj_read_file_vnode(struct _buf *file, char *buf, unsigned size, unsigned off) struct thread *td = curthread; struct uio auio; struct iovec aiov; - int error, vfslocked; + int error; bzero(&aiov, sizeof(aiov)); bzero(&auio, sizeof(auio)); @@ -187,11 +183,9 @@ kobj_read_file_vnode(struct _buf *file, char *buf, unsigned size, unsigned off) auio.uio_resid = size; auio.uio_td = td; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_SHARED | LK_RETRY); error = VOP_READ(vp, &auio, IO_UNIT | IO_SYNC, td->td_ucred); VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); return (error != 0 ? -1 : size - auio.uio_resid); } @@ -221,14 +215,7 @@ void kobj_close_file(struct _buf *file) { - if (file->mounted) { - struct vnode *vp = file->ptr; - struct thread *td = curthread; - int vfslocked; - - vfslocked = VFS_LOCK_GIANT(vp->v_mount); - vn_close(vp, FREAD, td->td_ucred, td); - VFS_UNLOCK_GIANT(vfslocked); - } + if (file->mounted) + vn_close(file->ptr, FREAD, curthread->td_ucred, curthread); kmem_free(file, sizeof(*file)); } diff --git a/sys/cddl/compat/opensolaris/kern/opensolaris_lookup.c b/sys/cddl/compat/opensolaris/kern/opensolaris_lookup.c index ba79027..a7ec8b9 100644 --- a/sys/cddl/compat/opensolaris/kern/opensolaris_lookup.c +++ b/sys/cddl/compat/opensolaris/kern/opensolaris_lookup.c @@ -54,7 +54,7 @@ lookupnameat(char *dirname, enum uio_seg seg, enum symfollow follow, vref(startvp); ltype = VOP_ISLOCKED(startvp); VOP_UNLOCK(startvp, 0); - NDINIT_ATVP(&nd, LOOKUP, LOCKLEAF | MPSAFE | follow, seg, dirname, + NDINIT_ATVP(&nd, LOOKUP, LOCKLEAF | follow, seg, dirname, startvp, curthread); error = namei(&nd); *compvpp = nd.ni_vp; diff --git a/sys/cddl/compat/opensolaris/sys/vnode.h b/sys/cddl/compat/opensolaris/sys/vnode.h index d653db2..b219d9d 100644 --- a/sys/cddl/compat/opensolaris/sys/vnode.h +++ b/sys/cddl/compat/opensolaris/sys/vnode.h @@ -193,7 +193,7 @@ vn_openat(char *pnamep, enum uio_seg seg, int filemode, int createmode, if (startvp != NULL) vref(startvp); - NDINIT_ATVP(&nd, operation, MPSAFE, UIO_SYSSPACE, pnamep, startvp, td); + NDINIT_ATVP(&nd, operation, 0, UIO_SYSSPACE, pnamep, startvp, td); filemode |= O_NOFOLLOW; error = vn_open_cred(&nd, &filemode, createmode, 0, td->td_ucred, NULL); NDFREE(&nd, NDF_ONLY_PNBUF); @@ -223,12 +223,11 @@ zfs_vn_rdwr(enum uio_rw rw, vnode_t *vp, caddr_t base, ssize_t len, ssize_t *residp) { struct thread *td = curthread; - int error, vfslocked, resid; + int error, resid; ASSERT(ioflag == 0); ASSERT(ulimit == RLIM64_INFINITY); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); if (rw == UIO_WRITE) { ioflag = IO_SYNC; } else { @@ -236,7 +235,6 @@ zfs_vn_rdwr(enum uio_rw rw, vnode_t *vp, caddr_t base, ssize_t len, } error = vn_rdwr(rw, vp, base, len, offset, seg, ioflag, cr, NOCRED, &resid, td); - VFS_UNLOCK_GIANT(vfslocked); if (residp != NULL) *residp = (ssize_t)resid; return (error); @@ -248,11 +246,10 @@ static __inline int zfs_vop_fsync(vnode_t *vp, int flag, cred_t *cr) { struct mount *mp; - int error, vfslocked; + int error; ASSERT(flag == FSYNC); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); if ((error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0) goto drop; vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); @@ -260,7 +257,6 @@ zfs_vop_fsync(vnode_t *vp, int flag, cred_t *cr) VOP_UNLOCK(vp, 0); vn_finished_write(mp); drop: - VFS_UNLOCK_GIANT(vfslocked); return (error); } #define VOP_FSYNC(vp, flag, cr, ct) zfs_vop_fsync((vp), (flag), (cr)) @@ -268,14 +264,12 @@ drop: static __inline int zfs_vop_close(vnode_t *vp, int flag, int count, offset_t offset, cred_t *cr) { - int error, vfslocked; + int error; ASSERT(count == 1); ASSERT(offset == 0); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); error = vn_close(vp, flag, cr, curthread); - VFS_UNLOCK_GIANT(vfslocked); return (error); } #define VOP_CLOSE(vp, oflags, count, offset, cr, ct) \ diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c index be3cefc..a40269c 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c @@ -52,7 +52,7 @@ vdev_file_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift) vdev_file_t *vf; vnode_t *vp; vattr_t vattr; - int error, vfslocked; + int error; /* * We must have a pathname, and it must be absolute. @@ -112,11 +112,9 @@ skip_open: * Determine the physical size of the file. */ vattr.va_mask = AT_SIZE; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_SHARED | LK_RETRY); error = VOP_GETATTR(vp, &vattr, kcred); VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); if (error) { (void) VOP_CLOSE(vp, spa_mode(vd->vdev_spa), 1, 0, kcred, NULL); vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED; diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c index 14b6823..826d515 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c @@ -1079,14 +1079,12 @@ zfs_get_done(zgd_t *zgd, int error) { znode_t *zp = zgd->zgd_private; objset_t *os = zp->z_zfsvfs->z_os; - int vfslocked; if (zgd->zgd_db) dmu_buf_rele(zgd->zgd_db, zgd); zfs_range_unlock(zgd->zgd_rl); - vfslocked = VFS_LOCK_GIANT(zp->z_zfsvfs->z_vfs); /* * Release the vnode asynchronously as we currently have the * txg stopped from syncing. @@ -1097,7 +1095,6 @@ zfs_get_done(zgd_t *zgd, int error) zil_add_block(zgd->zgd_zilog, zgd->zgd_bp); kmem_free(zgd, sizeof (zgd_t)); - VFS_UNLOCK_GIANT(vfslocked); } #ifdef DEBUG @@ -6324,7 +6321,7 @@ vop_getextattr { } flags = FREAD; - NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_SYSSPACE, attrname, + NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, attrname, xvp, td); error = vn_open_cred(&nd, &flags, 0, 0, ap->a_cred, NULL); vp = nd.ni_vp; @@ -6392,7 +6389,7 @@ vop_deleteextattr { return (error); } - NDINIT_ATVP(&nd, DELETE, NOFOLLOW | LOCKPARENT | LOCKLEAF | MPSAFE, + NDINIT_ATVP(&nd, DELETE, NOFOLLOW | LOCKPARENT | LOCKLEAF, UIO_SYSSPACE, attrname, xvp, td); error = namei(&nd); vp = nd.ni_vp; @@ -6459,7 +6456,7 @@ vop_setextattr { } flags = FFLAGS(O_WRONLY | O_CREAT); - NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_SYSSPACE, attrname, + NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, attrname, xvp, td); error = vn_open_cred(&nd, &flags, 0600, 0, ap->a_cred, NULL); vp = nd.ni_vp; @@ -6540,7 +6537,7 @@ vop_listextattr { return (error); } - NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW | LOCKLEAF | LOCKSHARED | MPSAFE, + NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW | LOCKLEAF | LOCKSHARED, UIO_SYSSPACE, ".", xvp, td); error = namei(&nd); vp = nd.ni_vp; diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c index 2858812..cba6b2e 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c @@ -1395,7 +1395,6 @@ zfs_zinactive(znode_t *zp) vnode_t *vp = ZTOV(zp); zfsvfs_t *zfsvfs = zp->z_zfsvfs; uint64_t z_id = zp->z_id; - int vfslocked; ASSERT(zp->z_sa_hdl); @@ -1428,9 +1427,7 @@ zfs_zinactive(znode_t *zp) ZFS_OBJ_HOLD_EXIT(zfsvfs, z_id); ASSERT(vp->v_count == 0); vrecycle(vp, curthread); - vfslocked = VFS_LOCK_GIANT(zfsvfs->z_vfs); zfs_rmnode(zp); - VFS_UNLOCK_GIANT(vfslocked); return; } diff --git a/sys/compat/linprocfs/linprocfs.c b/sys/compat/linprocfs/linprocfs.c index 8832d3d..ad11ee6 100644 --- a/sys/compat/linprocfs/linprocfs.c +++ b/sys/compat/linprocfs/linprocfs.c @@ -335,7 +335,7 @@ linprocfs_domtab(PFS_FILL_ARGS) int error; /* resolve symlinks etc. in the emulation tree prefix */ - NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, linux_emul_path, td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, linux_emul_path, td); flep = NULL; error = namei(&nd); lep = linux_emul_path; @@ -343,7 +343,6 @@ linprocfs_domtab(PFS_FILL_ARGS) if (vn_fullpath(td, nd.ni_vp, &dlep, &flep) == 0) lep = dlep; vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(NDHASGIANT(&nd)); } lep_len = strlen(lep); @@ -414,7 +413,7 @@ linprocfs_dopartitions(PFS_FILL_ARGS) int major, minor; /* resolve symlinks etc. in the emulation tree prefix */ - NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, linux_emul_path, td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, linux_emul_path, td); flep = NULL; error = namei(&nd); lep = linux_emul_path; @@ -422,7 +421,6 @@ linprocfs_dopartitions(PFS_FILL_ARGS) if (vn_fullpath(td, nd.ni_vp, &dlep, &flep) == 0) lep = dlep; vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(NDHASGIANT(&nd)); } lep_len = strlen(lep); @@ -1144,7 +1142,6 @@ linprocfs_doprocmaps(PFS_FILL_ARGS) int error; struct vnode *vp; struct vattr vat; - int locked; PROC_LOCK(p); error = p_candebug(td, p); @@ -1197,12 +1194,10 @@ linprocfs_doprocmaps(PFS_FILL_ARGS) VM_OBJECT_UNLOCK(obj); if (vp) { vn_fullpath(td, vp, &name, &freename); - locked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_SHARED | LK_RETRY); VOP_GETATTR(vp, &vat, td->td_ucred); ino = vat.va_fileid; vput(vp); - VFS_UNLOCK_GIANT(locked); } } else { flags = 0; diff --git a/sys/compat/linux/linux_file.c b/sys/compat/linux/linux_file.c index e923032..3f14348 100644 --- a/sys/compat/linux/linux_file.c +++ b/sys/compat/linux/linux_file.c @@ -334,7 +334,7 @@ getdents_common(struct thread *td, struct linux_getdents64_args *args, struct l_dirent64 *linux_dirent64; int buflen, error, eofflag, nbytes, justone; u_long *cookies = NULL, *cookiep; - int ncookies, vfslocked; + int ncookies; nbytes = args->count; if (nbytes == 1) { @@ -355,9 +355,7 @@ getdents_common(struct thread *td, struct linux_getdents64_args *args, } vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); if (vp->v_type != VDIR) { - VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); return (EINVAL); } @@ -523,7 +521,6 @@ out: free(cookies, M_TEMP); VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); free(buf, M_TEMP); free(lbuf, M_TEMP); diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c index bbc805d..065cb9e 100644 --- a/sys/compat/linux/linux_misc.c +++ b/sys/compat/linux/linux_misc.c @@ -233,7 +233,7 @@ linux_uselib(struct thread *td, struct linux_uselib_args *args) unsigned long bss_size; char *library; int error; - int locked, vfslocked; + int locked; LCONVPATHEXIST(td, args->library, &library); @@ -243,11 +243,10 @@ linux_uselib(struct thread *td, struct linux_uselib_args *args) #endif a_out = NULL; - vfslocked = 0; locked = 0; vp = NULL; - NDINIT(&ni, LOOKUP, ISOPEN | FOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1, + NDINIT(&ni, LOOKUP, ISOPEN | FOLLOW | LOCKLEAF | AUDITVNODE1, UIO_SYSSPACE, library, td); error = namei(&ni); LFREEPATH(library); @@ -255,7 +254,6 @@ linux_uselib(struct thread *td, struct linux_uselib_args *args) goto cleanup; vp = ni.ni_vp; - vfslocked = NDHASGIANT(&ni); NDFREE(&ni, NDF_ONLY_PNBUF); /* @@ -379,7 +377,6 @@ linux_uselib(struct thread *td, struct linux_uselib_args *args) */ locked = 0; VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); /* * Check if file_offset page aligned. Currently we cannot handle @@ -458,10 +455,8 @@ linux_uselib(struct thread *td, struct linux_uselib_args *args) cleanup: /* Unlock vnode if needed */ - if (locked) { + if (locked) VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); - } /* Release the kernel mapping. */ if (a_out) diff --git a/sys/compat/ndis/subr_ndis.c b/sys/compat/ndis/subr_ndis.c index 4bdb6ef..c20e81dd 100644 --- a/sys/compat/ndis/subr_ndis.c +++ b/sys/compat/ndis/subr_ndis.c @@ -2741,7 +2741,7 @@ NdisOpenFile(status, filehandle, filelength, filename, highestaddr) char *afilename = NULL; struct thread *td = curthread; struct nameidata nd; - int flags, error, vfslocked; + int flags, error; struct vattr vat; struct vattr *vap = &vat; ndis_fh *fh; @@ -2821,7 +2821,7 @@ NdisOpenFile(status, filehandle, filelength, filename, highestaddr) if (td->td_proc->p_fd->fd_cdir == NULL) td->td_proc->p_fd->fd_cdir = rootvnode; - NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, path, td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, path, td); flags = FREAD; error = vn_open(&nd, &flags, 0, NULL); @@ -2833,7 +2833,6 @@ NdisOpenFile(status, filehandle, filelength, filename, highestaddr) free(afilename, M_DEVBUF); return; } - vfslocked = NDHASGIANT(&nd); ExFreePool(path); @@ -2842,7 +2841,6 @@ NdisOpenFile(status, filehandle, filelength, filename, highestaddr) /* Get the file size. */ VOP_GETATTR(nd.ni_vp, vap, td->td_ucred); VOP_UNLOCK(nd.ni_vp, 0); - VFS_UNLOCK_GIANT(vfslocked); fh->nf_vp = nd.ni_vp; fh->nf_map = NULL; @@ -2862,7 +2860,7 @@ NdisMapFile(status, mappedbuffer, filehandle) struct thread *td = curthread; linker_file_t lf; caddr_t kldstart; - int error, resid, vfslocked; + int error, resid; struct vnode *vp; if (filehandle == NULL) { @@ -2902,10 +2900,8 @@ NdisMapFile(status, mappedbuffer, filehandle) } vp = fh->nf_vp; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); error = vn_rdwr(UIO_READ, vp, fh->nf_map, fh->nf_maplen, 0, UIO_SYSSPACE, 0, td->td_ucred, NOCRED, &resid, td); - VFS_UNLOCK_GIANT(vfslocked); if (error) *status = NDIS_STATUS_FAILURE; @@ -2936,7 +2932,6 @@ NdisCloseFile(filehandle) { struct thread *td = curthread; ndis_fh *fh; - int vfslocked; struct vnode *vp; if (filehandle == NULL) @@ -2954,9 +2949,7 @@ NdisCloseFile(filehandle) if (fh->nf_type == NDIS_FH_TYPE_VFS) { vp = fh->nf_vp; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_close(vp, FREAD, td->td_ucred, td); - VFS_UNLOCK_GIANT(vfslocked); } fh->nf_vp = NULL; diff --git a/sys/compat/svr4/svr4_misc.c b/sys/compat/svr4/svr4_misc.c index c0a7478..3eedb35 100644 --- a/sys/compat/svr4/svr4_misc.c +++ b/sys/compat/svr4/svr4_misc.c @@ -241,7 +241,7 @@ svr4_sys_getdents64(td, uap) struct iovec aiov; off_t off; struct svr4_dirent64 svr4_dirent; - int buflen, error, eofflag, nbytes, justone, vfslocked; + int buflen, error, eofflag, nbytes, justone; u_long *cookies = NULL, *cookiep; int ncookies; @@ -258,9 +258,7 @@ svr4_sys_getdents64(td, uap) } vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); if (vp->v_type != VDIR) { - VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); return (EINVAL); } @@ -397,7 +395,6 @@ eof: td->td_retval[0] = nbytes - resid; out: VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); if (cookies) free(cookies, M_TEMP); @@ -422,7 +419,7 @@ svr4_sys_getdents(td, uap) struct iovec aiov; struct svr4_dirent idb; off_t off; /* true file offset */ - int buflen, error, eofflag, vfslocked; + int buflen, error, eofflag; u_long *cookiebuf = NULL, *cookie; int ncookies = 0, *retval = td->td_retval; @@ -439,9 +436,7 @@ svr4_sys_getdents(td, uap) } vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); if (vp->v_type != VDIR) { - VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); return (EINVAL); } @@ -534,7 +529,6 @@ eof: *retval = uap->nbytes - resid; out: VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); if (cookiebuf) free(cookiebuf, M_TEMP); @@ -614,7 +608,7 @@ svr4_sys_fchroot(td, uap) struct filedesc *fdp = td->td_proc->p_fd; struct vnode *vp; struct file *fp; - int error, vfslocked; + int error; if ((error = priv_check(td, PRIV_VFS_FCHROOT)) != 0) return error; @@ -624,7 +618,6 @@ svr4_sys_fchroot(td, uap) vp = fp->f_vnode; VREF(vp); fdrop(fp, td); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); error = change_dir(vp, td); if (error) @@ -637,11 +630,9 @@ svr4_sys_fchroot(td, uap) VOP_UNLOCK(vp, 0); error = change_root(vp, td); vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); fail: vput(vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -1652,13 +1643,12 @@ svr4_sys_resolvepath(td, uap) int error, *retval = td->td_retval; unsigned int ncopy; - NDINIT(&nd, LOOKUP, NOFOLLOW | SAVENAME | MPSAFE, UIO_USERSPACE, + NDINIT(&nd, LOOKUP, NOFOLLOW | SAVENAME, UIO_USERSPACE, uap->path, td); if ((error = namei(&nd)) != 0) return (error); NDFREE(&nd, NDF_NO_FREE_PNBUF); - VFS_UNLOCK_GIANT(NDHASGIANT(&nd)); ncopy = min(uap->bufsiz, strlen(nd.ni_cnd.cn_pnbuf) + 1); if ((error = copyout(nd.ni_cnd.cn_pnbuf, uap->buf, ncopy)) != 0) diff --git a/sys/dev/hwpmc/hwpmc_mod.c b/sys/dev/hwpmc/hwpmc_mod.c index 4cfcea8..11faaef 100644 --- a/sys/dev/hwpmc/hwpmc_mod.c +++ b/sys/dev/hwpmc/hwpmc_mod.c @@ -1626,7 +1626,6 @@ pmc_log_kernel_mappings(struct pmc *pm) static void pmc_log_process_mappings(struct pmc_owner *po, struct proc *p) { - int locked; vm_map_t map; struct vnode *vp; struct vmspace *vm; @@ -1736,9 +1735,7 @@ pmc_log_process_mappings(struct pmc_owner *po, struct proc *p) pmc_getfilename(vp, &fullpath, &freepath); last_vp = vp; - locked = VFS_LOCK_GIANT(vp->v_mount); vrele(vp); - VFS_UNLOCK_GIANT(locked); vp = NULL; pmclog_process_map_in(po, p->p_pid, start_addr, fullpath); diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c index 078eca8..b6b4795 100644 --- a/sys/dev/md/md.c +++ b/sys/dev/md/md.c @@ -511,7 +511,7 @@ mdstart_preload(struct md_s *sc, struct bio *bp) static int mdstart_vnode(struct md_s *sc, struct bio *bp) { - int error, vfslocked; + int error; struct uio auio; struct iovec aiov; struct mount *mp; @@ -541,13 +541,11 @@ mdstart_vnode(struct md_s *sc, struct bio *bp) */ if (bp->bio_cmd == BIO_FLUSH) { - vfslocked = VFS_LOCK_GIANT(vp->v_mount); (void) vn_start_write(vp, &mp, V_WAIT); vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); error = VOP_FSYNC(vp, MNT_WAIT, td); VOP_UNLOCK(vp, 0); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -569,7 +567,6 @@ mdstart_vnode(struct md_s *sc, struct bio *bp) auio.uio_rw = UIO_WRITE; auio.uio_td = td; end = bp->bio_offset + bp->bio_length; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); (void) vn_start_write(vp, &mp, V_WAIT); vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); error = 0; @@ -587,7 +584,6 @@ mdstart_vnode(struct md_s *sc, struct bio *bp) VOP_UNLOCK(vp, 0); vn_finished_write(mp); bp->bio_resid = end - auio.uio_offset; - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -609,7 +605,6 @@ mdstart_vnode(struct md_s *sc, struct bio *bp) * When reading set IO_DIRECT to try to avoid double-caching * the data. When writing IO_DIRECT is not optimal. */ - vfslocked = VFS_LOCK_GIANT(vp->v_mount); if (bp->bio_cmd == BIO_READ) { vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); error = VOP_READ(vp, &auio, IO_DIRECT, sc->cred); @@ -622,7 +617,6 @@ mdstart_vnode(struct md_s *sc, struct bio *bp) VOP_UNLOCK(vp, 0); vn_finished_write(mp); } - VFS_UNLOCK_GIANT(vfslocked); bp->bio_resid = auio.uio_resid; return (error); } @@ -962,7 +956,7 @@ mdcreate_vnode(struct md_s *sc, struct md_ioctl *mdio, struct thread *td) struct vattr vattr; struct nameidata nd; char *fname; - int error, flags, vfslocked; + int error, flags; /* * Kernel-originated requests must have the filename appended @@ -981,11 +975,10 @@ mdcreate_vnode(struct md_s *sc, struct md_ioctl *mdio, struct thread *td) * set the FWRITE mask before trying to open the backing store. */ flags = FREAD | ((mdio->md_options & MD_READONLY) ? 0 : FWRITE); - NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, sc->file, td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, sc->file, td); error = vn_open(&nd, &flags, 0, NULL); if (error != 0) return (error); - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); if (nd.ni_vp->v_type != VREG) { error = EINVAL; @@ -1021,19 +1014,16 @@ mdcreate_vnode(struct md_s *sc, struct md_ioctl *mdio, struct thread *td) nd.ni_vp->v_vflag &= ~VV_MD; goto bad; } - VFS_UNLOCK_GIANT(vfslocked); return (0); bad: VOP_UNLOCK(nd.ni_vp, 0); (void)vn_close(nd.ni_vp, flags, td->td_ucred, td); - VFS_UNLOCK_GIANT(vfslocked); return (error); } static int mddestroy(struct md_s *sc, struct thread *td) { - int vfslocked; if (sc->gp) { sc->gp->softc = NULL; @@ -1055,13 +1045,11 @@ mddestroy(struct md_s *sc, struct thread *td) mtx_unlock(&sc->queue_mtx); mtx_destroy(&sc->queue_mtx); if (sc->vnode != NULL) { - vfslocked = VFS_LOCK_GIANT(sc->vnode->v_mount); vn_lock(sc->vnode, LK_EXCLUSIVE | LK_RETRY); sc->vnode->v_vflag &= ~VV_MD; VOP_UNLOCK(sc->vnode, 0); (void)vn_close(sc->vnode, sc->flags & MD_READONLY ? FREAD : (FREAD|FWRITE), sc->cred, td); - VFS_UNLOCK_GIANT(vfslocked); } if (sc->cred != NULL) crfree(sc->cred); diff --git a/sys/fs/nfs/nfs_commonport.c b/sys/fs/nfs/nfs_commonport.c index 0320f47..92d0776 100644 --- a/sys/fs/nfs/nfs_commonport.c +++ b/sys/fs/nfs/nfs_commonport.c @@ -212,7 +212,7 @@ nfsrv_lookupfilename(struct nameidata *ndp, char *fname, NFSPROC_T *p) { int error; - NDINIT(ndp, LOOKUP, FOLLOW | LOCKLEAF | MPSAFE, UIO_USERSPACE, fname, + NDINIT(ndp, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE, fname, p); error = namei(ndp); if (!error) { diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c index 82f05d0..7010a5a 100644 --- a/sys/fs/nfsserver/nfs_nfsdport.c +++ b/sys/fs/nfsserver/nfs_nfsdport.c @@ -2035,8 +2035,7 @@ again: cn.cn_nameptr = dp->d_name; cn.cn_namelen = nlen; cn.cn_flags = ISLASTCN | - NOFOLLOW | LOCKLEAF | - MPSAFE; + NOFOLLOW | LOCKLEAF; if (nlen == 2 && dp->d_name[0] == '.' && dp->d_name[1] == '.') @@ -2620,10 +2619,7 @@ nfsvno_fhtovp(struct mount *mp, fhandle_t *fhp, struct sockaddr *nam, *credp = NULL; exp->nes_numsecflavor = 0; - if (VFS_NEEDSGIANT(mp)) - error = ESTALE; - else - error = VFS_FHTOVP(mp, &fhp->fh_fid, LK_EXCLUSIVE, vpp); + error = VFS_FHTOVP(mp, &fhp->fh_fid, LK_EXCLUSIVE, vpp); if (error != 0) /* Make sure the server replies ESTALE to the client. */ error = ESTALE; @@ -2806,7 +2802,7 @@ nfsrv_v4rootexport(void *argp, struct ucred *cred, struct thread *p) /* * If fspec != NULL, this is the v4root path. */ - NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_USERSPACE, + NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, nfsexargp->fspec, p); if ((error = namei(&nd)) != 0) goto out; diff --git a/sys/fs/procfs/procfs_map.c b/sys/fs/procfs/procfs_map.c index 4396aca..3f57add 100644 --- a/sys/fs/procfs/procfs_map.c +++ b/sys/fs/procfs/procfs_map.c @@ -84,7 +84,7 @@ procfs_doprocmap(PFS_FILL_ARGS) struct vnode *vp; char *fullpath, *freepath; struct ucred *cred; - int error, vfslocked; + int error; unsigned int last_timestamp; #ifdef COMPAT_FREEBSD32 int wrap32 = 0; @@ -189,9 +189,7 @@ procfs_doprocmap(PFS_FILL_ARGS) VM_OBJECT_UNLOCK(obj); if (vp != NULL) { vn_fullpath(td, vp, &fullpath, &freepath); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); } } else { type = "none"; diff --git a/sys/fs/unionfs/union_subr.c b/sys/fs/unionfs/union_subr.c index 2e74844..c5b727e 100644 --- a/sys/fs/unionfs/union_subr.c +++ b/sys/fs/unionfs/union_subr.c @@ -331,7 +331,6 @@ unionfs_nodeget_out: void unionfs_noderem(struct vnode *vp, struct thread *td) { - int vfslocked; int count; struct unionfs_node *unp, *unp_t1, *unp_t2; struct unionfs_node_hashhead *hd; @@ -363,20 +362,12 @@ unionfs_noderem(struct vnode *vp, struct thread *td) if (dvp != NULLVP && unp->un_hash.le_prev != NULL) unionfs_rem_cached_vnode(unp, dvp); - if (lvp != NULLVP) { - vfslocked = VFS_LOCK_GIANT(lvp->v_mount); + if (lvp != NULLVP) vrele(lvp); - VFS_UNLOCK_GIANT(vfslocked); - } - if (uvp != NULLVP) { - vfslocked = VFS_LOCK_GIANT(uvp->v_mount); + if (uvp != NULLVP) vrele(uvp); - VFS_UNLOCK_GIANT(vfslocked); - } if (dvp != NULLVP) { - vfslocked = VFS_LOCK_GIANT(dvp->v_mount); vrele(dvp); - VFS_UNLOCK_GIANT(vfslocked); unp->un_dvp = NULLVP; } if (unp->un_path != NULL) { diff --git a/sys/geom/geom_vfs.c b/sys/geom/geom_vfs.c index f90321d..a819ac2 100644 --- a/sys/geom/geom_vfs.c +++ b/sys/geom/geom_vfs.c @@ -33,7 +33,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include /* XXX Temporary for VFS_LOCK_GIANT */ #include #include @@ -69,7 +68,6 @@ static void g_vfs_done(struct bio *bip) { struct buf *bp; - int vfslocked; /* * Provider ('bio_to') could have withered away sometime @@ -93,9 +91,7 @@ g_vfs_done(struct bio *bip) bp->b_ioflags |= BIO_ERROR; bp->b_resid = bp->b_bcount - bip->bio_completed; g_destroy_bio(bip); - vfslocked = VFS_LOCK_GIANT(((struct mount *)NULL)); bufdone(bp); - VFS_UNLOCK_GIANT(vfslocked); } void @@ -103,7 +99,6 @@ g_vfs_strategy(struct bufobj *bo, struct buf *bp) { struct g_consumer *cp; struct bio *bip; - int vfslocked; cp = bo->bo_private; /* G_VALID_CONSUMER(cp); We likely lack topology lock */ @@ -114,9 +109,7 @@ g_vfs_strategy(struct bufobj *bo, struct buf *bp) if (cp->provider == NULL) { bp->b_error = ENXIO; bp->b_ioflags |= BIO_ERROR; - vfslocked = VFS_LOCK_GIANT(((struct mount *)NULL)); bufdone(bp); - VFS_UNLOCK_GIANT(vfslocked); return; } @@ -155,7 +148,6 @@ g_vfs_open(struct vnode *vp, struct g_consumer **cpp, const char *fsname, int wr struct g_provider *pp; struct g_consumer *cp; struct bufobj *bo; - int vfslocked; int error; g_topology_assert(); @@ -176,9 +168,7 @@ g_vfs_open(struct vnode *vp, struct g_consumer **cpp, const char *fsname, int wr g_wither_geom(gp, ENXIO); return (error); } - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vnode_create_vobject(vp, pp->mediasize, curthread); - VFS_UNLOCK_GIANT(vfslocked); *cpp = cp; cp->private = vp; bo->bo_ops = g_vfs_bufops; diff --git a/sys/geom/journal/g_journal.c b/sys/geom/journal/g_journal.c index 254ba92..08fce18 100644 --- a/sys/geom/journal/g_journal.c +++ b/sys/geom/journal/g_journal.c @@ -2869,7 +2869,7 @@ g_journal_do_switch(struct g_class *classp) struct mount *mp; struct bintime bt; char *mountpoint; - int error, vfslocked; + int error; DROP_GIANT(); g_topology_lock(); @@ -2921,11 +2921,8 @@ g_journal_do_switch(struct g_class *classp) mountpoint = mp->mnt_stat.f_mntonname; - vfslocked = VFS_LOCK_GIANT(mp); - error = vn_start_write(NULL, &mp, V_WAIT); if (error != 0) { - VFS_UNLOCK_GIANT(vfslocked); GJ_DEBUG(0, "vn_start_write(%s) failed (error=%d).", mountpoint, error); goto next; @@ -2957,10 +2954,8 @@ g_journal_do_switch(struct g_class *classp) vn_finished_write(mp); - if (error != 0) { - VFS_UNLOCK_GIANT(vfslocked); + if (error != 0) goto next; - } /* * Send BIO_FLUSH before freezing the file system, so it can be @@ -2972,7 +2967,6 @@ g_journal_do_switch(struct g_class *classp) GJ_TIMER_START(1, &bt); error = vfs_write_suspend(mp); - VFS_UNLOCK_GIANT(vfslocked); GJ_TIMER_STOP(1, &bt, "Suspend time of %s", mountpoint); if (error != 0) { GJ_DEBUG(0, "Cannot suspend file system %s (error=%d).", diff --git a/sys/i386/ibcs2/ibcs2_misc.c b/sys/i386/ibcs2/ibcs2_misc.c index a08fdf3..01bb2cc 100644 --- a/sys/i386/ibcs2/ibcs2_misc.c +++ b/sys/i386/ibcs2/ibcs2_misc.c @@ -331,7 +331,7 @@ ibcs2_getdents(td, uap) struct iovec aiov; struct ibcs2_dirent idb; off_t off; /* true file offset */ - int buflen, error, eofflag, vfslocked; + int buflen, error, eofflag; u_long *cookies = NULL, *cookiep; int ncookies; #define BSD_DIRENT(cp) ((struct dirent *)(cp)) @@ -345,9 +345,7 @@ ibcs2_getdents(td, uap) return (EBADF); } vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); if (vp->v_type != VDIR) { /* XXX vnode readdir op should do this */ - VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); return (EINVAL); } @@ -464,7 +462,6 @@ eof: td->td_retval[0] = uap->nbytes - resid; out: VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); if (cookies) free(cookies, M_TEMP); @@ -490,7 +487,7 @@ ibcs2_read(td, uap) char name[14]; } idb; off_t off; /* true file offset */ - int buflen, error, eofflag, size, vfslocked; + int buflen, error, eofflag, size; u_long *cookies = NULL, *cookiep; int ncookies; @@ -506,9 +503,7 @@ ibcs2_read(td, uap) return (EBADF); } vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); if (vp->v_type != VDIR) { - VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); return read(td, (struct read_args *)uap); } @@ -631,7 +626,6 @@ eof: td->td_retval[0] = uap->nbytes - resid; out: VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); if (cookies) free(cookies, M_TEMP); diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c index 45f6d64..5054e75 100644 --- a/sys/kern/imgact_elf.c +++ b/sys/kern/imgact_elf.c @@ -578,7 +578,7 @@ __elfN(load_file)(struct proc *p, const char *file, u_long *addr, vm_prot_t prot; u_long rbase; u_long base_addr = 0; - int vfslocked, error, i, numsegs; + int error, i, numsegs; #ifdef CAPABILITY_MODE /* @@ -604,14 +604,11 @@ __elfN(load_file)(struct proc *p, const char *file, u_long *addr, imgp->object = NULL; imgp->execlabel = NULL; - NDINIT(nd, LOOKUP, MPSAFE|LOCKLEAF|FOLLOW, UIO_SYSSPACE, file, - curthread); - vfslocked = 0; + NDINIT(nd, LOOKUP, LOCKLEAF | FOLLOW, UIO_SYSSPACE, file, curthread); if ((error = namei(nd)) != 0) { nd->ni_vp = NULL; goto fail; } - vfslocked = NDHASGIANT(nd); NDFREE(nd, NDF_ONLY_PNBUF); imgp->vp = nd->ni_vp; @@ -690,7 +687,6 @@ fail: if (nd->ni_vp) vput(nd->ni_vp); - VFS_UNLOCK_GIANT(vfslocked); free(tempdata, M_TEMP); return (error); diff --git a/sys/kern/kern_acct.c b/sys/kern/kern_acct.c index c7ba517..d783ed3 100644 --- a/sys/kern/kern_acct.c +++ b/sys/kern/kern_acct.c @@ -196,7 +196,7 @@ int acct(struct thread *td, struct acct_args *uap) { struct nameidata nd; - int error, flags, vfslocked; + int error, flags; error = priv_check(td, PRIV_ACCT); if (error) @@ -207,30 +207,26 @@ acct(struct thread *td, struct acct_args *uap) * appending and make sure it's a 'normal'. */ if (uap->path != NULL) { - NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE | AUDITVNODE1, + NDINIT(&nd, LOOKUP, NOFOLLOW | AUDITVNODE1, UIO_USERSPACE, uap->path, td); flags = FWRITE | O_APPEND; error = vn_open(&nd, &flags, 0, NULL); if (error) return (error); - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); #ifdef MAC error = mac_system_check_acct(td->td_ucred, nd.ni_vp); if (error) { VOP_UNLOCK(nd.ni_vp, 0); vn_close(nd.ni_vp, flags, td->td_ucred, td); - VFS_UNLOCK_GIANT(vfslocked); return (error); } #endif VOP_UNLOCK(nd.ni_vp, 0); if (nd.ni_vp->v_type != VREG) { vn_close(nd.ni_vp, flags, td->td_ucred, td); - VFS_UNLOCK_GIANT(vfslocked); return (EACCES); } - VFS_UNLOCK_GIANT(vfslocked); #ifdef MAC } else { error = mac_system_check_acct(td->td_ucred, NULL); @@ -252,11 +248,8 @@ acct(struct thread *td, struct acct_args *uap) * enabled. */ acct_suspended = 0; - if (acct_vp != NULL) { - vfslocked = VFS_LOCK_GIANT(acct_vp->v_mount); + if (acct_vp != NULL) error = acct_disable(td); - VFS_UNLOCK_GIANT(vfslocked); - } if (uap->path == NULL) { if (acct_state & ACCT_RUNNING) { acct_state |= ACCT_EXITREQ; @@ -284,9 +277,7 @@ acct(struct thread *td, struct acct_args *uap) error = kproc_create(acct_thread, NULL, NULL, 0, 0, "accounting"); if (error) { - vfslocked = VFS_LOCK_GIANT(acct_vp->v_mount); (void) vn_close(acct_vp, acct_flags, acct_cred, td); - VFS_UNLOCK_GIANT(vfslocked); crfree(acct_cred); acct_configured = 0; acct_vp = NULL; @@ -337,7 +328,7 @@ acct_process(struct thread *td) struct plimit *newlim, *oldlim; struct proc *p; struct rusage ru; - int t, ret, vfslocked; + int t, ret; /* * Lockless check of accounting condition before doing the hard @@ -433,11 +424,9 @@ acct_process(struct thread *td) /* * Write the accounting information to the file. */ - vfslocked = VFS_LOCK_GIANT(acct_vp->v_mount); ret = vn_rdwr(UIO_WRITE, acct_vp, (caddr_t)&acct, sizeof (acct), (off_t)0, UIO_SYSSPACE, IO_APPEND|IO_UNIT, acct_cred, NOCRED, NULL, td); - VFS_UNLOCK_GIANT(vfslocked); sx_sunlock(&acct_sx); return (ret); } @@ -554,7 +543,6 @@ static void acctwatch(void) { struct statfs sb; - int vfslocked; sx_assert(&acct_sx, SX_XLOCKED); @@ -572,10 +560,8 @@ acctwatch(void) * If our vnode is no longer valid, tear it down and signal the * accounting thread to die. */ - vfslocked = VFS_LOCK_GIANT(acct_vp->v_mount); if (acct_vp->v_type == VBAD) { (void) acct_disable(NULL); - VFS_UNLOCK_GIANT(vfslocked); acct_state |= ACCT_EXITREQ; return; } @@ -584,11 +570,8 @@ acctwatch(void) * Stopping here is better than continuing, maybe it will be VBAD * next time around. */ - if (VFS_STATFS(acct_vp->v_mount, &sb) < 0) { - VFS_UNLOCK_GIANT(vfslocked); + if (VFS_STATFS(acct_vp->v_mount, &sb) < 0) return; - } - VFS_UNLOCK_GIANT(vfslocked); if (acct_suspended) { if (sb.f_bavail > (int64_t)(acctresume * sb.f_blocks / 100)) { diff --git a/sys/kern/kern_alq.c b/sys/kern/kern_alq.c index 98e6de8..893d2f8 100644 --- a/sys/kern/kern_alq.c +++ b/sys/kern/kern_alq.c @@ -313,7 +313,6 @@ alq_doio(struct alq *alq) struct iovec aiov[2]; int totlen; int iov; - int vfslocked; int wrapearly; KASSERT((HAS_PENDING_DATA(alq)), ("%s: queue empty!", __func__)); @@ -365,7 +364,6 @@ alq_doio(struct alq *alq) /* * Do all of the junk required to write now. */ - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_start_write(vp, &mp, V_WAIT); vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); /* @@ -377,7 +375,6 @@ alq_doio(struct alq *alq) VOP_WRITE(vp, &auio, IO_UNIT | IO_APPEND, alq->aq_cred); VOP_UNLOCK(vp, 0); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); ALQ_LOCK(alq); alq->aq_flags &= ~AQ_FLUSHING; @@ -438,25 +435,22 @@ alq_open_flags(struct alq **alqp, const char *file, struct ucred *cred, int cmod struct alq *alq; int oflags; int error; - int vfslocked; KASSERT((size > 0), ("%s: size <= 0", __func__)); *alqp = NULL; td = curthread; - NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_SYSSPACE, file, td); + NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, file, td); oflags = FWRITE | O_NOFOLLOW | O_CREAT; error = vn_open_cred(&nd, &oflags, cmode, 0, cred, NULL); if (error) return (error); - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); /* We just unlock so we hold a reference */ VOP_UNLOCK(nd.ni_vp, 0); - VFS_UNLOCK_GIANT(vfslocked); alq = malloc(sizeof(*alq), M_ALD, M_WAITOK|M_ZERO); alq->aq_vp = nd.ni_vp; diff --git a/sys/kern/kern_ctf.c b/sys/kern/kern_ctf.c index 758ad81..f01fb24 100644 --- a/sys/kern/kern_ctf.c +++ b/sys/kern/kern_ctf.c @@ -69,7 +69,6 @@ link_elf_ctf_get(linker_file_t lf, linker_ctf_t *lc) int i; int nbytes; int resid; - int vfslocked; size_t sz; struct nameidata nd; struct thread *td = curthread; @@ -114,12 +113,11 @@ link_elf_ctf_get(linker_file_t lf, linker_ctf_t *lc) */ ef->ctfcnt = -1; - NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, lf->pathname, td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, lf->pathname, td); flags = FREAD; error = vn_open(&nd, &flags, 0, NULL); if (error) return (error); - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); /* Allocate memory for the FLF header. */ @@ -305,7 +303,6 @@ link_elf_ctf_get(linker_file_t lf, linker_ctf_t *lc) out: VOP_UNLOCK(nd.ni_vp, 0); vn_close(nd.ni_vp, FREAD, td->td_ucred, td); - VFS_UNLOCK_GIANT(vfslocked); if (hdr != NULL) free(hdr, M_LINKER); diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index 4aaed1f..5c2b737 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -465,11 +465,9 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) char *pop; struct vnode *vp; int error, flg, tmp; - int vfslocked; u_int old, new; uint64_t bsize; - vfslocked = 0; error = 0; flg = F_POSIX; p = td->td_proc; @@ -625,7 +623,6 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) fhold(fp); FILEDESC_SUNLOCK(fdp); vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); switch (flp->l_type) { case F_RDLCK: if ((fp->f_flag & FREAD) == 0) { @@ -669,8 +666,6 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) error = EINVAL; break; } - VFS_UNLOCK_GIANT(vfslocked); - vfslocked = 0; /* Check for race with close */ FILEDESC_SLOCK(fdp); if ((unsigned) fd >= fdp->fd_nfiles || @@ -680,11 +675,8 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) flp->l_start = 0; flp->l_len = 0; flp->l_type = F_UNLCK; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); (void) VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_UNLCK, flp, F_POSIX); - VFS_UNLOCK_GIANT(vfslocked); - vfslocked = 0; } else FILEDESC_SUNLOCK(fdp); fdrop(fp, td); @@ -726,11 +718,8 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) fhold(fp); FILEDESC_SUNLOCK(fdp); vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_GETLK, flp, F_POSIX); - VFS_UNLOCK_GIANT(vfslocked); - vfslocked = 0; fdrop(fp, td); break; @@ -753,7 +742,6 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) FILEDESC_SUNLOCK(fdp); if (arg != 0) { vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); error = vn_lock(vp, LK_SHARED); if (error != 0) goto readahead_vnlock_fail; @@ -764,9 +752,7 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) new = old = fp->f_flag; new |= FRDAHEAD; } while (!atomic_cmpset_rel_int(&fp->f_flag, old, new)); -readahead_vnlock_fail: - VFS_UNLOCK_GIANT(vfslocked); - vfslocked = 0; + readahead_vnlock_fail:; } else { do { new = old = fp->f_flag; @@ -780,7 +766,6 @@ readahead_vnlock_fail: error = EINVAL; break; } - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -1402,12 +1387,9 @@ fpathconf(struct thread *td, struct fpathconf_args *uap) } vp = fp->f_vnode; if (vp != NULL) { - int vfslocked; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_SHARED | LK_RETRY); error = VOP_PATHCONF(vp, uap->name, td->td_retval); VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); } else if (fp->f_type == DTYPE_PIPE || fp->f_type == DTYPE_SOCKET) { if (uap->name != _PC_PIPE_BUF) { error = EINVAL; @@ -1845,7 +1827,7 @@ fdfree(struct thread *td) { struct filedesc *fdp; struct file **fpp; - int i, locked; + int i; struct filedesc_to_leader *fdtol; struct file *fp; struct vnode *cdir, *jdir, *rdir, *vp; @@ -1885,14 +1867,12 @@ fdfree(struct thread *td) lf.l_len = 0; lf.l_type = F_UNLCK; vp = fp->f_vnode; - locked = VFS_LOCK_GIANT(vp->v_mount); (void) VOP_ADVLOCK(vp, (caddr_t)td->td_proc-> p_leader, F_UNLCK, &lf, F_POSIX); - VFS_UNLOCK_GIANT(locked); FILEDESC_XLOCK(fdp); fdrop(fp, td); fpp = fdp->fd_ofiles + i; @@ -1972,21 +1952,12 @@ fdfree(struct thread *td) fdp->fd_jdir = NULL; FILEDESC_XUNLOCK(fdp); - if (cdir) { - locked = VFS_LOCK_GIANT(cdir->v_mount); + if (cdir) vrele(cdir); - VFS_UNLOCK_GIANT(locked); - } - if (rdir) { - locked = VFS_LOCK_GIANT(rdir->v_mount); + if (rdir) vrele(rdir); - VFS_UNLOCK_GIANT(locked); - } - if (jdir) { - locked = VFS_LOCK_GIANT(jdir->v_mount); + if (jdir) vrele(jdir); - VFS_UNLOCK_GIANT(locked); - } fddrop(fdp); } @@ -2195,10 +2166,7 @@ closef(struct file *fp, struct thread *td) */ (void)cap_funwrap(fp, 0, &fp_object); if ((fp_object->f_type == DTYPE_VNODE) && (td != NULL)) { - int vfslocked; - vp = fp_object->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); if ((td->td_proc->p_leader->p_flag & P_ADVLOCK) != 0) { lf.l_whence = SEEK_SET; lf.l_start = 0; @@ -2241,7 +2209,6 @@ closef(struct file *fp, struct thread *td) } FILEDESC_XUNLOCK(fdp); } - VFS_UNLOCK_GIANT(vfslocked); } return (fdrop(fp, td)); } @@ -2607,7 +2574,6 @@ flock(struct thread *td, struct flock_args *uap) struct file *fp; struct vnode *vp; struct flock lf; - int vfslocked; int error; if ((error = fget(td, uap->fd, CAP_FLOCK, &fp)) != 0) @@ -2618,7 +2584,6 @@ flock(struct thread *td, struct flock_args *uap) } vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); lf.l_whence = SEEK_SET; lf.l_start = 0; lf.l_len = 0; @@ -2641,7 +2606,6 @@ flock(struct thread *td, struct flock_args *uap) (uap->how & LOCK_NB) ? F_FLOCK : F_FLOCK | F_WAIT); done2: fdrop(fp, td); - VFS_UNLOCK_GIANT(vfslocked); return (error); } /* @@ -2914,7 +2878,6 @@ export_vnode_for_osysctl(struct vnode *vp, int type, { int error; char *fullpath, *freepath; - int vfslocked; bzero(kif, sizeof(*kif)); kif->kf_structsize = sizeof(*kif); @@ -2940,9 +2903,7 @@ export_vnode_for_osysctl(struct vnode *vp, int type, fullpath = "-"; FILEDESC_SUNLOCK(fdp); vn_fullpath(curthread, vp, &fullpath, &freepath); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); strlcpy(kif->kf_path, fullpath, sizeof(kif->kf_path)); if (freepath != NULL) free(freepath, M_TEMP); @@ -2966,7 +2927,6 @@ sysctl_kern_proc_ofiledesc(SYSCTL_HANDLER_ARGS) struct file *fp; struct proc *p; struct tty *tp; - int vfslocked; name = (int *)arg1; if ((p = pfind((pid_t)name[0])) == NULL) @@ -3131,9 +3091,7 @@ sysctl_kern_proc_ofiledesc(SYSCTL_HANDLER_ARGS) fullpath = "-"; FILEDESC_SUNLOCK(fdp); vn_fullpath(curthread, vp, &fullpath, &freepath); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); strlcpy(kif->kf_path, fullpath, sizeof(kif->kf_path)); if (freepath != NULL) @@ -3206,7 +3164,7 @@ export_fd_for_sysctl(void *data, int type, int fd, int fflags, int refcnt, }; #define NFFLAGS (sizeof(fflags_table) / sizeof(*fflags_table)) struct vnode *vp; - int error, vfslocked; + int error; unsigned int i; bzero(kif, sizeof(*kif)); @@ -3215,9 +3173,7 @@ export_fd_for_sysctl(void *data, int type, int fd, int fflags, int refcnt, case KF_TYPE_VNODE: vp = (struct vnode *)data; error = fill_vnode_info(vp, kif); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); break; case KF_TYPE_SOCKET: error = fill_socket_info((struct socket *)data, kif); @@ -3491,7 +3447,7 @@ fill_vnode_info(struct vnode *vp, struct kinfo_file *kif) { struct vattr va; char *fullpath, *freepath; - int error, vfslocked; + int error; if (vp == NULL) return (1); @@ -3510,11 +3466,9 @@ fill_vnode_info(struct vnode *vp, struct kinfo_file *kif) */ va.va_fsid = VNOVAL; va.va_rdev = NODEV; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_SHARED | LK_RETRY); error = VOP_GETATTR(vp, &va, curthread->td_ucred); VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); if (error != 0) return (error); if (va.va_fsid != VNOVAL) diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index 1c42420..e2c8285 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -340,7 +340,6 @@ do_execve(td, args, mac_p) #endif struct vnode *textvp = NULL, *binvp = NULL; int credential_changing; - int vfslocked; int textset; #ifdef MAC struct label *interpvplabel = NULL; @@ -351,7 +350,6 @@ do_execve(td, args, mac_p) #endif static const char fexecv_proc_title[] = "(fexecv)"; - vfslocked = 0; imgp = &image_params; /* @@ -411,7 +409,7 @@ do_execve(td, args, mac_p) */ if (args->fname != NULL) { NDINIT(&nd, LOOKUP, ISOPEN | LOCKLEAF | FOLLOW | SAVENAME - | MPSAFE | AUDITVNODE1, UIO_SYSSPACE, args->fname, td); + | AUDITVNODE1, UIO_SYSSPACE, args->fname, td); } SDT_PROBE(proc, kernel, , exec, args->fname, 0, 0, 0, 0 ); @@ -434,7 +432,6 @@ interpret: if (error) goto exec_fail; - vfslocked = NDHASGIANT(&nd); binvp = nd.ni_vp; imgp->vp = binvp; } else { @@ -446,7 +443,6 @@ interpret: error = fgetvp_read(td, args->fd, CAP_FEXECVE, &binvp); if (error) goto exec_fail; - vfslocked = VFS_LOCK_GIANT(binvp->v_mount); vn_lock(binvp, LK_EXCLUSIVE | LK_RETRY); AUDIT_ARG_VNODE1(binvp); imgp->vp = binvp; @@ -535,10 +531,8 @@ interpret: vput(binvp); vm_object_deallocate(imgp->object); imgp->object = NULL; - VFS_UNLOCK_GIANT(vfslocked); - vfslocked = 0; /* set new name to that of the interpreter */ - NDINIT(&nd, LOOKUP, LOCKLEAF | FOLLOW | SAVENAME | MPSAFE, + NDINIT(&nd, LOOKUP, LOCKLEAF | FOLLOW | SAVENAME, UIO_SYSSPACE, imgp->interpreter_name, td); args->fname = imgp->interpreter_name; goto interpret; @@ -847,23 +841,13 @@ done1: /* * Handle deferred decrement of ref counts. */ - if (textvp != NULL) { - int tvfslocked; - - tvfslocked = VFS_LOCK_GIANT(textvp->v_mount); + if (textvp != NULL) vrele(textvp); - VFS_UNLOCK_GIANT(tvfslocked); - } if (binvp && error != 0) vrele(binvp); #ifdef KTRACE - if (tracevp != NULL) { - int tvfslocked; - - tvfslocked = VFS_LOCK_GIANT(tracevp->v_mount); + if (tracevp != NULL) vrele(tracevp); - VFS_UNLOCK_GIANT(tvfslocked); - } if (tracecred != NULL) crfree(tracecred); #endif @@ -920,7 +904,6 @@ done2: mac_execve_exit(imgp); mac_execve_interpreter_exit(interpvplabel); #endif - VFS_UNLOCK_GIANT(vfslocked); exec_free_args(args); if (error && imgp->vmspace_destroyed) { diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index e5d6094..fcc9ccf 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -123,7 +123,6 @@ exit1(struct thread *td, int rv) struct vnode *vtmp; struct vnode *ttyvp = NULL; struct plimit *plim; - int locked; mtx_assert(&Giant, MA_NOTOWNED); @@ -363,9 +362,7 @@ exit1(struct thread *td, int rv) */ if ((vtmp = p->p_textvp) != NULL) { p->p_textvp = NULL; - locked = VFS_LOCK_GIANT(vtmp->v_mount); vrele(vtmp); - VFS_UNLOCK_GIANT(locked); } /* diff --git a/sys/kern/kern_jail.c b/sys/kern/kern_jail.c index 050563b..ba58472 100644 --- a/sys/kern/kern_jail.c +++ b/sys/kern/kern_jail.c @@ -530,7 +530,7 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags) int created, cuflags, descend, enforce, error, errmsg_len, errmsg_pos; int gotchildmax, gotenforce, gothid, gotslevel; int fi, jid, jsys, len, level; - int childmax, slevel, vfslocked; + int childmax, slevel; #if defined(INET) || defined(INET6) int ii, ij; #endif @@ -906,21 +906,17 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags) error = ENAMETOOLONG; goto done_free; } - NDINIT(&nd, LOOKUP, MPSAFE | FOLLOW, UIO_SYSSPACE, - path, td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, path, td); error = namei(&nd); if (error) goto done_free; - vfslocked = NDHASGIANT(&nd); root = nd.ni_vp; NDFREE(&nd, NDF_ONLY_PNBUF); if (root->v_type != VDIR) { error = ENOTDIR; vrele(root); - VFS_UNLOCK_GIANT(vfslocked); goto done_free; } - VFS_UNLOCK_GIANT(vfslocked); } } @@ -1777,11 +1773,8 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags) done_unlock_list: sx_xunlock(&allprison_lock); done_releroot: - if (root != NULL) { - vfslocked = VFS_LOCK_GIANT(root->v_mount); + if (root != NULL) vrele(root); - VFS_UNLOCK_GIANT(vfslocked); - } done_errmsg: if (error) { vfs_getopt(opts, "errmsg", (void **)&errmsg, &errmsg_len); @@ -2256,7 +2249,7 @@ do_jail_attach(struct thread *td, struct prison *pr) struct prison *ppr; struct proc *p; struct ucred *newcred, *oldcred; - int vfslocked, error; + int error; /* * XXX: Note that there is a slight race here if two threads @@ -2287,7 +2280,6 @@ do_jail_attach(struct thread *td, struct prison *pr) if (error) goto e_revert_osd; - vfslocked = VFS_LOCK_GIANT(pr->pr_root->v_mount); vn_lock(pr->pr_root, LK_EXCLUSIVE | LK_RETRY); if ((error = change_dir(pr->pr_root, td)) != 0) goto e_unlock; @@ -2297,8 +2289,7 @@ do_jail_attach(struct thread *td, struct prison *pr) #endif VOP_UNLOCK(pr->pr_root, 0); if ((error = change_root(pr->pr_root, td))) - goto e_unlock_giant; - VFS_UNLOCK_GIANT(vfslocked); + goto e_revert_osd; newcred = crget(); PROC_LOCK(p); @@ -2316,8 +2307,6 @@ do_jail_attach(struct thread *td, struct prison *pr) return (0); e_unlock: VOP_UNLOCK(pr->pr_root, 0); - e_unlock_giant: - VFS_UNLOCK_GIANT(vfslocked); e_revert_osd: /* Tell modules this thread is still in its old jail after all. */ (void)osd_jail_call(ppr, PR_METHOD_ATTACH, td); @@ -2466,7 +2455,6 @@ static void prison_deref(struct prison *pr, int flags) { struct prison *ppr, *tpr; - int vfslocked; if (!(flags & PD_LOCKED)) mtx_lock(&pr->pr_mtx); @@ -2528,11 +2516,8 @@ prison_deref(struct prison *pr, int flags) if (pr->pr_vnet != ppr->pr_vnet) vnet_destroy(pr->pr_vnet); #endif - if (pr->pr_root != NULL) { - vfslocked = VFS_LOCK_GIANT(pr->pr_root->v_mount); + if (pr->pr_root != NULL) vrele(pr->pr_root); - VFS_UNLOCK_GIANT(vfslocked); - } mtx_destroy(&pr->pr_mtx); #ifdef INET free(pr->pr_ip4, M_PRISON); diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c index 5db5aee..4076b5c 100644 --- a/sys/kern/kern_ktrace.c +++ b/sys/kern/kern_ktrace.c @@ -506,7 +506,6 @@ ktrprocexit(struct thread *td) struct proc *p; struct ucred *cred; struct vnode *vp; - int vfslocked; p = td->td_proc; if (p->p_traceflag == 0) @@ -524,11 +523,8 @@ ktrprocexit(struct thread *td) ktr_freeproc(p, &cred, &vp); mtx_unlock(&ktrace_mtx); PROC_UNLOCK(p); - if (vp != NULL) { - vfslocked = VFS_LOCK_GIANT(vp->v_mount); + if (vp != NULL) vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); - } if (cred != NULL) crfree(cred); ktrace_exit(td); @@ -794,7 +790,7 @@ ktrace(td, uap) int ops = KTROP(uap->ops); int descend = uap->ops & KTRFLAG_DESCEND; int nfound, ret = 0; - int flags, error = 0, vfslocked; + int flags, error = 0; struct nameidata nd; struct ucred *cred; @@ -809,25 +805,21 @@ ktrace(td, uap) /* * an operation which requires a file argument. */ - NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_USERSPACE, - uap->fname, td); + NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, uap->fname, td); flags = FREAD | FWRITE | O_NOFOLLOW; error = vn_open(&nd, &flags, 0, NULL); if (error) { ktrace_exit(td); return (error); } - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); vp = nd.ni_vp; VOP_UNLOCK(vp, 0); if (vp->v_type != VREG) { (void) vn_close(vp, FREAD|FWRITE, td->td_ucred, td); - VFS_UNLOCK_GIANT(vfslocked); ktrace_exit(td); return (EACCES); } - VFS_UNLOCK_GIANT(vfslocked); } /* * Clear all uses of the tracefile. @@ -853,10 +845,8 @@ ktrace(td, uap) } sx_sunlock(&allproc_lock); if (vrele_count > 0) { - vfslocked = VFS_LOCK_GIANT(vp->v_mount); while (vrele_count-- > 0) vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); } goto done; } @@ -922,11 +912,8 @@ ktrace(td, uap) if (!ret) error = EPERM; done: - if (vp != NULL) { - vfslocked = VFS_LOCK_GIANT(vp->v_mount); + if (vp != NULL) (void) vn_close(vp, FWRITE, td->td_ucred, td); - VFS_UNLOCK_GIANT(vfslocked); - } ktrace_exit(td); return (error); #else /* !KTRACE */ @@ -1018,13 +1005,8 @@ ktrops(td, p, ops, facs, vp) if ((p->p_traceflag & KTRFAC_MASK) != 0) ktrprocctor_entered(td, p); PROC_UNLOCK(p); - if (tracevp != NULL) { - int vfslocked; - - vfslocked = VFS_LOCK_GIANT(tracevp->v_mount); + if (tracevp != NULL) vrele(tracevp); - VFS_UNLOCK_GIANT(vfslocked); - } if (tracecred != NULL) crfree(tracecred); @@ -1078,7 +1060,7 @@ ktr_writerequest(struct thread *td, struct ktr_request *req) struct iovec aiov[3]; struct mount *mp; int datalen, buflen, vrele_count; - int error, vfslocked; + int error; /* * We hold the vnode and credential for use in I/O in case ktrace is @@ -1136,7 +1118,6 @@ ktr_writerequest(struct thread *td, struct ktr_request *req) auio.uio_iovcnt++; } - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_start_write(vp, &mp, V_WAIT); vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); #ifdef MAC @@ -1149,10 +1130,8 @@ ktr_writerequest(struct thread *td, struct ktr_request *req) crfree(cred); if (!error) { vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); return; } - VFS_UNLOCK_GIANT(vfslocked); /* * If error encountered, give up tracing on this vnode. We defer @@ -1191,10 +1170,8 @@ ktr_writerequest(struct thread *td, struct ktr_request *req) } sx_sunlock(&allproc_lock); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); while (vrele_count-- > 0) vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); } /* diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c index 4337c95..9e6c574 100644 --- a/sys/kern/kern_linker.c +++ b/sys/kern/kern_linker.c @@ -1688,7 +1688,7 @@ linker_lookup_file(const char *path, int pathlen, const char *name, struct nameidata nd; struct thread *td = curthread; /* XXX */ char *result, **cpp, *sep; - int error, len, extlen, reclen, flags, vfslocked; + int error, len, extlen, reclen, flags; enum vtype type; extlen = 0; @@ -1709,18 +1709,16 @@ linker_lookup_file(const char *path, int pathlen, const char *name, * Attempt to open the file, and return the path if * we succeed and it's a regular file. */ - NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, result, td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, result, td); flags = FREAD; error = vn_open(&nd, &flags, 0, NULL); if (error == 0) { - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); type = nd.ni_vp->v_type; if (vap) VOP_GETATTR(nd.ni_vp, vap, td->td_ucred); VOP_UNLOCK(nd.ni_vp, 0); vn_close(nd.ni_vp, FREAD, td->td_ucred, td); - VFS_UNLOCK_GIANT(vfslocked); if (type == VREG) return (result); } @@ -1748,7 +1746,6 @@ linker_hints_lookup(const char *path, int pathlen, const char *modname, u_char *hints = NULL; u_char *cp, *recptr, *bufend, *result, *best, *pathbuf, *sep; int error, ival, bestver, *intp, reclen, found, flags, clen, blen; - int vfslocked = 0; result = NULL; bestver = found = 0; @@ -1760,12 +1757,11 @@ linker_hints_lookup(const char *path, int pathlen, const char *modname, snprintf(pathbuf, reclen, "%.*s%s%s", pathlen, path, sep, linker_hintfile); - NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_SYSSPACE, pathbuf, td); + NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, pathbuf, td); flags = FREAD; error = vn_open(&nd, &flags, 0, NULL); if (error) goto bad; - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); if (nd.ni_vp->v_type != VREG) goto bad; @@ -1789,7 +1785,6 @@ linker_hints_lookup(const char *path, int pathlen, const char *modname, goto bad; VOP_UNLOCK(nd.ni_vp, 0); vn_close(nd.ni_vp, FREAD, cred, td); - VFS_UNLOCK_GIANT(vfslocked); nd.ni_vp = NULL; if (reclen != 0) { printf("can't read %d\n", reclen); @@ -1858,7 +1853,6 @@ bad: if (nd.ni_vp != NULL) { VOP_UNLOCK(nd.ni_vp, 0); vn_close(nd.ni_vp, FREAD, cred, td); - VFS_UNLOCK_GIANT(vfslocked); } /* * If nothing found or hints is absent - fallback to the old diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index c84c5ae..53b7fc4 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -1425,7 +1425,7 @@ sysctl_kern_proc_pathname(SYSCTL_HANDLER_ARGS) struct proc *p; struct vnode *vp; char *retbuf, *freebuf; - int error, vfslocked; + int error; if (arglen != 1) return (EINVAL); @@ -1451,9 +1451,7 @@ sysctl_kern_proc_pathname(SYSCTL_HANDLER_ARGS) if (*pidp != -1) PROC_UNLOCK(p); error = vn_fullpath(req->td, vp, &retbuf, &freebuf); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); if (error) return (error); error = SYSCTL_OUT(req, retbuf, strlen(retbuf) + 1); @@ -1532,7 +1530,6 @@ sysctl_kern_proc_ovmmap(SYSCTL_HANDLER_ARGS) entry = entry->next) { vm_object_t obj, tobj, lobj; vm_offset_t addr; - int vfslocked; if (entry->eflags & MAP_ENTRY_IS_SUB_MAP) continue; @@ -1629,14 +1626,12 @@ sysctl_kern_proc_ovmmap(SYSCTL_HANDLER_ARGS) vn_fullpath(curthread, vp, &fullpath, &freepath); cred = curthread->td_ucred; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_SHARED | LK_RETRY); if (VOP_GETATTR(vp, &va, cred) == 0) { kve->kve_fileid = va.va_fileid; kve->kve_fsid = va.va_fsid; } vput(vp); - VFS_UNLOCK_GIANT(vfslocked); } } else { kve->kve_type = KVME_TYPE_NONE; @@ -1710,7 +1705,6 @@ sysctl_kern_proc_vmmap(SYSCTL_HANDLER_ARGS) entry = entry->next) { vm_object_t obj, tobj, lobj; vm_offset_t addr; - int vfslocked; if (entry->eflags & MAP_ENTRY_IS_SUB_MAP) continue; @@ -1805,7 +1799,6 @@ sysctl_kern_proc_vmmap(SYSCTL_HANDLER_ARGS) &freepath); kve->kve_vn_type = vntype_to_kinfo(vp->v_type); cred = curthread->td_ucred; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_SHARED | LK_RETRY); if (VOP_GETATTR(vp, &va, cred) == 0) { kve->kve_vn_fileid = va.va_fileid; @@ -1817,7 +1810,6 @@ sysctl_kern_proc_vmmap(SYSCTL_HANDLER_ARGS) kve->kve_status = KF_ATTR_VALID; } vput(vp); - VFS_UNLOCK_GIANT(vfslocked); } } else { kve->kve_type = KVME_TYPE_NONE; diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index 26ef0d7..f4ddd90 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -3107,11 +3107,10 @@ nomem: int error, n; int flags = O_CREAT | O_EXCL | FWRITE | O_NOFOLLOW; int cmode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP; - int vfslocked; for (n = 0; n < num_cores; n++) { temp[indexpos] = '0' + n; - NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_SYSSPACE, + NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, temp, td); error = vn_open(&nd, &flags, cmode, NULL); if (error) { @@ -3125,11 +3124,9 @@ nomem: free(temp, M_TEMP); return (NULL); } - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); VOP_UNLOCK(nd.ni_vp, 0); error = vn_close(nd.ni_vp, FWRITE, td->td_ucred, td); - VFS_UNLOCK_GIANT(vfslocked); if (error) { log(LOG_ERR, "pid %d (%s), uid (%u): Path `%s' failed " @@ -3166,7 +3163,6 @@ coredump(struct thread *td) struct mount *mp; char *name; /* name of corefile */ off_t limit; - int vfslocked; int compress; #ifdef COMPRESS_USER_CORES @@ -3216,7 +3212,7 @@ coredump(struct thread *td) PROC_UNLOCK(p); restart: - NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_SYSSPACE, name, td); + NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, name, td); flags = O_CREAT | FWRITE | O_NOFOLLOW; error = vn_open_cred(&nd, &flags, S_IRUSR | S_IWUSR, VN_OPEN_NOAUDIT, cred, NULL); @@ -3227,7 +3223,6 @@ restart: free(name, M_TEMP); return (error); } - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); vp = nd.ni_vp; @@ -3254,7 +3249,6 @@ restart: goto out; if ((error = vn_start_write(NULL, &mp, V_XSLEEP | PCATCH)) != 0) goto out; - VFS_UNLOCK_GIANT(vfslocked); goto restart; } @@ -3287,7 +3281,6 @@ out: audit_proc_coredump(td, name, error); #endif free(name, M_TEMP); - VFS_UNLOCK_GIANT(vfslocked); return (error); } diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c index 2f9a1f6..5cf6e2f 100644 --- a/sys/kern/link_elf.c +++ b/sys/kern/link_elf.c @@ -663,17 +663,15 @@ link_elf_load_file(linker_class_t cls, const char* filename, int symstrindex; int symcnt; int strcnt; - int vfslocked; shdr = NULL; lf = NULL; - NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, filename, td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, filename, td); flags = FREAD; error = vn_open(&nd, &flags, 0, NULL); if (error != 0) return (error); - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); if (nd.ni_vp->v_type != VREG) { error = ENOEXEC; @@ -960,7 +958,6 @@ nosyms: out: VOP_UNLOCK(nd.ni_vp, 0); vn_close(nd.ni_vp, FREAD, td->td_ucred, td); - VFS_UNLOCK_GIANT(vfslocked); if (error != 0 && lf != NULL) linker_file_unload(lf, LINKER_UNLOAD_FORCE); if (shdr != NULL) diff --git a/sys/kern/link_elf_obj.c b/sys/kern/link_elf_obj.c index a5a815d..4bab162 100644 --- a/sys/kern/link_elf_obj.c +++ b/sys/kern/link_elf_obj.c @@ -449,19 +449,17 @@ link_elf_load_file(linker_class_t cls, const char *filename, int nsym; int pb, rl, ra; int alignmask; - int vfslocked; shdr = NULL; lf = NULL; mapsize = 0; hdr = NULL; - NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, filename, td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, filename, td); flags = FREAD; error = vn_open(&nd, &flags, 0, NULL); if (error) return error; - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); if (nd.ni_vp->v_type != VREG) { error = ENOEXEC; @@ -861,7 +859,6 @@ link_elf_load_file(linker_class_t cls, const char *filename, out: VOP_UNLOCK(nd.ni_vp, 0); vn_close(nd.ni_vp, FREAD, td->td_ucred, td); - VFS_UNLOCK_GIANT(vfslocked); if (error && lf) linker_file_unload(lf, LINKER_UNLOAD_FORCE); if (hdr) diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index ee36b35..1fdf985 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -335,7 +335,7 @@ ptrace_vm_entry(struct thread *td, struct proc *p, struct ptrace_vm_entry *pve) struct vnode *vp; char *freepath, *fullpath; u_int pathlen; - int error, index, vfslocked; + int error, index; error = 0; obj = NULL; @@ -412,14 +412,12 @@ ptrace_vm_entry(struct thread *td, struct proc *p, struct ptrace_vm_entry *pve) freepath = NULL; fullpath = NULL; vn_fullpath(td, vp, &fullpath, &freepath); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_SHARED | LK_RETRY); if (VOP_GETATTR(vp, &vattr, td->td_ucred) == 0) { pve->pve_fileid = vattr.va_fileid; pve->pve_fsid = vattr.va_fsid; } vput(vp); - VFS_UNLOCK_GIANT(vfslocked); if (fullpath != NULL) { pve->pve_pathlen = strlen(fullpath) + 1; diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index 0e5efe6..fb939a5 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -1836,7 +1836,6 @@ kern_sendfile(struct thread *td, struct sendfile_args *uap, struct vm_page *pg; off_t off, xfsize, fsbytes = 0, sbytes = 0, rem = 0; int error, hdrlen = 0, mnw = 0; - int vfslocked; struct sendfile_sync *sfs = NULL; /* @@ -1848,7 +1847,6 @@ kern_sendfile(struct thread *td, struct sendfile_args *uap, AUDIT_ARG_FD(uap->fd); if ((error = fgetvp_read(td, uap->fd, CAP_READ, &vp)) != 0) goto out; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_SHARED | LK_RETRY); if (vp->v_type == VREG) { obj = vp->v_object; @@ -1870,7 +1868,6 @@ kern_sendfile(struct thread *td, struct sendfile_args *uap, } } VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); if (obj == NULL) { error = EINVAL; goto out; @@ -2098,7 +2095,6 @@ retry_space: /* * Get the page from backing store. */ - vfslocked = VFS_LOCK_GIANT(vp->v_mount); error = vn_lock(vp, LK_SHARED); if (error != 0) goto after_read; @@ -2116,7 +2112,6 @@ retry_space: td->td_ucred, NOCRED, &resid, td); VOP_UNLOCK(vp, 0); after_read: - VFS_UNLOCK_GIANT(vfslocked); VM_OBJECT_LOCK(obj); vm_page_io_finish(pg); if (!error) @@ -2267,11 +2262,8 @@ out: } if (obj != NULL) vm_object_deallocate(obj); - if (vp != NULL) { - vfslocked = VFS_LOCK_GIANT(vp->v_mount); + if (vp != NULL) vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); - } if (so) fdrop(sock_fp, td); if (m) diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index 3a34f58..b190733 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -452,7 +452,7 @@ uipc_bind(struct socket *so, struct sockaddr *nam, struct thread *td) { struct sockaddr_un *soun = (struct sockaddr_un *)nam; struct vattr vattr; - int error, namelen, vfslocked; + int error, namelen; struct nameidata nd; struct unpcb *unp; struct vnode *vp; @@ -492,15 +492,13 @@ uipc_bind(struct socket *so, struct sockaddr *nam, struct thread *td) buf[namelen] = 0; restart: - vfslocked = 0; - NDINIT(&nd, CREATE, MPSAFE | NOFOLLOW | LOCKPARENT | SAVENAME, + NDINIT(&nd, CREATE, NOFOLLOW | LOCKPARENT | SAVENAME, UIO_SYSSPACE, buf, td); /* SHOULD BE ABLE TO ADOPT EXISTING AND wakeup() ALA FIFO's */ error = namei(&nd); if (error) goto error; vp = nd.ni_vp; - vfslocked = NDHASGIANT(&nd); if (vp != NULL || vn_start_write(nd.ni_dvp, &mp, V_NOWAIT) != 0) { NDFREE(&nd, NDF_ONLY_PNBUF); if (nd.ni_dvp == vp) @@ -515,7 +513,6 @@ restart: error = vn_start_write(NULL, &mp, V_XSLEEP | PCATCH); if (error) goto error; - VFS_UNLOCK_GIANT(vfslocked); goto restart; } VATTR_NULL(&vattr); @@ -547,12 +544,10 @@ restart: UNP_LINK_WUNLOCK(); VOP_UNLOCK(vp, 0); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); free(buf, M_TEMP); return (0); error: - VFS_UNLOCK_GIANT(vfslocked); UNP_PCB_LOCK(unp); unp->unp_flags &= ~UNP_BINDING; UNP_PCB_UNLOCK(unp); @@ -670,13 +665,8 @@ uipc_detach(struct socket *so) uma_zfree(unp_zone, unp); } else UNP_PCB_UNLOCK(unp); - if (vp) { - int vfslocked; - - vfslocked = VFS_LOCK_GIANT(vp->v_mount); + if (vp) vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); - } if (local_unp_rights) taskqueue_enqueue(taskqueue_thread, &unp_gc_task); } @@ -1242,7 +1232,7 @@ unp_connect(struct socket *so, struct sockaddr *nam, struct thread *td) struct vnode *vp; struct socket *so2, *so3; struct unpcb *unp, *unp2, *unp3; - int error, len, vfslocked; + int error, len; struct nameidata nd; char buf[SOCK_MAXADDRLEN]; struct sockaddr *sa; @@ -1268,7 +1258,7 @@ unp_connect(struct socket *so, struct sockaddr *nam, struct thread *td) UNP_PCB_UNLOCK(unp); sa = malloc(sizeof(struct sockaddr_un), M_SONAME, M_WAITOK); - NDINIT(&nd, LOOKUP, MPSAFE | FOLLOW | LOCKLEAF, UIO_SYSSPACE, buf, + NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE, buf, td); error = namei(&nd); if (error) @@ -1276,7 +1266,6 @@ unp_connect(struct socket *so, struct sockaddr *nam, struct thread *td) else vp = nd.ni_vp; ASSERT_VOP_LOCKED(vp, "unp_connect"); - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); if (error) goto bad; @@ -1293,7 +1282,6 @@ unp_connect(struct socket *so, struct sockaddr *nam, struct thread *td) error = VOP_ACCESS(vp, VWRITE, td->td_ucred, td); if (error) goto bad; - VFS_UNLOCK_GIANT(vfslocked); unp = sotounpcb(so); KASSERT(unp != NULL, ("unp_connect: unp == NULL")); @@ -1376,16 +1364,9 @@ unp_connect(struct socket *so, struct sockaddr *nam, struct thread *td) UNP_PCB_UNLOCK(unp); bad2: UNP_LINK_WUNLOCK(); - if (vfslocked) - /* - * Giant has been previously acquired. This means filesystem - * isn't MPSAFE. Do it once again. - */ - mtx_lock(&Giant); bad: if (vp != NULL) vput(vp); - VFS_UNLOCK_GIANT(vfslocked); free(sa, M_SONAME); UNP_LINK_WLOCK(); UNP_PCB_LOCK(unp); diff --git a/sys/kern/vfs_acl.c b/sys/kern/vfs_acl.c index 9010a50..2a39d1f 100644 --- a/sys/kern/vfs_acl.c +++ b/sys/kern/vfs_acl.c @@ -327,16 +327,14 @@ int __acl_get_file(struct thread *td, struct __acl_get_file_args *uap) { struct nameidata nd; - int vfslocked, error; + int error; - NDINIT(&nd, LOOKUP, MPSAFE|FOLLOW, UIO_USERSPACE, uap->path, td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, uap->path, td); error = namei(&nd); - vfslocked = NDHASGIANT(&nd); if (error == 0) { error = vacl_get_acl(td, nd.ni_vp, uap->type, uap->aclp); NDFREE(&nd, 0); } - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -347,16 +345,14 @@ int __acl_get_link(struct thread *td, struct __acl_get_link_args *uap) { struct nameidata nd; - int vfslocked, error; + int error; - NDINIT(&nd, LOOKUP, MPSAFE|NOFOLLOW, UIO_USERSPACE, uap->path, td); + NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, uap->path, td); error = namei(&nd); - vfslocked = NDHASGIANT(&nd); if (error == 0) { error = vacl_get_acl(td, nd.ni_vp, uap->type, uap->aclp); NDFREE(&nd, 0); } - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -367,16 +363,14 @@ int __acl_set_file(struct thread *td, struct __acl_set_file_args *uap) { struct nameidata nd; - int vfslocked, error; + int error; - NDINIT(&nd, LOOKUP, MPSAFE|FOLLOW, UIO_USERSPACE, uap->path, td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, uap->path, td); error = namei(&nd); - vfslocked = NDHASGIANT(&nd); if (error == 0) { error = vacl_set_acl(td, nd.ni_vp, uap->type, uap->aclp); NDFREE(&nd, 0); } - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -387,16 +381,14 @@ int __acl_set_link(struct thread *td, struct __acl_set_link_args *uap) { struct nameidata nd; - int vfslocked, error; + int error; - NDINIT(&nd, LOOKUP, MPSAFE|NOFOLLOW, UIO_USERSPACE, uap->path, td); + NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, uap->path, td); error = namei(&nd); - vfslocked = NDHASGIANT(&nd); if (error == 0) { error = vacl_set_acl(td, nd.ni_vp, uap->type, uap->aclp); NDFREE(&nd, 0); } - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -407,14 +399,12 @@ int __acl_get_fd(struct thread *td, struct __acl_get_fd_args *uap) { struct file *fp; - int vfslocked, error; + int error; error = getvnode(td->td_proc->p_fd, uap->filedes, CAP_ACL_GET, &fp); if (error == 0) { - vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); error = vacl_get_acl(td, fp->f_vnode, uap->type, uap->aclp); fdrop(fp, td); - VFS_UNLOCK_GIANT(vfslocked); } return (error); } @@ -426,14 +416,12 @@ int __acl_set_fd(struct thread *td, struct __acl_set_fd_args *uap) { struct file *fp; - int vfslocked, error; + int error; error = getvnode(td->td_proc->p_fd, uap->filedes, CAP_ACL_SET, &fp); if (error == 0) { - vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); error = vacl_set_acl(td, fp->f_vnode, uap->type, uap->aclp); fdrop(fp, td); - VFS_UNLOCK_GIANT(vfslocked); } return (error); } @@ -445,16 +433,14 @@ int __acl_delete_file(struct thread *td, struct __acl_delete_file_args *uap) { struct nameidata nd; - int vfslocked, error; + int error; - NDINIT(&nd, LOOKUP, MPSAFE|FOLLOW, UIO_USERSPACE, uap->path, td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, uap->path, td); error = namei(&nd); - vfslocked = NDHASGIANT(&nd); if (error == 0) { error = vacl_delete(td, nd.ni_vp, uap->type); NDFREE(&nd, 0); } - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -465,16 +451,14 @@ int __acl_delete_link(struct thread *td, struct __acl_delete_link_args *uap) { struct nameidata nd; - int vfslocked, error; + int error; - NDINIT(&nd, LOOKUP, MPSAFE|NOFOLLOW, UIO_USERSPACE, uap->path, td); + NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, uap->path, td); error = namei(&nd); - vfslocked = NDHASGIANT(&nd); if (error == 0) { error = vacl_delete(td, nd.ni_vp, uap->type); NDFREE(&nd, 0); } - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -485,15 +469,13 @@ int __acl_delete_fd(struct thread *td, struct __acl_delete_fd_args *uap) { struct file *fp; - int vfslocked, error; + int error; error = getvnode(td->td_proc->p_fd, uap->filedes, CAP_ACL_DELETE, &fp); if (error == 0) { - vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); error = vacl_delete(td, fp->f_vnode, uap->type); fdrop(fp, td); - VFS_UNLOCK_GIANT(vfslocked); } return (error); } @@ -505,16 +487,14 @@ int __acl_aclcheck_file(struct thread *td, struct __acl_aclcheck_file_args *uap) { struct nameidata nd; - int vfslocked, error; + int error; - NDINIT(&nd, LOOKUP, MPSAFE|FOLLOW, UIO_USERSPACE, uap->path, td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, uap->path, td); error = namei(&nd); - vfslocked = NDHASGIANT(&nd); if (error == 0) { error = vacl_aclcheck(td, nd.ni_vp, uap->type, uap->aclp); NDFREE(&nd, 0); } - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -525,16 +505,14 @@ int __acl_aclcheck_link(struct thread *td, struct __acl_aclcheck_link_args *uap) { struct nameidata nd; - int vfslocked, error; + int error; - NDINIT(&nd, LOOKUP, MPSAFE|NOFOLLOW, UIO_USERSPACE, uap->path, td); + NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, uap->path, td); error = namei(&nd); - vfslocked = NDHASGIANT(&nd); if (error == 0) { error = vacl_aclcheck(td, nd.ni_vp, uap->type, uap->aclp); NDFREE(&nd, 0); } - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -545,15 +523,13 @@ int __acl_aclcheck_fd(struct thread *td, struct __acl_aclcheck_fd_args *uap) { struct file *fp; - int vfslocked, error; + int error; error = getvnode(td->td_proc->p_fd, uap->filedes, CAP_ACL_CHECK, &fp); if (error == 0) { - vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); error = vacl_aclcheck(td, fp->f_vnode, uap->type, uap->aclp); fdrop(fp, td); - VFS_UNLOCK_GIANT(vfslocked); } return (error); } diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c index aedbdd0..aa17daf 100644 --- a/sys/kern/vfs_aio.c +++ b/sys/kern/vfs_aio.c @@ -835,10 +835,8 @@ static int aio_fsync_vnode(struct thread *td, struct vnode *vp) { struct mount *mp; - int vfslocked; int error; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); if ((error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0) goto drop; vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); @@ -852,7 +850,6 @@ aio_fsync_vnode(struct thread *td, struct vnode *vp) VOP_UNLOCK(vp, 0); vn_finished_write(mp); drop: - VFS_UNLOCK_GIANT(vfslocked); return (error); } diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index a6ad81e..38e03c0 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -266,14 +266,13 @@ static struct mtx nblock; /* * Definitions for the buffer free lists. */ -#define BUFFER_QUEUES 6 /* number of free buffer queues */ +#define BUFFER_QUEUES 5 /* number of free buffer queues */ #define QUEUE_NONE 0 /* on no queue */ #define QUEUE_CLEAN 1 /* non-B_DELWRI buffers */ #define QUEUE_DIRTY 2 /* B_DELWRI buffers */ -#define QUEUE_DIRTY_GIANT 3 /* B_DELWRI buffers that need giant */ -#define QUEUE_EMPTYKVA 4 /* empty buffer headers w/KVA assignment */ -#define QUEUE_EMPTY 5 /* empty buffer headers */ +#define QUEUE_EMPTYKVA 3 /* empty buffer headers w/KVA assignment */ +#define QUEUE_EMPTY 4 /* empty buffer headers */ #define QUEUE_SENTINEL 1024 /* not an queue index, but mark for sentinel */ /* Queues for free buffers with various properties */ @@ -1467,10 +1466,7 @@ brelse(struct buf *bp) TAILQ_INSERT_HEAD(&bufqueues[QUEUE_CLEAN], bp, b_freelist); /* remaining buffers */ } else { - if ((bp->b_flags & (B_DELWRI|B_NEEDSGIANT)) == - (B_DELWRI|B_NEEDSGIANT)) - bp->b_qindex = QUEUE_DIRTY_GIANT; - else if (bp->b_flags & B_DELWRI) + if (bp->b_flags & B_DELWRI) bp->b_qindex = QUEUE_DIRTY; else bp->b_qindex = QUEUE_CLEAN; @@ -1567,10 +1563,7 @@ bqrelse(struct buf *bp) panic("bqrelse: free buffer onto another queue???"); /* buffers with stale but valid contents */ if (bp->b_flags & B_DELWRI) { - if (bp->b_flags & B_NEEDSGIANT) - bp->b_qindex = QUEUE_DIRTY_GIANT; - else - bp->b_qindex = QUEUE_DIRTY; + bp->b_qindex = QUEUE_DIRTY; TAILQ_INSERT_TAIL(&bufqueues[bp->b_qindex], bp, b_freelist); } else { /* @@ -2176,12 +2169,6 @@ buf_do_flush(struct vnode *vp) int flushed; flushed = flushbufqueues(vp, QUEUE_DIRTY, 0); - /* The list empty check here is slightly racy */ - if (!TAILQ_EMPTY(&bufqueues[QUEUE_DIRTY_GIANT])) { - mtx_lock(&Giant); - flushed += flushbufqueues(vp, QUEUE_DIRTY_GIANT, 0); - mtx_unlock(&Giant); - } if (flushed == 0) { /* * Could not find any buffers without rollback @@ -2189,12 +2176,6 @@ buf_do_flush(struct vnode *vp) * in the hopes of eventually making progress. */ flushbufqueues(vp, QUEUE_DIRTY, 1); - if (!TAILQ_EMPTY( - &bufqueues[QUEUE_DIRTY_GIANT])) { - mtx_lock(&Giant); - flushbufqueues(vp, QUEUE_DIRTY_GIANT, 1); - mtx_unlock(&Giant); - } } return (flushed); } diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c index 30fb28b..a9200df 100644 --- a/sys/kern/vfs_cache.c +++ b/sys/kern/vfs_cache.c @@ -939,7 +939,7 @@ kern___getcwd(struct thread *td, u_char *buf, enum uio_seg bufseg, u_int buflen) char *bp, *tmpbuf; struct filedesc *fdp; struct vnode *cdir, *rdir; - int error, vfslocked; + int error; if (disablecwd) return (ENODEV); @@ -957,12 +957,8 @@ kern___getcwd(struct thread *td, u_char *buf, enum uio_seg bufseg, u_int buflen) VREF(rdir); FILEDESC_SUNLOCK(fdp); error = vn_fullpath1(td, cdir, rdir, tmpbuf, &bp, buflen); - vfslocked = VFS_LOCK_GIANT(rdir->v_mount); vrele(rdir); - VFS_UNLOCK_GIANT(vfslocked); - vfslocked = VFS_LOCK_GIANT(cdir->v_mount); vrele(cdir); - VFS_UNLOCK_GIANT(vfslocked); if (!error) { if (bufseg == UIO_SYSSPACE) @@ -1009,7 +1005,7 @@ vn_fullpath(struct thread *td, struct vnode *vn, char **retbuf, char **freebuf) char *buf; struct filedesc *fdp; struct vnode *rdir; - int error, vfslocked; + int error; if (disablefullpath) return (ENODEV); @@ -1023,9 +1019,7 @@ vn_fullpath(struct thread *td, struct vnode *vn, char **retbuf, char **freebuf) VREF(rdir); FILEDESC_SUNLOCK(fdp); error = vn_fullpath1(td, vn, rdir, buf, retbuf, MAXPATHLEN); - vfslocked = VFS_LOCK_GIANT(rdir->v_mount); vrele(rdir); - VFS_UNLOCK_GIANT(vfslocked); if (!error) *freebuf = buf; @@ -1086,7 +1080,7 @@ vn_vptocnp_locked(struct vnode **vp, struct ucred *cred, char *buf, { struct vnode *dvp; struct namecache *ncp; - int error, vfslocked; + int error; TAILQ_FOREACH(ncp, &((*vp)->v_cache_dst), nc_dst) { if ((ncp->nc_flag & NCF_ISDOTDOT) == 0) @@ -1112,12 +1106,10 @@ vn_vptocnp_locked(struct vnode **vp, struct ucred *cred, char *buf, vhold(*vp); CACHE_RUNLOCK(); - vfslocked = VFS_LOCK_GIANT((*vp)->v_mount); vn_lock(*vp, LK_SHARED | LK_RETRY); error = VOP_VPTOCNP(*vp, &dvp, cred, buf, buflen); VOP_UNLOCK(*vp, 0); vdrop(*vp); - VFS_UNLOCK_GIANT(vfslocked); if (error) { numfullpathfail2++; SDT_PROBE(vfs, namecache, fullpath, return, error, vp, diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c index b8b9cdf..9dd9f8d 100644 --- a/sys/kern/vfs_extattr.c +++ b/sys/kern/vfs_extattr.c @@ -69,7 +69,7 @@ extattrctl(td, uap) struct nameidata nd; struct mount *mp, *mp_writable; char attrname[EXTATTR_MAXNAMELEN]; - int vfslocked, fnvfslocked, error; + int error; AUDIT_ARG_CMD(uap->cmd); AUDIT_ARG_VALUE(uap->attrnamespace); @@ -85,27 +85,24 @@ extattrctl(td, uap) } AUDIT_ARG_TEXT(attrname); - vfslocked = fnvfslocked = 0; mp = NULL; filename_vp = NULL; if (uap->filename != NULL) { - NDINIT(&nd, LOOKUP, MPSAFE | FOLLOW | AUDITVNODE2, + NDINIT(&nd, LOOKUP, FOLLOW | AUDITVNODE2, UIO_USERSPACE, uap->filename, td); error = namei(&nd); if (error) return (error); - fnvfslocked = NDHASGIANT(&nd); filename_vp = nd.ni_vp; NDFREE(&nd, NDF_NO_VP_RELE); } /* uap->path is always defined. */ - NDINIT(&nd, LOOKUP, MPSAFE | FOLLOW | LOCKLEAF | AUDITVNODE1, + NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | AUDITVNODE1, UIO_USERSPACE, uap->path, td); error = namei(&nd); if (error) goto out; - vfslocked = NDHASGIANT(&nd); mp = nd.ni_vp->v_mount; error = vfs_busy(mp, 0); if (error) { @@ -145,8 +142,6 @@ out: */ if (filename_vp != NULL) vrele(filename_vp); - VFS_UNLOCK_GIANT(fnvfslocked); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -170,7 +165,6 @@ extattr_set_vp(struct vnode *vp, int attrnamespace, const char *attrname, ssize_t cnt; int error; - VFS_ASSERT_GIANT(vp->v_mount); error = vn_start_write(vp, &mp, V_WAIT | PCATCH); if (error) return (error); @@ -222,7 +216,7 @@ extattr_set_fd(td, uap) { struct file *fp; char attrname[EXTATTR_MAXNAMELEN]; - int vfslocked, error; + int error; AUDIT_ARG_FD(uap->fd); AUDIT_ARG_VALUE(uap->attrnamespace); @@ -235,11 +229,9 @@ extattr_set_fd(td, uap) if (error) return (error); - vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); error = extattr_set_vp(fp->f_vnode, uap->attrnamespace, attrname, uap->data, uap->nbytes, td); fdrop(fp, td); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -257,7 +249,7 @@ extattr_set_file(td, uap) { struct nameidata nd; char attrname[EXTATTR_MAXNAMELEN]; - int vfslocked, error; + int error; AUDIT_ARG_VALUE(uap->attrnamespace); error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL); @@ -265,19 +257,17 @@ extattr_set_file(td, uap) return (error); AUDIT_ARG_TEXT(attrname); - NDINIT(&nd, LOOKUP, MPSAFE | FOLLOW | AUDITVNODE1, UIO_USERSPACE, + NDINIT(&nd, LOOKUP, FOLLOW | AUDITVNODE1, UIO_USERSPACE, uap->path, td); error = namei(&nd); if (error) return (error); NDFREE(&nd, NDF_ONLY_PNBUF); - vfslocked = NDHASGIANT(&nd); error = extattr_set_vp(nd.ni_vp, uap->attrnamespace, attrname, uap->data, uap->nbytes, td); vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -294,7 +284,7 @@ extattr_set_link(td, uap) { struct nameidata nd; char attrname[EXTATTR_MAXNAMELEN]; - int vfslocked, error; + int error; AUDIT_ARG_VALUE(uap->attrnamespace); error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL); @@ -302,19 +292,17 @@ extattr_set_link(td, uap) return (error); AUDIT_ARG_TEXT(attrname); - NDINIT(&nd, LOOKUP, MPSAFE | NOFOLLOW | AUDITVNODE1, UIO_USERSPACE, + NDINIT(&nd, LOOKUP, NOFOLLOW | AUDITVNODE1, UIO_USERSPACE, uap->path, td); error = namei(&nd); if (error) return (error); NDFREE(&nd, NDF_ONLY_PNBUF); - vfslocked = NDHASGIANT(&nd); error = extattr_set_vp(nd.ni_vp, uap->attrnamespace, attrname, uap->data, uap->nbytes, td); vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -338,7 +326,6 @@ extattr_get_vp(struct vnode *vp, int attrnamespace, const char *attrname, size_t size, *sizep; int error; - VFS_ASSERT_GIANT(vp->v_mount); vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); /* @@ -402,7 +389,7 @@ extattr_get_fd(td, uap) { struct file *fp; char attrname[EXTATTR_MAXNAMELEN]; - int vfslocked, error; + int error; AUDIT_ARG_FD(uap->fd); AUDIT_ARG_VALUE(uap->attrnamespace); @@ -415,12 +402,10 @@ extattr_get_fd(td, uap) if (error) return (error); - vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); error = extattr_get_vp(fp->f_vnode, uap->attrnamespace, attrname, uap->data, uap->nbytes, td); fdrop(fp, td); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -437,7 +422,7 @@ extattr_get_file(td, uap) { struct nameidata nd; char attrname[EXTATTR_MAXNAMELEN]; - int vfslocked, error; + int error; AUDIT_ARG_VALUE(uap->attrnamespace); error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL); @@ -445,19 +430,16 @@ extattr_get_file(td, uap) return (error); AUDIT_ARG_TEXT(attrname); - NDINIT(&nd, LOOKUP, MPSAFE | FOLLOW | AUDITVNODE1, UIO_USERSPACE, - uap->path, td); + NDINIT(&nd, LOOKUP, FOLLOW | AUDITVNODE1, UIO_USERSPACE, uap->path, td); error = namei(&nd); if (error) return (error); NDFREE(&nd, NDF_ONLY_PNBUF); - vfslocked = NDHASGIANT(&nd); error = extattr_get_vp(nd.ni_vp, uap->attrnamespace, attrname, uap->data, uap->nbytes, td); vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -474,7 +456,7 @@ extattr_get_link(td, uap) { struct nameidata nd; char attrname[EXTATTR_MAXNAMELEN]; - int vfslocked, error; + int error; AUDIT_ARG_VALUE(uap->attrnamespace); error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL); @@ -482,19 +464,17 @@ extattr_get_link(td, uap) return (error); AUDIT_ARG_TEXT(attrname); - NDINIT(&nd, LOOKUP, MPSAFE | NOFOLLOW | AUDITVNODE1, UIO_USERSPACE, - uap->path, td); + NDINIT(&nd, LOOKUP, NOFOLLOW | AUDITVNODE1, UIO_USERSPACE, uap->path, + td); error = namei(&nd); if (error) return (error); NDFREE(&nd, NDF_ONLY_PNBUF); - vfslocked = NDHASGIANT(&nd); error = extattr_get_vp(nd.ni_vp, uap->attrnamespace, attrname, uap->data, uap->nbytes, td); vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -515,7 +495,6 @@ extattr_delete_vp(struct vnode *vp, int attrnamespace, const char *attrname, struct mount *mp; int error; - VFS_ASSERT_GIANT(vp->v_mount); error = vn_start_write(vp, &mp, V_WAIT | PCATCH); if (error) return (error); @@ -552,7 +531,7 @@ extattr_delete_fd(td, uap) { struct file *fp; char attrname[EXTATTR_MAXNAMELEN]; - int vfslocked, error; + int error; AUDIT_ARG_FD(uap->fd); AUDIT_ARG_VALUE(uap->attrnamespace); @@ -566,11 +545,9 @@ extattr_delete_fd(td, uap) if (error) return (error); - vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); error = extattr_delete_vp(fp->f_vnode, uap->attrnamespace, attrname, td); fdrop(fp, td); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -585,7 +562,7 @@ extattr_delete_file(td, uap) { struct nameidata nd; char attrname[EXTATTR_MAXNAMELEN]; - int vfslocked, error; + int error; AUDIT_ARG_VALUE(uap->attrnamespace); error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL); @@ -593,17 +570,14 @@ extattr_delete_file(td, uap) return(error); AUDIT_ARG_TEXT(attrname); - NDINIT(&nd, LOOKUP, MPSAFE | FOLLOW | AUDITVNODE1, UIO_USERSPACE, - uap->path, td); + NDINIT(&nd, LOOKUP, FOLLOW | AUDITVNODE1, UIO_USERSPACE, uap->path, td); error = namei(&nd); if (error) return(error); NDFREE(&nd, NDF_ONLY_PNBUF); - vfslocked = NDHASGIANT(&nd); error = extattr_delete_vp(nd.ni_vp, uap->attrnamespace, attrname, td); vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); return(error); } @@ -618,7 +592,7 @@ extattr_delete_link(td, uap) { struct nameidata nd; char attrname[EXTATTR_MAXNAMELEN]; - int vfslocked, error; + int error; AUDIT_ARG_VALUE(uap->attrnamespace); error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL); @@ -626,17 +600,14 @@ extattr_delete_link(td, uap) return(error); AUDIT_ARG_TEXT(attrname); - NDINIT(&nd, LOOKUP, MPSAFE | NOFOLLOW | AUDITVNODE1, UIO_USERSPACE, - uap->path, td); + NDINIT(&nd, LOOKUP, NOFOLLOW | AUDITVNODE1, UIO_USERSPACE, uap->path, td); error = namei(&nd); if (error) return(error); NDFREE(&nd, NDF_ONLY_PNBUF); - vfslocked = NDHASGIANT(&nd); error = extattr_delete_vp(nd.ni_vp, uap->attrnamespace, attrname, td); vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); return(error); } @@ -660,7 +631,6 @@ extattr_list_vp(struct vnode *vp, int attrnamespace, void *data, ssize_t cnt; int error; - VFS_ASSERT_GIANT(vp->v_mount); vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); auiop = NULL; @@ -717,7 +687,7 @@ extattr_list_fd(td, uap) } */ *uap; { struct file *fp; - int vfslocked, error; + int error; AUDIT_ARG_FD(uap->fd); AUDIT_ARG_VALUE(uap->attrnamespace); @@ -725,12 +695,10 @@ extattr_list_fd(td, uap) if (error) return (error); - vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); error = extattr_list_vp(fp->f_vnode, uap->attrnamespace, uap->data, uap->nbytes, td); fdrop(fp, td); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -745,22 +713,19 @@ extattr_list_file(td, uap) } */ *uap; { struct nameidata nd; - int vfslocked, error; + int error; AUDIT_ARG_VALUE(uap->attrnamespace); - NDINIT(&nd, LOOKUP, MPSAFE | FOLLOW | AUDITVNODE1, UIO_USERSPACE, - uap->path, td); + NDINIT(&nd, LOOKUP, FOLLOW | AUDITVNODE1, UIO_USERSPACE, uap->path, td); error = namei(&nd); if (error) return (error); NDFREE(&nd, NDF_ONLY_PNBUF); - vfslocked = NDHASGIANT(&nd); error = extattr_list_vp(nd.ni_vp, uap->attrnamespace, uap->data, uap->nbytes, td); vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -775,21 +740,19 @@ extattr_list_link(td, uap) } */ *uap; { struct nameidata nd; - int vfslocked, error; + int error; AUDIT_ARG_VALUE(uap->attrnamespace); - NDINIT(&nd, LOOKUP, MPSAFE | NOFOLLOW | AUDITVNODE1, UIO_USERSPACE, - uap->path, td); + NDINIT(&nd, LOOKUP, NOFOLLOW | AUDITVNODE1, UIO_USERSPACE, uap->path, + td); error = namei(&nd); if (error) return (error); NDFREE(&nd, NDF_ONLY_PNBUF); - vfslocked = NDHASGIANT(&nd); error = extattr_list_vp(nd.ni_vp, uap->attrnamespace, uap->data, uap->nbytes, td); vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } diff --git a/sys/kern/vfs_init.c b/sys/kern/vfs_init.c index 4367b8c..3be109a 100644 --- a/sys/kern/vfs_init.c +++ b/sys/kern/vfs_init.c @@ -150,7 +150,7 @@ vfs_register(struct vfsconf *vfc) return (EINVAL); } if (vfs_byname(vfc->vfc_name) != NULL) - return EEXIST; + return (EEXIST); vfc->vfc_typenum = maxvfsconf++; TAILQ_INSERT_TAIL(&vfsconf, vfc, vfc_list); diff --git a/sys/kern/vfs_lookup.c b/sys/kern/vfs_lookup.c index a145017..b054b8c 100644 --- a/sys/kern/vfs_lookup.c +++ b/sys/kern/vfs_lookup.c @@ -133,10 +133,7 @@ namei(struct nameidata *ndp) struct componentname *cnp = &ndp->ni_cnd; struct thread *td = cnp->cn_thread; struct proc *p = td->td_proc; - int vfslocked; - KASSERT((cnp->cn_flags & MPSAFE) != 0 || mtx_owned(&Giant) != 0, - ("NOT MPSAFE and Giant not held")); ndp->ni_cnd.cn_cred = ndp->ni_cnd.cn_thread->td_ucred; KASSERT(cnp->cn_cred && p, ("namei: bad cred/proc")); KASSERT((cnp->cn_nameiop & (~OPMASK)) == 0, @@ -244,9 +241,7 @@ namei(struct nameidata *ndp) if (error != 0 || dp != NULL) { FILEDESC_SUNLOCK(fdp); if (error == 0 && dp->v_type != VDIR) { - vfslocked = VFS_LOCK_GIANT(dp->v_mount); vrele(dp); - VFS_UNLOCK_GIANT(vfslocked); error = ENOTDIR; } } @@ -263,15 +258,11 @@ namei(struct nameidata *ndp) dp = fdp->fd_cdir; VREF(dp); FILEDESC_SUNLOCK(fdp); - if (ndp->ni_startdir != NULL) { - vfslocked = VFS_LOCK_GIANT(ndp->ni_startdir->v_mount); + if (ndp->ni_startdir != NULL) vrele(ndp->ni_startdir); - VFS_UNLOCK_GIANT(vfslocked); - } } SDT_PROBE(vfs, namei, lookup, entry, dp, cnp->cn_pnbuf, cnp->cn_flags, 0, 0); - vfslocked = VFS_LOCK_GIANT(dp->v_mount); for (;;) { /* * Check if root directory should replace current directory. @@ -280,7 +271,6 @@ namei(struct nameidata *ndp) cnp->cn_nameptr = cnp->cn_pnbuf; if (*(cnp->cn_nameptr) == '/') { vrele(dp); - VFS_UNLOCK_GIANT(vfslocked); if (ndp->ni_strictrelative != 0) return (ENOTCAPABLE); while (*(cnp->cn_nameptr) == '/') { @@ -288,11 +278,8 @@ namei(struct nameidata *ndp) ndp->ni_pathlen--; } dp = ndp->ni_rootdir; - vfslocked = VFS_LOCK_GIANT(dp->v_mount); VREF(dp); } - if (vfslocked) - ndp->ni_cnd.cn_flags |= GIANTHELD; ndp->ni_startdir = dp; error = lookup(ndp); if (error) { @@ -305,8 +292,6 @@ namei(struct nameidata *ndp) 0, 0); return (error); } - vfslocked = (ndp->ni_cnd.cn_flags & GIANTHELD) != 0; - ndp->ni_cnd.cn_flags &= ~GIANTHELD; /* * If not a symbolic link, we're done. */ @@ -320,10 +305,6 @@ namei(struct nameidata *ndp) } else cnp->cn_flags |= HASBUF; - if ((cnp->cn_flags & MPSAFE) == 0) { - VFS_UNLOCK_GIANT(vfslocked); - } else if (vfslocked) - ndp->ni_cnd.cn_flags |= GIANTHELD; SDT_PROBE(vfs, namei, lookup, return, 0, ndp->ni_vp, 0, 0, 0); return (0); @@ -390,7 +371,6 @@ namei(struct nameidata *ndp) vput(ndp->ni_vp); ndp->ni_vp = NULL; vrele(ndp->ni_dvp); - VFS_UNLOCK_GIANT(vfslocked); SDT_PROBE(vfs, namei, lookup, return, error, NULL, 0, 0, 0); return (error); } @@ -494,17 +474,11 @@ lookup(struct nameidata *ndp) int error = 0; int dpunlocked = 0; /* dp has already been unlocked */ struct componentname *cnp = &ndp->ni_cnd; - int vfslocked; /* VFS Giant state for child */ - int dvfslocked; /* VFS Giant state for parent */ - int tvfslocked; int lkflags_save; /* * Setup: break out flag bits into variables. */ - dvfslocked = (ndp->ni_cnd.cn_flags & GIANTHELD) != 0; - vfslocked = 0; - ndp->ni_cnd.cn_flags &= ~GIANTHELD; wantparent = cnp->cn_flags & (LOCKPARENT | WANTPARENT); KASSERT(cnp->cn_nameiop == LOOKUP || wantparent, ("CREATE, DELETE, RENAME require LOCKPARENT or WANTPARENT.")); @@ -665,7 +639,6 @@ dirloop: (cnp->cn_flags & NOCROSSMOUNT) != 0)) { ndp->ni_dvp = dp; ndp->ni_vp = dp; - vfslocked = VFS_LOCK_GIANT(dp->v_mount); VREF(dp); goto nextname; } @@ -677,11 +650,8 @@ dirloop: } tdp = dp; dp = dp->v_mount->mnt_vnodecovered; - tvfslocked = dvfslocked; - dvfslocked = VFS_LOCK_GIANT(dp->v_mount); VREF(dp); vput(tdp); - VFS_UNLOCK_GIANT(tvfslocked); vn_lock(dp, compute_cn_lkflags(dp->v_mount, cnp->cn_lkflags | LK_RETRY)); @@ -703,7 +673,6 @@ unionlookup: ndp->ni_dvp = dp; ndp->ni_vp = NULL; ASSERT_VOP_LOCKED(dp, "lookup"); - VNASSERT(vfslocked == 0, dp, ("lookup: vfslocked %d", vfslocked)); /* * If we have a shared lock we may need to upgrade the lock for the * last operation. @@ -734,11 +703,8 @@ unionlookup: (dp->v_mount->mnt_flag & MNT_UNION)) { tdp = dp; dp = dp->v_mount->mnt_vnodecovered; - tvfslocked = dvfslocked; - dvfslocked = VFS_LOCK_GIANT(dp->v_mount); VREF(dp); vput(tdp); - VFS_UNLOCK_GIANT(tvfslocked); vn_lock(dp, compute_cn_lkflags(dp->v_mount, cnp->cn_lkflags | LK_RETRY)); @@ -792,7 +758,6 @@ unionlookup: } dp = ndp->ni_vp; - vfslocked = VFS_LOCK_GIANT(dp->v_mount); /* * Check to see if the vnode has been mounted on; @@ -803,14 +768,10 @@ unionlookup: if (vfs_busy(mp, 0)) continue; vput(dp); - VFS_UNLOCK_GIANT(vfslocked); - vfslocked = VFS_LOCK_GIANT(mp); if (dp != ndp->ni_dvp) vput(ndp->ni_dvp); else vrele(ndp->ni_dvp); - VFS_UNLOCK_GIANT(dvfslocked); - dvfslocked = 0; vref(vp_crossmp); ndp->ni_dvp = vp_crossmp; error = VFS_ROOT(mp, compute_cn_lkflags(mp, cnp->cn_lkflags), @@ -869,9 +830,6 @@ nextname: vput(ndp->ni_dvp); else vrele(ndp->ni_dvp); - VFS_UNLOCK_GIANT(dvfslocked); - dvfslocked = vfslocked; /* dp becomes dvp in dirloop */ - vfslocked = 0; goto dirloop; } /* @@ -899,8 +857,6 @@ nextname: vput(ndp->ni_dvp); else vrele(ndp->ni_dvp); - VFS_UNLOCK_GIANT(dvfslocked); - dvfslocked = 0; } else if ((cnp->cn_flags & LOCKPARENT) == 0 && ndp->ni_dvp != dp) VOP_UNLOCK(ndp->ni_dvp, 0); @@ -924,10 +880,6 @@ success: goto bad2; } } - if (vfslocked && dvfslocked) - VFS_UNLOCK_GIANT(dvfslocked); /* Only need one */ - if (vfslocked || dvfslocked) - ndp->ni_cnd.cn_flags |= GIANTHELD; return (0); bad2: @@ -938,9 +890,6 @@ bad2: bad: if (!dpunlocked) vput(dp); - VFS_UNLOCK_GIANT(vfslocked); - VFS_UNLOCK_GIANT(dvfslocked); - ndp->ni_cnd.cn_flags &= ~GIANTHELD; ndp->ni_vp = NULL; return (error); } @@ -1203,13 +1152,13 @@ kern_alternate_path(struct thread *td, const char *prefix, const char *path, for (cp = &ptr[len] - 1; *cp != '/'; cp--); *cp = '\0'; - NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, buf, td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, buf, td); error = namei(&nd); *cp = '/'; if (error != 0) goto keeporig; } else { - NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, buf, td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, buf, td); error = namei(&nd); if (error != 0) @@ -1223,7 +1172,7 @@ kern_alternate_path(struct thread *td, const char *prefix, const char *path, * root directory and never finding it, because "/" resolves * to the emulation root directory. This is expensive :-( */ - NDINIT(&ndroot, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, prefix, + NDINIT(&ndroot, LOOKUP, FOLLOW, UIO_SYSSPACE, prefix, td); /* We shouldn't ever get an error from this namei(). */ @@ -1234,13 +1183,11 @@ kern_alternate_path(struct thread *td, const char *prefix, const char *path, NDFREE(&ndroot, NDF_ONLY_PNBUF); vrele(ndroot.ni_vp); - VFS_UNLOCK_GIANT(NDHASGIANT(&ndroot)); } } NDFREE(&nd, NDF_ONLY_PNBUF); vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(NDHASGIANT(&nd)); keeporig: /* If there was an error, use the original path name. */ diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c index 5d6892c..845fffd 100644 --- a/sys/kern/vfs_mount.c +++ b/sys/kern/vfs_mount.c @@ -1060,13 +1060,12 @@ vfs_domount( /* * Get vnode to be covered or mount point's vnode in case of MNT_UPDATE. */ - NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1, + NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | AUDITVNODE1, UIO_SYSSPACE, fspath, td); error = namei(&nd); if (error != 0) return (error); - if (!NDHASGIANT(&nd)) - mtx_lock(&Giant); + mtx_lock(&Giant); NDFREE(&nd, NDF_ONLY_PNBUF); vp = nd.ni_vp; if ((fsflags & MNT_UPDATE) == 0) { diff --git a/sys/kern/vfs_mountroot.c b/sys/kern/vfs_mountroot.c index ccbcb33..60b4f05 100644 --- a/sys/kern/vfs_mountroot.c +++ b/sys/kern/vfs_mountroot.c @@ -872,16 +872,13 @@ vfs_mountroot_readconf(struct thread *td, struct sbuf *sb) off_t ofs; int error, flags; int len, resid; - int vfslocked; - NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, - "/.mount.conf", td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, "/.mount.conf", td); flags = FREAD; error = vn_open(&nd, &flags, 0, NULL); if (error) return (error); - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); ofs = 0; len = sizeof(buf) - 1; @@ -900,7 +897,6 @@ vfs_mountroot_readconf(struct thread *td, struct sbuf *sb) VOP_UNLOCK(nd.ni_vp, 0); vn_close(nd.ni_vp, FREAD, td->td_ucred, td); - VFS_UNLOCK_GIANT(vfslocked); return (error); } diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 325ca99..1a98113 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -94,9 +94,6 @@ __FBSDID("$FreeBSD$"); #include #endif -#define WI_MPSAFEQ 0 -#define WI_GIANTQ 1 - static void delmntque(struct vnode *vp); static int flushbuflist(struct bufv *bufv, int flags, struct bufobj *bo, int slpflag, int slptimeo); @@ -222,7 +219,7 @@ static uma_zone_t vnodepoll_zone; static int syncer_delayno; static long syncer_mask; LIST_HEAD(synclist, bufobj); -static struct synclist *syncer_workitem_pending[2]; +static struct synclist *syncer_workitem_pending; /* * The sync_mtx protects: * bo->bo_synclist @@ -334,9 +331,7 @@ vntblinit(void *dummy __unused) /* * Initialize the filesystem syncer. */ - syncer_workitem_pending[WI_MPSAFEQ] = hashinit(syncer_maxdelay, M_VNODE, - &syncer_mask); - syncer_workitem_pending[WI_GIANTQ] = hashinit(syncer_maxdelay, M_VNODE, + syncer_workitem_pending = hashinit(syncer_maxdelay, M_VNODE, &syncer_mask); syncer_maxdelay = syncer_mask + 1; mtx_init(&sync_mtx, "Syncer mtx", NULL, MTX_DEF); @@ -734,7 +729,6 @@ static void vnlru_free(int count) { struct vnode *vp; - int vfslocked; mtx_assert(&vnode_free_list_mtx, MA_OWNED); for (; count > 0; count--) { @@ -762,9 +756,7 @@ vnlru_free(int count) vholdl(vp); mtx_unlock(&vnode_free_list_mtx); VI_UNLOCK(vp); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vtryrecycle(vp); - VFS_UNLOCK_GIANT(vfslocked); /* * If the recycled succeeded this vdrop will actually free * the vnode. If not it will simply place it back on @@ -786,7 +778,7 @@ static void vnlru_proc(void) { struct mount *mp, *nmp; - int done, vfslocked; + int done; struct proc *p = vnlruproc; EVENTHANDLER_REGISTER(shutdown_pre_sync, kproc_shutdown, p, @@ -812,9 +804,7 @@ vnlru_proc(void) nmp = TAILQ_NEXT(mp, mnt_list); continue; } - vfslocked = VFS_LOCK_GIANT(mp); done += vlrureclaim(mp); - VFS_UNLOCK_GIANT(vfslocked); mtx_lock(&mountlist_mtx); nmp = TAILQ_NEXT(mp, mnt_list); vfs_unbusy(mp); @@ -1087,11 +1077,8 @@ insmntque1(struct vnode *vp, struct mount *mp, KASSERT(vp->v_mount == NULL, ("insmntque: vnode already on per mount vnode list")); VNASSERT(mp != NULL, vp, ("Don't call insmntque(foo, NULL)")); -#ifdef DEBUG_VFS_LOCKS - if (!VFS_NEEDSGIANT(mp)) - ASSERT_VOP_ELOCKED(vp, - "insmntque: mp-safe fs and non-locked vp"); -#endif + ASSERT_VOP_ELOCKED(vp, + "insmntque: mp-safe fs and non-locked vp"); MNT_ILOCK(mp); if ((mp->mnt_kern_flag & MNTK_NOINSMNTQ) != 0 && ((mp->mnt_kern_flag & MNTK_UNMOUNTF) != 0 || @@ -1606,8 +1593,6 @@ bgetvp(struct vnode *vp, struct buf *bp) ("bgetvp: bp already attached! %p", bp)); vhold(vp); - if (VFS_NEEDSGIANT(vp->v_mount) || bo->bo_flag & BO_NEEDSGIANT) - bp->b_flags |= B_NEEDSGIANT; bp->b_vp = vp; bp->b_bufobj = bo; /* @@ -1658,7 +1643,7 @@ brelvp(struct buf *bp) static void vn_syncer_add_to_worklist(struct bufobj *bo, int delay) { - int queue, slot; + int slot; ASSERT_BO_LOCKED(bo); @@ -1674,10 +1659,7 @@ vn_syncer_add_to_worklist(struct bufobj *bo, int delay) delay = syncer_maxdelay - 2; slot = (syncer_delayno + delay) & syncer_mask; - queue = VFS_NEEDSGIANT(bo->__bo_vnode->v_mount) ? WI_GIANTQ : - WI_MPSAFEQ; - LIST_INSERT_HEAD(&syncer_workitem_pending[queue][slot], bo, - bo_synclist); + LIST_INSERT_HEAD(&syncer_workitem_pending[slot], bo, bo_synclist); mtx_unlock(&sync_mtx); } @@ -1757,8 +1739,7 @@ sync_vnode(struct synclist *slp, struct bufobj **bo, struct thread *td) static void sched_sync(void) { - struct synclist *gnext, *next; - struct synclist *gslp, *slp; + struct synclist *next, *slp; struct bufobj *bo; long starttime; struct thread *td = curthread; @@ -1804,13 +1785,11 @@ sched_sync(void) * Skip over empty worklist slots when shutting down. */ do { - slp = &syncer_workitem_pending[WI_MPSAFEQ][syncer_delayno]; - gslp = &syncer_workitem_pending[WI_GIANTQ][syncer_delayno]; + slp = &syncer_workitem_pending[syncer_delayno]; syncer_delayno += 1; if (syncer_delayno == syncer_maxdelay) syncer_delayno = 0; - next = &syncer_workitem_pending[WI_MPSAFEQ][syncer_delayno]; - gnext = &syncer_workitem_pending[WI_GIANTQ][syncer_delayno]; + next = &syncer_workitem_pending[syncer_delayno]; /* * If the worklist has wrapped since the * it was emptied of all but syncer vnodes, @@ -1824,7 +1803,7 @@ sched_sync(void) syncer_final_iter = SYNCER_SHUTDOWN_SPEEDUP; } } while (syncer_state != SYNCER_RUNNING && LIST_EMPTY(slp) && - LIST_EMPTY(gslp) && syncer_worklist_len > 0); + syncer_worklist_len > 0); /* * Keep track of the last time there was anything @@ -1848,21 +1827,6 @@ sched_sync(void) wdog_kern_pat(WD_LASTVAL); #endif } - if (!LIST_EMPTY(gslp)) { - mtx_unlock(&sync_mtx); - mtx_lock(&Giant); - mtx_lock(&sync_mtx); - while (!LIST_EMPTY(gslp)) { - error = sync_vnode(gslp, &bo, td); - if (error == 1) { - LIST_REMOVE(bo, bo_synclist); - LIST_INSERT_HEAD(gnext, bo, - bo_synclist); - continue; - } - } - mtx_unlock(&Giant); - } if (syncer_state == SYNCER_FINAL_DELAY && syncer_final_iter > 0) syncer_final_iter--; /* @@ -2123,7 +2087,6 @@ vget(struct vnode *vp, int flags, struct thread *td) int error; error = 0; - VFS_ASSERT_GIANT(vp->v_mount); VNASSERT((flags & LK_TYPE_MASK) != 0, vp, ("vget: invalid lock operation")); CTR3(KTR_VFS, "%s: vp %p with flags %d", __func__, vp, flags); @@ -2208,7 +2171,6 @@ vputx(struct vnode *vp, int func) ASSERT_VOP_LOCKED(vp, "vput"); else KASSERT(func == VPUTX_VRELE, ("vputx: wrong func")); - VFS_ASSERT_GIANT(vp->v_mount); CTR2(KTR_VFS, "%s: vp %p", __func__, vp); VI_LOCK(vp); @@ -4394,7 +4356,6 @@ vfs_mark_atime(struct vnode *vp, struct ucred *cred) struct mount *mp; mp = vp->v_mount; - VFS_ASSERT_GIANT(mp); ASSERT_VOP_LOCKED(vp, "vfs_mark_atime"); if (mp != NULL && (mp->mnt_flag & (MNT_NOATIME | MNT_RDONLY)) == 0) (void)VOP_MARKATIME(vp); diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index c0ae0a7..8c1bb97 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -130,7 +130,6 @@ sync(td, uap) struct sync_args *uap; { struct mount *mp, *nmp; - int vfslocked; mtx_lock(&mountlist_mtx); for (mp = TAILQ_FIRST(&mountlist); mp != NULL; mp = nmp) { @@ -138,7 +137,6 @@ sync(td, uap) nmp = TAILQ_NEXT(mp, mnt_list); continue; } - vfslocked = VFS_LOCK_GIANT(mp); if ((mp->mnt_flag & MNT_RDONLY) == 0 && vn_start_write(NULL, &mp, V_NOWAIT) == 0) { MNT_ILOCK(mp); @@ -155,7 +153,6 @@ sync(td, uap) MNT_IUNLOCK(mp); vn_finished_write(mp); } - VFS_UNLOCK_GIANT(vfslocked); mtx_lock(&mountlist_mtx); nmp = TAILQ_NEXT(mp, mnt_list); vfs_unbusy(mp); @@ -186,7 +183,6 @@ quotactl(td, uap) } */ *uap; { struct mount *mp; - int vfslocked; int error; struct nameidata nd; @@ -194,24 +190,20 @@ quotactl(td, uap) AUDIT_ARG_UID(uap->uid); if (!prison_allow(td->td_ucred, PR_ALLOW_QUOTAS)) return (EPERM); - NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1, + NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | AUDITVNODE1, UIO_USERSPACE, uap->path, td); if ((error = namei(&nd)) != 0) return (error); - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); mp = nd.ni_vp->v_mount; vfs_ref(mp); vput(nd.ni_vp); error = vfs_busy(mp, 0); vfs_rel(mp); - if (error) { - VFS_UNLOCK_GIANT(vfslocked); + if (error) return (error); - } error = VFS_QUOTACTL(mp, uap->cmd, uap->uid, uap->arg); vfs_unbusy(mp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -288,26 +280,22 @@ kern_statfs(struct thread *td, char *path, enum uio_seg pathseg, { struct mount *mp; struct statfs *sp, sb; - int vfslocked; int error; struct nameidata nd; - NDINIT(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | MPSAFE | + NDINIT(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | AUDITVNODE1, pathseg, path, td); error = namei(&nd); if (error) return (error); - vfslocked = NDHASGIANT(&nd); mp = nd.ni_vp->v_mount; vfs_ref(mp); NDFREE(&nd, NDF_ONLY_PNBUF); vput(nd.ni_vp); error = vfs_busy(mp, 0); vfs_rel(mp); - if (error) { - VFS_UNLOCK_GIANT(vfslocked); + if (error) return (error); - } #ifdef MAC error = mac_mount_check_stat(td->td_ucred, mp); if (error) @@ -332,7 +320,6 @@ kern_statfs(struct thread *td, char *path, enum uio_seg pathseg, *buf = *sp; out: vfs_unbusy(mp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -368,7 +355,6 @@ kern_fstatfs(struct thread *td, int fd, struct statfs *buf) struct file *fp; struct mount *mp; struct statfs *sp, sb; - int vfslocked; struct vnode *vp; int error; @@ -377,7 +363,6 @@ kern_fstatfs(struct thread *td, int fd, struct statfs *buf) if (error) return (error); vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_SHARED | LK_RETRY); #ifdef AUDIT AUDIT_ARG_VNODE1(vp); @@ -393,10 +378,8 @@ kern_fstatfs(struct thread *td, int fd, struct statfs *buf) } error = vfs_busy(mp, 0); vfs_rel(mp); - if (error) { - VFS_UNLOCK_GIANT(vfslocked); + if (error) return (error); - } #ifdef MAC error = mac_mount_check_stat(td->td_ucred, mp); if (error) @@ -422,7 +405,6 @@ kern_fstatfs(struct thread *td, int fd, struct statfs *buf) out: if (mp) vfs_unbusy(mp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -462,7 +444,6 @@ kern_getfsstat(struct thread *td, struct statfs **buf, size_t bufsize, struct mount *mp, *nmp; struct statfs *sfsp, *sp, sb; size_t count, maxcount; - int vfslocked; int error; maxcount = bufsize / sizeof(struct statfs); @@ -499,7 +480,6 @@ kern_getfsstat(struct thread *td, struct statfs **buf, size_t bufsize, nmp = TAILQ_NEXT(mp, mnt_list); continue; } - vfslocked = VFS_LOCK_GIANT(mp); if (sfsp && count < maxcount) { sp = &mp->mnt_stat; /* @@ -517,7 +497,6 @@ kern_getfsstat(struct thread *td, struct statfs **buf, size_t bufsize, if (((flags & (MNT_LAZY|MNT_NOWAIT)) == 0 || (flags & MNT_WAIT)) && (error = VFS_STATFS(mp, sp))) { - VFS_UNLOCK_GIANT(vfslocked); mtx_lock(&mountlist_mtx); nmp = TAILQ_NEXT(mp, mnt_list); vfs_unbusy(mp); @@ -535,13 +514,11 @@ kern_getfsstat(struct thread *td, struct statfs **buf, size_t bufsize, error = copyout(sp, sfsp, sizeof(*sp)); if (error) { vfs_unbusy(mp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } } sfsp++; } - VFS_UNLOCK_GIANT(vfslocked); count++; mtx_lock(&mountlist_mtx); nmp = TAILQ_NEXT(mp, mnt_list); @@ -742,7 +719,6 @@ fchdir(td, uap) struct vnode *vp, *tdp, *vpold; struct mount *mp; struct file *fp; - int vfslocked; int error; AUDIT_ARG_FD(uap->fd); @@ -751,40 +727,29 @@ fchdir(td, uap) vp = fp->f_vnode; VREF(vp); fdrop(fp, td); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_SHARED | LK_RETRY); AUDIT_ARG_VNODE1(vp); error = change_dir(vp, td); while (!error && (mp = vp->v_mountedhere) != NULL) { - int tvfslocked; if (vfs_busy(mp, 0)) continue; - tvfslocked = VFS_LOCK_GIANT(mp); error = VFS_ROOT(mp, LK_SHARED, &tdp); vfs_unbusy(mp); - if (error) { - VFS_UNLOCK_GIANT(tvfslocked); + if (error) break; - } vput(vp); - VFS_UNLOCK_GIANT(vfslocked); vp = tdp; - vfslocked = tvfslocked; } if (error) { vput(vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); FILEDESC_XLOCK(fdp); vpold = fdp->fd_cdir; fdp->fd_cdir = vp; FILEDESC_XUNLOCK(fdp); - vfslocked = VFS_LOCK_GIANT(vpold->v_mount); vrele(vpold); - VFS_UNLOCK_GIANT(vfslocked); return (0); } @@ -814,29 +779,23 @@ kern_chdir(struct thread *td, char *path, enum uio_seg pathseg) int error; struct nameidata nd; struct vnode *vp; - int vfslocked; - NDINIT(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | AUDITVNODE1 | - MPSAFE, pathseg, path, td); + NDINIT(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | AUDITVNODE1, + pathseg, path, td); if ((error = namei(&nd)) != 0) return (error); - vfslocked = NDHASGIANT(&nd); if ((error = change_dir(nd.ni_vp, td)) != 0) { vput(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); NDFREE(&nd, NDF_ONLY_PNBUF); return (error); } VOP_UNLOCK(nd.ni_vp, 0); - VFS_UNLOCK_GIANT(vfslocked); NDFREE(&nd, NDF_ONLY_PNBUF); FILEDESC_XLOCK(fdp); vp = fdp->fd_cdir; fdp->fd_cdir = nd.ni_vp; FILEDESC_XUNLOCK(fdp); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); return (0); } @@ -897,17 +856,15 @@ chroot(td, uap) { int error; struct nameidata nd; - int vfslocked; error = priv_check(td, PRIV_VFS_CHROOT); if (error) return (error); - NDINIT(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | MPSAFE | + NDINIT(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | AUDITVNODE1, UIO_USERSPACE, uap->path, td); error = namei(&nd); if (error) goto error; - vfslocked = NDHASGIANT(&nd); if ((error = change_dir(nd.ni_vp, td)) != 0) goto e_vunlock; #ifdef MAC @@ -917,12 +874,10 @@ chroot(td, uap) VOP_UNLOCK(nd.ni_vp, 0); error = change_root(nd.ni_vp, td); vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); NDFREE(&nd, NDF_ONLY_PNBUF); return (error); e_vunlock: vput(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); error: NDFREE(&nd, NDF_ONLY_PNBUF); return (error); @@ -963,10 +918,8 @@ change_root(vp, td) { struct filedesc *fdp; struct vnode *oldvp; - int vfslocked; int error; - VFS_ASSERT_GIANT(vp->v_mount); fdp = td->td_proc->p_fd; FILEDESC_XLOCK(fdp); if (chroot_allow_open_directories == 0 || @@ -985,9 +938,7 @@ change_root(vp, td) VREF(fdp->fd_jdir); } FILEDESC_XUNLOCK(fdp); - vfslocked = VFS_LOCK_GIANT(oldvp->v_mount); vrele(oldvp); - VFS_UNLOCK_GIANT(vfslocked); return (0); } @@ -1087,7 +1038,6 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg, int type, indx = -1, error, error_open; struct flock lf; struct nameidata nd; - int vfslocked; cap_rights_t rights_needed = CAP_LOOKUP; AUDIT_ARG_FFLAGS(flags); @@ -1117,7 +1067,7 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg, /* Set the flags early so the finit in devfs can pick them up. */ fp->f_flag = flags & FMASK; cmode = ((mode &~ fdp->fd_cmask) & ALLPERMS) &~ S_ISTXT; - NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | AUDITVNODE1 | MPSAFE, pathseg, + NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | AUDITVNODE1, pathseg, path, fd, rights_needed, td); td->td_dupfd = -1; /* XXX check for fdopen */ error = vn_open(&nd, &flags, cmode, fp); @@ -1163,7 +1113,6 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg, return (error); } td->td_dupfd = 0; - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); vp = nd.ni_vp; @@ -1205,7 +1154,6 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg, if (error) goto bad; } - VFS_UNLOCK_GIANT(vfslocked); success: /* * If we haven't already installed the FD (for dupfdopen), do so now. @@ -1235,7 +1183,6 @@ success: td->td_retval[0] = indx; return (0); bad: - VFS_UNLOCK_GIANT(vfslocked); bad_unlocked: if (indx != -1) fdclose(fdp, fp, indx, td); @@ -1325,7 +1272,6 @@ kern_mknodat(struct thread *td, int fd, char *path, enum uio_seg pathseg, int error; int whiteout = 0; struct nameidata nd; - int vfslocked; AUDIT_ARG_MODE(mode); AUDIT_ARG_DEV(dev); @@ -1353,11 +1299,10 @@ kern_mknodat(struct thread *td, int fd, char *path, enum uio_seg pathseg, restart: bwillwrite(); NDINIT_ATRIGHTS(&nd, CREATE, - LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1, pathseg, path, fd, + LOCKPARENT | SAVENAME | AUDITVNODE1, pathseg, path, fd, CAP_MKFIFO, td); if ((error = namei(&nd)) != 0) return (error); - vfslocked = NDHASGIANT(&nd); vp = nd.ni_vp; if (vp != NULL) { NDFREE(&nd, NDF_ONLY_PNBUF); @@ -1366,7 +1311,6 @@ restart: else vput(nd.ni_dvp); vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); return (EEXIST); } else { VATTR_NULL(&vattr); @@ -1395,7 +1339,6 @@ restart: if (vn_start_write(nd.ni_dvp, &mp, V_NOWAIT) != 0) { NDFREE(&nd, NDF_ONLY_PNBUF); vput(nd.ni_dvp); - VFS_UNLOCK_GIANT(vfslocked); if ((error = vn_start_write(NULL, &mp, V_XSLEEP | PCATCH)) != 0) return (error); goto restart; @@ -1418,7 +1361,6 @@ restart: NDFREE(&nd, NDF_ONLY_PNBUF); vput(nd.ni_dvp); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -1473,16 +1415,14 @@ kern_mkfifoat(struct thread *td, int fd, char *path, enum uio_seg pathseg, struct vattr vattr; int error; struct nameidata nd; - int vfslocked; AUDIT_ARG_MODE(mode); restart: bwillwrite(); - NDINIT_AT(&nd, CREATE, LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1, + NDINIT_AT(&nd, CREATE, LOCKPARENT | SAVENAME | AUDITVNODE1, pathseg, path, fd, td); if ((error = namei(&nd)) != 0) return (error); - vfslocked = NDHASGIANT(&nd); if (nd.ni_vp != NULL) { NDFREE(&nd, NDF_ONLY_PNBUF); if (nd.ni_vp == nd.ni_dvp) @@ -1490,13 +1430,11 @@ restart: else vput(nd.ni_dvp); vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); return (EEXIST); } if (vn_start_write(nd.ni_dvp, &mp, V_NOWAIT) != 0) { NDFREE(&nd, NDF_ONLY_PNBUF); vput(nd.ni_dvp); - VFS_UNLOCK_GIANT(vfslocked); if ((error = vn_start_write(NULL, &mp, V_XSLEEP | PCATCH)) != 0) return (error); goto restart; @@ -1518,7 +1456,6 @@ out: #endif vput(nd.ni_dvp); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); NDFREE(&nd, NDF_ONLY_PNBUF); return (error); } @@ -1619,33 +1556,27 @@ kern_linkat(struct thread *td, int fd1, int fd2, char *path1, char *path2, struct vnode *vp; struct mount *mp; struct nameidata nd; - int vfslocked; - int lvfslocked; int error; bwillwrite(); - NDINIT_AT(&nd, LOOKUP, follow | MPSAFE | AUDITVNODE1, segflg, path1, + NDINIT_AT(&nd, LOOKUP, follow | AUDITVNODE1, segflg, path1, fd1, td); if ((error = namei(&nd)) != 0) return (error); - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); vp = nd.ni_vp; if (vp->v_type == VDIR) { vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); return (EPERM); /* POSIX */ } if ((error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0) { vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } - NDINIT_AT(&nd, CREATE, LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE2, + NDINIT_AT(&nd, CREATE, LOCKPARENT | SAVENAME | AUDITVNODE2, segflg, path2, fd2, td); if ((error = namei(&nd)) == 0) { - lvfslocked = NDHASGIANT(&nd); if (nd.ni_vp != NULL) { if (nd.ni_dvp == nd.ni_vp) vrele(nd.ni_dvp); @@ -1667,11 +1598,9 @@ kern_linkat(struct thread *td, int fd1, int fd2, char *path1, char *path2, vput(nd.ni_dvp); } NDFREE(&nd, NDF_ONLY_PNBUF); - VFS_UNLOCK_GIANT(lvfslocked); } vrele(vp); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -1727,7 +1656,6 @@ kern_symlinkat(struct thread *td, char *path1, int fd, char *path2, char *syspath; int error; struct nameidata nd; - int vfslocked; if (segflg == UIO_SYSSPACE) { syspath = path1; @@ -1739,11 +1667,10 @@ kern_symlinkat(struct thread *td, char *path1, int fd, char *path2, AUDIT_ARG_TEXT(syspath); restart: bwillwrite(); - NDINIT_AT(&nd, CREATE, LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1, + NDINIT_AT(&nd, CREATE, LOCKPARENT | SAVENAME | AUDITVNODE1, segflg, path2, fd, td); if ((error = namei(&nd)) != 0) goto out; - vfslocked = NDHASGIANT(&nd); if (nd.ni_vp) { NDFREE(&nd, NDF_ONLY_PNBUF); if (nd.ni_vp == nd.ni_dvp) @@ -1751,14 +1678,12 @@ restart: else vput(nd.ni_dvp); vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); error = EEXIST; goto out; } if (vn_start_write(nd.ni_dvp, &mp, V_NOWAIT) != 0) { NDFREE(&nd, NDF_ONLY_PNBUF); vput(nd.ni_dvp); - VFS_UNLOCK_GIANT(vfslocked); if ((error = vn_start_write(NULL, &mp, V_XSLEEP | PCATCH)) != 0) goto out; goto restart; @@ -1781,7 +1706,6 @@ out2: NDFREE(&nd, NDF_ONLY_PNBUF); vput(nd.ni_dvp); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); out: if (segflg != UIO_SYSSPACE) uma_zfree(namei_zone, syspath); @@ -1801,16 +1725,14 @@ undelete(td, uap) int error; struct mount *mp; struct nameidata nd; - int vfslocked; restart: bwillwrite(); - NDINIT(&nd, DELETE, LOCKPARENT | DOWHITEOUT | MPSAFE | AUDITVNODE1, + NDINIT(&nd, DELETE, LOCKPARENT | DOWHITEOUT | AUDITVNODE1, UIO_USERSPACE, uap->path, td); error = namei(&nd); if (error) return (error); - vfslocked = NDHASGIANT(&nd); if (nd.ni_vp != NULLVP || !(nd.ni_cnd.cn_flags & ISWHITEOUT)) { NDFREE(&nd, NDF_ONLY_PNBUF); @@ -1820,13 +1742,11 @@ restart: vput(nd.ni_dvp); if (nd.ni_vp) vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); return (EEXIST); } if (vn_start_write(nd.ni_dvp, &mp, V_NOWAIT) != 0) { NDFREE(&nd, NDF_ONLY_PNBUF); vput(nd.ni_dvp); - VFS_UNLOCK_GIANT(vfslocked); if ((error = vn_start_write(NULL, &mp, V_XSLEEP | PCATCH)) != 0) return (error); goto restart; @@ -1835,7 +1755,6 @@ restart: NDFREE(&nd, NDF_ONLY_PNBUF); vput(nd.ni_dvp); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -1897,15 +1816,13 @@ kern_unlinkat(struct thread *td, int fd, char *path, enum uio_seg pathseg, int error; struct nameidata nd; struct stat sb; - int vfslocked; restart: bwillwrite(); - NDINIT_AT(&nd, DELETE, LOCKPARENT | LOCKLEAF | MPSAFE | AUDITVNODE1, + NDINIT_AT(&nd, DELETE, LOCKPARENT | LOCKLEAF | AUDITVNODE1, pathseg, path, fd, td); if ((error = namei(&nd)) != 0) return (error == EINVAL ? EPERM : error); - vfslocked = NDHASGIANT(&nd); vp = nd.ni_vp; if (vp->v_type == VDIR && oldinum == 0) { error = EPERM; /* POSIX */ @@ -1930,7 +1847,6 @@ restart: vrele(vp); else vput(vp); - VFS_UNLOCK_GIANT(vfslocked); if ((error = vn_start_write(NULL, &mp, V_XSLEEP | PCATCH)) != 0) return (error); @@ -1954,7 +1870,6 @@ out: vrele(vp); else vput(vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -1985,7 +1900,6 @@ lseek(td, uap) struct vattr vattr; off_t offset, size; int error, noneg; - int vfslocked; AUDIT_ARG_FD(uap->fd); if ((error = fget(td, uap->fd, CAP_SEEK, &fp)) != 0) @@ -1995,7 +1909,6 @@ lseek(td, uap) return (ESPIPE); } vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); noneg = (vp->v_type != VCHR); offset = uap->offset; switch (uap->whence) { @@ -2050,7 +1963,6 @@ lseek(td, uap) *(off_t *)(td->td_retval) = fp->f_offset; drop: fdrop(fp, td); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -2189,7 +2101,6 @@ kern_accessat(struct thread *td, int fd, char *path, enum uio_seg pathseg, struct ucred *cred, *tmpcred; struct vnode *vp; struct nameidata nd; - int vfslocked; int error; /* @@ -2205,17 +2116,15 @@ kern_accessat(struct thread *td, int fd, char *path, enum uio_seg pathseg, } else cred = tmpcred = td->td_ucred; AUDIT_ARG_VALUE(mode); - NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | MPSAFE | + NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | AUDITVNODE1, pathseg, path, fd, CAP_FSTAT, td); if ((error = namei(&nd)) != 0) goto out1; - vfslocked = NDHASGIANT(&nd); vp = nd.ni_vp; error = vn_access(vp, mode, tmpcred, td); NDFREE(&nd, NDF_ONLY_PNBUF); vput(vp); - VFS_UNLOCK_GIANT(vfslocked); out1: if (!(flags & AT_EACCESS)) { td->td_ucred = cred; @@ -2410,18 +2319,17 @@ kern_statat_vnhook(struct thread *td, int flag, int fd, char *path, { struct nameidata nd; struct stat sb; - int error, vfslocked; + int error; if (flag & ~AT_SYMLINK_NOFOLLOW) return (EINVAL); NDINIT_ATRIGHTS(&nd, LOOKUP, ((flag & AT_SYMLINK_NOFOLLOW) ? NOFOLLOW : - FOLLOW) | LOCKSHARED | LOCKLEAF | AUDITVNODE1 | MPSAFE, pathseg, + FOLLOW) | LOCKSHARED | LOCKLEAF | AUDITVNODE1, pathseg, path, fd, CAP_FSTAT, td); if ((error = namei(&nd)) != 0) return (error); - vfslocked = NDHASGIANT(&nd); error = vn_stat(nd.ni_vp, &sb, td->td_ucred, NOCRED, td); if (!error) { SDT_PROBE(vfs, , stat, mode, path, sb.st_mode, 0, 0, 0); @@ -2432,7 +2340,6 @@ kern_statat_vnhook(struct thread *td, int flag, int fd, char *path, } NDFREE(&nd, NDF_ONLY_PNBUF); vput(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); if (error) return (error); *sbp = sb; @@ -2603,13 +2510,12 @@ kern_pathconf(struct thread *td, char *path, enum uio_seg pathseg, int name, u_long flags) { struct nameidata nd; - int error, vfslocked; + int error; - NDINIT(&nd, LOOKUP, LOCKSHARED | LOCKLEAF | MPSAFE | AUDITVNODE1 | - flags, pathseg, path, td); + NDINIT(&nd, LOOKUP, LOCKSHARED | LOCKLEAF | AUDITVNODE1 | flags, + pathseg, path, td); if ((error = namei(&nd)) != 0) return (error); - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); /* If asynchronous I/O is available, it works for all files. */ @@ -2618,7 +2524,6 @@ kern_pathconf(struct thread *td, char *path, enum uio_seg pathseg, int name, else error = VOP_PATHCONF(nd.ni_vp, name, td->td_retval); vput(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -2679,24 +2584,21 @@ kern_readlinkat(struct thread *td, int fd, char *path, enum uio_seg pathseg, struct uio auio; int error; struct nameidata nd; - int vfslocked; if (count > INT_MAX) return (EINVAL); - NDINIT_AT(&nd, LOOKUP, NOFOLLOW | LOCKSHARED | LOCKLEAF | MPSAFE | + NDINIT_AT(&nd, LOOKUP, NOFOLLOW | LOCKSHARED | LOCKLEAF | AUDITVNODE1, pathseg, path, fd, td); if ((error = namei(&nd)) != 0) return (error); NDFREE(&nd, NDF_ONLY_PNBUF); - vfslocked = NDHASGIANT(&nd); vp = nd.ni_vp; #ifdef MAC error = mac_vnode_check_readlink(td->td_ucred, vp); if (error) { vput(vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } #endif @@ -2715,7 +2617,6 @@ kern_readlinkat(struct thread *td, int fd, char *path, enum uio_seg pathseg, error = VOP_READLINK(vp, &auio, td->td_ucred); } vput(vp); - VFS_UNLOCK_GIANT(vfslocked); td->td_retval[0] = count - auio.uio_resid; return (error); } @@ -2779,18 +2680,15 @@ chflags(td, uap) { int error; struct nameidata nd; - int vfslocked; AUDIT_ARG_FFLAGS(uap->flags); - NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE | AUDITVNODE1, UIO_USERSPACE, + NDINIT(&nd, LOOKUP, FOLLOW | AUDITVNODE1, UIO_USERSPACE, uap->path, td); if ((error = namei(&nd)) != 0) return (error); NDFREE(&nd, NDF_ONLY_PNBUF); - vfslocked = NDHASGIANT(&nd); error = setfflags(td, nd.ni_vp, uap->flags); vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -2807,18 +2705,15 @@ lchflags(td, uap) { int error; struct nameidata nd; - int vfslocked; AUDIT_ARG_FFLAGS(uap->flags); - NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE | AUDITVNODE1, UIO_USERSPACE, + NDINIT(&nd, LOOKUP, NOFOLLOW | AUDITVNODE1, UIO_USERSPACE, uap->path, td); if ((error = namei(&nd)) != 0) return (error); - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); error = setfflags(td, nd.ni_vp, uap->flags); vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -2840,7 +2735,6 @@ fchflags(td, uap) } */ *uap; { struct file *fp; - int vfslocked; int error; AUDIT_ARG_FD(uap->fd); @@ -2848,14 +2742,12 @@ fchflags(td, uap) if ((error = getvnode(td->td_proc->p_fd, uap->fd, CAP_FCHFLAGS, &fp)) != 0) return (error); - vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); #ifdef AUDIT vn_lock(fp->f_vnode, LK_SHARED | LK_RETRY); AUDIT_ARG_VNODE1(fp->f_vnode); VOP_UNLOCK(fp->f_vnode, 0); #endif error = setfflags(td, fp->f_vnode, uap->flags); - VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); return (error); } @@ -2968,20 +2860,17 @@ kern_fchmodat(struct thread *td, int fd, char *path, enum uio_seg pathseg, { int error; struct nameidata nd; - int vfslocked; int follow; AUDIT_ARG_MODE(mode); follow = (flag & AT_SYMLINK_NOFOLLOW) ? NOFOLLOW : FOLLOW; - NDINIT_ATRIGHTS(&nd, LOOKUP, follow | MPSAFE | AUDITVNODE1, pathseg, + NDINIT_ATRIGHTS(&nd, LOOKUP, follow | AUDITVNODE1, pathseg, path, fd, CAP_FCHMOD, td); if ((error = namei(&nd)) != 0) return (error); - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); error = setfmode(td, td->td_ucred, nd.ni_vp, mode); vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -3101,20 +2990,18 @@ kern_fchownat(struct thread *td, int fd, char *path, enum uio_seg pathseg, int uid, int gid, int flag) { struct nameidata nd; - int error, vfslocked, follow; + int error, follow; AUDIT_ARG_OWNER(uid, gid); follow = (flag & AT_SYMLINK_NOFOLLOW) ? NOFOLLOW : FOLLOW; - NDINIT_ATRIGHTS(&nd, LOOKUP, follow | MPSAFE | AUDITVNODE1, pathseg, + NDINIT_ATRIGHTS(&nd, LOOKUP, follow | AUDITVNODE1, pathseg, path, fd, CAP_FCHOWN, td); if ((error = namei(&nd)) != 0) return (error); - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); error = setfown(td, td->td_ucred, nd.ni_vp, uid, gid); vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -3309,20 +3196,18 @@ kern_utimesat(struct thread *td, int fd, char *path, enum uio_seg pathseg, { struct nameidata nd; struct timespec ts[2]; - int error, vfslocked; + int error; if ((error = getutimes(tptr, tptrseg, ts)) != 0) return (error); - NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | MPSAFE | AUDITVNODE1, pathseg, + NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | AUDITVNODE1, pathseg, path, fd, CAP_FUTIMES, td); if ((error = namei(&nd)) != 0) return (error); - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); error = setutimes(td, nd.ni_vp, ts, 2, tptr == NULL); vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -3355,18 +3240,15 @@ kern_lutimes(struct thread *td, char *path, enum uio_seg pathseg, struct timespec ts[2]; int error; struct nameidata nd; - int vfslocked; if ((error = getutimes(tptr, tptrseg, ts)) != 0) return (error); - NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE | AUDITVNODE1, pathseg, path, td); + NDINIT(&nd, LOOKUP, NOFOLLOW | AUDITVNODE1, pathseg, path, td); if ((error = namei(&nd)) != 0) return (error); - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); error = setutimes(td, nd.ni_vp, ts, 2, tptr == NULL); vrele(nd.ni_vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -3397,7 +3279,6 @@ kern_futimes(struct thread *td, int fd, struct timeval *tptr, { struct timespec ts[2]; struct file *fp; - int vfslocked; int error; AUDIT_ARG_FD(fd); @@ -3406,14 +3287,12 @@ kern_futimes(struct thread *td, int fd, struct timeval *tptr, if ((error = getvnode(td->td_proc->p_fd, fd, CAP_FUTIMES, &fp)) != 0) return (error); - vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); #ifdef AUDIT vn_lock(fp->f_vnode, LK_SHARED | LK_RETRY); AUDIT_ARG_VNODE1(fp->f_vnode); VOP_UNLOCK(fp->f_vnode, 0); #endif error = setutimes(td, fp->f_vnode, ts, 2, tptr == NULL); - VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); return (error); } @@ -3449,18 +3328,15 @@ kern_truncate(struct thread *td, char *path, enum uio_seg pathseg, off_t length) struct vattr vattr; int error; struct nameidata nd; - int vfslocked; if (length < 0) return(EINVAL); - NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE | AUDITVNODE1, pathseg, path, td); + NDINIT(&nd, LOOKUP, FOLLOW | AUDITVNODE1, pathseg, path, td); if ((error = namei(&nd)) != 0) return (error); - vfslocked = NDHASGIANT(&nd); vp = nd.ni_vp; if ((error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0) { vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } NDFREE(&nd, NDF_ONLY_PNBUF); @@ -3479,7 +3355,6 @@ kern_truncate(struct thread *td, char *path, enum uio_seg pathseg, off_t length) } vput(vp); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -3552,7 +3427,6 @@ fsync(td, uap) struct vnode *vp; struct mount *mp; struct file *fp; - int vfslocked; int error, lock_flags; AUDIT_ARG_FD(uap->fd); @@ -3560,7 +3434,6 @@ fsync(td, uap) &fp)) != 0) return (error); vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); if ((error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0) goto drop; if (MNT_SHARED_WRITES(mp) || @@ -3581,7 +3454,6 @@ fsync(td, uap) VOP_UNLOCK(vp, 0); vn_finished_write(mp); drop: - VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); return (error); } @@ -3638,23 +3510,19 @@ kern_renameat(struct thread *td, int oldfd, char *old, int newfd, char *new, struct mount *mp = NULL; struct vnode *tvp, *fvp, *tdvp; struct nameidata fromnd, tond; - int tvfslocked; - int fvfslocked; int error; bwillwrite(); #ifdef MAC NDINIT_ATRIGHTS(&fromnd, DELETE, LOCKPARENT | LOCKLEAF | SAVESTART | - MPSAFE | AUDITVNODE1, pathseg, old, oldfd, CAP_DELETE, td); + AUDITVNODE1, pathseg, old, oldfd, CAP_DELETE, td); #else - NDINIT_ATRIGHTS(&fromnd, DELETE, WANTPARENT | SAVESTART | MPSAFE | + NDINIT_ATRIGHTS(&fromnd, DELETE, WANTPARENT | SAVESTART | AUDITVNODE1, pathseg, old, oldfd, CAP_DELETE, td); #endif if ((error = namei(&fromnd)) != 0) return (error); - fvfslocked = NDHASGIANT(&fromnd); - tvfslocked = 0; #ifdef MAC error = mac_vnode_check_rename_from(td->td_ucred, fromnd.ni_dvp, fromnd.ni_vp, &fromnd.ni_cnd); @@ -3672,7 +3540,7 @@ kern_renameat(struct thread *td, int oldfd, char *old, int newfd, char *new, goto out1; } NDINIT_ATRIGHTS(&tond, RENAME, LOCKPARENT | LOCKLEAF | NOCACHE | - SAVESTART | MPSAFE | AUDITVNODE2, pathseg, new, newfd, CAP_CREATE, + SAVESTART | AUDITVNODE2, pathseg, new, newfd, CAP_CREATE, td); if (fromnd.ni_vp->v_type == VDIR) tond.ni_cnd.cn_flags |= WILLBEDIR; @@ -3686,7 +3554,6 @@ kern_renameat(struct thread *td, int oldfd, char *old, int newfd, char *new, vn_finished_write(mp); goto out1; } - tvfslocked = NDHASGIANT(&tond); tdvp = tond.ni_dvp; tvp = tond.ni_vp; if (tvp != NULL) { @@ -3736,8 +3603,6 @@ out: out1: if (fromnd.ni_startdir) vrele(fromnd.ni_startdir); - VFS_UNLOCK_GIANT(fvfslocked); - VFS_UNLOCK_GIANT(tvfslocked); if (error == -1) return (0); return (error); @@ -3794,17 +3659,15 @@ kern_mkdirat(struct thread *td, int fd, char *path, enum uio_seg segflg, struct vattr vattr; int error; struct nameidata nd; - int vfslocked; AUDIT_ARG_MODE(mode); restart: bwillwrite(); - NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | SAVENAME | MPSAFE | + NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | SAVENAME | AUDITVNODE1, segflg, path, fd, CAP_MKDIR, td); nd.ni_cnd.cn_flags |= WILLBEDIR; if ((error = namei(&nd)) != 0) return (error); - vfslocked = NDHASGIANT(&nd); vp = nd.ni_vp; if (vp != NULL) { NDFREE(&nd, NDF_ONLY_PNBUF); @@ -3818,13 +3681,11 @@ restart: else vput(nd.ni_dvp); vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); return (EEXIST); } if (vn_start_write(nd.ni_dvp, &mp, V_NOWAIT) != 0) { NDFREE(&nd, NDF_ONLY_PNBUF); vput(nd.ni_dvp); - VFS_UNLOCK_GIANT(vfslocked); if ((error = vn_start_write(NULL, &mp, V_XSLEEP | PCATCH)) != 0) return (error); goto restart; @@ -3847,7 +3708,6 @@ out: if (!error) vput(nd.ni_vp); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -3884,15 +3744,13 @@ kern_rmdirat(struct thread *td, int fd, char *path, enum uio_seg pathseg) struct vnode *vp; int error; struct nameidata nd; - int vfslocked; restart: bwillwrite(); - NDINIT_ATRIGHTS(&nd, DELETE, LOCKPARENT | LOCKLEAF | MPSAFE | + NDINIT_ATRIGHTS(&nd, DELETE, LOCKPARENT | LOCKLEAF | AUDITVNODE1, pathseg, path, fd, CAP_RMDIR, td); if ((error = namei(&nd)) != 0) return (error); - vfslocked = NDHASGIANT(&nd); vp = nd.ni_vp; if (vp->v_type != VDIR) { error = ENOTDIR; @@ -3925,7 +3783,6 @@ restart: vrele(nd.ni_dvp); else vput(nd.ni_dvp); - VFS_UNLOCK_GIANT(vfslocked); if ((error = vn_start_write(NULL, &mp, V_XSLEEP | PCATCH)) != 0) return (error); goto restart; @@ -3939,7 +3796,6 @@ out: vrele(nd.ni_dvp); else vput(nd.ni_dvp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -3977,7 +3833,7 @@ kern_ogetdirentries(struct thread *td, struct ogetdirentries_args *uap, struct iovec aiov, kiov; struct dirent *dp, *edp; caddr_t dirbuf; - int error, eofflag, readcnt, vfslocked; + int error, eofflag, readcnt; long loff; /* XXX arbitrary sanity limit on `count'. */ @@ -3992,9 +3848,7 @@ kern_ogetdirentries(struct thread *td, struct ogetdirentries_args *uap, } vp = fp->f_vnode; unionread: - vfslocked = VFS_LOCK_GIANT(vp->v_mount); if (vp->v_type != VDIR) { - VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); return (EINVAL); } @@ -4012,7 +3866,6 @@ unionread: error = mac_vnode_check_readdir(td->td_ucred, vp); if (error) { VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); return (error); } @@ -4070,7 +3923,6 @@ unionread: } if (error) { VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); return (error); } @@ -4084,11 +3936,9 @@ unionread: fp->f_data = vp; fp->f_offset = 0; vput(tvp); - VFS_UNLOCK_GIANT(vfslocked); goto unionread; } VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); td->td_retval[0] = uap->count - auio.uio_resid; if (error == 0) @@ -4137,7 +3987,6 @@ kern_getdirentries(struct thread *td, int fd, char *buf, u_int count, struct file *fp; struct uio auio; struct iovec aiov; - int vfslocked; long loff; int error, eofflag; @@ -4153,9 +4002,7 @@ kern_getdirentries(struct thread *td, int fd, char *buf, u_int count, } vp = fp->f_vnode; unionread: - vfslocked = VFS_LOCK_GIANT(vp->v_mount); if (vp->v_type != VDIR) { - VFS_UNLOCK_GIANT(vfslocked); error = EINVAL; goto fail; } @@ -4179,7 +4026,6 @@ unionread: fp->f_offset = auio.uio_offset; if (error) { VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); goto fail; } if (count == auio.uio_resid && @@ -4192,11 +4038,9 @@ unionread: fp->f_data = vp; fp->f_offset = 0; vput(tvp); - VFS_UNLOCK_GIANT(vfslocked); goto unionread; } VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); *basep = loff; td->td_retval[0] = count - auio.uio_resid; fail: @@ -4273,13 +4117,11 @@ revoke(td, uap) struct vattr vattr; int error; struct nameidata nd; - int vfslocked; - NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1, + NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | AUDITVNODE1, UIO_USERSPACE, uap->path, td); if ((error = namei(&nd)) != 0) return (error); - vfslocked = NDHASGIANT(&nd); vp = nd.ni_vp; NDFREE(&nd, NDF_ONLY_PNBUF); if (vp->v_type != VCHR || vp->v_rdev == NULL) { @@ -4303,7 +4145,6 @@ revoke(td, uap) VOP_REVOKE(vp, REVOKEALL); out: vput(vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -4368,25 +4209,22 @@ lgetfh(td, uap) struct nameidata nd; fhandle_t fh; register struct vnode *vp; - int vfslocked; int error; error = priv_check(td, PRIV_VFS_GETFH); if (error) return (error); - NDINIT(&nd, LOOKUP, NOFOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1, + NDINIT(&nd, LOOKUP, NOFOLLOW | LOCKLEAF | AUDITVNODE1, UIO_USERSPACE, uap->fname, td); error = namei(&nd); if (error) return (error); - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); vp = nd.ni_vp; bzero(&fh, sizeof(fh)); fh.fh_fsid = vp->v_mount->mnt_stat.f_fsid; error = VOP_VPTOFH(vp, &fh.fh_fid); vput(vp); - VFS_UNLOCK_GIANT(vfslocked); if (error) return (error); error = copyout(&fh, uap->fhp, sizeof (fh)); @@ -4407,25 +4245,22 @@ getfh(td, uap) struct nameidata nd; fhandle_t fh; register struct vnode *vp; - int vfslocked; int error; error = priv_check(td, PRIV_VFS_GETFH); if (error) return (error); - NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1, + NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | AUDITVNODE1, UIO_USERSPACE, uap->fname, td); error = namei(&nd); if (error) return (error); - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); vp = nd.ni_vp; bzero(&fh, sizeof(fh)); fh.fh_fsid = vp->v_mount->mnt_stat.f_fsid; error = VOP_VPTOFH(vp, &fh.fh_fid); vput(vp); - VFS_UNLOCK_GIANT(vfslocked); if (error) return (error); error = copyout(&fh, uap->fhp, sizeof (fh)); @@ -4465,7 +4300,6 @@ fhopen(td, uap) int fmode, error, type; accmode_t accmode; struct file *nfp; - int vfslocked; int indx; error = priv_check(td, PRIV_VFS_FHOPEN); @@ -4482,7 +4316,6 @@ fhopen(td, uap) mp = vfs_busyfs(&fhp.fh_fsid); if (mp == NULL) return (ESTALE); - vfslocked = VFS_LOCK_GIANT(mp); /* now give me my vnode, it gets returned to me locked */ error = VFS_FHTOVP(mp, &fhp.fh_fid, LK_EXCLUSIVE, &vp); vfs_unbusy(mp); @@ -4616,14 +4449,12 @@ fhopen(td, uap) VOP_UNLOCK(vp, 0); fdrop(fp, td); - VFS_UNLOCK_GIANT(vfslocked); td->td_retval[0] = indx; return (0); bad: vput(vp); out: - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -4648,7 +4479,6 @@ fhstat(td, uap) fhandle_t fh; struct mount *mp; struct vnode *vp; - int vfslocked; int error; error = priv_check(td, PRIV_VFS_FHSTAT); @@ -4659,16 +4489,12 @@ fhstat(td, uap) return (error); if ((mp = vfs_busyfs(&fh.fh_fsid)) == NULL) return (ESTALE); - vfslocked = VFS_LOCK_GIANT(mp); error = VFS_FHTOVP(mp, &fh.fh_fid, LK_EXCLUSIVE, &vp); vfs_unbusy(mp); - if (error) { - VFS_UNLOCK_GIANT(vfslocked); + if (error) return (error); - } error = vn_stat(vp, &sb, td->td_ucred, NOCRED, td); vput(vp); - VFS_UNLOCK_GIANT(vfslocked); if (error) return (error); error = copyout(&sb, uap->sb, sizeof(sb)); @@ -4711,7 +4537,6 @@ kern_fhstatfs(struct thread *td, fhandle_t fh, struct statfs *buf) struct statfs *sp; struct mount *mp; struct vnode *vp; - int vfslocked; int error; error = priv_check(td, PRIV_VFS_FHSTATFS); @@ -4719,11 +4544,9 @@ kern_fhstatfs(struct thread *td, fhandle_t fh, struct statfs *buf) return (error); if ((mp = vfs_busyfs(&fh.fh_fsid)) == NULL) return (ESTALE); - vfslocked = VFS_LOCK_GIANT(mp); error = VFS_FHTOVP(mp, &fh.fh_fid, LK_EXCLUSIVE, &vp); if (error) { vfs_unbusy(mp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } vput(vp); @@ -4747,7 +4570,6 @@ kern_fhstatfs(struct thread *td, fhandle_t fh, struct statfs *buf) *buf = *sp; out: vfs_unbusy(mp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -4802,17 +4624,13 @@ kern_posix_fallocate(struct thread *td, int fd, off_t offset, off_t len) ooffset = offset; bwillwrite(); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); mp = NULL; error = vn_start_write(vp, &mp, V_WAIT | PCATCH); - if (error != 0) { - VFS_UNLOCK_GIANT(vfslocked); + if (error != 0) break; - } error = vn_lock(vp, LK_EXCLUSIVE); if (error != 0) { vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); break; } #ifdef MAC @@ -4822,7 +4640,6 @@ kern_posix_fallocate(struct thread *td, int fd, off_t offset, off_t len) error = VOP_ALLOCATE(vp, &offset, &len); VOP_UNLOCK(vp, 0); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); if (olen + ooffset != offset + len) { panic("offset + len changed from %jx/%jx to %jx/%jx", diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index 92fb0d9..4a5a4a3 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -119,16 +119,12 @@ vn_open_cred(struct nameidata *ndp, int *flagp, int cmode, u_int vn_open_flags, struct vattr *vap = &vat; int fmode, error; accmode_t accmode; - int vfslocked, mpsafe; - mpsafe = ndp->ni_cnd.cn_flags & MPSAFE; restart: - vfslocked = 0; fmode = *flagp; if (fmode & O_CREAT) { ndp->ni_cnd.cn_nameiop = CREATE; - ndp->ni_cnd.cn_flags = ISOPEN | LOCKPARENT | LOCKLEAF | - MPSAFE; + ndp->ni_cnd.cn_flags = ISOPEN | LOCKPARENT | LOCKLEAF; if ((fmode & O_EXCL) == 0 && (fmode & O_NOFOLLOW) == 0) ndp->ni_cnd.cn_flags |= FOLLOW; if (!(vn_open_flags & VN_OPEN_NOAUDIT)) @@ -136,9 +132,6 @@ restart: bwillwrite(); if ((error = namei(ndp)) != 0) return (error); - vfslocked = NDHASGIANT(ndp); - if (!mpsafe) - ndp->ni_cnd.cn_flags &= ~MPSAFE; if (ndp->ni_vp == NULL) { VATTR_NULL(vap); vap->va_type = VREG; @@ -148,7 +141,6 @@ restart: if (vn_start_write(ndp->ni_dvp, &mp, V_NOWAIT) != 0) { NDFREE(ndp, NDF_ONLY_PNBUF); vput(ndp->ni_dvp); - VFS_UNLOCK_GIANT(vfslocked); if ((error = vn_start_write(NULL, &mp, V_XSLEEP | PCATCH)) != 0) return (error); @@ -164,7 +156,6 @@ restart: vput(ndp->ni_dvp); vn_finished_write(mp); if (error) { - VFS_UNLOCK_GIANT(vfslocked); NDFREE(ndp, NDF_ONLY_PNBUF); return (error); } @@ -186,17 +177,13 @@ restart: } else { ndp->ni_cnd.cn_nameiop = LOOKUP; ndp->ni_cnd.cn_flags = ISOPEN | - ((fmode & O_NOFOLLOW) ? NOFOLLOW : FOLLOW) | - LOCKLEAF | MPSAFE; + ((fmode & O_NOFOLLOW) ? NOFOLLOW : FOLLOW) | LOCKLEAF; if (!(fmode & FWRITE)) ndp->ni_cnd.cn_flags |= LOCKSHARED; if (!(vn_open_flags & VN_OPEN_NOAUDIT)) ndp->ni_cnd.cn_flags |= AUDITVNODE1; if ((error = namei(ndp)) != 0) return (error); - if (!mpsafe) - ndp->ni_cnd.cn_flags &= ~MPSAFE; - vfslocked = NDHASGIANT(ndp); vp = ndp->ni_vp; } if (vp->v_type == VLNK) { @@ -249,13 +236,10 @@ restart: vp->v_writecount++; *flagp = fmode; ASSERT_VOP_LOCKED(vp, "vn_open_cred"); - if (!mpsafe) - VFS_UNLOCK_GIANT(vfslocked); return (0); bad: NDFREE(ndp, NDF_ONLY_PNBUF); vput(vp); - VFS_UNLOCK_GIANT(vfslocked); *flagp = fmode; ndp->ni_vp = NULL; return (error); @@ -301,8 +285,6 @@ vn_close(vp, flags, file_cred, td) else lock_flags = LK_EXCLUSIVE; - VFS_ASSERT_GIANT(vp->v_mount); - vn_start_write(vp, &mp, V_WAIT); vn_lock(vp, lock_flags | LK_RETRY); if (flags & FWRITE) { @@ -382,8 +364,6 @@ vn_rdwr(rw, vp, base, len, offset, segflg, ioflg, active_cred, file_cred, struct ucred *cred; int error, lock_flags; - VFS_ASSERT_GIANT(vp->v_mount); - if ((ioflg & IO_NODELOCKED) == 0) { mp = NULL; if (rw == UIO_WRITE) { @@ -472,8 +452,6 @@ vn_rdwr_inchunks(rw, vp, base, len, offset, segflg, ioflg, active_cred, int error = 0; int iaresid; - VFS_ASSERT_GIANT(vp->v_mount); - do { int chunk; @@ -518,7 +496,6 @@ vn_read(fp, uio, active_cred, flags, td) struct vnode *vp; int error, ioflag; struct mtx *mtxp; - int vfslocked; KASSERT(uio->uio_td == td, ("uio_td %p is not td %p", uio->uio_td, td)); @@ -529,7 +506,6 @@ vn_read(fp, uio, active_cred, flags, td) ioflag |= IO_NDELAY; if (fp->f_flag & O_DIRECT) ioflag |= IO_DIRECT; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); /* * According to McKusick the vn lock was protecting f_offset here. * It is now protected by the FOFFSET_LOCKED flag. @@ -566,7 +542,6 @@ vn_read(fp, uio, active_cred, flags, td) } fp->f_nextoff = uio->uio_offset; VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -584,12 +559,10 @@ vn_write(fp, uio, active_cred, flags, td) struct vnode *vp; struct mount *mp; int error, ioflag, lock_flags; - int vfslocked; KASSERT(uio->uio_td == td, ("uio_td %p is not td %p", uio->uio_td, td)); vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); if (vp->v_type == VREG) bwillwrite(); ioflag = IO_UNIT; @@ -631,7 +604,6 @@ vn_write(fp, uio, active_cred, flags, td) if (vp->v_type != VCHR) vn_finished_write(mp); unlock: - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -648,16 +620,12 @@ vn_truncate(fp, length, active_cred, td) struct vattr vattr; struct mount *mp; struct vnode *vp; - int vfslocked; int error; vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); error = vn_start_write(vp, &mp, V_WAIT | PCATCH); - if (error) { - VFS_UNLOCK_GIANT(vfslocked); + if (error) return (error); - } vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); if (vp->v_type == VDIR) { error = EISDIR; @@ -677,7 +645,6 @@ vn_truncate(fp, length, active_cred, td) out: VOP_UNLOCK(vp, 0); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -692,14 +659,11 @@ vn_statfile(fp, sb, active_cred, td) struct thread *td; { struct vnode *vp = fp->f_vnode; - int vfslocked; int error; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_SHARED | LK_RETRY); error = vn_stat(vp, sb, active_cred, fp->f_cred, td); VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -827,10 +791,8 @@ vn_ioctl(fp, com, data, active_cred, td) { struct vnode *vp = fp->f_vnode; struct vattr vattr; - int vfslocked; int error; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); error = ENOTTY; switch (vp->v_type) { case VREG: @@ -852,7 +814,6 @@ vn_ioctl(fp, com, data, active_cred, td) default: break; } - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -867,11 +828,9 @@ vn_poll(fp, events, active_cred, td) struct thread *td; { struct vnode *vp; - int vfslocked; int error; vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); #ifdef MAC vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); error = mac_vnode_check_poll(active_cred, fp->f_cred, vp); @@ -880,7 +839,6 @@ vn_poll(fp, events, active_cred, td) #endif error = VOP_POLL(vp, events, fp->f_cred, td); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -929,12 +887,10 @@ vn_closefile(fp, td) { struct vnode *vp; struct flock lf; - int vfslocked; int error; vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); if (fp->f_type == DTYPE_VNODE && fp->f_flag & FHASLOCK) { lf.l_whence = SEEK_SET; lf.l_start = 0; @@ -946,7 +902,6 @@ vn_closefile(fp, td) fp->f_ops = &badfileops; error = vn_close(vp, fp->f_flag, fp->f_cred, td); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -1186,14 +1141,10 @@ vfs_write_resume(mp) static int vn_kqfilter(struct file *fp, struct knote *kn) { - int vfslocked; int error; - vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); error = VOP_KQFILTER(fp->f_vnode, kn); - VFS_UNLOCK_GIANT(vfslocked); - - return error; + return (error); } /* @@ -1369,17 +1320,15 @@ vn_chmod(struct file *fp, mode_t mode, struct ucred *active_cred, struct thread *td) { struct vnode *vp; - int error, vfslocked; + int error; vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); #ifdef AUDIT vn_lock(vp, LK_SHARED | LK_RETRY); AUDIT_ARG_VNODE1(vp); VOP_UNLOCK(vp, 0); #endif error = setfmode(td, active_cred, vp, mode); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -1388,17 +1337,15 @@ vn_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred, struct thread *td) { struct vnode *vp; - int error, vfslocked; + int error; vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); #ifdef AUDIT vn_lock(vp, LK_SHARED | LK_RETRY); AUDIT_ARG_VNODE1(vp); VOP_UNLOCK(vp, 0); #endif error = setfown(td, active_cred, vp, uid, gid); - VFS_UNLOCK_GIANT(vfslocked); return (error); } diff --git a/sys/nfsserver/nfs.h b/sys/nfsserver/nfs.h index 4bdceda..3d01923 100644 --- a/sys/nfsserver/nfs.h +++ b/sys/nfsserver/nfs.h @@ -268,7 +268,7 @@ int nfsrv_commit(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, struct mbuf **mrq); int nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, struct mbuf **mrq); -int nfsrv_fhtovp(fhandle_t *, int, struct vnode **, int *, +int nfsrv_fhtovp(fhandle_t *, int, struct vnode **, struct nfsrv_descript *, struct nfssvc_sock *, struct sockaddr *, int *); int nfsrv_setpublicfs(struct mount *, struct netexport *, diff --git a/sys/nfsserver/nfs_serv.c b/sys/nfsserver/nfs_serv.c index 1b9dd98..7b4602c 100644 --- a/sys/nfsserver/nfs_serv.c +++ b/sys/nfsserver/nfs_serv.c @@ -160,32 +160,6 @@ ndclear(struct nameidata *nd) } /* - * Takes two vfslocked integers and returns with at most one - * reference to giant. The return value indicates whether giant - * is held by either lock. This simplifies nfsrv ops by allowing - * them to track only one vfslocked var. - */ -static __inline int -nfsrv_lockedpair(int vfs1, int vfs2) -{ - - if (vfs1 && vfs2) - VFS_UNLOCK_GIANT(vfs2); - - return (vfs1 | vfs2); -} - -static __inline int -nfsrv_lockedpair_nd(int vfs1, struct nameidata *nd) -{ - int vfs2; - - vfs2 = NDHASGIANT(nd); - - return nfsrv_lockedpair(vfs1, vfs2); -} - -/* * nfs v3 access service */ int @@ -206,16 +180,14 @@ nfsrv3_access(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, struct vattr vattr, *vap = &vattr; u_long testmode, nfsmode; int v3 = (nfsd->nd_flag & ND_NFSV3); - int vfslocked; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); if (!v3) panic("nfsrv3_access: v3 proc called on a v2 connection"); - vfslocked = 0; fhp = &nfh.fh_generic; nfsm_srvmtofh(fhp); tl = nfsm_dissect_nonblock(u_int32_t *, NFSX_UNSIGNED); - error = nfsrv_fhtovp(fhp, 0, &vp, &vfslocked, nfsd, slp, nam, &rdonly); + error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly); if (error) { nfsm_reply(NFSX_UNSIGNED); nfsm_srvpostop_attr(1, NULL); @@ -251,7 +223,6 @@ nfsrv3_access(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, nfsmout: if (vp) vput(vp); - VFS_UNLOCK_GIANT(vfslocked); return(error); } @@ -275,13 +246,11 @@ nfsrv_getattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, caddr_t bpos; int error = 0, rdonly; struct mbuf *mb, *mreq; - int vfslocked; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); - vfslocked = 0; fhp = &nfh.fh_generic; nfsm_srvmtofh(fhp); - error = nfsrv_fhtovp(fhp, 0, &vp, &vfslocked, nfsd, slp, nam, &rdonly); + error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly); if (error) { nfsm_reply(0); error = 0; @@ -303,7 +272,6 @@ nfsrv_getattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, nfsmout: if (vp) vput(vp); - VFS_UNLOCK_GIANT(vfslocked); return(error); } @@ -332,18 +300,14 @@ nfsrv_setattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, struct mbuf *mb, *mreq; struct timespec guard = { 0, 0 }; struct mount *mp = NULL; - int tvfslocked; - int vfslocked; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); - vfslocked = 0; fhp = &nfh.fh_generic; nfsm_srvmtofh(fhp); if ((mp = vfs_getvfs(&fhp->fh_fsid)) == NULL) { error = ESTALE; goto out; } - vfslocked = VFS_LOCK_GIANT(mp); (void) vn_start_write(NULL, &mp, V_WAIT); vfs_rel(mp); /* The write holds a ref. */ VATTR_NULL(vap); @@ -389,8 +353,7 @@ nfsrv_setattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, /* * Now that we have all the fields, lets do it. */ - error = nfsrv_fhtovp(fhp, 0, &vp, &tvfslocked, nfsd, slp, nam, &rdonly); - vfslocked = nfsrv_lockedpair(vfslocked, tvfslocked); + error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly); if (error) { nfsm_reply(2 * NFSX_UNSIGNED); if (v3) @@ -460,7 +423,6 @@ nfsmout: if (vp) vput(vp); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); return(error); } @@ -485,12 +447,9 @@ nfsrv_lookup(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, int v3 = (nfsd->nd_flag & ND_NFSV3), pubflag; struct mbuf *mb, *mreq; struct vattr va, dirattr, *vap = &va; - int tvfslocked; - int vfslocked; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); ndclear(&nd); - vfslocked = 0; fhp = &nfh.fh_generic; nfsm_srvmtofh(fhp); @@ -500,10 +459,9 @@ nfsrv_lookup(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, nd.ni_cnd.cn_cred = cred; nd.ni_cnd.cn_nameiop = LOOKUP; - nd.ni_cnd.cn_flags = LOCKLEAF | SAVESTART | MPSAFE; + nd.ni_cnd.cn_flags = LOCKLEAF | SAVESTART; error = nfs_namei(&nd, nfsd, fhp, len, slp, nam, &md, &dpos, &dirp, v3, &dirattr, &dirattr_ret, pubflag); - vfslocked = NDHASGIANT(&nd); /* * namei failure, only dirp to cleanup. Clear out garbarge from @@ -550,14 +508,8 @@ nfsrv_lookup(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, nfs_pub.np_index; ind.ni_startdir = nd.ni_vp; VREF(ind.ni_startdir); - ind.ni_cnd.cn_flags &= ~GIANTHELD; - tvfslocked = VFS_LOCK_GIANT(ind.ni_startdir->v_mount); - if (tvfslocked) - nd.ni_cnd.cn_flags |= GIANTHELD; error = lookup(&ind); ind.ni_dvp = NULL; - vfslocked = nfsrv_lockedpair_nd(vfslocked, &ind); - ind.ni_cnd.cn_flags &= ~GIANTHELD; if (error == 0) { /* @@ -644,7 +596,6 @@ nfsmout: vrele(ndp->ni_startdir); } NDFREE(&nd, NDF_ONLY_PNBUF); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -672,10 +623,8 @@ nfsrv_readlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, nfsfh_t nfh; fhandle_t *fhp; struct uio io, *uiop = &io; - int vfslocked; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); - vfslocked = 0; #ifndef nolint mp = NULL; #endif @@ -711,7 +660,7 @@ nfsrv_readlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, uiop->uio_rw = UIO_READ; uiop->uio_segflg = UIO_SYSSPACE; uiop->uio_td = NULL; - error = nfsrv_fhtovp(fhp, 0, &vp, &vfslocked, nfsd, slp, nam, &rdonly); + error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly); if (error) { nfsm_reply(2 * NFSX_UNSIGNED); if (v3) @@ -750,7 +699,6 @@ nfsmout: m_freem(mp3); if (vp) vput(vp); - VFS_UNLOCK_GIANT(vfslocked); return(error); } @@ -784,11 +732,8 @@ nfsrv_read(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, struct nfsheur *nh; off_t off; int ioflag = 0; - int vfslocked; - nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); - vfslocked = 0; fhp = &nfh.fh_generic; nfsm_srvmtofh(fhp); if (v3) { @@ -806,7 +751,7 @@ nfsrv_read(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, * as well. */ - error = nfsrv_fhtovp(fhp, 0, &vp, &vfslocked, nfsd, slp, nam, &rdonly); + error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly); if (error) { vp = NULL; nfsm_reply(2 * NFSX_UNSIGNED); @@ -999,7 +944,6 @@ nfsrv_read(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, nfsmout: if (vp) vput(vp); - VFS_UNLOCK_GIANT(vfslocked); return(error); } @@ -1034,11 +978,8 @@ nfsrv_write(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, struct uio io, *uiop = &io; off_t off; struct mount *mntp = NULL; - int tvfslocked; - int vfslocked; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); - vfslocked = 0; if (mrep == NULL) { *mrq = NULL; error = 0; @@ -1050,7 +991,6 @@ nfsrv_write(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, error = ESTALE; goto ereply; } - vfslocked = VFS_LOCK_GIANT(mntp); (void) vn_start_write(NULL, &mntp, V_WAIT); vfs_rel(mntp); /* The write holds a ref. */ if (v3) { @@ -1106,8 +1046,7 @@ nfsrv_write(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, error = 0; goto nfsmout; } - error = nfsrv_fhtovp(fhp, 0, &vp, &tvfslocked, nfsd, slp, nam, &rdonly); - vfslocked = nfsrv_lockedpair(vfslocked, tvfslocked); + error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly); if (error) { vp = NULL; nfsm_reply(2 * NFSX_UNSIGNED); @@ -1216,7 +1155,6 @@ nfsmout: if (vp) vput(vp); vn_finished_write(mntp); - VFS_UNLOCK_GIANT(vfslocked); return(error); } @@ -1248,11 +1186,8 @@ nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, u_quad_t tempsize; struct timespec cverf; struct mount *mp = NULL; - int tvfslocked; - int vfslocked; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); - vfslocked = 0; #ifndef nolint rdev = 0; #endif @@ -1264,14 +1199,13 @@ nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, error = ESTALE; goto ereply; } - vfslocked = VFS_LOCK_GIANT(mp); (void) vn_start_write(NULL, &mp, V_WAIT); vfs_rel(mp); /* The write holds a ref. */ nfsm_srvnamesiz(len); nd.ni_cnd.cn_cred = cred; nd.ni_cnd.cn_nameiop = CREATE; - nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | SAVESTART | MPSAFE; + nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | SAVESTART; /* * Call namei and do initial cleanup to get a few things @@ -1284,7 +1218,6 @@ nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, */ error = nfs_namei(&nd, nfsd, fhp, len, slp, nam, &md, &dpos, &dirp, v3, &dirfor, &dirfor_ret, FALSE); - vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd); if (dirp && !v3) { vrele(dirp); dirp = NULL; @@ -1420,13 +1353,8 @@ nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, nd.ni_cnd.cn_flags &= ~(LOCKPARENT); nd.ni_cnd.cn_thread = curthread; nd.ni_cnd.cn_cred = cred; - tvfslocked = VFS_LOCK_GIANT(nd.ni_startdir->v_mount); - if (tvfslocked) - nd.ni_cnd.cn_flags |= GIANTHELD; error = lookup(&nd); nd.ni_dvp = NULL; - vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd); - nd.ni_cnd.cn_flags &= ~GIANTHELD; if (error) goto ereply; @@ -1514,7 +1442,6 @@ nfsmout: vrele(dirp); NDFREE(&nd, NDF_ONLY_PNBUF); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -1544,11 +1471,8 @@ nfsrv_mknod(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, fhandle_t *fhp; struct mount *mp = NULL; int v3 = (nfsd->nd_flag & ND_NFSV3); - int tvfslocked; - int vfslocked; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); - vfslocked = 0; if (!v3) panic("nfsrv_mknod: v3 proc called on a v2 connection"); ndclear(&nd); @@ -1559,14 +1483,13 @@ nfsrv_mknod(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, error = ESTALE; goto ereply; } - vfslocked = VFS_LOCK_GIANT(mp); (void) vn_start_write(NULL, &mp, V_WAIT); vfs_rel(mp); /* The write holds a ref. */ nfsm_srvnamesiz(len); nd.ni_cnd.cn_cred = cred; nd.ni_cnd.cn_nameiop = CREATE; - nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | SAVESTART | MPSAFE; + nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | SAVESTART; /* * Handle nfs_namei() call. If an error occurs, the nd structure @@ -1576,7 +1499,6 @@ nfsrv_mknod(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, error = nfs_namei(&nd, nfsd, fhp, len, slp, nam, &md, &dpos, &dirp, v3, &dirfor, &dirfor_ret, FALSE); - vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd); if (error) { nfsm_reply(NFSX_WCCDATA(1)); nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft); @@ -1636,13 +1558,8 @@ nfsrv_mknod(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, nd.ni_cnd.cn_flags &= ~(LOCKPARENT); nd.ni_cnd.cn_thread = td; nd.ni_cnd.cn_cred = td->td_ucred; - tvfslocked = VFS_LOCK_GIANT(nd.ni_startdir->v_mount); - if (tvfslocked) - nd.ni_cnd.cn_flags |= GIANTHELD; error = lookup(&nd); nd.ni_dvp = NULL; - vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd); - nd.ni_cnd.cn_flags &= ~GIANTHELD; if (error) goto out; @@ -1694,7 +1611,6 @@ ereply: nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft); } vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); return (0); nfsmout: if (nd.ni_dvp) { @@ -1711,7 +1627,6 @@ nfsmout: vrele(nd.ni_startdir); NDFREE(&nd, NDF_ONLY_PNBUF); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -1736,11 +1651,9 @@ nfsrv_remove(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, nfsfh_t nfh; fhandle_t *fhp; struct mount *mp = NULL; - int vfslocked; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); ndclear(&nd); - vfslocked = 0; fhp = &nfh.fh_generic; nfsm_srvmtofh(fhp); @@ -1748,17 +1661,15 @@ nfsrv_remove(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, error = ESTALE; goto ereply; } - vfslocked = VFS_LOCK_GIANT(mp); (void) vn_start_write(NULL, &mp, V_WAIT); vfs_rel(mp); /* The write holds a ref. */ nfsm_srvnamesiz(len); nd.ni_cnd.cn_cred = cred; nd.ni_cnd.cn_nameiop = DELETE; - nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | MPSAFE; + nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF; error = nfs_namei(&nd, nfsd, fhp, len, slp, nam, &md, &dpos, &dirp, v3, &dirfor, &dirfor_ret, FALSE); - vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd); if (dirp && !v3) { vrele(dirp); dirp = NULL; @@ -1820,7 +1731,6 @@ nfsmout: if (nd.ni_vp) vput(nd.ni_vp); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); return(error); } @@ -1848,10 +1758,8 @@ nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, fhandle_t *ffhp, *tfhp; uid_t saved_uid; struct mount *mp = NULL; - int vfslocked; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); - vfslocked = 0; #ifndef nolint fvp = NULL; #endif @@ -1870,7 +1778,6 @@ nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, error = ESTALE; goto out1; } - vfslocked = VFS_LOCK_GIANT(mp); (void) vn_start_write(NULL, &mp, V_WAIT); vfs_rel(mp); /* The write holds a ref. */ nfsm_srvnamesiz(len); @@ -1881,10 +1788,9 @@ nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, saved_uid = cred->cr_uid; fromnd.ni_cnd.cn_cred = cred; fromnd.ni_cnd.cn_nameiop = DELETE; - fromnd.ni_cnd.cn_flags = WANTPARENT | SAVESTART | MPSAFE; + fromnd.ni_cnd.cn_flags = WANTPARENT | SAVESTART; error = nfs_namei(&fromnd, nfsd, ffhp, len, slp, nam, &md, &dpos, &fdirp, v3, &fdirfor, &fdirfor_ret, FALSE); - vfslocked = nfsrv_lockedpair_nd(vfslocked, &fromnd); if (fdirp && !v3) { vrele(fdirp); fdirp = NULL; @@ -1904,10 +1810,9 @@ nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, cred->cr_uid = saved_uid; tond.ni_cnd.cn_cred = cred; tond.ni_cnd.cn_nameiop = RENAME; - tond.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART | MPSAFE; + tond.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART; error = nfs_namei(&tond, nfsd, tfhp, len2, slp, nam, &md, &dpos, &tdirp, v3, &tdirfor, &tdirfor_ret, FALSE); - vfslocked = nfsrv_lockedpair_nd(vfslocked, &tond); if (tdirp && !v3) { vrele(tdirp); tdirp = NULL; @@ -2053,7 +1958,6 @@ nfsmout: vrele(fromnd.ni_vp); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -2078,12 +1982,9 @@ nfsrv_link(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, nfsfh_t nfh, dnfh; fhandle_t *fhp, *dfhp; struct mount *mp = NULL; - int tvfslocked; - int vfslocked; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); ndclear(&nd); - vfslocked = 0; fhp = &nfh.fh_generic; dfhp = &dnfh.fh_generic; @@ -2092,14 +1993,12 @@ nfsrv_link(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, error = ESTALE; goto ereply; } - vfslocked = VFS_LOCK_GIANT(mp); (void) vn_start_write(NULL, &mp, V_WAIT); vfs_rel(mp); /* The write holds a ref. */ nfsm_srvmtofh(dfhp); nfsm_srvnamesiz(len); - error = nfsrv_fhtovp(fhp, 0, &vp, &tvfslocked, nfsd, slp, nam, &rdonly); - vfslocked = nfsrv_lockedpair(vfslocked, tvfslocked); + error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly); if (error) { nfsm_reply(NFSX_POSTOPATTR(v3) + NFSX_WCCDATA(v3)); if (v3) { @@ -2119,10 +2018,9 @@ nfsrv_link(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, VOP_UNLOCK(vp, 0); nd.ni_cnd.cn_cred = cred; nd.ni_cnd.cn_nameiop = CREATE; - nd.ni_cnd.cn_flags = LOCKPARENT | MPSAFE | MPSAFE; + nd.ni_cnd.cn_flags = LOCKPARENT; error = nfs_namei(&nd, nfsd, dfhp, len, slp, nam, &md, &dpos, &dirp, v3, &dirfor, &dirfor_ret, FALSE); - vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd); if (dirp && !v3) { vrele(dirp); dirp = NULL; @@ -2200,7 +2098,6 @@ nfsmout: if (nd.ni_vp) vrele(nd.ni_vp); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); return(error); } @@ -2229,12 +2126,9 @@ nfsrv_symlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, nfsfh_t nfh; fhandle_t *fhp; struct mount *mp = NULL; - int tvfslocked; - int vfslocked; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); ndclear(&nd); - vfslocked = 0; fhp = &nfh.fh_generic; nfsm_srvmtofh(fhp); @@ -2242,16 +2136,14 @@ nfsrv_symlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, error = ESTALE; goto out; } - vfslocked = VFS_LOCK_GIANT(mp); (void) vn_start_write(NULL, &mp, V_WAIT); vfs_rel(mp); /* The write holds a ref. */ nfsm_srvnamesiz(len); nd.ni_cnd.cn_cred = cred; nd.ni_cnd.cn_nameiop = CREATE; - nd.ni_cnd.cn_flags = LOCKPARENT | SAVESTART | MPSAFE; + nd.ni_cnd.cn_flags = LOCKPARENT | SAVESTART; error = nfs_namei(&nd, nfsd, fhp, len, slp, nam, &md, &dpos, &dirp, v3, &dirfor, &dirfor_ret, FALSE); - vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd); if (error == 0) { VATTR_NULL(vap); if (v3) @@ -2317,13 +2209,8 @@ nfsrv_symlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, nd.ni_cnd.cn_flags |= (NOFOLLOW | LOCKLEAF); nd.ni_cnd.cn_thread = curthread; nd.ni_cnd.cn_cred = cred; - tvfslocked = VFS_LOCK_GIANT(nd.ni_startdir->v_mount); - if (tvfslocked) - nd.ni_cnd.cn_flags |= GIANTHELD; error = lookup(&nd); nd.ni_dvp = NULL; - vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd); - nd.ni_cnd.cn_flags &= ~GIANTHELD; if (error == 0) { bzero((caddr_t)fhp, sizeof(nfh)); @@ -2383,7 +2270,6 @@ nfsmout: free(pathcp, M_TEMP); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -2412,11 +2298,9 @@ nfsrv_mkdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, nfsfh_t nfh; fhandle_t *fhp; struct mount *mp = NULL; - int vfslocked; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); ndclear(&nd); - vfslocked = 0; fhp = &nfh.fh_generic; nfsm_srvmtofh(fhp); @@ -2424,17 +2308,15 @@ nfsrv_mkdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, error = ESTALE; goto out; } - vfslocked = VFS_LOCK_GIANT(mp); (void) vn_start_write(NULL, &mp, V_WAIT); vfs_rel(mp); /* The write holds a ref. */ nfsm_srvnamesiz(len); nd.ni_cnd.cn_cred = cred; nd.ni_cnd.cn_nameiop = CREATE; - nd.ni_cnd.cn_flags = LOCKPARENT | MPSAFE; + nd.ni_cnd.cn_flags = LOCKPARENT; error = nfs_namei(&nd, nfsd, fhp, len, slp, nam, &md, &dpos, &dirp, v3, &dirfor, &dirfor_ret, FALSE); - vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd); if (dirp && !v3) { vrele(dirp); dirp = NULL; @@ -2546,7 +2428,6 @@ nfsmout: if (dirp) vrele(dirp); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -2571,11 +2452,9 @@ nfsrv_rmdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, fhandle_t *fhp; struct nameidata nd; struct mount *mp = NULL; - int vfslocked; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); ndclear(&nd); - vfslocked = 0; fhp = &nfh.fh_generic; nfsm_srvmtofh(fhp); @@ -2583,16 +2462,14 @@ nfsrv_rmdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, error = ESTALE; goto out; } - vfslocked = VFS_LOCK_GIANT(mp); (void) vn_start_write(NULL, &mp, V_WAIT); vfs_rel(mp); /* The write holds a ref. */ nfsm_srvnamesiz(len); nd.ni_cnd.cn_cred = cred; nd.ni_cnd.cn_nameiop = DELETE; - nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | MPSAFE; + nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF; error = nfs_namei(&nd, nfsd, fhp, len, slp, nam, &md, &dpos, &dirp, v3, &dirfor, &dirfor_ret, FALSE); - vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd); if (dirp && !v3) { vrele(dirp); dirp = NULL; @@ -2670,7 +2547,6 @@ nfsmout: vrele(dirp); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); return(error); } @@ -2739,10 +2615,9 @@ nfsrv_readdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, int v3 = (nfsd->nd_flag & ND_NFSV3); u_quad_t off, toff, verf; u_long *cookies = NULL, *cookiep; /* needs to be int64_t or off_t */ - int vfslocked, not_zfs; + int not_zfs; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); - vfslocked = 0; fhp = &nfh.fh_generic; nfsm_srvmtofh(fhp); if (v3) { @@ -2765,7 +2640,7 @@ nfsrv_readdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, if (siz > xfer) siz = xfer; fullsiz = siz; - error = nfsrv_fhtovp(fhp, 0, &vp, &vfslocked, nfsd, slp, nam, &rdonly); + error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly); if (!error && vp->v_type != VDIR) { error = ENOTDIR; vput(vp); @@ -3005,7 +2880,6 @@ again: nfsmout: if (vp) vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); return(error); } @@ -3039,13 +2913,12 @@ nfsrv_readdirplus(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, u_quad_t off, toff, verf; u_long *cookies = NULL, *cookiep; /* needs to be int64_t or off_t */ int v3 = (nfsd->nd_flag & ND_NFSV3); - int usevget = 1, vfslocked; + int usevget = 1; struct componentname cn; struct mount *mntp = NULL; int not_zfs; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); - vfslocked = 0; vp_locked = 0; if (!v3) panic("nfsrv_readdirplus: v3 proc called on a v2 connection"); @@ -3066,7 +2939,7 @@ nfsrv_readdirplus(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, if (siz > xfer) siz = xfer; fullsiz = siz; - error = nfsrv_fhtovp(fhp, NFSRV_FLAG_BUSY, &vp, &vfslocked, nfsd, slp, + error = nfsrv_fhtovp(fhp, NFSRV_FLAG_BUSY, &vp, nfsd, slp, nam, &rdonly); if (!error) { vp_locked = 1; @@ -3235,7 +3108,7 @@ again: usevget = 0; cn.cn_nameiop = LOOKUP; cn.cn_flags = ISLASTCN | NOFOLLOW | \ - LOCKSHARED | LOCKLEAF | MPSAFE; + LOCKSHARED | LOCKLEAF; cn.cn_lkflags = LK_SHARED | LK_RETRY; cn.cn_cred = cred; cn.cn_thread = curthread; @@ -3383,7 +3256,6 @@ nfsmout: vrele(vp); if (mntp) vfs_unbusy(mntp); - VFS_UNLOCK_GIANT(vfslocked); return(error); } @@ -3409,11 +3281,8 @@ nfsrv_commit(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, u_quad_t off; struct mount *mp = NULL; int v3 = (nfsd->nd_flag & ND_NFSV3); - int tvfslocked; - int vfslocked; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); - vfslocked = 0; if (!v3) panic("nfsrv_commit: v3 proc called on a v2 connection"); fhp = &nfh.fh_generic; @@ -3422,7 +3291,6 @@ nfsrv_commit(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, error = ESTALE; goto ereply; } - vfslocked = VFS_LOCK_GIANT(mp); (void) vn_start_write(NULL, &mp, V_WAIT); vfs_rel(mp); /* The write holds a ref. */ tl = nfsm_dissect_nonblock(u_int32_t *, 3 * NFSX_UNSIGNED); @@ -3434,8 +3302,7 @@ nfsrv_commit(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, off = fxdr_hyper(tl); tl += 2; cnt = fxdr_unsigned(int, *tl); - error = nfsrv_fhtovp(fhp, 0, &vp, &tvfslocked, nfsd, slp, nam, &rdonly); - vfslocked = nfsrv_lockedpair(vfslocked, tvfslocked); + error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly); if (error) { nfsm_reply(2 * NFSX_UNSIGNED); nfsm_srvwcc_data(for_ret, &bfor, aft_ret, &aft); @@ -3546,7 +3413,6 @@ nfsmout: if (vp) vput(vp); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); return(error); } @@ -3573,13 +3439,11 @@ nfsrv_statfs(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, fhandle_t *fhp; struct statfs statfs; u_quad_t tval; - int vfslocked; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); - vfslocked = 0; fhp = &nfh.fh_generic; nfsm_srvmtofh(fhp); - error = nfsrv_fhtovp(fhp, 0, &vp, &vfslocked, nfsd, slp, nam, &rdonly); + error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly); if (error) { nfsm_reply(NFSX_UNSIGNED); if (v3) @@ -3639,7 +3503,6 @@ nfsrv_statfs(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, nfsmout: if (vp) vput(vp); - VFS_UNLOCK_GIANT(vfslocked); return(error); } @@ -3665,15 +3528,13 @@ nfsrv_fsinfo(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, u_quad_t maxfsize; struct statfs sb; int v3 = (nfsd->nd_flag & ND_NFSV3); - int vfslocked; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); if (!v3) panic("nfsrv_fsinfo: v3 proc called on a v2 connection"); fhp = &nfh.fh_generic; - vfslocked = 0; nfsm_srvmtofh(fhp); - error = nfsrv_fhtovp(fhp, 0, &vp, &vfslocked, nfsd, slp, nam, &rdonly); + error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly); if (error) { nfsm_reply(NFSX_UNSIGNED); nfsm_srvpostop_attr(getret, &at); @@ -3714,7 +3575,6 @@ nfsrv_fsinfo(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, nfsmout: if (vp) vput(vp); - VFS_UNLOCK_GIANT(vfslocked); return(error); } @@ -3739,15 +3599,13 @@ nfsrv_pathconf(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, nfsfh_t nfh; fhandle_t *fhp; int v3 = (nfsd->nd_flag & ND_NFSV3); - int vfslocked; nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); if (!v3) panic("nfsrv_pathconf: v3 proc called on a v2 connection"); - vfslocked = 0; fhp = &nfh.fh_generic; nfsm_srvmtofh(fhp); - error = nfsrv_fhtovp(fhp, 0, &vp, &vfslocked, nfsd, slp, nam, &rdonly); + error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly); if (error) { nfsm_reply(NFSX_UNSIGNED); nfsm_srvpostop_attr(getret, &at); @@ -3787,7 +3645,6 @@ nfsrv_pathconf(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, nfsmout: if (vp) vput(vp); - VFS_UNLOCK_GIANT(vfslocked); return(error); } @@ -3856,8 +3713,6 @@ nfsrv_access(struct vnode *vp, accmode_t accmode, struct ucred *cred, struct vattr vattr; int error; - VFS_ASSERT_GIANT(vp->v_mount); - nfsdbprintf(("%s %d\n", __FILE__, __LINE__)); if (accmode & VWRITE) { diff --git a/sys/nfsserver/nfs_srvsubs.c b/sys/nfsserver/nfs_srvsubs.c index 66a85c4..ba3a9fe 100644 --- a/sys/nfsserver/nfs_srvsubs.c +++ b/sys/nfsserver/nfs_srvsubs.c @@ -594,11 +594,7 @@ nfs_namei(struct nameidata *ndp, struct nfsrv_descript *nfsd, int error, rdonly, linklen; struct componentname *cnp = &ndp->ni_cnd; int lockleaf = (cnp->cn_flags & LOCKLEAF) != 0; - int dvfslocked; - int vfslocked; - vfslocked = 0; - dvfslocked = 0; *retdirp = NULL; cnp->cn_flags |= NOMACCHECK; cnp->cn_pnbuf = uma_zalloc(namei_zone, M_WAITOK); @@ -645,10 +641,9 @@ nfs_namei(struct nameidata *ndp, struct nfsrv_descript *nfsd, /* * Extract and set starting directory. */ - error = nfsrv_fhtovp(fhp, 0, &dp, &dvfslocked, nfsd, slp, nam, &rdonly); + error = nfsrv_fhtovp(fhp, 0, &dp, nfsd, slp, nam, &rdonly); if (error) goto out; - vfslocked = VFS_LOCK_GIANT(dp->v_mount); if (dp->v_type != VDIR) { vput(dp); error = ENOTDIR; @@ -726,14 +721,9 @@ nfs_namei(struct nameidata *ndp, struct nfsrv_descript *nfsd, if (pubflag) { ndp->ni_rootdir = rootvnode; ndp->ni_loopcnt = 0; - if (cnp->cn_pnbuf[0] == '/') { - int tvfslocked; - tvfslocked = VFS_LOCK_GIANT(rootvnode->v_mount); - VFS_UNLOCK_GIANT(vfslocked); + if (cnp->cn_pnbuf[0] == '/') dp = rootvnode; - vfslocked = tvfslocked; - } } else { cnp->cn_flags |= NOCROSSMOUNT; } @@ -758,11 +748,7 @@ nfs_namei(struct nameidata *ndp, struct nfsrv_descript *nfsd, * In either case ni_startdir will be dereferenced and NULLed * out. */ - if (vfslocked) - ndp->ni_cnd.cn_flags |= GIANTHELD; error = lookup(ndp); - vfslocked = (ndp->ni_cnd.cn_flags & GIANTHELD) != 0; - ndp->ni_cnd.cn_flags &= ~GIANTHELD; if (error) break; @@ -860,10 +846,6 @@ nfs_namei(struct nameidata *ndp, struct nfsrv_descript *nfsd, } if (!lockleaf) cnp->cn_flags &= ~LOCKLEAF; - if (cnp->cn_flags & GIANTHELD) { - mtx_unlock(&Giant); - cnp->cn_flags &= ~GIANTHELD; - } /* * nfs_namei() guarentees that fields will not contain garbage @@ -877,21 +859,9 @@ out: ndp->ni_dvp = NULL; ndp->ni_startdir = NULL; cnp->cn_flags &= ~HASBUF; - VFS_UNLOCK_GIANT(vfslocked); - vfslocked = 0; } else if ((ndp->ni_cnd.cn_flags & (WANTPARENT|LOCKPARENT)) == 0) { ndp->ni_dvp = NULL; } - /* - * This differs from normal namei() in that even on failure we may - * return with Giant held due to the dirp return. Make sure we only - * have not recursed however. The calling code only expects to drop - * one acquire. - */ - if (vfslocked || dvfslocked) - ndp->ni_cnd.cn_flags |= GIANTHELD; - if (vfslocked && dvfslocked) - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -1055,7 +1025,7 @@ nfsm_srvfattr(struct nfsrv_descript *nfsd, struct vattr *vap, * - if cred->cr_uid == 0 or MNT_EXPORTANON set it to credanon */ int -nfsrv_fhtovp(fhandle_t *fhp, int flags, struct vnode **vpp, int *vfslockedp, +nfsrv_fhtovp(fhandle_t *fhp, int flags, struct vnode **vpp, struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, struct sockaddr *nam, int *rdonlyp) { @@ -1067,13 +1037,11 @@ nfsrv_fhtovp(fhandle_t *fhp, int flags, struct vnode **vpp, int *vfslockedp, struct sockaddr_int *saddr; #endif int credflavor; - int vfslocked; int numsecflavors, *secflavors; int authsys; int v3 = nfsd->nd_flag & ND_NFSV3; int mountreq; - *vfslockedp = 0; *vpp = NULL; if (nfs_ispublicfh(fhp)) { @@ -1085,7 +1053,6 @@ nfsrv_fhtovp(fhandle_t *fhp, int flags, struct vnode **vpp, int *vfslockedp, mp = vfs_busyfs(&fhp->fh_fsid); if (!mp) return (ESTALE); - vfslocked = VFS_LOCK_GIANT(mp); error = VFS_CHECKEXP(mp, nam, &exflags, &credanon, &numsecflavors, &secflavors); if (error) { @@ -1169,10 +1136,6 @@ out: if (credanon != NULL) crfree(credanon); - if (error) - VFS_UNLOCK_GIANT(vfslocked); - else - *vfslockedp = vfslocked; return (error); } diff --git a/sys/nlm/nlm_prot_impl.c b/sys/nlm/nlm_prot_impl.c index afbb9dd..d86f62d 100644 --- a/sys/nlm/nlm_prot_impl.c +++ b/sys/nlm/nlm_prot_impl.c @@ -1768,7 +1768,6 @@ nlm_convert_to_fhandle_t(fhandle_t *fhp, struct netobj *p) struct vfs_state { struct mount *vs_mp; struct vnode *vs_vp; - int vs_vfslocked; int vs_vnlocked; }; @@ -1785,7 +1784,6 @@ nlm_get_vfs_state(struct nlm_host *host, struct svc_req *rqstp, if (!vs->vs_mp) { return (ESTALE); } - vs->vs_vfslocked = VFS_LOCK_GIANT(vs->vs_mp); error = VFS_CHECKEXP(vs->vs_mp, (struct sockaddr *)&host->nh_addr, &exflags, &credanon, NULL, NULL); @@ -1847,7 +1845,6 @@ nlm_release_vfs_state(struct vfs_state *vs) } if (vs->vs_mp) vfs_rel(vs->vs_mp); - VFS_UNLOCK_GIANT(vs->vs_vfslocked); } static nlm4_stats diff --git a/sys/security/audit/audit_arg.c b/sys/security/audit/audit_arg.c index e4409f2..f19375d 100644 --- a/sys/security/audit/audit_arg.c +++ b/sys/security/audit/audit_arg.c @@ -651,7 +651,6 @@ audit_arg_file(struct proc *p, struct file *fp) struct socket *so; struct inpcb *pcb; struct vnode *vp; - int vfslocked; ar = currecord(); if (ar == NULL) @@ -664,11 +663,9 @@ audit_arg_file(struct proc *p, struct file *fp) * XXXAUDIT: Only possibly to record as first vnode? */ vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_SHARED | LK_RETRY); audit_arg_vnode1(vp); VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); break; case DTYPE_SOCKET: @@ -768,11 +765,6 @@ audit_arg_vnode(struct vnode *vp, struct vnode_au_info *vnp) struct vattr vattr; int error; - /* - * Assume that if the caller is calling audit_arg_vnode() on a - * non-MPSAFE vnode, then it will have acquired Giant. - */ - VFS_ASSERT_GIANT(vp->v_mount); ASSERT_VOP_LOCKED(vp, "audit_arg_vnode"); error = VOP_GETATTR(vp, &vattr, curthread->td_ucred); @@ -889,7 +881,6 @@ audit_sysclose(struct thread *td, int fd) struct kaudit_record *ar; struct vnode *vp; struct file *fp; - int vfslocked; KASSERT(td != NULL, ("audit_sysclose: td == NULL")); @@ -903,10 +894,8 @@ audit_sysclose(struct thread *td, int fd) return; vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_SHARED | LK_RETRY); audit_arg_vnode1(vp); VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); fdrop(fp, td); } diff --git a/sys/security/audit/audit_syscalls.c b/sys/security/audit/audit_syscalls.c index 075aac5..b326563 100644 --- a/sys/security/audit/audit_syscalls.c +++ b/sys/security/audit/audit_syscalls.c @@ -749,7 +749,7 @@ auditctl(struct thread *td, struct auditctl_args *uap) struct ucred *cred; struct vnode *vp; int error = 0; - int flags, vfslocked; + int flags; if (jailed(td->td_ucred)) return (ENOSYS); @@ -770,20 +770,18 @@ auditctl(struct thread *td, struct auditctl_args *uap) if (uap->path == NULL) return (EINVAL); - NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1, + NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | AUDITVNODE1, UIO_USERSPACE, uap->path, td); flags = AUDIT_OPEN_FLAGS; error = vn_open(&nd, &flags, 0, NULL); if (error) return (error); - vfslocked = NDHASGIANT(&nd); vp = nd.ni_vp; #ifdef MAC error = mac_system_check_auditctl(td->td_ucred, vp); VOP_UNLOCK(vp, 0); if (error) { vn_close(vp, AUDIT_CLOSE_FLAGS, td->td_ucred, td); - VFS_UNLOCK_GIANT(vfslocked); return (error); } #else @@ -792,10 +790,8 @@ auditctl(struct thread *td, struct auditctl_args *uap) NDFREE(&nd, NDF_ONLY_PNBUF); if (vp->v_type != VREG) { vn_close(vp, AUDIT_CLOSE_FLAGS, td->td_ucred, td); - VFS_UNLOCK_GIANT(vfslocked); return (EINVAL); } - VFS_UNLOCK_GIANT(vfslocked); cred = td->td_ucred; crhold(cred); diff --git a/sys/security/audit/audit_worker.c b/sys/security/audit/audit_worker.c index 631b29f..d21ae18 100644 --- a/sys/security/audit/audit_worker.c +++ b/sys/security/audit/audit_worker.c @@ -113,7 +113,7 @@ audit_record_write(struct vnode *vp, struct ucred *cred, void *data, static struct timeval last_fail; static int cur_lowspace_trigger; struct statfs *mnt_stat; - int error, vfslocked; + int error; static int cur_fail; struct vattr vattr; long temp; @@ -124,7 +124,6 @@ audit_record_write(struct vnode *vp, struct ucred *cred, void *data, return; mnt_stat = &vp->v_mount->mnt_stat; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); /* * First, gather statistics on the audit log file and file system so @@ -258,7 +257,6 @@ audit_record_write(struct vnode *vp, struct ucred *cred, void *data, } } - VFS_UNLOCK_GIANT(vfslocked); return; fail_enospc: @@ -289,7 +287,6 @@ fail: panic("audit_worker: write error %d\n", error); } else if (ppsratecheck(&last_fail, &cur_fail, 1)) printf("audit_worker: write error %d\n", error); - VFS_UNLOCK_GIANT(vfslocked); } /* @@ -451,7 +448,6 @@ audit_rotate_vnode(struct ucred *cred, struct vnode *vp) { struct ucred *old_audit_cred; struct vnode *old_audit_vp; - int vfslocked; KASSERT((cred != NULL && vp != NULL) || (cred == NULL && vp == NULL), ("audit_rotate_vnode: cred %p vp %p", cred, vp)); @@ -473,10 +469,8 @@ audit_rotate_vnode(struct ucred *cred, struct vnode *vp) * If there was an old vnode/credential, close and free. */ if (old_audit_vp != NULL) { - vfslocked = VFS_LOCK_GIANT(old_audit_vp->v_mount); vn_close(old_audit_vp, AUDIT_CLOSE_FLAGS, old_audit_cred, curthread); - VFS_UNLOCK_GIANT(vfslocked); crfree(old_audit_cred); } } diff --git a/sys/security/mac/mac_process.c b/sys/security/mac/mac_process.c index 214e748..8e5e5bc 100644 --- a/sys/security/mac/mac_process.c +++ b/sys/security/mac/mac_process.c @@ -254,7 +254,7 @@ mac_proc_vm_revoke_recurse(struct thread *td, struct ucred *cred, struct vm_map *map) { vm_map_entry_t vme; - int vfslocked, result; + int result; vm_prot_t revokeperms; vm_object_t backing_object, object; vm_ooffset_t offset; @@ -300,7 +300,6 @@ mac_proc_vm_revoke_recurse(struct thread *td, struct ucred *cred, if (object->type != OBJT_VNODE) continue; vp = (struct vnode *)object->handle; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); result = vme->max_protection; mac_vnode_check_mmap_downgrade(cred, vp, &result); @@ -310,10 +309,8 @@ mac_proc_vm_revoke_recurse(struct thread *td, struct ucred *cred, * but a policy needs to get removed. */ revokeperms = vme->max_protection & ~result; - if (!revokeperms) { - VFS_UNLOCK_GIANT(vfslocked); + if (!revokeperms) continue; - } printf("pid %ld: revoking %s perms from %#lx:%ld " "(max %s/cur %s)\n", (long)td->td_proc->p_pid, prot2str(revokeperms), (u_long)vme->start, @@ -369,7 +366,6 @@ mac_proc_vm_revoke_recurse(struct thread *td, struct ucred *cred, vme->protection & ~revokeperms); vm_map_simplify_entry(map, vme); } - VFS_UNLOCK_GIANT(vfslocked); } vm_map_unlock(map); } diff --git a/sys/security/mac/mac_syscalls.c b/sys/security/mac/mac_syscalls.c index dc27547..a7b063a 100644 --- a/sys/security/mac/mac_syscalls.c +++ b/sys/security/mac/mac_syscalls.c @@ -230,7 +230,7 @@ __mac_get_fd(struct thread *td, struct __mac_get_fd_args *uap) struct pipe *pipe; struct socket *so; short label_type; - int vfslocked, error; + int error; error = copyin(uap->mac_p, &mac, sizeof(mac)); if (error) @@ -260,11 +260,9 @@ __mac_get_fd(struct thread *td, struct __mac_get_fd_args *uap) return (EINVAL); vp = fp->f_vnode; intlabel = mac_vnode_label_alloc(); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); mac_vnode_copy_label(vp->v_label, intlabel); VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); error = mac_vnode_externalize_label(intlabel, elements, buffer, mac.m_buflen); mac_vnode_label_free(intlabel); @@ -316,7 +314,7 @@ __mac_get_file(struct thread *td, struct __mac_get_file_args *uap) struct nameidata nd; struct label *intlabel; struct mac mac; - int vfslocked, error; + int error; if (!(mac_labeled & MPC_OBJECT_VNODE)) return (EINVAL); @@ -337,20 +335,18 @@ __mac_get_file(struct thread *td, struct __mac_get_file_args *uap) } buffer = malloc(mac.m_buflen, M_MACTEMP, M_WAITOK | M_ZERO); - NDINIT(&nd, LOOKUP, MPSAFE | LOCKLEAF | FOLLOW, UIO_USERSPACE, + NDINIT(&nd, LOOKUP, LOCKLEAF | FOLLOW, UIO_USERSPACE, uap->path_p, td); error = namei(&nd); if (error) goto out; intlabel = mac_vnode_label_alloc(); - vfslocked = NDHASGIANT(&nd); mac_vnode_copy_label(nd.ni_vp->v_label, intlabel); error = mac_vnode_externalize_label(intlabel, elements, buffer, mac.m_buflen); NDFREE(&nd, 0); - VFS_UNLOCK_GIANT(vfslocked); mac_vnode_label_free(intlabel); if (error == 0) error = copyout(buffer, mac.m_string, strlen(buffer)+1); @@ -369,7 +365,7 @@ __mac_get_link(struct thread *td, struct __mac_get_link_args *uap) struct nameidata nd; struct label *intlabel; struct mac mac; - int vfslocked, error; + int error; if (!(mac_labeled & MPC_OBJECT_VNODE)) return (EINVAL); @@ -390,19 +386,17 @@ __mac_get_link(struct thread *td, struct __mac_get_link_args *uap) } buffer = malloc(mac.m_buflen, M_MACTEMP, M_WAITOK | M_ZERO); - NDINIT(&nd, LOOKUP, MPSAFE | LOCKLEAF | NOFOLLOW, UIO_USERSPACE, + NDINIT(&nd, LOOKUP, LOCKLEAF | NOFOLLOW, UIO_USERSPACE, uap->path_p, td); error = namei(&nd); if (error) goto out; intlabel = mac_vnode_label_alloc(); - vfslocked = NDHASGIANT(&nd); mac_vnode_copy_label(nd.ni_vp->v_label, intlabel); error = mac_vnode_externalize_label(intlabel, elements, buffer, mac.m_buflen); NDFREE(&nd, 0); - VFS_UNLOCK_GIANT(vfslocked); mac_vnode_label_free(intlabel); if (error == 0) @@ -426,7 +420,7 @@ __mac_set_fd(struct thread *td, struct __mac_set_fd_args *uap) struct vnode *vp; struct mac mac; char *buffer; - int error, vfslocked; + int error; error = copyin(uap->mac_p, &mac, sizeof(mac)); if (error) @@ -459,10 +453,8 @@ __mac_set_fd(struct thread *td, struct __mac_set_fd_args *uap) break; } vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); error = vn_start_write(vp, &mp, V_WAIT | PCATCH); if (error != 0) { - VFS_UNLOCK_GIANT(vfslocked); mac_vnode_label_free(intlabel); break; } @@ -470,7 +462,6 @@ __mac_set_fd(struct thread *td, struct __mac_set_fd_args *uap) error = vn_setlabel(vp, intlabel, td->td_ucred); VOP_UNLOCK(vp, 0); vn_finished_write(mp); - VFS_UNLOCK_GIANT(vfslocked); mac_vnode_label_free(intlabel); break; @@ -519,7 +510,7 @@ __mac_set_file(struct thread *td, struct __mac_set_file_args *uap) struct mount *mp; struct mac mac; char *buffer; - int vfslocked, error; + int error; if (!(mac_labeled & MPC_OBJECT_VNODE)) return (EINVAL); @@ -545,10 +536,9 @@ __mac_set_file(struct thread *td, struct __mac_set_file_args *uap) if (error) goto out; - NDINIT(&nd, LOOKUP, MPSAFE | LOCKLEAF | FOLLOW, UIO_USERSPACE, + NDINIT(&nd, LOOKUP, LOCKLEAF | FOLLOW, UIO_USERSPACE, uap->path_p, td); error = namei(&nd); - vfslocked = NDHASGIANT(&nd); if (error == 0) { error = vn_start_write(nd.ni_vp, &mp, V_WAIT | PCATCH); if (error == 0) { @@ -559,7 +549,6 @@ __mac_set_file(struct thread *td, struct __mac_set_file_args *uap) } NDFREE(&nd, 0); - VFS_UNLOCK_GIANT(vfslocked); out: mac_vnode_label_free(intlabel); return (error); @@ -573,7 +562,7 @@ __mac_set_link(struct thread *td, struct __mac_set_link_args *uap) struct mount *mp; struct mac mac; char *buffer; - int vfslocked, error; + int error; if (!(mac_labeled & MPC_OBJECT_VNODE)) return (EINVAL); @@ -599,10 +588,9 @@ __mac_set_link(struct thread *td, struct __mac_set_link_args *uap) if (error) goto out; - NDINIT(&nd, LOOKUP, MPSAFE | LOCKLEAF | NOFOLLOW, UIO_USERSPACE, + NDINIT(&nd, LOOKUP, LOCKLEAF | NOFOLLOW, UIO_USERSPACE, uap->path_p, td); error = namei(&nd); - vfslocked = NDHASGIANT(&nd); if (error == 0) { error = vn_start_write(nd.ni_vp, &mp, V_WAIT | PCATCH); if (error == 0) { @@ -613,7 +601,6 @@ __mac_set_link(struct thread *td, struct __mac_set_link_args *uap) } NDFREE(&nd, 0); - VFS_UNLOCK_GIANT(vfslocked); out: mac_vnode_label_free(intlabel); return (error); diff --git a/sys/sys/bufobj.h b/sys/sys/bufobj.h index 916b256..3934553 100644 --- a/sys/sys/bufobj.h +++ b/sys/sys/bufobj.h @@ -111,7 +111,6 @@ struct bufobj { */ #define BO_ONWORKLST (1 << 0) /* On syncer work-list */ #define BO_WWAIT (1 << 1) /* Wait for output to complete */ -#define BO_NEEDSGIANT (1 << 2) /* Require giant for child buffers. */ #define BO_MTX(bo) (&(bo)->bo_mtx) #define BO_LOCK(bo) mtx_lock(BO_MTX((bo))) diff --git a/sys/sys/mount.h b/sys/sys/mount.h index ecaf7b8..19216cb 100644 --- a/sys/sys/mount.h +++ b/sys/sys/mount.h @@ -622,41 +622,6 @@ vfs_statfs_t __vfs_statfs; ({if (*(MP)->mnt_op->vfs_susp_clean != NULL) \ (*(MP)->mnt_op->vfs_susp_clean)(MP); }) -#define VFS_NEEDSGIANT_(MP) \ - ((MP) != NULL && ((MP)->mnt_kern_flag & MNTK_MPSAFE) == 0) - -#define VFS_NEEDSGIANT(MP) __extension__ \ -({ \ - struct mount *_mp; \ - _mp = (MP); \ - VFS_NEEDSGIANT_(_mp); \ -}) - -#define VFS_LOCK_GIANT(MP) __extension__ \ -({ \ - int _locked; \ - struct mount *_mp; \ - _mp = (MP); \ - if (VFS_NEEDSGIANT_(_mp)) { \ - mtx_lock(&Giant); \ - _locked = 1; \ - } else \ - _locked = 0; \ - _locked; \ -}) -#define VFS_UNLOCK_GIANT(locked) do \ -{ \ - if ((locked)) \ - mtx_unlock(&Giant); \ -} while (0) -#define VFS_ASSERT_GIANT(MP) do \ -{ \ - struct mount *_mp; \ - _mp = (MP); \ - if (VFS_NEEDSGIANT_(_mp)) \ - mtx_assert(&Giant, MA_OWNED); \ -} while (0) - #define VFS_KNOTE_LOCKED(vp, hint) do \ { \ if (((vp)->v_vflag & VV_NOKNOTE) == 0) \ diff --git a/sys/sys/namei.h b/sys/sys/namei.h index c68a7f7..18dd942 100644 --- a/sys/sys/namei.h +++ b/sys/sys/namei.h @@ -144,15 +144,11 @@ struct nameidata { #define ISOPEN 0x00200000 /* caller is opening; return a real vnode. */ #define NOCROSSMOUNT 0x00400000 /* do not cross mount points */ #define NOMACCHECK 0x00800000 /* do not perform MAC checks */ -#define MPSAFE 0x01000000 /* namei() must acquire Giant if needed. */ -#define GIANTHELD 0x02000000 /* namei() is holding giant. */ #define AUDITVNODE1 0x04000000 /* audit the looked up vnode information */ #define AUDITVNODE2 0x08000000 /* audit the looked up vnode information */ #define TRAILINGSLASH 0x10000000 /* path ended in a slash */ #define PARAMASK 0x1ffffe00 /* mask of parameter descriptors */ -#define NDHASGIANT(NDP) (((NDP)->ni_cnd.cn_flags & GIANTHELD) != 0) - /* * Initialization of a nameidata structure. */ diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c index 5f984b4..5756be7 100644 --- a/sys/ufs/ffs/ffs_alloc.c +++ b/sys/ufs/ffs/ffs_alloc.c @@ -2469,7 +2469,7 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS) long blkcnt, blksize; struct filedesc *fdp; struct file *fp, *vfp; - int vfslocked, filetype, error; + int filetype, error; static struct fileops *origops, bufferedops; if (req->newlen > sizeof cmd) @@ -2674,23 +2674,18 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS) #endif /* DEBUG */ if ((error = ffs_vget(mp, (ino_t)cmd.value, LK_SHARED, &vp))) break; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); AUDIT_ARG_VNODE1(vp); if ((error = change_dir(vp, td)) != 0) { vput(vp); - VFS_UNLOCK_GIANT(vfslocked); break; } VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); fdp = td->td_proc->p_fd; FILEDESC_XLOCK(fdp); vpold = fdp->fd_cdir; fdp->fd_cdir = vp; FILEDESC_XUNLOCK(fdp); - vfslocked = VFS_LOCK_GIANT(vpold->v_mount); vrele(vpold); - VFS_UNLOCK_GIANT(vfslocked); break; case FFS_SET_DOTDOT: @@ -2763,7 +2758,6 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS) #endif /* DEBUG */ if ((error = ffs_vget(mp, (ino_t)cmd.value, LK_EXCLUSIVE, &vp))) break; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); AUDIT_ARG_VNODE1(vp); ip = VTOI(vp); if (ip->i_ump->um_fstype == UFS1) @@ -2774,13 +2768,11 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS) sizeof(struct ufs2_dinode)); if (error) { vput(vp); - VFS_UNLOCK_GIANT(vfslocked); break; } ip->i_flag |= IN_CHANGE | IN_MODIFIED; error = ffs_update(vp, 1); vput(vp); - VFS_UNLOCK_GIANT(vfslocked); break; case FFS_SET_BUFOUTPUT: @@ -2857,7 +2849,7 @@ buffered_write(fp, uio, active_cred, flags, td) struct inode *ip; struct buf *bp; struct fs *fs; - int error, vfslocked; + int error; daddr_t lbn; /* @@ -2871,7 +2863,6 @@ buffered_write(fp, uio, active_cred, flags, td) if (ip->i_devvp != devvp) return (EINVAL); fs = ip->i_fs; - vfslocked = VFS_LOCK_GIANT(ip->i_vnode->v_mount); vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); if ((flags & FOF_OFFSET) == 0) uio->uio_offset = fp->f_offset; @@ -2904,6 +2895,5 @@ buffered_write(fp, uio, active_cred, flags, td) fp->f_nextoff = uio->uio_offset; out: VOP_UNLOCK(devvp, 0); - VFS_UNLOCK_GIANT(vfslocked); return (error); } diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c index 6cf033a..63b61a2 100644 --- a/sys/ufs/ffs/ffs_softdep.c +++ b/sys/ufs/ffs/ffs_softdep.c @@ -1336,14 +1336,12 @@ softdep_flush(void) struct thread *td; int remaining; int progress; - int vfslocked; td = curthread; td->td_pflags |= TDP_NORUNNINGBUF; for (;;) { kproc_suspend_check(softdepproc); - vfslocked = VFS_LOCK_GIANT((struct mount *)NULL); ACQUIRE_LOCK(&lk); /* * If requested, try removing inode or removal dependencies. @@ -1359,7 +1357,6 @@ softdep_flush(void) wakeup_one(&proc_waiting); } FREE_LOCK(&lk); - VFS_UNLOCK_GIANT(vfslocked); remaining = progress = 0; mtx_lock(&mountlist_mtx); for (mp = TAILQ_FIRST(&mountlist); mp != NULL; mp = nmp) { @@ -1368,11 +1365,9 @@ softdep_flush(void) continue; if (vfs_busy(mp, MBF_NOWAIT | MBF_MNTLSTLOCK)) continue; - vfslocked = VFS_LOCK_GIANT(mp); progress += softdep_process_worklist(mp, 0); ump = VFSTOUFS(mp); remaining += ump->softdep_on_worklist; - VFS_UNLOCK_GIANT(vfslocked); mtx_lock(&mountlist_mtx); nmp = TAILQ_NEXT(mp, mnt_list); vfs_unbusy(mp); diff --git a/sys/ufs/ufs/ufs_quota.c b/sys/ufs/ufs/ufs_quota.c index 59e89f9..0801cb0 100644 --- a/sys/ufs/ufs/ufs_quota.c +++ b/sys/ufs/ufs/ufs_quota.c @@ -497,7 +497,7 @@ quotaon(struct thread *td, struct mount *mp, int type, void *fname) struct vnode *vp, **vpp; struct vnode *mvp; struct dquot *dq; - int error, flags, vfslocked; + int error, flags; struct nameidata nd; error = priv_check(td, PRIV_UFS_QUOTAON); @@ -510,18 +510,16 @@ quotaon(struct thread *td, struct mount *mp, int type, void *fname) ump = VFSTOUFS(mp); dq = NODQUOT; - NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_USERSPACE, fname, td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, fname, td); flags = FREAD | FWRITE; error = vn_open(&nd, &flags, 0, NULL); if (error) return (error); - vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); vp = nd.ni_vp; if (vp->v_type != VREG) { VOP_UNLOCK(vp, 0); (void) vn_close(vp, FREAD|FWRITE, td->td_ucred, td); - VFS_UNLOCK_GIANT(vfslocked); return (EACCES); } @@ -530,7 +528,6 @@ quotaon(struct thread *td, struct mount *mp, int type, void *fname) UFS_UNLOCK(ump); VOP_UNLOCK(vp, 0); (void) vn_close(vp, FREAD|FWRITE, td->td_ucred, td); - VFS_UNLOCK_GIANT(vfslocked); return (EALREADY); } ump->um_qflags[type] |= QTF_OPENING|QTF_CLOSING; @@ -541,7 +538,6 @@ quotaon(struct thread *td, struct mount *mp, int type, void *fname) ump->um_qflags[type] &= ~(QTF_OPENING|QTF_CLOSING); UFS_UNLOCK(ump); (void) vn_close(vp, FREAD|FWRITE, td->td_ucred, td); - VFS_UNLOCK_GIANT(vfslocked); return (error); } VOP_UNLOCK(vp, 0); @@ -557,7 +553,6 @@ quotaon(struct thread *td, struct mount *mp, int type, void *fname) vp->v_vflag |= VV_SYSTEM; VOP_UNLOCK(vp, 0); *vpp = vp; - VFS_UNLOCK_GIANT(vfslocked); /* * Save the credential of the process that turned on quotas. * Set up the time limits for this quota. @@ -635,7 +630,6 @@ quotaoff1(struct thread *td, struct mount *mp, int type) struct dquot *dq; struct inode *ip; struct ucred *cr; - int vfslocked; int error; ump = VFSTOUFS(mp); @@ -688,12 +682,10 @@ again: ump->um_cred[type] = NOCRED; UFS_UNLOCK(ump); - vfslocked = VFS_LOCK_GIANT(qvp->v_mount); vn_lock(qvp, LK_EXCLUSIVE | LK_RETRY); qvp->v_vflag &= ~VV_SYSTEM; VOP_UNLOCK(qvp, 0); error = vn_close(qvp, FREAD|FWRITE, td->td_ucred, td); - VFS_UNLOCK_GIANT(vfslocked); crfree(cr); return (error); @@ -1219,7 +1211,7 @@ dqget(struct vnode *vp, u_long id, struct ufsmount *ump, int type, struct vnode *dqvp; struct iovec aiov; struct uio auio; - int vfslocked, dqvplocked, error; + int dqvplocked, error; #ifdef DEBUG_VFS_LOCKS if (vp != NULLVP) @@ -1265,12 +1257,10 @@ hfound: DQI_LOCK(dq); error = EIO; } *dqp = dq; - vfslocked = VFS_LOCK_GIANT(dqvp->v_mount); if (dqvplocked) vput(dqvp); else vrele(dqvp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -1323,12 +1313,10 @@ hfound: DQI_LOCK(dq); DQH_UNLOCK(); tablefull("dquot"); *dqp = NODQUOT; - vfslocked = VFS_LOCK_GIANT(dqvp->v_mount); if (dqvplocked) vput(dqvp); else vrele(dqvp); - VFS_UNLOCK_GIANT(vfslocked); return (EUSERS); } if (dq->dq_cnt || (dq->dq_flags & DQ_MOD)) @@ -1371,7 +1359,6 @@ hfound: DQI_LOCK(dq); auio.uio_rw = UIO_READ; auio.uio_td = (struct thread *)0; - vfslocked = VFS_LOCK_GIANT(dqvp->v_mount); error = VOP_READ(dqvp, &auio, 0, ump->um_cred[type]); if (auio.uio_resid == recsize && error == 0) { bzero(&dq->dq_dqb, sizeof(dq->dq_dqb)); @@ -1385,7 +1372,6 @@ hfound: DQI_LOCK(dq); vput(dqvp); else vrele(dqvp); - VFS_UNLOCK_GIANT(vfslocked); /* * I/O error in reading quota file, release * quota structure and reflect problem to caller. @@ -1496,7 +1482,7 @@ dqsync(struct vnode *vp, struct dquot *dq) struct vnode *dqvp; struct iovec aiov; struct uio auio; - int vfslocked, error; + int error; struct mount *mp; struct ufsmount *ump; @@ -1517,12 +1503,10 @@ dqsync(struct vnode *vp, struct dquot *dq) vref(dqvp); UFS_UNLOCK(ump); - vfslocked = VFS_LOCK_GIANT(dqvp->v_mount); DQI_LOCK(dq); if ((dq->dq_flags & DQ_MOD) == 0) { DQI_UNLOCK(dq); vrele(dqvp); - VFS_UNLOCK_GIANT(vfslocked); return (0); } DQI_UNLOCK(dq); @@ -1531,7 +1515,6 @@ dqsync(struct vnode *vp, struct dquot *dq) if (vp != dqvp) vn_lock(dqvp, LK_EXCLUSIVE | LK_RETRY); - VFS_UNLOCK_GIANT(vfslocked); DQI_LOCK(dq); DQI_WAIT(dq, PINOD+2, "dqsync"); if ((dq->dq_flags & DQ_MOD) == 0) @@ -1562,9 +1545,7 @@ dqsync(struct vnode *vp, struct dquot *dq) auio.uio_segflg = UIO_SYSSPACE; auio.uio_rw = UIO_WRITE; auio.uio_td = (struct thread *)0; - vfslocked = VFS_LOCK_GIANT(dqvp->v_mount); error = VOP_WRITE(dqvp, &auio, 0, dq->dq_ump->um_cred[dq->dq_type]); - VFS_UNLOCK_GIANT(vfslocked); if (auio.uio_resid && error == 0) error = EIO; @@ -1573,13 +1554,11 @@ dqsync(struct vnode *vp, struct dquot *dq) dq->dq_flags &= ~DQ_MOD; out: DQI_UNLOCK(dq); - vfslocked = VFS_LOCK_GIANT(dqvp->v_mount); if (vp != dqvp) vput(dqvp); else vrele(dqvp); vn_finished_secondary_write(mp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } diff --git a/sys/vm/vm_contig.c b/sys/vm/vm_contig.c index 67ebdc3..5334850 100644 --- a/sys/vm/vm_contig.c +++ b/sys/vm/vm_contig.c @@ -93,7 +93,6 @@ vm_contig_launder_page(vm_page_t m, vm_page_t *next) vm_page_t m_tmp; struct vnode *vp; struct mount *mp; - int vfslocked; mtx_assert(&vm_page_queue_mtx, MA_OWNED); vm_page_lock_assert(m, MA_OWNED); @@ -124,13 +123,11 @@ vm_contig_launder_page(vm_page_t m, vm_page_t *next) vm_object_reference_locked(object); VM_OBJECT_UNLOCK(object); (void) vn_start_write(vp, &mp, V_WAIT); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); VM_OBJECT_LOCK(object); vm_object_page_clean(object, 0, 0, OBJPC_SYNC); VM_OBJECT_UNLOCK(object); VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); vm_object_deallocate(object); vn_finished_write(mp); vm_page_lock_queues(); diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index eeb10a4..d577bd6 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -98,8 +98,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include /* XXX Temporary for VFS_LOCK_GIANT() */ - #define PFBAK 4 #define PFFOR 4 #define PAGEORDER_SIZE (PFBAK+PFFOR) @@ -129,7 +127,6 @@ struct faultstate { vm_map_entry_t entry; int lookup_still_valid; struct vnode *vp; - int vfslocked; }; static inline void @@ -174,8 +171,6 @@ unlock_and_deallocate(struct faultstate *fs) vput(fs->vp); fs->vp = NULL; } - VFS_UNLOCK_GIANT(fs->vfslocked); - fs->vfslocked = 0; } /* @@ -234,7 +229,6 @@ vm_fault_hold(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type, growstack = TRUE; PCPU_INC(cnt.v_vm_faults); fs.vp = NULL; - fs.vfslocked = 0; faultcount = behind = 0; RetryFault:; @@ -522,7 +516,6 @@ readrest: */ unlock_map(&fs); -vnode_lock: if (fs.object->type == OBJT_VNODE) { vp = fs.object->handle; if (vp == fs.vp) @@ -533,25 +526,12 @@ vnode_lock: } locked = VOP_ISLOCKED(vp); - if (VFS_NEEDSGIANT(vp->v_mount) && !fs.vfslocked) { - fs.vfslocked = 1; - if (!mtx_trylock(&Giant)) { - VM_OBJECT_UNLOCK(fs.object); - mtx_lock(&Giant); - VM_OBJECT_LOCK(fs.object); - goto vnode_lock; - } - } if (locked != LK_EXCLUSIVE) locked = LK_SHARED; /* Do not sleep for vnode lock while fs.m is busy */ error = vget(vp, locked | LK_CANRECURSE | LK_NOWAIT, curthread); if (error != 0) { - int vfslocked; - - vfslocked = fs.vfslocked; - fs.vfslocked = 0; /* Keep Giant */ vhold(vp); release_page(&fs); unlock_and_deallocate(&fs); @@ -559,7 +539,6 @@ vnode_lock: LK_CANRECURSE, curthread); vdrop(vp); fs.vp = vp; - fs.vfslocked = vfslocked; KASSERT(error == 0, ("vm_fault: vget failed")); goto RetryFault; diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c index a46d6b5..fc728fa 100644 --- a/sys/vm/vm_mmap.c +++ b/sys/vm/vm_mmap.c @@ -1234,15 +1234,11 @@ vm_mmap_vnode(struct thread *td, vm_size_t objsize, struct mount *mp; struct ucred *cred; int error, flags; - int vfslocked; mp = vp->v_mount; cred = td->td_ucred; - vfslocked = VFS_LOCK_GIANT(mp); - if ((error = vget(vp, LK_SHARED, td)) != 0) { - VFS_UNLOCK_GIANT(vfslocked); + if ((error = vget(vp, LK_SHARED, td)) != 0) return (error); - } foff = *foffp; flags = *flagsp; obj = vp->v_object; @@ -1306,7 +1302,6 @@ mark_atime: done: vput(vp); - VFS_UNLOCK_GIANT(vfslocked); return (error); } diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index 602d99e..ec0dc5f 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -425,7 +425,6 @@ vm_object_vndeallocate(vm_object_t object) { struct vnode *vp = (struct vnode *) object->handle; - VFS_ASSERT_GIANT(vp->v_mount); VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); KASSERT(object->type == OBJT_VNODE, ("vm_object_vndeallocate: not a vnode object")); @@ -478,38 +477,11 @@ vm_object_deallocate(vm_object_t object) vm_object_t temp; while (object != NULL) { - int vfslocked; - - vfslocked = 0; - restart: VM_OBJECT_LOCK(object); if (object->type == OBJT_VNODE) { - struct vnode *vp = (struct vnode *) object->handle; - - /* - * Conditionally acquire Giant for a vnode-backed - * object. We have to be careful since the type of - * a vnode object can change while the object is - * unlocked. - */ - if (VFS_NEEDSGIANT(vp->v_mount) && !vfslocked) { - vfslocked = 1; - if (!mtx_trylock(&Giant)) { - VM_OBJECT_UNLOCK(object); - mtx_lock(&Giant); - goto restart; - } - } vm_object_vndeallocate(object); - VFS_UNLOCK_GIANT(vfslocked); return; - } else - /* - * This is to handle the case that the object - * changed type while we dropped its lock to - * obtain Giant. - */ - VFS_UNLOCK_GIANT(vfslocked); + } KASSERT(object->ref_count != 0, ("vm_object_deallocate: object deallocated too many times: %d", object->type)); @@ -964,11 +936,9 @@ vm_object_sync(vm_object_t object, vm_ooffset_t offset, vm_size_t size, */ if (object->type == OBJT_VNODE && (object->flags & OBJ_MIGHTBEDIRTY) != 0) { - int vfslocked; vp = object->handle; VM_OBJECT_UNLOCK(object); (void) vn_start_write(vp, &mp, V_WAIT); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); flags = (syncio || invalidate) ? OBJPC_SYNC : 0; flags |= invalidate ? OBJPC_INVAL : 0; @@ -976,7 +946,6 @@ vm_object_sync(vm_object_t object, vm_ooffset_t offset, vm_size_t size, vm_object_page_clean(object, offset, offset + size, flags); VM_OBJECT_UNLOCK(object); VOP_UNLOCK(vp, 0); - VFS_UNLOCK_GIANT(vfslocked); vn_finished_write(mp); VM_OBJECT_LOCK(object); } diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c index e9c9927..fddd070 100644 --- a/sys/vm/vm_pageout.c +++ b/sys/vm/vm_pageout.c @@ -948,7 +948,7 @@ rescan0: * pressure where there are insufficient clean pages * on the inactive queue, we may have to go all out. */ - int swap_pageouts_ok, vfslocked = 0; + int swap_pageouts_ok; struct vnode *vp = NULL; struct mount *mp = NULL; @@ -1022,7 +1022,6 @@ rescan0: ("vp %p with NULL v_mount", vp)); vm_object_reference_locked(object); VM_OBJECT_UNLOCK(object); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); if (vget(vp, LK_EXCLUSIVE | LK_TIMELOCK, curthread)) { VM_OBJECT_LOCK(object); @@ -1098,7 +1097,6 @@ unlock_and_continue: vm_page_unlock_queues(); if (vp != NULL) vput(vp); - VFS_UNLOCK_GIANT(vfslocked); vm_object_deallocate(object); vn_finished_write(mp); vm_page_lock_queues(); diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index 23ade63..5308370 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -288,7 +288,6 @@ vnode_pager_haspage(object, pindex, before, after) int poff; int bsize; int pagesperblock, blocksperpage; - int vfslocked; VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); /* @@ -314,9 +313,7 @@ vnode_pager_haspage(object, pindex, before, after) reqblock = pindex * blocksperpage; } VM_OBJECT_UNLOCK(object); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); err = VOP_BMAP(vp, reqblock, NULL, &bn, after, before); - VFS_UNLOCK_GIANT(vfslocked); VM_OBJECT_LOCK(object); if (err) return TRUE; @@ -657,15 +654,12 @@ vnode_pager_getpages(object, m, count, reqpage) int rtval; struct vnode *vp; int bytes = count * PAGE_SIZE; - int vfslocked; vp = object->handle; VM_OBJECT_UNLOCK(object); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); rtval = VOP_GETPAGES(vp, m, bytes, reqpage, 0); KASSERT(rtval != EOPNOTSUPP, ("vnode_pager: FS getpages not implemented\n")); - VFS_UNLOCK_GIANT(vfslocked); VM_OBJECT_LOCK(object); return rtval; }