Author: mjg
Date: Sat Jul 11 16:22:48 2015
New Revision: 285391
URL: https://svnweb.freebsd.org/changeset/base/285391

Log:
  Create a dedicated function for ensuring that cdir and rdir are populated.
  
  Previously several places were doing it on its own, partially
  incorrectly (e.g. without the filedesc locked) or even actively harmful
  by populating jdir or assigning rootvnode without vrefing it.
  
  Reviewed by:  kib

Modified:
  head/sys/cam/ctl/ctl_backend_block.c
  head/sys/cddl/compat/opensolaris/kern/opensolaris_kobj.c
  head/sys/cddl/compat/opensolaris/sys/vnode.h
  head/sys/compat/ndis/subr_ndis.c
  head/sys/dev/xen/blkback/blkback.c
  head/sys/kern/kern_descrip.c
  head/sys/kern/subr_firmware.c
  head/sys/sys/filedesc.h

Modified: head/sys/cam/ctl/ctl_backend_block.c
==============================================================================
--- head/sys/cam/ctl/ctl_backend_block.c        Sat Jul 11 16:19:11 2015        
(r285390)
+++ head/sys/cam/ctl/ctl_backend_block.c        Sat Jul 11 16:22:48 2015        
(r285391)
@@ -2123,18 +2123,7 @@ ctl_be_block_open(struct ctl_be_block_so
                return (1);
        }
 
-       if (!curthread->td_proc->p_fd->fd_cdir) {
-               curthread->td_proc->p_fd->fd_cdir = rootvnode;
-               VREF(rootvnode);
-       }
-       if (!curthread->td_proc->p_fd->fd_rdir) {
-               curthread->td_proc->p_fd->fd_rdir = rootvnode;
-               VREF(rootvnode);
-       }
-       if (!curthread->td_proc->p_fd->fd_jdir) {
-               curthread->td_proc->p_fd->fd_jdir = rootvnode;
-               VREF(rootvnode);
-       }
+       pwd_ensure_dirs();
 
  again:
        NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, be_lun->dev_path, curthread);

Modified: head/sys/cddl/compat/opensolaris/kern/opensolaris_kobj.c
==============================================================================
--- head/sys/cddl/compat/opensolaris/kern/opensolaris_kobj.c    Sat Jul 11 
16:19:11 2015        (r285390)
+++ head/sys/cddl/compat/opensolaris/kern/opensolaris_kobj.c    Sat Jul 11 
16:22:48 2015        (r285391)
@@ -67,21 +67,10 @@ static void *
 kobj_open_file_vnode(const char *file)
 {
        struct thread *td = curthread;
-       struct filedesc *fd;
        struct nameidata nd;
        int error, flags;
 
-       fd = td->td_proc->p_fd;
-       FILEDESC_XLOCK(fd);
-       if (fd->fd_rdir == NULL) {
-               fd->fd_rdir = rootvnode;
-               vref(fd->fd_rdir);
-       }
-       if (fd->fd_cdir == NULL) {
-               fd->fd_cdir = rootvnode;
-               vref(fd->fd_cdir);
-       }
-       FILEDESC_XUNLOCK(fd);
+       pwd_ensure_dirs();
 
        flags = FREAD | O_NOFOLLOW;
        NDINIT(&nd, LOOKUP, 0, UIO_SYSSPACE, file, td);

Modified: head/sys/cddl/compat/opensolaris/sys/vnode.h
==============================================================================
--- head/sys/cddl/compat/opensolaris/sys/vnode.h        Sat Jul 11 16:19:11 
2015        (r285390)
+++ head/sys/cddl/compat/opensolaris/sys/vnode.h        Sat Jul 11 16:22:48 
2015        (r285391)
@@ -162,7 +162,6 @@ vn_openat(char *pnamep, enum uio_seg seg
     int fd)
 {
        struct thread *td = curthread;
-       struct filedesc *fdc;
        struct nameidata nd;
        int error, operation;
 
@@ -179,17 +178,7 @@ vn_openat(char *pnamep, enum uio_seg seg
        }
        ASSERT(umask == 0);
 
-       fdc = td->td_proc->p_fd;
-       FILEDESC_XLOCK(fdc);
-       if (fdc->fd_rdir == NULL) {
-               fdc->fd_rdir = rootvnode;
-               vref(fdc->fd_rdir);
-       }
-       if (fdc->fd_cdir == NULL) {
-               fdc->fd_cdir = rootvnode;
-               vref(fdc->fd_rdir);
-       }
-       FILEDESC_XUNLOCK(fdc);
+       pwd_ensure_dirs();
 
        if (startvp != NULL)
                vref(startvp);

Modified: head/sys/compat/ndis/subr_ndis.c
==============================================================================
--- head/sys/compat/ndis/subr_ndis.c    Sat Jul 11 16:19:11 2015        
(r285390)
+++ head/sys/compat/ndis/subr_ndis.c    Sat Jul 11 16:22:48 2015        
(r285391)
@@ -2817,10 +2817,7 @@ NdisOpenFile(status, filehandle, filelen
 
        /* Some threads don't have a current working directory. */
 
-       if (td->td_proc->p_fd->fd_rdir == NULL)
-               td->td_proc->p_fd->fd_rdir = rootvnode;
-       if (td->td_proc->p_fd->fd_cdir == NULL)
-               td->td_proc->p_fd->fd_cdir = rootvnode;
+       pwd_ensure_dirs();
 
        NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, path, td);
 

Modified: head/sys/dev/xen/blkback/blkback.c
==============================================================================
--- head/sys/dev/xen/blkback/blkback.c  Sat Jul 11 16:19:11 2015        
(r285390)
+++ head/sys/dev/xen/blkback/blkback.c  Sat Jul 11 16:22:48 2015        
(r285391)
@@ -2692,18 +2692,7 @@ xbb_open_backend(struct xbb_softc *xbb)
        if ((xbb->flags & XBBF_READ_ONLY) == 0)
                flags |= FWRITE;
 
-       if (!curthread->td_proc->p_fd->fd_cdir) {
-               curthread->td_proc->p_fd->fd_cdir = rootvnode;
-               VREF(rootvnode);
-       }
-       if (!curthread->td_proc->p_fd->fd_rdir) {
-               curthread->td_proc->p_fd->fd_rdir = rootvnode;
-               VREF(rootvnode);
-       }
-       if (!curthread->td_proc->p_fd->fd_jdir) {
-               curthread->td_proc->p_fd->fd_jdir = rootvnode;
-               VREF(rootvnode);
-       }
+       pwd_ensure_dirs();
 
  again:
        NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, xbb->dev_name, curthread);

Modified: head/sys/kern/kern_descrip.c
==============================================================================
--- head/sys/kern/kern_descrip.c        Sat Jul 11 16:19:11 2015        
(r285390)
+++ head/sys/kern/kern_descrip.c        Sat Jul 11 16:22:48 2015        
(r285391)
@@ -68,6 +68,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/sbuf.h>
 #include <sys/signalvar.h>
 #include <sys/socketvar.h>
+#include <sys/kdb.h>
 #include <sys/stat.h>
 #include <sys/sx.h>
 #include <sys/syscallsubr.h>
@@ -308,6 +309,24 @@ fdfree(struct filedesc *fdp, int fd)
 #endif
 }
 
