summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authordholland <dholland@NetBSD.org>2010-11-19 06:44:33 +0000
committerdholland <dholland@NetBSD.org>2010-11-19 06:44:33 +0000
commit8f6ed30d57969451cf6dee44963bdbfad19bea01 (patch)
tree4d7f4fee51c9f0d03aeb78a6de5fe56a3a096106 /sys/dev
parent0ce666ede04fa90ffe8633b9bd63f0454d2c09ff (diff)
Introduce struct pathbuf. This is an abstraction to hold a pathname
and the metadata required to interpret it. Callers of namei must now create a pathbuf and pass it to NDINIT (instead of a string and a uio_seg), then destroy the pathbuf after the namei session is complete. Update all namei call sites accordingly. Add a pathbuf(9) man page and update namei(9). The pathbuf interface also now appears in a couple of related additional places that were passing string/uio_seg pairs that were later fed into NDINIT. Update other call sites accordingly.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ccd.c14
-rw-r--r--sys/dev/cgd.c16
-rw-r--r--sys/dev/dksubr.c9
-rw-r--r--sys/dev/dkvar.h7
-rw-r--r--sys/dev/dm/dm_pdev.c13
-rw-r--r--sys/dev/firmload.c18
-rw-r--r--sys/dev/fss.c20
-rw-r--r--sys/dev/kloader.c15
-rw-r--r--sys/dev/raidframe/rf_copyback.c18
-rw-r--r--sys/dev/raidframe/rf_disks.c15
-rw-r--r--sys/dev/raidframe/rf_reconstruct.c14
-rw-r--r--sys/dev/vnd.c17
12 files changed, 134 insertions, 42 deletions
diff --git a/sys/dev/ccd.c b/sys/dev/ccd.c
index c3357d26268..245c676dd96 100644
--- a/sys/dev/ccd.c
+++ b/sys/dev/ccd.c
@@ -1,4 +1,4 @@
-/* $NetBSD: ccd.c,v 1.135 2010/11/14 03:49:52 uebayasi Exp $ */
+/* $NetBSD: ccd.c,v 1.136 2010/11/19 06:44:39 dholland Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 1999, 2007, 2009 The NetBSD Foundation, Inc.
@@ -127,7 +127,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ccd.c,v 1.135 2010/11/14 03:49:52 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ccd.c,v 1.136 2010/11/19 06:44:39 dholland Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -1070,6 +1070,7 @@ ccdioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
struct ccd_ioctl *ccio = (struct ccd_ioctl *)data;
kauth_cred_t uc;
char **cpp;
+ struct pathbuf *pb;
struct vnode **vpp;
#ifdef __HAVE_OLD_DISKLABEL
struct disklabel newlabel;
@@ -1171,8 +1172,13 @@ ccdioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
if (ccddebug & CCDB_INIT)
printf("ccdioctl: lookedup = %d\n", lookedup);
#endif
- if ((error = dk_lookup(cpp[i], l, &vpp[i],
- UIO_USERSPACE)) != 0) {
+ error = pathbuf_copyin(cpp[i], &pb);
+ if (error) {
+ goto out;
+ }
+ error = dk_lookup(pb, l, &vpp[i]);
+ pathbuf_destroy(pb);
+ if (error != 0) {
for (j = 0; j < lookedup; ++j)
(void)vn_close(vpp[j], FREAD|FWRITE,
uc);
diff --git a/sys/dev/cgd.c b/sys/dev/cgd.c
index 513d6b5f600..2f901607cbc 100644
--- a/sys/dev/cgd.c
+++ b/sys/dev/cgd.c
@@ -1,4 +1,4 @@
-/* $NetBSD: cgd.c,v 1.70 2010/02/11 18:24:48 joerg Exp $ */
+/* $NetBSD: cgd.c,v 1.71 2010/11/19 06:44:39 dholland Exp $ */
/*-
* Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cgd.c,v 1.70 2010/02/11 18:24:48 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cgd.c,v 1.71 2010/11/19 06:44:39 dholland Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -46,6 +46,7 @@ __KERNEL_RCSID(0, "$NetBSD: cgd.c,v 1.70 2010/02/11 18:24:48 joerg Exp $");
#include <sys/disk.h>
#include <sys/disklabel.h>
#include <sys/fcntl.h>
+#include <sys/namei.h> /* for pathbuf */
#include <sys/vnode.h>
#include <sys/conf.h>
#include <sys/syslog.h>
@@ -579,11 +580,20 @@ cgd_ioctl_set(struct cgd_softc *cs, void *data, struct lwp *l)
size_t i;
size_t keybytes; /* key length in bytes */
const char *cp;
+ struct pathbuf *pb;
char *inbuf;
cp = ci->ci_disk;
- if ((ret = dk_lookup(cp, l, &vp, UIO_USERSPACE)) != 0)
+
+ ret = pathbuf_copyin(ci->ci_disk, &pb);
+ if (ret != 0) {
+ return ret;
+ }
+ ret = dk_lookup(pb, l, &vp);
+ pathbuf_destroy(pb);
+ if (ret != 0) {
return ret;
+ }
inbuf = malloc(MAX_KEYSIZE, M_TEMP, M_WAITOK);
diff --git a/sys/dev/dksubr.c b/sys/dev/dksubr.c
index 6045d92e31e..d9630d0de10 100644
--- a/sys/dev/dksubr.c
+++ b/sys/dev/dksubr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: dksubr.c,v 1.41 2010/06/24 13:03:08 hannken Exp $ */
+/* $NetBSD: dksubr.c,v 1.42 2010/11/19 06:44:39 dholland Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 1999, 2002, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dksubr.c,v 1.41 2010/06/24 13:03:08 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dksubr.c,v 1.42 2010/11/19 06:44:39 dholland Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -619,8 +619,7 @@ dk_makedisklabel(struct dk_intf *di, struct dk_softc *dksc)
* set *vpp to the file's vnode.
*/
int
-dk_lookup(const char *path, struct lwp *l, struct vnode **vpp,
- enum uio_seg segflg)
+dk_lookup(struct pathbuf *pb, struct lwp *l, struct vnode **vpp)
{
struct nameidata nd;
struct vnode *vp;
@@ -630,7 +629,7 @@ dk_lookup(const char *path, struct lwp *l, struct vnode **vpp,
if (l == NULL)
return ESRCH; /* Is ESRCH the best choice? */
- NDINIT(&nd, LOOKUP, FOLLOW, segflg, path);
+ NDINIT(&nd, LOOKUP, FOLLOW, pb);
if ((error = vn_open(&nd, FREAD | FWRITE, 0)) != 0) {
DPRINTF((DKDB_FOLLOW|DKDB_INIT),
("dk_lookup: vn_open error = %d\n", error));
diff --git a/sys/dev/dkvar.h b/sys/dev/dkvar.h
index dcf89f50c99..e16a0abd201 100644
--- a/sys/dev/dkvar.h
+++ b/sys/dev/dkvar.h
@@ -1,4 +1,4 @@
-/* $NetBSD: dkvar.h,v 1.14 2009/08/07 00:07:39 dyoung Exp $ */
+/* $NetBSD: dkvar.h,v 1.15 2010/11/19 06:44:39 dholland Exp $ */
/*-
* Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -29,6 +29,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+struct pathbuf; /* from namei.h */
+
+
struct dk_geom {
u_int32_t pdg_secsize;
u_int32_t pdg_nsectors;
@@ -111,4 +114,4 @@ void dk_getdisklabel(struct dk_intf *, struct dk_softc *, dev_t);
void dk_getdefaultlabel(struct dk_intf *, struct dk_softc *,
struct disklabel *);
-int dk_lookup(const char *, struct lwp *, struct vnode **, enum uio_seg);
+int dk_lookup(struct pathbuf *, struct lwp *, struct vnode **);
diff --git a/sys/dev/dm/dm_pdev.c b/sys/dev/dm/dm_pdev.c
index 250624898f2..7f63a463691 100644
--- a/sys/dev/dm/dm_pdev.c
+++ b/sys/dev/dm/dm_pdev.c
@@ -1,4 +1,4 @@
-/* $NetBSD: dm_pdev.c,v 1.6 2010/01/04 00:19:08 haad Exp $ */
+/* $NetBSD: dm_pdev.c,v 1.7 2010/11/19 06:44:40 dholland Exp $ */
/*
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -84,6 +84,7 @@ SLIST_HEAD(dm_pdevs, dm_pdev) dm_pdev_list;
dm_pdev_t *
dm_pdev_insert(const char *dev_name)
{
+ struct pathbuf *dev_pb;
dm_pdev_t *dmp;
int error;
@@ -103,7 +104,15 @@ dm_pdev_insert(const char *dev_name)
if ((dmp = dm_pdev_alloc(dev_name)) == NULL)
return NULL;
- error = dk_lookup(dev_name, curlwp, &dmp->pdev_vnode, UIO_SYSSPACE);
+ dev_pb = pathbuf_create(dev_name);
+ if (dev_pb == NULL) {
+ aprint_debug("pathbuf_create on device: %s failed!\n",
+ dev_name);
+ kmem_free(dmp, sizeof(dm_pdev_t));
+ return NULL;
+ }
+ error = dk_lookup(dev_pb, curlwp, &dmp->pdev_vnode);
+ pathbuf_destroy(dev_pb);
if (error) {
aprint_debug("dk_lookup on device: %s failed with error %d!\n",
dev_name, error);
diff --git a/sys/dev/firmload.c b/sys/dev/firmload.c
index d94f4e551f2..e83dd19e213 100644
--- a/sys/dev/firmload.c
+++ b/sys/dev/firmload.c
@@ -1,4 +1,4 @@
-/* $NetBSD: firmload.c,v 1.14 2010/11/15 05:52:41 uebayasi Exp $ */
+/* $NetBSD: firmload.c,v 1.15 2010/11/19 06:44:39 dholland Exp $ */
/*-
* Copyright (c) 2005, 2006 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: firmload.c,v 1.14 2010/11/15 05:52:41 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: firmload.c,v 1.15 2010/11/19 06:44:39 dholland Exp $");
/*
* The firmload API provides an interface for device drivers to access
@@ -218,6 +218,7 @@ firmware_path_first(const char *drvname, const char *imgname, char *pnbuf,
int
firmware_open(const char *drvname, const char *imgname, firmware_handle_t *fhp)
{
+ struct pathbuf *pb;
struct nameidata nd;
struct vattr va;
char *pnbuf, *path, *prefix;
@@ -241,17 +242,26 @@ firmware_open(const char *drvname, const char *imgname, firmware_handle_t *fhp)
fh = firmware_handle_alloc();
KASSERT(fh != NULL);
+ pb = NULL;
error = 0;
for (path = firmware_path_first(drvname, imgname, pnbuf, &prefix);
path != NULL;
path = firmware_path_next(drvname, imgname, pnbuf, &prefix)) {
- NDINIT(&nd, LOOKUP, FOLLOW | NOCHROOT, UIO_SYSSPACE, path);
+ pb = pathbuf_create(path);
+ if (pb == NULL) {
+ error = ENOMEM;
+ break;
+ }
+ NDINIT(&nd, LOOKUP, FOLLOW | NOCHROOT, pb);
error = vn_open(&nd, FREAD, 0);
- if (error == ENOENT)
+ if (error == ENOENT) {
+ pathbuf_destroy(pb);
continue;
+ }
break;
}
+ pathbuf_destroy(pb);
PNBUF_PUT(pnbuf);
if (error) {
firmware_handle_free(fh);
diff --git a/sys/dev/fss.c b/sys/dev/fss.c
index 24bcd91c6d6..3d69fc88325 100644
--- a/sys/dev/fss.c
+++ b/sys/dev/fss.c
@@ -1,4 +1,4 @@
-/* $NetBSD: fss.c,v 1.70 2010/06/24 13:03:08 hannken Exp $ */
+/* $NetBSD: fss.c,v 1.71 2010/11/19 06:44:39 dholland Exp $ */
/*-
* Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fss.c,v 1.70 2010/06/24 13:03:08 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fss.c,v 1.71 2010/11/19 06:44:39 dholland Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -582,6 +582,7 @@ fss_create_files(struct fss_softc *sc, struct fss_set *fss,
struct timespec ts;
struct partinfo dpart;
/* nd -> nd2 to reduce mistakes while updating only some namei calls */
+ struct pathbuf *pb2;
struct nameidata nd2;
struct vnode *vp;
@@ -676,15 +677,24 @@ fss_create_files(struct fss_softc *sc, struct fss_set *fss,
* Get the backing store
*/
- NDINIT(&nd2, LOOKUP, FOLLOW, UIO_USERSPACE, fss->fss_bstore);
- if ((error = vn_open(&nd2, FREAD|FWRITE, 0)) != 0)
+ error = pathbuf_copyin(fss->fss_bstore, &pb2);
+ if (error) {
+ return error;
+ }
+ NDINIT(&nd2, LOOKUP, FOLLOW, pb2);
+ if ((error = vn_open(&nd2, FREAD|FWRITE, 0)) != 0) {
+ pathbuf_destroy(pb2);
return error;
+ }
VOP_UNLOCK(nd2.ni_vp);
sc->sc_bs_vp = nd2.ni_vp;
- if (nd2.ni_vp->v_type != VREG && nd2.ni_vp->v_type != VCHR)
+ if (nd2.ni_vp->v_type != VREG && nd2.ni_vp->v_type != VCHR) {
+ pathbuf_destroy(pb2);
return EINVAL;
+ }
+ pathbuf_destroy(pb2);
if (sc->sc_bs_vp->v_type == VREG) {
fsbsize = sc->sc_bs_vp->v_mount->mnt_stat.f_iosize;
diff --git a/sys/dev/kloader.c b/sys/dev/kloader.c
index 481bd2acf8f..86c8ed72a2f 100644
--- a/sys/dev/kloader.c
+++ b/sys/dev/kloader.c
@@ -1,4 +1,4 @@
-/* $NetBSD: kloader.c,v 1.23 2010/11/12 16:47:18 uebayasi Exp $ */
+/* $NetBSD: kloader.c,v 1.24 2010/11/19 06:44:39 dholland Exp $ */
/*-
* Copyright (c) 2001, 2002, 2004 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kloader.c,v 1.23 2010/11/12 16:47:18 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kloader.c,v 1.24 2010/11/19 06:44:39 dholland Exp $");
#include "debug_kloader.h"
@@ -585,14 +585,22 @@ kloader_load_segment(Elf_Phdr *p)
struct vnode *
kloader_open(const char *filename)
{
+ struct pathbuf *pb;
struct nameidata nid;
int error;
- NDINIT(&nid, LOOKUP, FOLLOW, UIO_SYSSPACE, filename);
+ pb = pathbuf_create(filename);
+ if (pb == NULL) {
+ PRINTF("%s: pathbuf_create failed\n", filename);
+ return (NULL);
+ }
+
+ NDINIT(&nid, LOOKUP, FOLLOW, pb);
error = namei(&nid);
if (error != 0) {
PRINTF("%s: namei failed, errno=%d\n", filename, error);
+ pathbuf_destroy(pb);
return (NULL);
}
@@ -602,6 +610,7 @@ kloader_open(const char *filename)
return (NULL);
}
+ pathbuf_destroy(pb);
return (nid.ni_vp);
}
diff --git a/sys/dev/raidframe/rf_copyback.c b/sys/dev/raidframe/rf_copyback.c
index c92615678d1..423d998772c 100644
--- a/sys/dev/raidframe/rf_copyback.c
+++ b/sys/dev/raidframe/rf_copyback.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_copyback.c,v 1.43 2010/11/01 02:35:25 mrg Exp $ */
+/* $NetBSD: rf_copyback.c,v 1.44 2010/11/19 06:44:40 dholland Exp $ */
/*
* Copyright (c) 1995 Carnegie-Mellon University.
* All rights reserved.
@@ -38,7 +38,7 @@
****************************************************************************/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_copyback.c,v 1.43 2010/11/01 02:35:25 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_copyback.c,v 1.44 2010/11/19 06:44:40 dholland Exp $");
#include <dev/raidframe/raidframevar.h>
@@ -81,6 +81,7 @@ rf_ConfigureCopyback(RF_ShutdownList_t **listp)
#include <sys/ioctl.h>
#include <sys/fcntl.h>
#include <sys/vnode.h>
+#include <sys/namei.h> /* for pathbuf */
/* do a complete copyback */
void
@@ -93,6 +94,7 @@ rf_CopybackReconstructedData(RF_Raid_t *raidPtr)
RF_RaidDisk_t *badDisk;
char *databuf;
+ struct pathbuf *dev_pb;
struct vnode *vp;
struct vattr va;
@@ -133,8 +135,16 @@ rf_CopybackReconstructedData(RF_Raid_t *raidPtr)
printf("About to (re-)open the device: %s\n",
raidPtr->Disks[fcol].devname);
- retcode = dk_lookup(raidPtr->Disks[fcol].devname, curlwp, &vp,
- UIO_SYSSPACE);
+ dev_pb = pathbuf_create(raidPtr->Disks[fcol].devname);
+ if (dev_pb == NULL) {
+ /* shouldn't happen unless maybe the system is OOMing */
+ printf("raid%d: copyback: pathbuf_create on device: %s failed: %d!\n",
+ raidPtr->raidid, raidPtr->Disks[fcol].devname,
+ ENOMEM);
+ return;
+ }
+ retcode = dk_lookup(dev_pb, curlwp, &vp);
+ pathbuf_destroy(dev_pb);
if (retcode) {
printf("raid%d: copyback: dk_lookup on device: %s failed: %d!\n",
diff --git a/sys/dev/raidframe/rf_disks.c b/sys/dev/raidframe/rf_disks.c
index 81a22b89b46..a659a5cf6de 100644
--- a/sys/dev/raidframe/rf_disks.c
+++ b/sys/dev/raidframe/rf_disks.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_disks.c,v 1.74 2010/11/01 02:35:25 mrg Exp $ */
+/* $NetBSD: rf_disks.c,v 1.75 2010/11/19 06:44:40 dholland Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -60,7 +60,7 @@
***************************************************************/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_disks.c,v 1.74 2010/11/01 02:35:25 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_disks.c,v 1.75 2010/11/19 06:44:40 dholland Exp $");
#include <dev/raidframe/raidframevar.h>
@@ -78,6 +78,7 @@ __KERNEL_RCSID(0, "$NetBSD: rf_disks.c,v 1.74 2010/11/01 02:35:25 mrg Exp $");
#include <sys/ioctl.h>
#include <sys/fcntl.h>
#include <sys/vnode.h>
+#include <sys/namei.h> /* for pathbuf */
#include <sys/kauth.h>
static int rf_AllocDiskStructures(RF_Raid_t *, RF_Config_t *);
@@ -569,6 +570,7 @@ rf_ConfigureDisk(RF_Raid_t *raidPtr, char *bf, RF_RaidDisk_t *diskPtr,
RF_RowCol_t col)
{
char *p;
+ struct pathbuf *pb;
struct vnode *vp;
struct vattr va;
int error;
@@ -593,7 +595,14 @@ rf_ConfigureDisk(RF_Raid_t *raidPtr, char *bf, RF_RaidDisk_t *diskPtr,
return (0);
}
- error = dk_lookup(diskPtr->devname, curlwp, &vp, UIO_SYSSPACE);
+ pb = pathbuf_create(diskPtr->devname);
+ if (pb == NULL) {
+ printf("pathbuf_create for device: %s failed!\n",
+ diskPtr->devname);
+ return ENOMEM;
+ }
+ error = dk_lookup(pb, curlwp, &vp);
+ pathbuf_destroy(pb);
if (error) {
printf("dk_lookup on device: %s failed!\n", diskPtr->devname);
if (error == ENXIO) {
diff --git a/sys/dev/raidframe/rf_reconstruct.c b/sys/dev/raidframe/rf_reconstruct.c
index 2a1282ce1ee..d6276dc5e06 100644
--- a/sys/dev/raidframe/rf_reconstruct.c
+++ b/sys/dev/raidframe/rf_reconstruct.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_reconstruct.c,v 1.109 2010/11/01 02:35:25 mrg Exp $ */
+/* $NetBSD: rf_reconstruct.c,v 1.110 2010/11/19 06:44:40 dholland Exp $ */
/*
* Copyright (c) 1995 Carnegie-Mellon University.
* All rights reserved.
@@ -33,7 +33,7 @@
************************************************************/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_reconstruct.c,v 1.109 2010/11/01 02:35:25 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_reconstruct.c,v 1.110 2010/11/19 06:44:40 dholland Exp $");
#include <sys/param.h>
#include <sys/time.h>
@@ -44,6 +44,7 @@ __KERNEL_RCSID(0, "$NetBSD: rf_reconstruct.c,v 1.109 2010/11/01 02:35:25 mrg Exp
#include <sys/ioctl.h>
#include <sys/fcntl.h>
#include <sys/vnode.h>
+#include <sys/namei.h> /* for pathbuf */
#include <dev/raidframe/raidframevar.h>
#include "rf_raid.h"
@@ -348,6 +349,7 @@ rf_ReconstructInPlace(RF_Raid_t *raidPtr, RF_RowCol_t col)
RF_ComponentLabel_t *c_label;
int numDisksDone = 0, rc;
struct partinfo dpart;
+ struct pathbuf *pb;
struct vnode *vp;
struct vattr va;
int retcode;
@@ -428,7 +430,13 @@ rf_ReconstructInPlace(RF_Raid_t *raidPtr, RF_RowCol_t col)
raidPtr->Disks[col].devname);
#endif
RF_UNLOCK_MUTEX(raidPtr->mutex);
- retcode = dk_lookup(raidPtr->Disks[col].devname, curlwp, &vp, UIO_SYSSPACE);
+ pb = pathbuf_create(raidPtr->Disks[col].devname);
+ if (pb == NULL) {
+ retcode = ENOMEM;
+ } else {
+ retcode = dk_lookup(pb, curlwp, &vp);
+ pathbuf_destroy(pb);
+ }
if (retcode) {
printf("raid%d: rebuilding: dk_lookup on device: %s failed: %d!\n",raidPtr->raidid,
diff --git a/sys/dev/vnd.c b/sys/dev/vnd.c
index b97d6296b6b..12463141197 100644
--- a/sys/dev/vnd.c
+++ b/sys/dev/vnd.c
@@ -1,4 +1,4 @@
-/* $NetBSD: vnd.c,v 1.213 2010/09/19 09:41:37 mrg Exp $ */
+/* $NetBSD: vnd.c,v 1.214 2010/11/19 06:44:39 dholland Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2008 The NetBSD Foundation, Inc.
@@ -130,7 +130,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vnd.c,v 1.213 2010/09/19 09:41:37 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vnd.c,v 1.214 2010/11/19 06:44:39 dholland Exp $");
#if defined(_KERNEL_OPT)
#include "opt_vnd.h"
@@ -1015,6 +1015,7 @@ vndioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
struct vnd_softc *vnd;
struct vnd_ioctl *vio;
struct vattr vattr;
+ struct pathbuf *pb;
struct nameidata nd;
int error, part, pmask;
size_t geomsize;
@@ -1100,9 +1101,15 @@ vndioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
fflags = FREAD;
if ((vio->vnd_flags & VNDIOF_READONLY) == 0)
fflags |= FWRITE;
- NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, vio->vnd_file);
- if ((error = vn_open(&nd, fflags, 0)) != 0)
+ error = pathbuf_copyin(vio->vnd_file, &pb);
+ if (error) {
+ goto unlock_and_exit;
+ }
+ NDINIT(&nd, LOOKUP, FOLLOW, pb);
+ if ((error = vn_open(&nd, fflags, 0)) != 0) {
+ pathbuf_destroy(pb);
goto unlock_and_exit;
+ }
KASSERT(l);
error = VOP_GETATTR(nd.ni_vp, &vattr, l->l_cred);
if (!error && nd.ni_vp->v_type != VREG)
@@ -1332,10 +1339,12 @@ vndioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
vndunlock(vnd);
+ pathbuf_destroy(pb);
break;
close_and_exit:
(void) vn_close(nd.ni_vp, fflags, l->l_cred);
+ pathbuf_destroy(pb);
unlock_and_exit:
#ifdef VND_COMPRESSION
/* free any allocated memory (for compressed file) */