aboutsummaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2007-05-31 11:51:53 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2007-05-31 11:51:53 +0000
commit9e223287c05be2947379d5b6fdf4c8f8882b38f5 (patch)
treed5e88e86417c996e0e901ce9a43de8d9ae3ad44e /sys/kern
parent049c3b6cdf6ad1566ed35d869341a2c4b4c0b76e (diff)
downloadsrc-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.c2
-rw-r--r--sys/kern/kern_conf.c4
-rw-r--r--sys/kern/kern_descrip.c10
-rw-r--r--sys/kern/kern_exec.c2
-rw-r--r--sys/kern/kern_ktrace.c2
-rw-r--r--sys/kern/kern_linker.c4
-rw-r--r--sys/kern/kern_sig.c2
-rw-r--r--sys/kern/link_elf.c2
-rw-r--r--sys/kern/link_elf_obj.c2
-rw-r--r--sys/kern/tty_cons.c2
-rw-r--r--sys/kern/vfs_syscalls.c16
-rw-r--r--sys/kern/vfs_vnops.c13
-rw-r--r--sys/kern/vnode_if.src2
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;
};