socsvn commit: r238799 - soc2012/gpf/pefs_kmod/sys/fs/pefs

gpf at FreeBSD.org gpf at FreeBSD.org
Mon Jul 2 12:12:19 UTC 2012


Author: gpf
Date: Mon Jul  2 12:12:16 2012
New Revision: 238799
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=238799

Log:
  - if pefs_ioctl is called to retrieve name checksum (MAC) but the vnode has
  no keys, then the call to pefs_eccn_lookup() will result in a page fault
  kernel panic. fix the code's behavior for this case by avoiding the
  call of pefs_eccn_lookup().
  

Modified:
  soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vnops.c

Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vnops.c
==============================================================================
--- soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vnops.c	Mon Jul  2 11:46:47 2012	(r238798)
+++ soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vnops.c	Mon Jul  2 12:12:16 2012	(r238799)
@@ -2557,23 +2557,30 @@
 		}
 
 		pefs_enccn_init(&enccn);
-
-		cn.cn_nameiop = LOOKUP;
-		cn.cn_thread = td;
-		cn.cn_cred = cred;
-		cn.cn_lkflags = 0;
-		cn.cn_flags = 0;
-		cn.cn_nameptr = xncs->pxnc_filename;
-		cn.cn_namelen = xncs->pxnc_namelen;
-
-		/* XXXgpf: does this lookup rely solely on present cache data? */
-		error = pefs_enccn_lookup(&enccn, vp, &cn);
+		if (pefs_no_keys(vp)) {
+			enc = xncs->pxnc_filename;
+			enc_len = xncs->pxnc_namelen;
+			error = 0;
+		}
+		else {
+			cn.cn_nameiop = LOOKUP;
+			cn.cn_thread = td;
+			cn.cn_cred = cred;
+			cn.cn_lkflags = 0;
+			cn.cn_flags = 0;
+			cn.cn_nameptr = xncs->pxnc_filename;
+			cn.cn_namelen = xncs->pxnc_namelen;
+
+			/* XXXgpf: does this lookup rely solely on present cache data? */
+			error = pefs_enccn_lookup(&enccn, vp, &cn);
+			if (error == 0) {
+				enc = enccn.pec_cn.cn_nameptr;
+				enc_len = enccn.pec_cn.cn_namelen;
+			}
+		}
 		VOP_UNLOCK(vp, 0);
 
 		if (error == 0) {
-			enc = enccn.pec_cn.cn_nameptr;
-			enc_len = enccn.pec_cn.cn_namelen;
-
 			if (enc[0] != '.' || enc_len <= 1) {
 				pefs_enccn_free(&enccn);
 				error = EINVAL;


More information about the svn-soc-all mailing list