Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 30 Sep 2009 19:58:48 GMT
From:      Gleb Kurtsou <gk@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 169063 for review
Message-ID:  <200909301958.n8UJwmXo070759@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=169063

Change 169063 by gk@gk_h1 on 2009/09/30 19:58:05

	fix VOP_LOOKUP(CREATE) and VOP_WRITE() for unencrypted files
	
	do not allocate v_object for files without key (bypass as nullfs)
	allow writing to files without key
	try too lookup unencrypted file on VOP_LOOKUP(CREATE) first
	do "encrypted" lookup on EJUSTRETURN

Affected files ...

.. //depot/projects/soc2009/gk_pefs/sys/fs/pefs/pefs_vnops.c#18 edit
.. //depot/projects/soc2009/gk_pefs/sys/modules/Makefile#3 edit

Differences ...

==== //depot/projects/soc2009/gk_pefs/sys/fs/pefs/pefs_vnops.c#18 (text+ko) ====

@@ -153,10 +153,10 @@
 	MPASS(pec != NULL && cnp != NULL);
 
 	if (encname_len >= MAXPATHLEN)
-		panic("invalid encrypted name length: %d", encname_len);
+		panic("pefs_enccn_set: invalid encrypted name length: %d", encname_len);
 
 	pefs_enccn_alloc(pec, cnp);
