* in readdir, don't copy extra memory back and forth to userspace

* consistent usage of the variable argsize with the rest of the module
This commit is contained in:
pooka 2007-04-20 11:56:35 +00:00
parent 07ba7a7d5f
commit ac5f1b1b78
1 changed files with 8 additions and 8 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: puffs_vnops.c,v 1.60 2007/04/20 11:36:25 pooka Exp $ */ /* $NetBSD: puffs_vnops.c,v 1.61 2007/04/20 11:56:35 pooka Exp $ */
/* /*
* Copyright (c) 2005, 2006 Antti Kantee. All Rights Reserved. * Copyright (c) 2005, 2006 Antti Kantee. All Rights Reserved.
@ -33,7 +33,7 @@
*/ */
#include <sys/cdefs.h> #include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.60 2007/04/20 11:36:25 pooka Exp $"); __KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.61 2007/04/20 11:56:35 pooka Exp $");
#include <sys/param.h> #include <sys/param.h>
#include <sys/fstrans.h> #include <sys/fstrans.h>
@ -887,7 +887,7 @@ puffs_readdir(void *v)
} */ *ap = v; } */ *ap = v;
struct puffs_mount *pmp = MPTOPUFFSMP(ap->a_vp->v_mount); struct puffs_mount *pmp = MPTOPUFFSMP(ap->a_vp->v_mount);
struct puffs_vnreq_readdir *readdir_argp; struct puffs_vnreq_readdir *readdir_argp;
size_t argsize, cookiemem, cookiesmax; size_t argsize, tomove, cookiemem, cookiesmax;
struct uio *uio = ap->a_uio; struct uio *uio = ap->a_uio;
size_t howmuch; size_t howmuch;
int error; int error;
@ -903,9 +903,9 @@ puffs_readdir(void *v)
cookiemem = 0; cookiemem = 0;
} }
argsize = sizeof(struct puffs_vnreq_readdir) argsize = sizeof(struct puffs_vnreq_readdir);
+ uio->uio_resid + cookiemem; tomove = uio->uio_resid + cookiemem;
readdir_argp = malloc(argsize, M_PUFFS, M_ZERO | M_WAITOK); readdir_argp = malloc(argsize + tomove, M_PUFFS, M_ZERO | M_WAITOK);
puffs_credcvt(&readdir_argp->pvnr_cred, ap->a_cred); puffs_credcvt(&readdir_argp->pvnr_cred, ap->a_cred);
readdir_argp->pvnr_offset = uio->uio_offset; readdir_argp->pvnr_offset = uio->uio_offset;
@ -915,8 +915,8 @@ puffs_readdir(void *v)
readdir_argp->pvnr_dentoff = cookiemem; readdir_argp->pvnr_dentoff = cookiemem;
error = puffs_vntouser(MPTOPUFFSMP(ap->a_vp->v_mount), error = puffs_vntouser(MPTOPUFFSMP(ap->a_vp->v_mount),
PUFFS_VN_READDIR, readdir_argp, argsize, PUFFS_VN_READDIR, readdir_argp, argsize, tomove,
uio->uio_resid + cookiemem, VPTOPNC(ap->a_vp), ap->a_vp, NULL); VPTOPNC(ap->a_vp), ap->a_vp, NULL);
if (error) if (error)
goto out; goto out;