From owner-p4-projects@FreeBSD.ORG Wed Sep 30 19:58:48 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id D6B6E1065693; Wed, 30 Sep 2009 19:58:48 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9B35E1065692 for ; Wed, 30 Sep 2009 19:58:48 +0000 (UTC) (envelope-from gk@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 8B42C8FC2C for ; Wed, 30 Sep 2009 19:58:48 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n8UJwmSE070761 for ; Wed, 30 Sep 2009 19:58:48 GMT (envelope-from gk@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n8UJwmXo070759 for perforce@freebsd.org; Wed, 30 Sep 2009 19:58:48 GMT (envelope-from gk@FreeBSD.org) Date: Wed, 30 Sep 2009 19:58:48 GMT Message-Id: <200909301958.n8UJwmXo070759@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to gk@FreeBSD.org using -f From: Gleb Kurtsou To: Perforce Change Reviews Cc: Subject: PERFORCE change 169063 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 30 Sep 2009 19:58:49 -0000 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 @@ -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