diff options
| author | dholland <dholland@NetBSD.org> | 2010-11-19 06:44:33 +0000 |
|---|---|---|
| committer | dholland <dholland@NetBSD.org> | 2010-11-19 06:44:33 +0000 |
| commit | 8f6ed30d57969451cf6dee44963bdbfad19bea01 (patch) | |
| tree | 4d7f4fee51c9f0d03aeb78a6de5fe56a3a096106 /sys/dev | |
| parent | 0ce666ede04fa90ffe8633b9bd63f0454d2c09ff (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.c | 14 | ||||
| -rw-r--r-- | sys/dev/cgd.c | 16 | ||||
| -rw-r--r-- | sys/dev/dksubr.c | 9 | ||||
| -rw-r--r-- | sys/dev/dkvar.h | 7 | ||||
| -rw-r--r-- | sys/dev/dm/dm_pdev.c | 13 | ||||
| -rw-r--r-- | sys/dev/firmload.c | 18 | ||||
| -rw-r--r-- | sys/dev/fss.c | 20 | ||||
| -rw-r--r-- | sys/dev/kloader.c | 15 | ||||
| -rw-r--r-- | sys/dev/raidframe/rf_copyback.c | 18 | ||||
| -rw-r--r-- | sys/dev/raidframe/rf_disks.c | 15 | ||||
| -rw-r--r-- | sys/dev/raidframe/rf_reconstruct.c | 14 | ||||
| -rw-r--r-- | sys/dev/vnd.c | 17 |
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) */ |
