Give the file server to ability to request the entire pathname buffer

under lookup by using PUFFS_KFLAG_LOOKUP_FULLPNBUF instead just the
current component.
This commit is contained in:
pooka 2007-07-01 22:54:16 +00:00
parent f50072a162
commit d410664985
4 changed files with 52 additions and 36 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: puffs_msgif.h,v 1.37 2007/07/01 17:22:13 pooka Exp $ */
/* $NetBSD: puffs_msgif.h,v 1.38 2007/07/01 22:54:16 pooka Exp $ */
/*
* Copyright (c) 2005, 2006 Antti Kantee. All Rights Reserved.
@ -83,7 +83,7 @@ enum {
#define PUFFS_VN_MAX PUFFS_VN_SETEXTATTR
#define PUFFSDEVELVERS 0x80000000
#define PUFFSVERSION 12
#define PUFFSVERSION 13
#define PUFFSNAMESIZE 32
struct puffs_kargs {
unsigned int pa_vers;
@ -112,7 +112,8 @@ struct puffs_kargs {
#define PUFFS_KFLAG_ALLOPS 0x04 /* ignore pa_vnopmask */
#define PUFFS_KFLAG_WTCACHE 0x08 /* write-through page cache */
#define PUFFS_KFLAG_IAONDEMAND 0x10 /* inactive only on demand */
#define PUFFS_KFLAG_MASK 0x1f
#define PUFFS_KFLAG_LOOKUP_FULLPNBUF 0x20 /* full pnbuf in lookup */
#define PUFFS_KFLAG_MASK 0x2f
#define PUFFS_FHFLAG_DYNAMIC 0x01
#define PUFFS_FHFLAG_NFSV2 0x02
@ -341,8 +342,9 @@ struct puffs_kcn {
u_long pkcn_nameiop; /* namei operation */
u_long pkcn_flags; /* flags */
char pkcn_name[MAXPATHLEN+1]; /* nul-terminated path component */
long pkcn_namelen;
char pkcn_name[MAXPATHLEN]; /* nulterminated path component */
long pkcn_namelen; /* current component length */
long pkcn_consume; /* IN: extra chars server ate */
};
/*

View File

@ -1,4 +1,4 @@
/* $NetBSD: puffs_subr.c,v 1.37 2007/07/01 17:22:14 pooka Exp $ */
/* $NetBSD: puffs_subr.c,v 1.38 2007/07/01 22:54:16 pooka Exp $ */
/*
* Copyright (c) 2005, 2006 Antti Kantee. All Rights Reserved.
@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: puffs_subr.c,v 1.37 2007/07/01 17:22:14 pooka Exp $");
__KERNEL_RCSID(0, "$NetBSD: puffs_subr.c,v 1.38 2007/07/01 22:54:16 pooka Exp $");
#include <sys/param.h>
#include <sys/conf.h>
@ -442,16 +442,21 @@ puffs_pnode2vnode(struct puffs_mount *pmp, void *cookie, int lock,
void
puffs_makecn(struct puffs_kcn *pkcn, struct puffs_kcred *pkcr,
struct puffs_kcid *pkcid, const struct componentname *cn)
struct puffs_kcid *pkcid, const struct componentname *cn, int full)
{
pkcn->pkcn_nameiop = cn->cn_nameiop;
pkcn->pkcn_flags = cn->cn_flags;
puffs_cidcvt(pkcid, cn->cn_lwp);
(void)memcpy(pkcn->pkcn_name, cn->cn_nameptr, cn->cn_namelen);
pkcn->pkcn_name[cn->cn_namelen] = '\0';
if (full) {
(void)strcpy(pkcn->pkcn_name, cn->cn_nameptr);
} else {
(void)memcpy(pkcn->pkcn_name, cn->cn_nameptr, cn->cn_namelen);
pkcn->pkcn_name[cn->cn_namelen] = '\0';
}
pkcn->pkcn_namelen = cn->cn_namelen;
pkcn->pkcn_consume = 0;
puffs_credcvt(pkcr, cn->cn_cred);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: puffs_sys.h,v 1.44 2007/07/01 17:22:15 pooka Exp $ */
/* $NetBSD: puffs_sys.h,v 1.45 2007/07/01 22:54:16 pooka Exp $ */
/*
* Copyright (c) 2005, 2006 Antti Kantee. All Rights Reserved.
@ -113,6 +113,8 @@ extern int puffsdebug; /* puffs_subr.c */
(((pmp)->pmp_flags & PUFFS_KFLAG_NOCACHE_NAME) == 0)
#define PUFFS_USE_PAGECACHE(pmp) \
(((pmp)->pmp_flags & PUFFS_KFLAG_NOCACHE_PAGE) == 0)
#define PUFFS_USE_FULLPNBUF(pmp) \
((pmp)->pmp_flags & PUFFS_KFLAG_LOOKUP_FULLPNBUF)
#define PUFFS_WCACHEINFO(pmp) 0
@ -232,7 +234,7 @@ void puffs_referencenode(struct puffs_node *);
int puffs_pnode2vnode(struct puffs_mount *, void *, int, struct vnode **);
void puffs_makecn(struct puffs_kcn *, struct puffs_kcred *,
struct puffs_kcid *, const struct componentname *);
struct puffs_kcid *, const struct componentname *, int);
void puffs_credcvt(struct puffs_kcred *, kauth_cred_t);
void puffs_cidcvt(struct puffs_kcid *, const struct lwp *);