-	if (ptk) {
+	if (ptk != NULL && ptk->ptk_key != NULL) {
 		pec->pec_tkey = *ptk;
 	} else {
 		pec->pec_tkey.ptk_key = NULL;
@@ -270,6 +270,7 @@
 	eofflag = 0;
 	error = 0;
 	de = NULL;
+	ptk.ptk_key = NULL;
 	dpn_key = pefs_node_key(dpn);
 	while (!eofflag) {
 		uio = pefs_chunk_uio(&pc, offset, UIO_READ);
@@ -307,7 +308,7 @@
 	struct pefs_node *pn = VP_TO_PN(vp);
 	int error;
 
-	if (!(pn->pn_flags & PN_HASKEY)) {
+	if ((pn->pn_flags & PN_HASKEY) == 0) {
 		pefs_enccn_set(pec, NULL, cnp->cn_nameptr, cnp->cn_namelen,
 		    cnp);
 		return (0);
@@ -572,10 +573,11 @@
 	nokey_lookup = 0;
 	skip_lookup = (flags & ISDOTDOT) ||
 	    pefs_name_skip(cnp->cn_nameptr, cnp->cn_namelen);
-	if (((dpn->pn_flags & PN_HASKEY) == 0 || skip_lookup) &&
-	    !((flags & ISLASTCN) && cnp->cn_nameiop == CREATE)) {
+	if (((dpn->pn_flags & PN_HASKEY) == 0 || skip_lookup)) {
 		error = VOP_LOOKUP(ldvp, &lvp, cnp);
-		if (skip_lookup || error == 0 || error == EJUSTRETURN ||
+		if (skip_lookup || error == 0 ||
+		    (error == EJUSTRETURN &&
+		    !((flags & ISLASTCN) && cnp->cn_nameiop == CREATE)) ||
 		    pefs_no_keys(dvp))
 			nokey_lookup = 1;
 	}
@@ -670,13 +672,15 @@
 	struct pefs_node *pn = VP_TO_PN(vp);
 	int error;
 
-	if (!(pn->pn_flags & PN_HASKEY) &&
-	    (ap->a_mode & (FWRITE | O_APPEND)))
+	if (pefs_no_keys(vp) && (ap->a_mode & (FWRITE | O_APPEND)))
 		return (EROFS);
 
 	error = pefs_bypass(&ap->a_gen, NULL);
 	if (error == 0) {
-		vnode_create_vobject(vp, 0, ap->a_td);
+		if ((pn->pn_flags & PN_HASKEY) == 0)
+			vp->v_object = PEFS_LOWERVP(vp)->v_object;
+		else
+			vnode_create_vobject(vp, 0, ap->a_td);
 	}
 	return (error);
 }
@@ -696,6 +700,7 @@
 	int error;
 
 	MPASS(vp->v_type == VREG);
+	MPASS(pn->pn_flags & PN_HASKEY);
 
 	error = VOP_GETATTR(lvp, &va, cred);
 	if (error)
@@ -793,6 +798,9 @@
 			if ((vp->v_mount->mnt_flag & MNT_RDONLY) ||
 			    pefs_no_keys(vp))
 				return (EROFS);
+			/* Bypass size change for node without key */
+			if ((VP_TO_PN(vp)->pn_flags & PN_HASKEY) == 0)
+				break;
 			if (vp->v_type == VREG)
 				error = pefs_tryextend(vp, vap->va_size, cred);
 			else
@@ -1034,7 +1042,7 @@
 				ap->a_flags |= LK_EXCLUSIVE;
 				break;
 			default:
-				panic("Unsupported lock request %d\n",
+				panic("pefs_lock: unsupported lock request %d\n",
 				    ap->a_flags);
 			}
 			VOP_UNLOCK(lvp, 0);
@@ -1113,7 +1121,7 @@
 	pefs_node_buf_free(pn);
 	VI_UNLOCK(vp);
 
-	if (vp->v_object != NULL) {
+	if ((pn->pn_flags & PN_HASKEY) && vp->v_object != NULL) {
 		if (vp->v_object->resident_page_count > 0)
 			PEFSDEBUG("pefs_inactive: vobject has dirty pages: vp=%p count=%d\n",
 			    vp, vp->v_object->resident_page_count);
@@ -1140,7 +1148,10 @@
 
 	PEFSDEBUG("pefs_reclaim: vp=%p\n", vp);
 
-	vnode_destroy_vobject(vp);
+	if (pn->pn_flags & PN_HASKEY)
+		vnode_destroy_vobject(vp);
+	else
+		vp->v_object = NULL;
 	cache_purge(vp);
 
 	/*
@@ -1571,7 +1582,7 @@
 	ssize_t target_len;
 	int error;
 
-	if (!(pn->pn_flags & PN_HASKEY))
+	if ((pn->pn_flags & PN_HASKEY) == 0)
 		return (VOP_READLINK(lvp, uio, ap->a_cred));
 
 	pefs_chunk_create(&pc, pn, qmin(uio->uio_resid, MAXPATHLEN));
@@ -1667,7 +1678,7 @@
 
 	if (vp->v_type == VDIR)
 		return (EISDIR);
-	if (!(pn->pn_flags & PN_HASKEY) || vp->v_type == VFIFO)
+	if ((pn->pn_flags & PN_HASKEY) == 0 || vp->v_type == VFIFO)
 		return (VOP_READ(lvp, uio, ioflag, cred));
 	if (vp->v_type != VREG)
 		return (EOPNOTSUPP);
@@ -1783,8 +1794,11 @@
 	if (uio->uio_offset < 0)
 		return (EINVAL);
 
-	if (!(pn->pn_flags & PN_HASKEY))
-		return (EROFS);
+	if ((pn->pn_flags & PN_HASKEY) == 0) {
+		if (pefs_no_keys(vp))
+			return (EROFS);
+		return (VOP_WRITE(lvp, uio, ioflag, cred));
+	}
 
 	error = pefs_getsize(vp, &nsize, cred);
 	if (error != 0)
@@ -1920,7 +1934,7 @@
 	pefs_enccn_init(&tenccn);
 	if ((pn->pn_flags & PN_HASKEY) == 0 || vp->v_type != VDIR ||
 	    pn->pn_tkey.ptk_key == pk) {
-		PEFSDEBUG("pefs_setkey failed: haskkey=%d; type=%d; pk=%d\n",
+		PEFSDEBUG("pefs_setkey failed: haskey=%d; type=%d; pk=%d\n",
 		    (pn->pn_flags & PN_HASKEY) == 0, vp->v_type != VDIR,
 		    pn->pn_tkey.ptk_key == pk);
 		return (EINVAL);

==== //depot/projects/soc2009/gk_pefs/sys/modules/Makefile#3 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/modules/Makefile,v 1.620 2009/07/05 15:25:02 trasz Exp $
+# $FreeBSD$
 
 .include <bsd.own.mk>
 
@@ -14,6 +14,7 @@
 	${_agp} \
 	aha \
 	${_ahb} \
+	ahci \
 	${_aic} \
 	aic7xxx \
 	aio \
@@ -39,6 +40,7 @@
 	${_bktr} \
 	${_bm} \
 	bridgestp \
+	bwi \
 	cam \
 	${_canbepm} \
 	${_canbus} \
@@ -108,6 +110,7 @@
 	if_disc \
 	if_edsc \
 	if_ef \
+	if_epair \
 	if_faith \
 	if_gif \
 	if_gre \
@@ -148,6 +151,7 @@
 	libiconv \
 	libmbpool \
 	libmchain \
+	${_lindev} \
 	${_linprocfs} \
 	${_linsysfs} \
 	${_linux} \
@@ -211,6 +215,7 @@
 	${_pccard} \
 	${_pcfclock} \
 	pcn \
+	pefs \
 	${_pf} \
 	${_pflog} \
 	plip \
@@ -223,6 +228,7 @@
 	procfs \
 	pseudofs \
 	${_pst} \
+	pty  \
 	puc \
 	ral \
 	ralfw \
@@ -234,6 +240,7 @@
 	rl \
 	${_s3} \
 	${_safe} \
+	salsa20 \
 	${_sbni} \
 	scc \
 	scd \
@@ -241,6 +248,7 @@
 	sdhci \
 	sem \
 	sf \
+	siis \
 	sis \
 	sk \
 	${_smbfs} \
@@ -293,6 +301,7 @@
 	wlan_xauth \
 	${_wpi} \
 	${_wpifw} \
+	${_x86bios} \
 	${_xe} \
 	xfs \
 	xl \
@@ -367,6 +376,7 @@
 _if_ndis=	if_ndis
 _igb=		igb
 _io=		io
+_lindev=	lindev
 _linprocfs=	linprocfs
 _linsysfs=	linsysfs
 _linux=		linux
@@ -450,6 +460,7 @@
 _s3=		s3
 _twa=		twa
 _vesa=		vesa
+_x86bios=	x86bios
 .elif ${MACHINE} == "pc98"
 _canbepm=	canbepm
 _canbus=	canbus
@@ -476,6 +487,7 @@
 .if ${MK_CDDL} != "no" || defined(ALL_MODULES)
 _cyclic=	cyclic
 .endif
+_dpms=		dpms
 _drm=		drm
 .if ${MK_CDDL} != "no" || defined(ALL_MODULES)
 _dtrace=	dtrace
@@ -502,6 +514,7 @@
 _iwn=		iwn
 _iwnfw=		iwnfw
 _ixgb=		ixgb
+_lindev=	lindev
 _linprocfs=	linprocfs
 _linsysfs=	linsysfs
 _linux=		linux
@@ -521,14 +534,18 @@
 .endif
 _pccard=	pccard
 _rdma=		rdma	
+_s3=		s3
 _safe=		safe
 _scsi_low=	scsi_low
 _smbfs=		smbfs
 _sound=		sound
 _speaker=	speaker
+_splash=	splash
 _sppp=		sppp
 _tmpfs=		tmpfs
 _twa=		twa
+_vesa=		vesa
+_x86bios=	x86bios
 _wi=		wi
 _wpi=		wpi
 _wpifw=		wpifw



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200909301958.n8UJwmXo070759>