Pass a thread pointer instead of its file descriptor table to getvnode(9).
authormpi <mpi@openbsd.org>
Thu, 7 May 2015 08:53:32 +0000 (08:53 +0000)
committermpi <mpi@openbsd.org>
Thu, 7 May 2015 08:53:32 +0000 (08:53 +0000)
Input and ok millert@

share/man/man9/file.9
sys/compat/linux/linux_misc.c
sys/dev/diskmap.c
sys/kern/vfs_syscalls.c
sys/sys/vnode.h
sys/uvm/uvm_mmap.c

index 0fdad04..594679d 100644 (file)
@@ -1,4 +1,4 @@
-.\"     $OpenBSD: file.9,v 1.14 2015/05/06 08:52:17 mpi Exp $
+.\"     $OpenBSD: file.9,v 1.15 2015/05/07 08:53:33 mpi Exp $
 .\"
 .\" Copyright (c) 2002 Artur Grabowski <art@openbsd.org>
 .\" All rights reserved.
@@ -22,7 +22,7 @@
 .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd $Mdocdate: May 6 2015 $
+.Dd $Mdocdate: May 7 2015 $
 .Dt FILE 9
 .Os
 .Sh NAME
@@ -47,7 +47,7 @@
 .In sys/filedesc.h
 .In sys/vnode.h
 .Ft int
