diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2007-05-31 11:51:53 +0000 |
---|---|---|
committer | Konstantin Belousov <kib@FreeBSD.org> | 2007-05-31 11:51:53 +0000 |
commit | 9e223287c05be2947379d5b6fdf4c8f8882b38f5 (patch) | |
tree | d5e88e86417c996e0e901ce9a43de8d9ae3ad44e /sys/kern | |
parent | 049c3b6cdf6ad1566ed35d869341a2c4b4c0b76e (diff) | |
download | src-9e223287c05be2947379d5b6fdf4c8f8882b38f5.tar.gz src-9e223287c05be2947379d5b6fdf4c8f8882b38f5.zip |
Revert UF_OPENING workaround for CURRENT.
Change the VOP_OPEN(), vn_open() vnode operation and d_fdopen() cdev operation
argument from being file descriptor index into the pointer to struct file.
Proposed and reviewed by: jhb
Reviewed by: daichi (unionfs)
Approved by: re (kensmith)
Notes
Notes:
svn path=/head/; revision=170152
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_acct.c | 2 | ||||
-rw-r--r-- | sys/kern/kern_conf.c | 4 | ||||
-rw-r--r-- | sys/kern/kern_descrip.c | 10 | ||||
-rw-r--r-- | sys/kern/kern_exec.c | 2 | ||||
-rw-r--r-- | sys/kern/kern_ktrace.c | 2 | ||||
-rw-r--r-- | sys/kern/kern_linker.c | 4 | ||||
-rw-r--r-- | sys/kern/kern_sig.c | 2 | ||||
-rw-r--r-- | sys/kern/link_elf.c | 2 | ||||
-rw-r--r-- | sys/kern/link_elf_obj.c | 2 | ||||
-rw-r--r-- | sys/kern/tty_cons.c | 2 | ||||
-rw-r--r-- | sys/kern/vfs_syscalls.c | 16 | ||||
-rw-r--r-- | sys/kern/vfs_vnops.c | 13 | ||||
-rw-r--r-- | sys/kern/vnode_if.src | 2 |
13 files changed, 24 insertions, 39 deletions
diff --git a/sys/kern/kern_acct.c b/sys/kern/kern_acct.c index 6783fba59624..f1b0b8f2a8df 100644 --- a/sys/kern/kern_acct.c +++ b/sys/kern/kern_acct.c @@ -211,7 +211,7 @@ acct(struct thread *td, struct acct_args *uap) NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE | AUDITVNODE1, UIO_USERSPACE, uap->path, td); flags = FWRITE | O_APPEND; - error = vn_open(&nd, &flags, 0, -1); + error = vn_open(&nd, &flags, 0, NULL); if (error) return (error); vfslocked = NDHASGIANT(&nd); diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c index 177b66bc10d4..dba6287cbc64 100644 --- a/sys/kern/kern_conf.c +++ b/sys/kern/kern_conf.c @@ -264,13 +264,13 @@ giant_open(struct cdev *dev, int oflags, int devtype, struct thread *td) } static int -giant_fdopen(struct cdev *dev, int oflags, struct thread *td, int fdidx) +giant_fdopen(struct cdev *dev, int oflags, struct thread *td, struct file *fp) { int retval; mtx_lock(&Giant); retval = dev->si_devsw->d_gianttrick-> - d_fdopen(dev, oflags, td, fdidx); + d_fdopen(dev, oflags, td, fp); mtx_unlock(&Giant); return (retval); } diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index bc9cad8f41c8..963b286393cb 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -666,9 +666,7 @@ do_dup(struct thread *td, enum dup_type type, int old, int new, * bad file descriptor. Userland should do its own locking to * avoid this case. */ - if (fdp->fd_ofiles[old] != fp || - (fdp->fd_ofileflags[old] & UF_OPENING) != 0 || - (fdp->fd_ofileflags[new] & UF_OPENING) != 0) { + if (fdp->fd_ofiles[old] != fp) { /* we've allocated a descriptor which we won't use */ if (fdp->fd_ofiles[new] == NULL) fdunused(fdp, new); @@ -992,8 +990,7 @@ kern_close(td, fd) FILEDESC_XLOCK(fdp); if ((unsigned)fd >= fdp->fd_nfiles || - (fp = fdp->fd_ofiles[fd]) == NULL || - (fdp->fd_ofileflags[fd] & UF_OPENING) != 0) { + (fp = fdp->fd_ofiles[fd]) == NULL) { FILEDESC_XUNLOCK(fdp); return (EBADF); } @@ -1507,8 +1504,7 @@ fdcopy(struct filedesc *fdp) newfdp->fd_freefile = -1; for (i = 0; i <= fdp->fd_lastfile; ++i) { if (fdisused(fdp, i) && - fdp->fd_ofiles[i]->f_type != DTYPE_KQUEUE && - (fdp->fd_ofileflags[i] & UF_OPENING) == 0) { + fdp->fd_ofiles[i]->f_type != DTYPE_KQUEUE) { newfdp->fd_ofiles[i] = fdp->fd_ofiles[i]; newfdp->fd_ofileflags[i] = fdp->fd_ofileflags[i]; fhold(newfdp->fd_ofiles[i]); diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index 65ee108bfc6a..78534ad49e1a 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -1224,7 +1224,7 @@ exec_check_permissions(imgp) * Call filesystem specific open routine (which does nothing in the * general case). */ - error = VOP_OPEN(vp, FREAD, td->td_ucred, td, -1); + error = VOP_OPEN(vp, FREAD, td->td_ucred, td, NULL); return (error); } diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c index bba1ce4a14b9..5ff62fe7cac3 100644 --- a/sys/kern/kern_ktrace.c +++ b/sys/kern/kern_ktrace.c @@ -596,7 +596,7 @@ ktrace(td, uap) NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_USERSPACE, uap->fname, td); flags = FREAD | FWRITE | O_NOFOLLOW; - error = vn_open(&nd, &flags, 0, -1); + error = vn_open(&nd, &flags, 0, NULL); if (error) { ktrace_exit(td); return (error); diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c index d8150fe9564d..764033418ec7 100644 --- a/sys/kern/kern_linker.c +++ b/sys/kern/kern_linker.c @@ -1510,7 +1510,7 @@ linker_lookup_file(const char *path, int pathlen, const char *name, */ NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, result, td); flags = FREAD; - error = vn_open(&nd, &flags, 0, -1); + error = vn_open(&nd, &flags, 0, NULL); if (error == 0) { vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); @@ -1561,7 +1561,7 @@ linker_hints_lookup(const char *path, int pathlen, const char *modname, NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_SYSSPACE, pathbuf, td); flags = FREAD; - error = vn_open(&nd, &flags, 0, -1); + error = vn_open(&nd, &flags, 0, NULL); if (error) goto bad; vfslocked = NDHASGIANT(&nd); diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index 97c32655b6b2..fe2bbbeee988 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -3072,7 +3072,7 @@ restart: return (EINVAL); NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_SYSSPACE, name, td); flags = O_CREAT | FWRITE | O_NOFOLLOW; - error = vn_open(&nd, &flags, S_IRUSR | S_IWUSR, -1); + error = vn_open(&nd, &flags, S_IRUSR | S_IWUSR, NULL); free(name, M_TEMP); if (error) return (error); diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c index 6902615f1904..5e9480c025dc 100644 --- a/sys/kern/link_elf.c +++ b/sys/kern/link_elf.c @@ -566,7 +566,7 @@ link_elf_load_file(linker_class_t cls, const char* filename, NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, filename, td); flags = FREAD; - error = vn_open(&nd, &flags, 0, -1); + error = vn_open(&nd, &flags, 0, NULL); if (error) return error; vfslocked = NDHASGIANT(&nd); diff --git a/sys/kern/link_elf_obj.c b/sys/kern/link_elf_obj.c index 342410ef658f..6426fc06ed04 100644 --- a/sys/kern/link_elf_obj.c +++ b/sys/kern/link_elf_obj.c @@ -404,7 +404,7 @@ link_elf_load_file(linker_class_t cls, const char *filename, NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, filename, td); flags = FREAD; - error = vn_open(&nd, &flags, 0, -1); + error = vn_open(&nd, &flags, 0, NULL); if (error) return error; vfslocked = NDHASGIANT(&nd); diff --git a/sys/kern/tty_cons.c b/sys/kern/tty_cons.c index 8e9e2a544e71..946072513573 100644 --- a/sys/kern/tty_cons.c +++ b/sys/kern/tty_cons.c @@ -407,7 +407,7 @@ cn_devopen(struct cn_device *cnd, struct thread *td, int forceopen) } snprintf(path, sizeof(path), "/dev/%s", cnd->cnd_cn->cn_name); NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, path, td); - error = vn_open(&nd, &openflag, 0, -1); + error = vn_open(&nd, &openflag, 0, NULL); if (error == 0) { NDFREE(&nd, NDF_ONLY_PNBUF); VOP_UNLOCK(nd.ni_vp, 0, td); diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index fe9d99ec8d65..ab10bfa2e6dd 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -984,19 +984,7 @@ kern_open(struct thread *td, char *path, enum uio_seg pathseg, int flags, cmode = ((mode &~ fdp->fd_cmask) & ALLPERMS) &~ S_ISTXT; NDINIT(&nd, LOOKUP, FOLLOW | AUDITVNODE1 | MPSAFE, pathseg, path, td); td->td_dupfd = -1; /* XXX check for fdopen */ - FILEDESC_XLOCK(fdp); - if (fp != fdp->fd_ofiles[indx]) { - FILEDESC_XUNLOCK(fdp); - fdrop(fp, td); - td->td_retval[0] = indx; - return (0); - } - fdp->fd_ofileflags[indx] |= UF_OPENING; - FILEDESC_XUNLOCK(fdp); - error = vn_open(&nd, &flags, cmode, indx); - FILEDESC_XLOCK(fdp); - fdp->fd_ofileflags[indx] &= ~UF_OPENING; - FILEDESC_XUNLOCK(fdp); + error = vn_open(&nd, &flags, cmode, fp); if (error) { /* * If the vn_open replaced the method vector, something @@ -4103,7 +4091,7 @@ fhopen(td, uap) if (error) goto bad; } - error = VOP_OPEN(vp, fmode, td->td_ucred, td, -1); + error = VOP_OPEN(vp, fmode, td->td_ucred, td, NULL); if (error) goto bad; diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index c0f179cfb8c2..019553d3dd1a 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -84,13 +84,14 @@ struct fileops vnops = { }; int -vn_open(ndp, flagp, cmode, fdidx) +vn_open(ndp, flagp, cmode, fp) struct nameidata *ndp; - int *flagp, cmode, fdidx; + int *flagp, cmode; + struct file *fp; { struct thread *td = ndp->ni_cnd.cn_thread; - return (vn_open_cred(ndp, flagp, cmode, td->td_ucred, fdidx)); + return (vn_open_cred(ndp, flagp, cmode, td->td_ucred, fp)); } /* @@ -101,11 +102,11 @@ vn_open(ndp, flagp, cmode, fdidx) * due to the NDINIT being done elsewhere. */ int -vn_open_cred(ndp, flagp, cmode, cred, fdidx) +vn_open_cred(ndp, flagp, cmode, cred, fp) struct nameidata *ndp; int *flagp, cmode; struct ucred *cred; - int fdidx; + struct file *fp; { struct vnode *vp; struct mount *mp; @@ -228,7 +229,7 @@ restart: goto bad; } } - if ((error = VOP_OPEN(vp, fmode, cred, td, fdidx)) != 0) + if ((error = VOP_OPEN(vp, fmode, cred, td, fp)) != 0) goto bad; if (fmode & FWRITE) diff --git a/sys/kern/vnode_if.src b/sys/kern/vnode_if.src index 373b988e956f..6bd98aa2fd68 100644 --- a/sys/kern/vnode_if.src +++ b/sys/kern/vnode_if.src @@ -130,7 +130,7 @@ vop_open { IN int mode; IN struct ucred *cred; IN struct thread *td; - IN int fdidx; + IN struct file *fp; }; |