From d410664985938a50989914c932d50e358e68e731 Mon Sep 17 00:00:00 2001 From: pooka Date: Sun, 1 Jul 2007 22:54:16 +0000 Subject: [PATCH] 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. --- sys/fs/puffs/puffs_msgif.h | 12 +++++---- sys/fs/puffs/puffs_subr.c | 15 +++++++---- sys/fs/puffs/puffs_sys.h | 6 +++-- sys/fs/puffs/puffs_vnops.c | 55 +++++++++++++++++++++----------------- 4 files changed, 52 insertions(+), 36 deletions(-) diff --git a/sys/fs/puffs/puffs_msgif.h b/sys/fs/puffs/puffs_msgif.h index 189c009c74d4..dedfa0539263 100644 --- a/sys/fs/puffs/puffs_msgif.h +++ b/sys/fs/puffs/puffs_msgif.h @@ -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 */ }; /* diff --git a/sys/fs/puffs/puffs_subr.c b/sys/fs/puffs/puffs_subr.c index f994a9cf512f..db606923d513 100644 --- a/sys/fs/puffs/puffs_subr.c +++ b/sys/fs/puffs/puffs_subr.c @@ -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 -__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 #include @@ -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); } diff --git a/sys/fs/puffs/puffs_sys.h b/sys/fs/puffs/puffs_sys.h index a66f3c96319c..4b64acec2955 100644 --- a/sys/fs/puffs/puffs_sys.h +++ b/sys/fs/puffs/puffs_sys.h @@ -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 *); diff --git a/sys/fs/puffs/puffs_vnops.c b/sys/fs/puffs/puffs_vnops.c index 9824d2be1a60..0911c67fc7d5 100644 --- a/sys/fs/puffs/puffs_vnops.c +++ b/sys/fs/puffs/puffs_vnops.c @@ -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 -__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 #include @@ -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