svn commit: r285391 - in head/sys: cam/ctl cddl/compat/opensolaris/kern cddl/compat/opensolaris/sys compat/ndis dev/xen/blkback kern sys
Mateusz Guzik
mjg at FreeBSD.org
Sat Jul 11 16:22:53 UTC 2015
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 */
More information about the svn-src-all
mailing list