From d1cd2c26a29e525cab70fc1a04fadf43d341be99 Mon Sep 17 00:00:00 2001 From: pooka Date: Mon, 13 Aug 2007 09:48:55 +0000 Subject: [PATCH] * don't call VOP_ACCESS in lookup, that's the file system's problem * be more careful with r/o fs to catch EEXIST in lookup CREATE * some comment polish --- sys/fs/puffs/puffs_vnops.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/sys/fs/puffs/puffs_vnops.c b/sys/fs/puffs/puffs_vnops.c index c135a40aa4af..8b863dfe2a5e 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.96 2007/08/12 19:44:15 pooka Exp $ */ +/* $NetBSD: puffs_vnops.c,v 1.97 2007/08/13 09:48:55 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.96 2007/08/12 19:44:15 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.97 2007/08/13 09:48:55 pooka Exp $"); #include #include @@ -429,16 +429,10 @@ puffs_lookup(void *v) dvp = ap->a_dvp; *ap->a_vpp = NULL; - /* first things first: check access */ - error = VOP_ACCESS(dvp, VEXEC, cnp->cn_cred, cnp->cn_lwp); - if (error) - return error; - - /* r/o fs? */ + /* r/o fs? we check create later to handle EEXIST */ if ((cnp->cn_flags & ISLASTCN) && (dvp->v_mount->mnt_flag & MNT_RDONLY) - && (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME || - cnp->cn_nameiop == CREATE)) + && (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME)) return EROFS; isdot = cnp->cn_namelen == 1 && *cnp->cn_nameptr == '.'; @@ -482,17 +476,25 @@ puffs_lookup(void *v) */ if (error) { if (error == ENOENT) { - if ((cnp->cn_flags & ISLASTCN) + /* don't allow to create files on r/o fs */ + if ((dvp->v_mount->mnt_flag & MNT_RDONLY) + && cnp->cn_nameiop == CREATE) { + error = EROFS; + + /* adjust values if we are creating */ + } else if ((cnp->cn_flags & ISLASTCN) && (cnp->cn_nameiop == CREATE || cnp->cn_nameiop == RENAME)) { cnp->cn_flags |= SAVENAME; error = EJUSTRETURN; + + /* save negative cache entry */ } else { if ((cnp->cn_flags & MAKEENTRY) && PUFFS_USE_NAMECACHE(pmp)) cache_enter(dvp, NULL, cnp); } - } else if (error < 0) { + } else if (error < 0 || error > ELAST) { error = EINVAL; } goto out; @@ -535,7 +537,7 @@ puffs_lookup(void *v) out: if (cnp->cn_flags & ISDOTDOT) vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY); - + DPRINTF(("puffs_lookup: returning %d %p\n", error, *ap->a_vpp)); return error; } @@ -1728,7 +1730,7 @@ puffs_write(void *v) round_page(uio->uio_offset), PGO_CLEANIT | PGO_SYNCIO); - /* write though page cache? */ + /* write through page cache? */ } else if (error == 0 && pmp->pmp_flags & PUFFS_KFLAG_WTCACHE) { simple_lock(&vp->v_interlock); error = VOP_PUTPAGES(vp, trunc_page(origoff),