-.Fn getvnode "struct filedesc *fdp" "int fd" "struct file **fpp"
+.Fn getvnode "struct proc *p" "int fd" "struct file **fpp"
 .Sh DESCRIPTION
 These functions provide the interface for the UNIX file descriptors.
 File descriptors can be used to access vnodes (see
@@ -75,27 +75,20 @@ recommended to make complicated kernel APIs that require it.
 The files are extracted from the file descriptor table using the
 functions
 .Fn fd_getfile
-and
-.Fn getvnode .
 .Fn fd_getfile
 performs all necessary checks to see if the file descriptor number is
 within the range of file descriptor table, and if the descriptor is
 valid.
-.Fn getvnode
-is a special case that besides doing
-.Fn fd_getfile
-also checks if the descriptor is a vnode, returns the proper
-errno on error and increases the use count with
-.Fn FREF .
 .Pp
 The files are extracted from the process context using the
 function
-.Fn getsock .
 .Fn getsock
-is a special case that besides doing
+and
+.Fn getvnode .
+These functions are special cases that besides doing
 .Fn fd_getfile
-also checks if the descriptor is a socket, returns the proper
-errno on error and increases the use count with
+also check if the descriptor is a socket or a vnode respectively,
+return the proper errno on error and increase the use count with
 .Fn FREF .
 .Sh CONCURRENT ACCESS
 Since multiple processes can share the same file descriptor table,
index f960b77..be01c8a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: linux_misc.c,v 1.93 2015/05/02 14:43:06 jsg Exp $     */
+/*     $OpenBSD: linux_misc.c,v 1.94 2015/05/07 08:53:32 mpi Exp $     */
 /*     $NetBSD: linux_misc.c,v 1.27 1996/05/20 01:59:21 fvdl Exp $     */
 
 /*-
@@ -1187,7 +1187,7 @@ getdents_common(p, v, retval, is64bit)
        int error;
        int nbytes = SCARG(uap, count);
 
-       if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
+       if ((error = getvnode(p, SCARG(uap, fd), &fp)) != 0)
                return (error);
 
        if (nbytes == 1) {      /* emulating old, broken behaviour */
index 2b54b5c..6086384 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: diskmap.c,v 1.10 2015/03/14 03:38:46 jsg Exp $        */
+/*     $OpenBSD: diskmap.c,v 1.11 2015/05/07 08:53:33 mpi Exp $        */
 
 /*
  * Copyright (c) 2009, 2010 Joel Sing <jsing@openbsd.org>
@@ -78,12 +78,12 @@ diskmapioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p)
                        goto invalid;
 
        /* Attempt to open actual device. */
+       if ((error = getvnode(p, fd, &fp)) != 0)
+               goto invalid;
+
        fdp = p->p_fd;
        fdplock(fdp);
 
-       if ((error = getvnode(fdp, fd, &fp)) != 0)
-               goto bad;
-
        ndp.ni_segflg = UIO_SYSSPACE;
        ndp.ni_dirfd = AT_FDCWD;
        ndp.ni_dirp = devname;
index 81667ee..2934999 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: vfs_syscalls.c,v 1.219 2015/04/30 09:20:51 mpi Exp $  */
+/*     $OpenBSD: vfs_syscalls.c,v 1.220 2015/05/07 08:53:33 mpi Exp $  */
 /*     $NetBSD: vfs_syscalls.c,v 1.71 1996/04/23 10:29:02 mycroft Exp $        */
 
 /*
@@ -591,7 +591,7 @@ sys_fstatfs(struct proc *p, void *v, register_t *retval)
        struct statfs *sp;
        int error;
 
-       if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
+       if ((error = getvnode(p, SCARG(uap, fd), &fp)) != 0)
                return (error);
        mp = ((struct vnode *)fp->f_data)->v_mount;
        if (!mp) {
@@ -1883,7 +1883,7 @@ sys_fchflags(struct proc *p, void *v, register_t *retval)
        struct vnode *vp;
        int error;
 
-       if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
+       if ((error = getvnode(p, SCARG(uap, fd), &fp)) != 0)
                return (error);
        vp = fp->f_data;
        vref(vp);
@@ -1999,7 +1999,7 @@ sys_fchmod(struct proc *p, void *v, register_t *retval)
        if (SCARG(uap, mode) & ~(S_IFMT | ALLPERMS))
                return (EINVAL);
 
-       if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
+       if ((error = getvnode(p, SCARG(uap, fd), &fp)) != 0)
                return (error);
        vp = (struct vnode *)fp->f_data;
        vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
@@ -2161,7 +2161,7 @@ sys_fchown(struct proc *p, void *v, register_t *retval)
        uid_t uid = SCARG(uap, uid);
        gid_t gid = SCARG(uap, gid);
 
-       if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
+       if ((error = getvnode(p, SCARG(uap, fd), &fp)) != 0)
                return (error);
        vp = (struct vnode *)fp->f_data;
        vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
@@ -2376,7 +2376,7 @@ dofutimens(struct proc *p, int fd, struct timespec ts[2])
        struct vnode *vp;
        int error;
 
-       if ((error = getvnode(p->p_fd, fd, &fp)) != 0)
+       if ((error = getvnode(p, fd, &fp)) != 0)
                return (error);
        vp = (struct vnode *)fp->f_data;
        vref(vp);
@@ -2437,7 +2437,7 @@ sys_ftruncate(struct proc *p, void *v, register_t *retval)
        off_t len;
        int error;
 
-       if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
+       if ((error = getvnode(p, SCARG(uap, fd), &fp)) != 0)
                return (error);
        len = SCARG(uap, length);
        if ((fp->f_flag & FWRITE) == 0 || len < 0) {
@@ -2473,7 +2473,7 @@ sys_fsync(struct proc *p, void *v, register_t *retval)
        struct file *fp;
        int error;
 
-       if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
+       if ((error = getvnode(p, SCARG(uap, fd), &fp)) != 0)
                return (error);
        vp = (struct vnode *)fp->f_data;
        vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
@@ -2692,7 +2692,7 @@ sys_getdents(struct proc *p, void *v, register_t *retval)
 
        if (buflen > INT_MAX)
                return EINVAL;
-       if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
+       if ((error = getvnode(p, SCARG(uap, fd), &fp)) != 0)
                return (error);
        if ((fp->f_flag & FREAD) == 0) {
                error = EBADF;
@@ -2783,12 +2783,12 @@ out:
  * On return *fpp is FREF:ed.
  */
 int
-getvnode(struct filedesc *fdp, int fd, struct file **fpp)
+getvnode(struct proc *p, int fd, struct file **fpp)
 {
        struct file *fp;
        struct vnode *vp;
 
-       if ((fp = fd_getfile(fdp, fd)) == NULL)
+       if ((fp = fd_getfile(p->p_fd, fd)) == NULL)
                return (EBADF);
 
        if (fp->f_type != DTYPE_VNODE)
index ca3ee27..5d5f5c8 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: vnode.h,v 1.131 2015/05/01 01:30:58 millert Exp $     */
+/*     $OpenBSD: vnode.h,v 1.132 2015/05/07 08:53:33 mpi Exp $ */
 /*     $NetBSD: vnode.h,v 1.38 1996/02/29 20:59:05 cgd Exp $   */
 
 /*
@@ -654,7 +654,7 @@ void        vn_syncer_add_to_worklist(struct vnode *, int);
 /* misc */
 int    vn_isdisk(struct vnode *, int *);
 int    softdep_fsync(struct vnode *);
-int    getvnode(struct filedesc *, int, struct file **);
+int    getvnode(struct proc *, int, struct file **);
 
 /* uvm */
 void   uvm_vnp_setsize(struct vnode *, off_t);
index 9f4205c..bdb63e3 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: uvm_mmap.c,v 1.108 2015/03/30 21:08:40 miod Exp $     */
+/*     $OpenBSD: uvm_mmap.c,v 1.109 2015/05/07 08:53:33 mpi Exp $      */
 /*     $NetBSD: uvm_mmap.c,v 1.49 2001/02/18 21:19:08 chs Exp $        */
 
 /*
@@ -141,7 +141,7 @@ sys_mquery(struct proc *p, void *v, register_t *retval)
                flags |= UVM_FLAG_FIXED;
 
        if (fd >= 0) {
-               if ((error = getvnode(p->p_fd, fd, &fp)) != 0)
+               if ((error = getvnode(p, fd, &fp)) != 0)
                        return (error);
                uobj = &((struct vnode *)fp->f_data)->v_uvm->u_obj;
                uoff = SCARG(uap, pos);