View File

@ -1,4 +1,4 @@
/* $NetBSD: puffs_vnops.c,v 1.82 2007/07/01 17:22:18 pooka Exp $ */
/* $NetBSD: puffs_vnops.c,v 1.83 2007/07/01 22:54:16 pooka Exp $ */
/*
* Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved.
@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.82 2007/07/01 17:22:18 pooka Exp $");
__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.83 2007/07/01 22:54:16 pooka Exp $");
#include <sys/param.h>
#include <sys/fstrans.h>
@ -455,7 +455,7 @@ puffs_lookup(void *v)
}
puffs_makecn(&lookup_arg.pvnr_cn, &lookup_arg.pvnr_cn_cred,
&lookup_arg.pvnr_cn_cid, cnp);
&lookup_arg.pvnr_cn_cid, cnp, PUFFS_USE_FULLPNBUF(pmp));
if (cnp->cn_flags & ISDOTDOT)
VOP_UNLOCK(dvp, 0);
@ -534,17 +534,19 @@ puffs_create(void *v)
struct componentname *a_cnp;
struct vattr *a_vap;
} */ *ap = v;
struct puffs_mount *pmp = MPTOPUFFSMP(ap->a_dvp->v_mount);
int error;
PUFFS_VNREQ(create);
DPRINTF(("puffs_create: dvp %p, cnp: %s\n",
ap->a_dvp, ap->a_cnp->cn_nameptr));
puffs_makecn(&create_arg.pvnr_cn, &create_arg.pvnr_cn_cred,
&create_arg.pvnr_cn_cid, ap->a_cnp);
&create_arg.pvnr_cn_cid, ap->a_cnp, PUFFS_USE_FULLPNBUF(pmp));
create_arg.pvnr_va = *ap->a_vap;
error = puffs_vntouser(MPTOPUFFSMP(ap->a_dvp->v_mount), PUFFS_VN_CREATE,
error = puffs_vntouser(pmp, PUFFS_VN_CREATE,
&create_arg, sizeof(create_arg), 0, ap->a_dvp, NULL);
if (error)
goto out;
@ -572,15 +574,16 @@ puffs_mknod(void *v)
struct componentname *a_cnp;
struct vattr *a_vap;
} */ *ap = v;
struct puffs_mount *pmp = MPTOPUFFSMP(ap->a_dvp->v_mount);
int error;
PUFFS_VNREQ(mknod);
puffs_makecn(&mknod_arg.pvnr_cn, &mknod_arg.pvnr_cn_cred,
&mknod_arg.pvnr_cn_cid, ap->a_cnp);
&mknod_arg.pvnr_cn_cid, ap->a_cnp, PUFFS_USE_FULLPNBUF(pmp));
mknod_arg.pvnr_va = *ap->a_vap;
error = puffs_vntouser(MPTOPUFFSMP(ap->a_dvp->v_mount), PUFFS_VN_MKNOD,
error = puffs_vntouser(pmp, PUFFS_VN_MKNOD,
&mknod_arg, sizeof(mknod_arg), 0, ap->a_dvp, NULL);
if (error)
goto out;
@ -1200,15 +1203,16 @@ puffs_remove(void *v)
struct vnode *a_vp;
struct componentname *a_cnp;
} */ *ap = v;
struct puffs_mount *pmp = MPTOPUFFSMP(ap->a_dvp->v_mount);
int error;
PUFFS_VNREQ(remove);
remove_arg.pvnr_cookie_targ = VPTOPNC(ap->a_vp);
puffs_makecn(&remove_arg.pvnr_cn, &remove_arg.pvnr_cn_cred,
&remove_arg.pvnr_cn_cid, ap->a_cnp);
&remove_arg.pvnr_cn_cid, ap->a_cnp, PUFFS_USE_FULLPNBUF(pmp));
error = puffs_vntouser(MPTOPUFFSMP(ap->a_vp->v_mount), PUFFS_VN_REMOVE,
error = puffs_vntouser(pmp, PUFFS_VN_REMOVE,
&remove_arg, sizeof(remove_arg), 0, ap->a_dvp, ap->a_vp);
vput(ap->a_vp);
@ -1230,15 +1234,16 @@ puffs_mkdir(void *v)
struct componentname *a_cnp;
struct vattr *a_vap;
} */ *ap = v;
struct puffs_mount *pmp = MPTOPUFFSMP(ap->a_dvp->v_mount);
int error;
PUFFS_VNREQ(mkdir);
puffs_makecn(&mkdir_arg.pvnr_cn, &mkdir_arg.pvnr_cn_cred,
&mkdir_arg.pvnr_cn_cid, ap->a_cnp);
&mkdir_arg.pvnr_cn_cid, ap->a_cnp, PUFFS_USE_FULLPNBUF(pmp));
mkdir_arg.pvnr_va = *ap->a_vap;
error = puffs_vntouser(MPTOPUFFSMP(ap->a_dvp->v_mount), PUFFS_VN_MKDIR,
error = puffs_vntouser(pmp, PUFFS_VN_MKDIR,
&mkdir_arg, sizeof(mkdir_arg), 0, ap->a_dvp, NULL);
if (error)
goto out;
@ -1262,15 +1267,16 @@ puffs_rmdir(void *v)
struct vnode *a_vp;
struct componentname *a_cnp;
} */ *ap = v;
struct puffs_mount *pmp = MPTOPUFFSMP(ap->a_dvp->v_mount);
int error;
PUFFS_VNREQ(rmdir);
rmdir_arg.pvnr_cookie_targ = VPTOPNC(ap->a_vp);
puffs_makecn(&rmdir_arg.pvnr_cn, &rmdir_arg.pvnr_cn_cred,
&rmdir_arg.pvnr_cn_cid, ap->a_cnp);
&rmdir_arg.pvnr_cn_cid, ap->a_cnp, PUFFS_USE_FULLPNBUF(pmp));
error = puffs_vntouser(MPTOPUFFSMP(ap->a_dvp->v_mount), PUFFS_VN_RMDIR,
error = puffs_vntouser(pmp, PUFFS_VN_RMDIR,
&rmdir_arg, sizeof(rmdir_arg), 0, ap->a_dvp, ap->a_vp);
/* XXX: some call cache_purge() *for both vnodes* here, investigate */
@ -1290,15 +1296,16 @@ puffs_link(void *v)
struct vnode *a_vp;
struct componentname *a_cnp;
} */ *ap = v;
struct puffs_mount *pmp = MPTOPUFFSMP(ap->a_dvp->v_mount);
int error;
PUFFS_VNREQ(link);
link_arg.pvnr_cookie_targ = VPTOPNC(ap->a_vp);
puffs_makecn(&link_arg.pvnr_cn, &link_arg.pvnr_cn_cred,
&link_arg.pvnr_cn_cid, ap->a_cnp);
&link_arg.pvnr_cn_cid, ap->a_cnp, PUFFS_USE_FULLPNBUF(pmp));
error = puffs_vntouser(MPTOPUFFSMP(ap->a_dvp->v_mount), PUFFS_VN_LINK,
error = puffs_vntouser(pmp, PUFFS_VN_LINK,
&link_arg, sizeof(link_arg), 0, ap->a_dvp, ap->a_vp);
/*
@ -1324,6 +1331,7 @@ puffs_symlink(void *v)
struct vattr *a_vap;
char *a_target;
} */ *ap = v;
struct puffs_mount *pmp = MPTOPUFFSMP(ap->a_dvp->v_mount);
struct puffs_vnreq_symlink *symlink_argp;
int error;
@ -1332,14 +1340,13 @@ puffs_symlink(void *v)
symlink_argp = malloc(sizeof(struct puffs_vnreq_symlink),
M_PUFFS, M_ZERO | M_WAITOK);
puffs_makecn(&symlink_argp->pvnr_cn, &symlink_argp->pvnr_cn_cred,
&symlink_argp->pvnr_cn_cid, ap->a_cnp);
&symlink_argp->pvnr_cn_cid, ap->a_cnp, PUFFS_USE_FULLPNBUF(pmp));
symlink_argp->pvnr_va = *ap->a_vap;
(void)strlcpy(symlink_argp->pvnr_link, ap->a_target,
sizeof(symlink_argp->pvnr_link));
error = puffs_vntouser(MPTOPUFFSMP(ap->a_dvp->v_mount),
PUFFS_VN_SYMLINK, symlink_argp, sizeof(*symlink_argp), 0,
ap->a_dvp, NULL);
error = puffs_vntouser(pmp, PUFFS_VN_SYMLINK,
symlink_argp, sizeof(*symlink_argp), 0, ap->a_dvp, NULL);
if (error)
goto out;
@ -1400,6 +1407,7 @@ puffs_rename(void *v)
struct componentname *a_tcnp;
} */ *ap = v;
struct puffs_vnreq_rename *rename_argp = NULL;
struct puffs_mount *pmp = MPTOPUFFSMP(ap->a_fdvp->v_mount);
int error;
if (ap->a_fvp->v_mount != ap->a_tdvp->v_mount)
@ -1416,14 +1424,13 @@ puffs_rename(void *v)
rename_argp->pvnr_cookie_targ = NULL;
puffs_makecn(&rename_argp->pvnr_cn_src,
&rename_argp->pvnr_cn_src_cred, &rename_argp->pvnr_cn_src_cid,
ap->a_fcnp);
ap->a_fcnp, PUFFS_USE_FULLPNBUF(pmp));
puffs_makecn(&rename_argp->pvnr_cn_targ,
&rename_argp->pvnr_cn_targ_cred, &rename_argp->pvnr_cn_targ_cid,
ap->a_tcnp);
ap->a_tcnp, PUFFS_USE_FULLPNBUF(pmp));
error = puffs_vntouser(MPTOPUFFSMP(ap->a_fdvp->v_mount),
PUFFS_VN_RENAME, rename_argp, sizeof(*rename_argp), 0,
ap->a_fdvp, NULL); /* XXX */
error = puffs_vntouser(pmp, PUFFS_VN_RENAME,
rename_argp, sizeof(*rename_argp), 0, ap->a_fdvp, NULL); /* XXX */
/*
* XXX: stay in touch with the cache. I don't like this, but