PERFORCE change 169063 for review
Gleb Kurtsou
gk at FreeBSD.org
Wed Sep 30 19:58:49 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=169063
Change 169063 by gk at 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
More information about the p4-projects
mailing list