Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 11 Jul 2015 16:22:49 +0000 (UTC)
From:      Mateusz Guzik <mjg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r285391 - in head/sys: cam/ctl cddl/compat/opensolaris/kern cddl/compat/opensolaris/sys compat/ndis dev/xen/blkback kern sys
Message-ID:  <201507111622.t6BGMnfk073860@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 */
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201507111622.t6BGMnfk073860>