summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2007-05-31 11:51:53 +0000
committerkib <kib@FreeBSD.org>2007-05-31 11:51:53 +0000
commitf13486a2227b9165fce30aa40d12b728f327a909 (patch)
treed5e88e86417c996e0e901ce9a43de8d9ae3ad44e
parent7f276f0bff169823b786ea0a9bbdfe936361fcb4 (diff)
downloadFreeBSD-src-f13486a2227b9165fce30aa40d12b728f327a909.zip
FreeBSD-src-f13486a2227b9165fce30aa40d12b728f327a909.tar.gz
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)
-rw-r--r--sys/cddl/compat/opensolaris/kern/opensolaris_kobj.c2
-rw-r--r--sys/cddl/compat/opensolaris/sys/vnode.h2
-rw-r--r--sys/coda/coda_vnops.c6
-rw-r--r--sys/compat/linux/linux_misc.c3
-rw-r--r--sys/compat/ndis/subr_ndis.c2
-rw-r--r--sys/compat/opensolaris/kern/opensolaris_kobj.c2
-rw-r--r--sys/compat/opensolaris/sys/vnode.h2
-rw-r--r--sys/dev/md/md.c2
-rw-r--r--sys/fs/coda/coda_vnops.c6
-rw-r--r--sys/fs/devfs/devfs_vnops.c19
-rw-r--r--sys/fs/fifofs/fifo_vnops.c7
-rw-r--r--sys/fs/smbfs/smbfs_vnops.c2
-rw-r--r--sys/fs/unionfs/union.h1
-rw-r--r--sys/fs/unionfs/union_subr.c6
-rw-r--r--sys/fs/unionfs/union_vnops.c8
-rw-r--r--sys/i386/ibcs2/imgact_coff.c2
-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
-rw-r--r--sys/sys/conf.h3
-rw-r--r--sys/sys/filedesc.h1
-rw-r--r--sys/sys/vnode.h4
-rw-r--r--sys/ufs/ufs/ufs_quota.c2
-rw-r--r--sys/vm/swap_pager.c2
34 files changed, 62 insertions, 85 deletions
diff --git a/sys/cddl/compat/opensolaris/kern/opensolaris_kobj.c b/sys/cddl/compat/opensolaris/kern/opensolaris_kobj.c
index 16a5800..248856b 100644
--- a/sys/cddl/compat/opensolaris/kern/opensolaris_kobj.c
+++ b/sys/cddl/compat/opensolaris/kern/opensolaris_kobj.c
@@ -77,7 +77,7 @@ kobj_open_file_vnode(const char *file)
flags = FREAD;
NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, file, td);
- error = vn_open_cred(&nd, &flags, 0, td->td_ucred, -1);
+ error = vn_open_cred(&nd, &flags, 0, td->td_ucred, NULL);
NDFREE(&nd, NDF_ONLY_PNBUF);
if (error != 0)
return (NULL);
diff --git a/sys/cddl/compat/opensolaris/sys/vnode.h b/sys/cddl/compat/opensolaris/sys/vnode.h
index 06a4eb2..a474461 100644
--- a/sys/cddl/compat/opensolaris/sys/vnode.h
+++ b/sys/cddl/compat/opensolaris/sys/vnode.h
@@ -170,7 +170,7 @@ zfs_vn_open(char *pnamep, enum uio_seg seg, int filemode, int createmode,
td->td_proc->p_fd->fd_cdir = rootvnode;
NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, pnamep, td);
- error = vn_open_cred(&nd, &filemode, createmode, td->td_ucred, -1);
+ error = vn_open_cred(&nd, &filemode, createmode, td->td_ucred, NULL);
NDFREE(&nd, NDF_ONLY_PNBUF);
if (error == 0) {
/* We just unlock so we hold a reference. */
diff --git a/sys/coda/coda_vnops.c b/sys/coda/coda_vnops.c
index d1072da..d0b5c60 100644
--- a/sys/coda/coda_vnops.c
+++ b/sys/coda/coda_vnops.c
@@ -257,7 +257,7 @@ coda_open(struct vop_open_args *ap)
cp->c_inode = inode;
/* Open the cache file. */
- error = VOP_OPEN(vp, flag, cred, td, -1);
+ error = VOP_OPEN(vp, flag, cred, td, NULL);
if (error) {
printf("coda_open: VOP_OPEN on container failed %d\n", error);
return (error);
@@ -410,7 +410,7 @@ coda_rdwr(struct vnode *vp, struct uio *uiop, enum uio_rw rw, int ioflag,
opened_internally = 1;
MARK_INT_GEN(CODA_OPEN_STATS);
error = VOP_OPEN(vp, (rw == UIO_READ ? FREAD : FWRITE),
- cred, td, -1);
+ cred, td, NULL);
printf("coda_rdwr: Internally Opening %p\n", vp);
if (error) {
printf("coda_rdwr: VOP_OPEN on container failed %d\n", error);
@@ -1525,7 +1525,7 @@ coda_readdir(struct vop_readdir_args *ap)
if (cp->c_ovp == NULL) {
opened_internally = 1;
MARK_INT_GEN(CODA_OPEN_STATS);
- error = VOP_OPEN(vp, FREAD, cred, td, -1);
+ error = VOP_OPEN(vp, FREAD, cred, td, NULL);
printf("coda_readdir: Internally Opening %p\n", vp);
if (error) {
printf("coda_readdir: VOP_OPEN on container failed %d\n", error);
diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c
index 0333023..28fc69b 100644
--- a/sys/compat/linux/linux_misc.c
+++ b/sys/compat/linux/linux_misc.c
@@ -305,7 +305,7 @@ linux_uselib(struct thread *td, struct linux_uselib_args *args)
if (error)
goto cleanup;
#endif
- error = VOP_OPEN(vp, FREAD, td->td_ucred, td, -1);
+ error = VOP_OPEN(vp, FREAD, td->td_ucred, td, NULL);
if (error)
goto cleanup;
@@ -1451,6 +1451,7 @@ linux_getpid(struct thread *td, struct linux_getpid_args *args)
int
linux_gettid(struct thread *td, struct linux_gettid_args *args)
{
+
#ifdef DEBUG
if (ldebug(gettid))
printf(ARGS(gettid, ""));
diff --git a/sys/compat/ndis/subr_ndis.c b/sys/compat/ndis/subr_ndis.c
index d86b8f4..02b034a 100644
--- a/sys/compat/ndis/subr_ndis.c
+++ b/sys/compat/ndis/subr_ndis.c
@@ -2961,7 +2961,7 @@ NdisOpenFile(status, filehandle, filelength, filename, highestaddr)
NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, path, td);
flags = FREAD;
- error = vn_open(&nd, &flags, 0, -1);
+ error = vn_open(&nd, &flags, 0, NULL);
if (error) {
*status = NDIS_STATUS_FILE_NOT_FOUND;
ExFreePool(fh);
diff --git a/sys/compat/opensolaris/kern/opensolaris_kobj.c b/sys/compat/opensolaris/kern/opensolaris_kobj.c
index 16a5800..248856b 100644
--- a/sys/compat/opensolaris/kern/opensolaris_kobj.c
+++ b/sys/compat/opensolaris/kern/opensolaris_kobj.c
@@ -77,7 +77,7 @@ kobj_open_file_vnode(const char *file)
flags = FREAD;
NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, file, td);
- error = vn_open_cred(&nd, &flags, 0, td->td_ucred, -1);
+ error = vn_open_cred(&nd, &flags, 0, td->td_ucred, NULL);
NDFREE(&nd, NDF_ONLY_PNBUF);
if (error != 0)
return (NULL);
diff --git a/sys/compat/opensolaris/sys/vnode.h b/sys/compat/opensolaris/sys/vnode.h
index 06a4eb2..a474461 100644
--- a/sys/compat/opensolaris/sys/vnode.h
+++ b/sys/compat/opensolaris/sys/vnode.h
@@ -170,7 +170,7 @@ zfs_vn_open(char *pnamep, enum uio_seg seg, int filemode, int createmode,
td->td_proc->p_fd->fd_cdir = rootvnode;
NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, pnamep, td);
- error = vn_open_cred(&nd, &filemode, createmode, td->td_ucred, -1);
+ error = vn_open_cred(&nd, &filemode, createmode, td->td_ucred, NULL);
NDFREE(&nd, NDF_ONLY_PNBUF);
if (error == 0) {
/* We just unlock so we hold a reference. */
diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c
index 06a813f..aaf7e9d 100644
--- a/sys/dev/md/md.c
+++ b/sys/dev/md/md.c
@@ -913,7 +913,7 @@ mdcreate_vnode(struct md_s *sc, struct md_ioctl *mdio, struct thread *td)
if ((mdio->md_options & MD_READONLY) != 0)
flags &= ~FWRITE;
NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, sc->file, td);
- error = vn_open(&nd, &flags, 0, -1);
+ error = vn_open(&nd, &flags, 0, NULL);
if (error != 0)
return (error);
vfslocked = NDHASGIANT(&nd);
diff --git a/sys/fs/coda/coda_vnops.c b/sys/fs/coda/coda_vnops.c
index d1072da..d0b5c60 100644
--- a/sys/fs/coda/coda_vnops.c
+++ b/sys/fs/coda/coda_vnops.c
@@ -257,7 +257,7 @@ coda_open(struct vop_open_args *ap)
cp->c_inode = inode;
/* Open the cache file. */
- error = VOP_OPEN(vp, flag, cred, td, -1);
+ error = VOP_OPEN(vp, flag, cred, td, NULL);
if (error) {
printf("coda_open: VOP_OPEN on container failed %d\n", error);
return (error);
@@ -410,7 +410,7 @@ coda_rdwr(struct vnode *vp, struct uio *uiop, enum uio_rw rw, int ioflag,
opened_internally = 1;
MARK_INT_GEN(CODA_OPEN_STATS);
error = VOP_OPEN(vp, (rw == UIO_READ ? FREAD : FWRITE),
- cred, td, -1);
+ cred, td, NULL);
printf("coda_rdwr: Internally Opening %p\n", vp);
if (error) {
printf("coda_rdwr: VOP_OPEN on container failed %d\n", error);
@@ -1525,7 +1525,7 @@ coda_readdir(struct vop_readdir_args *ap)
if (cp->c_ovp == NULL) {
opened_internally = 1;
MARK_INT_GEN(CODA_OPEN_STATS);
- error = VOP_OPEN(vp, FREAD, cred, td, -1);
+ error = VOP_OPEN(vp, FREAD, cred, td, NULL);
printf("coda_readdir: Internally Opening %p\n", vp);
if (error) {
printf("coda_readdir: VOP_OPEN on container failed %d\n", error);
diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c
index 4f7cda2..d6c3232 100644
--- a/sys/fs/devfs/devfs_vnops.c
+++ b/sys/fs/devfs/devfs_vnops.c
@@ -734,7 +734,7 @@ devfs_open(struct vop_open_args *ap)
struct thread *td = ap->a_td;
struct vnode *vp = ap->a_vp;
struct cdev *dev = vp->v_rdev;
- struct file *fp;
+ struct file *fp = ap->a_fp;
int error;
struct cdevsw *dsw;
@@ -761,13 +761,13 @@ devfs_open(struct vop_open_args *ap)
if(!(dsw->d_flags & D_NEEDGIANT)) {
DROP_GIANT();
if (dsw->d_fdopen != NULL)
- error = dsw->d_fdopen(dev, ap->a_mode, td, ap->a_fdidx);
+ error = dsw->d_fdopen(dev, ap->a_mode, td, fp);
else
error = dsw->d_open(dev, ap->a_mode, S_IFCHR, td);
PICKUP_GIANT();
} else {
if (dsw->d_fdopen != NULL)
- error = dsw->d_fdopen(dev, ap->a_mode, td, ap->a_fdidx);
+ error = dsw->d_fdopen(dev, ap->a_mode, td, fp);
else
error = dsw->d_open(dev, ap->a_mode, S_IFCHR, td);
}
@@ -780,19 +780,12 @@ devfs_open(struct vop_open_args *ap)
return (error);
#if 0 /* /dev/console */
- KASSERT(ap->a_fdidx >= 0,
- ("Could not vnode bypass device on fd %d", ap->a_fdidx));
+ KASSERT(fp != NULL,
+ ("Could not vnode bypass device on NULL fp"));
#else
- if(ap->a_fdidx < 0)
+ if(fp == NULL)
return (error);
#endif
- /*
- * This is a pretty disgustingly long chain, but I am not
- * sure there is any better way. Passing the fdidx into
- * VOP_OPEN() offers us more information than just passing
- * the file *.
- */
- fp = ap->a_td->td_proc->p_fd->fd_ofiles[ap->a_fdidx];
FILE_LOCK(fp);
KASSERT(fp->f_ops == &badfileops,
("Could not vnode bypass device on fdops %p", fp->f_ops));
diff --git a/sys/fs/fifofs/fifo_vnops.c b/sys/fs/fifofs/fifo_vnops.c
index 0c13c46..7161591 100644
--- a/sys/fs/fifofs/fifo_vnops.c
+++ b/sys/fs/fifofs/fifo_vnops.c
@@ -175,12 +175,12 @@ fifo_open(ap)
struct fifoinfo *fip;
struct thread *td = ap->a_td;
struct ucred *cred = ap->a_cred;
+ struct file *fp = ap->a_fp;
struct socket *rso, *wso;
- struct file *fp;
int error;
ASSERT_VOP_LOCKED(vp, "fifo_open");
- if (ap->a_fdidx < 0)
+ if (fp == NULL)
return (EINVAL);
if ((fip = vp->v_fifoinfo) == NULL) {
MALLOC(fip, struct fifoinfo *, sizeof(*fip), M_VNODE, M_WAITOK);
@@ -293,8 +293,7 @@ fail1:
}
}
mtx_unlock(&fifo_mtx);
- KASSERT(ap->a_fdidx >= 0, ("can't fifo/vnode bypass %d", ap->a_fdidx));
- fp = ap->a_td->td_proc->p_fd->fd_ofiles[ap->a_fdidx];
+ KASSERT(fp != NULL, ("can't fifo/vnode bypass"));
FILE_LOCK(fp);
KASSERT(fp->f_ops == &badfileops, ("not badfileops in fifo_open"));
fp->f_data = fip;
diff --git a/sys/fs/smbfs/smbfs_vnops.c b/sys/fs/smbfs/smbfs_vnops.c
index bfac2aa..4c84e00 100644
--- a/sys/fs/smbfs/smbfs_vnops.c
+++ b/sys/fs/smbfs/smbfs_vnops.c
@@ -385,7 +385,7 @@ smbfs_setattr(ap)
*/
if ((np->n_flag & NOPEN) == 0) {
if (vcp->vc_flags & SMBV_WIN95) {
- error = VOP_OPEN(vp, FWRITE, ap->a_cred, ap->a_td, -1);
+ error = VOP_OPEN(vp, FWRITE, ap->a_cred, ap->a_td, NULL);
if (!error) {
/* error = smbfs_smb_setfattrNT(np, 0, mtime, atime, &scred);
VOP_GETATTR(vp, &vattr, ap->a_cred, ap->a_td);*/
diff --git a/sys/fs/unionfs/union.h b/sys/fs/unionfs/union.h
index f35e1bb..e2df553 100644
--- a/sys/fs/unionfs/union.h
+++ b/sys/fs/unionfs/union.h
@@ -64,7 +64,6 @@ struct unionfs_node_status {
int uns_lower_opencnt; /* open count of lower */
int uns_upper_opencnt; /* open count of upper */
int uns_lower_openmode; /* open mode of lower */
- int uns_lower_fdidx; /* open fdidx of lower */
int uns_readdir_status; /* read status of readdir */
};
diff --git a/sys/fs/unionfs/union_subr.c b/sys/fs/unionfs/union_subr.c
index 4f66fb3..887ef70 100644
--- a/sys/fs/unionfs/union_subr.c
+++ b/sys/fs/unionfs/union_subr.c
@@ -913,7 +913,7 @@ unionfs_vn_create_on_upper(struct vnode **vpp, struct vnode *udvp,
if ((error = VOP_CREATE(udvp, &vp, &cn, uvap)) != 0)
goto unionfs_vn_create_on_upper_free_out1;
- if ((error = VOP_OPEN(vp, fmode, cred, td, -1)) != 0) {
+ if ((error = VOP_OPEN(vp, fmode, cred, td, NULL)) != 0) {
vput(vp);
goto unionfs_vn_create_on_upper_free_out1;
}
@@ -1049,7 +1049,7 @@ unionfs_copyfile(struct unionfs_node *unp, int docopy, struct ucred *cred,
}
if (docopy != 0) {
- error = VOP_OPEN(lvp, FREAD, cred, td, -1);
+ error = VOP_OPEN(lvp, FREAD, cred, td, NULL);
if (error == 0) {
error = unionfs_copyfile_core(lvp, uvp, cred, td);
VOP_CLOSE(lvp, FREAD, cred, td);
@@ -1110,7 +1110,7 @@ unionfs_check_rmdir(struct vnode *vp, struct ucred *cred, struct thread *td)
return (0);
/* open vnode */
- if ((error = VOP_OPEN(vp, FREAD, cred, td, -1)) != 0)
+ if ((error = VOP_OPEN(vp, FREAD, cred, td, NULL)) != 0)
return (error);
uio.uio_rw = UIO_READ;
diff --git a/sys/fs/unionfs/union_vnops.c b/sys/fs/unionfs/union_vnops.c
index 134fe1c..fbce59d 100644
--- a/sys/fs/unionfs/union_vnops.c
+++ b/sys/fs/unionfs/union_vnops.c
@@ -475,13 +475,13 @@ unionfs_open(struct vop_open_args *ap)
targetvp = uvp;
}
- error = VOP_OPEN(targetvp, ap->a_mode, cred, td, ap->a_fdidx);
+ error = VOP_OPEN(targetvp, ap->a_mode, cred, td, ap->a_fp);
if (error == 0) {
if (targetvp == uvp) {
if (uvp->v_type == VDIR && lvp != NULLVP &&
unsp->uns_lower_opencnt <= 0) {
/* open lower for readdir */
- error = VOP_OPEN(lvp, FREAD, cred, td, -1);
+ error = VOP_OPEN(lvp, FREAD, cred, td, NULL);
if (error != 0) {
VOP_CLOSE(uvp, ap->a_mode, cred, td);
goto unionfs_open_abort;
@@ -493,7 +493,6 @@ unionfs_open(struct vop_open_args *ap)
} else {
unsp->uns_lower_opencnt++;
unsp->uns_lower_openmode = ap->a_mode;
- unsp->uns_lower_fdidx = ap->a_fdidx;
}
ap->a_vp->v_object = targetvp->v_object;
}
@@ -1852,7 +1851,8 @@ unionfs_advlock(struct vop_advlock_args *ap)
unionfs_get_node_status(unp, td, &unsp);
if (unsp->uns_lower_opencnt > 0) {
/* try reopen the vnode */
- error = VOP_OPEN(uvp, unsp->uns_lower_openmode, td->td_ucred, td, unsp->uns_lower_fdidx);
+ error = VOP_OPEN(uvp, unsp->uns_lower_openmode,
+ td->td_ucred, td, NULL);
if (error)
goto unionfs_advlock_abort;
unsp->uns_upper_opencnt++;
diff --git a/sys/i386/ibcs2/imgact_coff.c b/sys/i386/ibcs2/imgact_coff.c
index c04fe83..b078e56 100644
--- a/sys/i386/ibcs2/imgact_coff.c
+++ b/sys/i386/ibcs2/imgact_coff.c
@@ -204,7 +204,7 @@ coff_load_file(struct thread *td, char *name)
if ((error = VOP_ACCESS(vp, VEXEC, td->td_ucred, td)) != 0)
goto fail;
- if ((error = VOP_OPEN(vp, FREAD, td->td_ucred, td, -1)) != 0)
+ if ((error = VOP_OPEN(vp, FREAD, td->td_ucred, td, NULL)) != 0)
goto fail;
/*
diff --git a/sys/kern/kern_acct.c b/sys/kern/kern_acct.c
index 6783fba..f1b0b8f 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 177b66b..dba6287 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 bc9cad8..963b286 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 65ee108b..78534ad 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 bba1ce4..5ff62fe 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 d8150fe..7640334 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 97c3265..fe2bbbe 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 6902615..5e9480c 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 342410e..6426fc0 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 8e9e2a5..9460725 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 fe9d99e..ab10bfa 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 c0f179c..019553d 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 373b988..6bd98aa 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;
};
diff --git a/sys/sys/conf.h b/sys/sys/conf.h
index 7380381..c4272dd 100644
--- a/sys/sys/conf.h
+++ b/sys/sys/conf.h
@@ -50,6 +50,7 @@ struct tty;
struct snapdata;
struct devfs_dirent;
struct cdevsw;
+struct file;
struct cdev {
struct cdev_priv *si_priv;
@@ -126,7 +127,7 @@ struct vnode;
typedef struct thread d_thread_t;
typedef int d_open_t(struct cdev *dev, int oflags, int devtype, struct thread *td);
-typedef int d_fdopen_t(struct cdev *dev, int oflags, struct thread *td, int fdidx);
+typedef int d_fdopen_t(struct cdev *dev, int oflags, struct thread *td, struct file *fp);
typedef int d_close_t(struct cdev *dev, int fflag, int devtype, struct thread *td);
typedef void d_strategy_t(struct bio *bp);
typedef int d_ioctl_t(struct cdev *dev, u_long cmd, caddr_t data,
diff --git a/sys/sys/filedesc.h b/sys/sys/filedesc.h
index 8bbb412..da4a87c 100644
--- a/sys/sys/filedesc.h
+++ b/sys/sys/filedesc.h
@@ -89,7 +89,6 @@ struct filedesc_to_leader {
* Per-process open flags.
*/
#define UF_EXCLOSE 0x01 /* auto-close on exec */
-#define UF_OPENING 0x02 /* file is being opened */
#ifdef _KERNEL
diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h
index 4b20140..d1170f2 100644
--- a/sys/sys/vnode.h
+++ b/sys/sys/vnode.h
@@ -612,9 +612,9 @@ void vn_finished_secondary_write(struct mount *mp);
int vn_isdisk(struct vnode *vp, int *errp);
int _vn_lock(struct vnode *vp, int flags, struct thread *td, char *file, int line);
#define vn_lock(vp, flags, td) _vn_lock(vp, flags, td, __FILE__, __LINE__)
-int vn_open(struct nameidata *ndp, int *flagp, int cmode, int fdidx);
+int vn_open(struct nameidata *ndp, int *flagp, int cmode, struct file *fp);
int vn_open_cred(struct nameidata *ndp, int *flagp, int cmode,
- struct ucred *cred, int fdidx);
+ struct ucred *cred, struct file *fp);
int vn_pollrecord(struct vnode *vp, struct thread *p, int events);
int vn_rdwr(enum uio_rw rw, struct vnode *vp, void *base,
int len, off_t offset, enum uio_seg segflg, int ioflg,
diff --git a/sys/ufs/ufs/ufs_quota.c b/sys/ufs/ufs/ufs_quota.c
index ce07b1d..c6d8795 100644
--- a/sys/ufs/ufs/ufs_quota.c
+++ b/sys/ufs/ufs/ufs_quota.c
@@ -524,7 +524,7 @@ quotaon(td, mp, type, fname)
NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_USERSPACE, fname, td);
flags = FREAD | FWRITE;
- 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/vm/swap_pager.c b/sys/vm/swap_pager.c
index 5ef6a70..10de8a4 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -2535,7 +2535,7 @@ swaponvp(struct thread *td, struct vnode *vp, u_long nblks)
error = mac_check_system_swapon(td->td_ucred, vp);
if (error == 0)
#endif
- error = VOP_OPEN(vp, FREAD | FWRITE, td->td_ucred, td, -1);
+ error = VOP_OPEN(vp, FREAD | FWRITE, td->td_ucred, td, NULL);
(void) VOP_UNLOCK(vp, 0, td);
if (error)
return (error);
OpenPOWER on IntegriCloud