+void
+pwd_ensure_dirs(void)
+{
+       struct filedesc *fdp;
+
+       fdp = curproc->p_fd;
+       FILEDESC_XLOCK(fdp);
+       if (fdp->fd_cdir == NULL) {
+               fdp->fd_cdir = rootvnode;
+               VREF(rootvnode);
+       }
+       if (fdp->fd_rdir == NULL) {
+               fdp->fd_rdir = rootvnode;
+               VREF(rootvnode);
+       }
+       FILEDESC_XUNLOCK(fdp);
+}
+
 /*
  * System calls on descriptors.
  */

Modified: head/sys/kern/subr_firmware.c
==============================================================================
--- head/sys/kern/subr_firmware.c       Sat Jul 11 16:19:11 2015        
(r285390)
+++ head/sys/kern/subr_firmware.c       Sat Jul 11 16:22:48 2015        
(r285391)
@@ -383,19 +383,8 @@ firmware_put(const struct firmware *p, i
 static void
 set_rootvnode(void *arg, int npending)
 {
-       struct thread *td = curthread;
-       struct proc *p = td->td_proc;
 
-       FILEDESC_XLOCK(p->p_fd);
-       if (p->p_fd->fd_cdir == NULL) {
-               p->p_fd->fd_cdir = rootvnode;
-               VREF(rootvnode);
-       }
-       if (p->p_fd->fd_rdir == NULL) {
-               p->p_fd->fd_rdir = rootvnode;
-               VREF(rootvnode);
-       }
-       FILEDESC_XUNLOCK(p->p_fd);
+       pwd_ensure_dirs();
 
        free(arg, M_TEMP);
 }

Modified: head/sys/sys/filedesc.h
==============================================================================
--- head/sys/sys/filedesc.h     Sat Jul 11 16:19:11 2015        (r285390)
+++ head/sys/sys/filedesc.h     Sat Jul 11 16:22:48 2015        (r285391)
@@ -208,6 +208,7 @@ fd_modified(struct filedesc *fdp, int fd
 /* cdir/rdir/jdir manipulation functions. */
 void   pwd_chdir(struct thread *td, struct vnode *vp);
 int    pwd_chroot(struct thread *td, struct vnode *vp);
+void   pwd_ensure_dirs(void);
 
 #endif /* _KERNEL */
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to