From owner-svn-soc-all@FreeBSD.ORG Mon Jun 25 14:53:21 2012 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from socsvn.FreeBSD.org (unknown [IPv6:2001:4f8:fff6::2f]) by hub.freebsd.org (Postfix) with SMTP id 73B3D1065677 for ; Mon, 25 Jun 2012 14:53:19 +0000 (UTC) (envelope-from gpf@FreeBSD.org) Received: by socsvn.FreeBSD.org (sSMTP sendmail emulation); Mon, 25 Jun 2012 14:53:19 +0000 Date: Mon, 25 Jun 2012 14:53:19 +0000 From: gpf@FreeBSD.org To: svn-soc-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Message-Id: <20120625145319.73B3D1065677@hub.freebsd.org> Cc: Subject: socsvn commit: r238269 - in soc2012/gpf/pefs_kmod/sys: fs/pefs modules/pefs X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 25 Jun 2012 14:53:21 -0000 Author: gpf Date: Mon Jun 25 14:53:18 2012 New Revision: 238269 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=238269 Log: - move checksum code in checksum.c and a few minor changes Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs.h soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_subr.c soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vfsops.c soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vnops.c soc2012/gpf/pefs_kmod/sys/modules/pefs/Makefile Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs.h ============================================================================== --- soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs.h Mon Jun 25 12:30:51 2012 (r238268) +++ soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs.h Mon Jun 25 14:53:18 2012 (r238269) @@ -118,28 +118,6 @@ char ptk_tweak[PEFS_TWEAK_SIZE]; }; -/* XXXgpf: fill this in */ -#define PEFS_FILE_CHECKSUM ".pefs.checksum" -#define PEFS_CFH_SIZE 16 -#define PEFS_HT_CELL_SIZE 16 - -struct pefs_checksum_index_entry { - uint32_t pcie_nhashes; - uint32_t pcie_offset; - uint64_t pcie_file_id; -}; - -struct pefs_checksum { - uint8_t pcs_version; - uint8_t pcs_reserved; - uint8_t pcs_hash_len; - uint8_t pcs_hash_algo[8]; - uint8_t pcs_offset_to_hash_table; - uint32_t pcs_hash_table_size; - char *pcs_table1, *pcs_table2; - struct vnode *pcs_checksumvp; -}; - #define PN_HASKEY 0x000001 #define PN_WANTRECYCLE 0x000100 #define PN_LOCKBUF_SMALL 0x001000 @@ -155,7 +133,7 @@ void *pn_buf_large; int pn_flags; struct pefs_tkey pn_tkey; - void *pn_checksum_index_entry; + char *pn_checksum_index_entry; }; #define PM_ROOT_CANRECURSE 0x01 @@ -163,6 +141,17 @@ #define PM_ASYNCRECLAIM 0x04 #define PM_CHECKSUM 0x08 +struct pefs_checksum { + uint8_t pcs_version; + uint8_t pcs_reserved; + uint8_t pcs_hash_len; + uint8_t pcs_hash_algo[8]; + uint8_t pcs_offset_to_hash_table; + uint32_t pcs_hash_table_size; + char *pcs_table1, *pcs_table2; + struct vnode *pcs_checksumvp; +}; + struct pefs_mount { struct mount *pm_lowervfs; struct vnode *pm_rootvp; Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_subr.c ============================================================================== --- soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_subr.c Mon Jun 25 12:30:51 2012 (r238268) +++ soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_subr.c Mon Jun 25 14:53:18 2012 (r238269) @@ -400,6 +400,7 @@ PEFSDEBUG("pefs_node_get: creating node without key: %p\n", pn); pn->pn_vnode = vp; + pn->pn_checksum_index_entry = NULL; vp->v_type = lvp->v_type; vp->v_data = pn; vp->v_vnlock = lvp->v_vnlock; Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vfsops.c ============================================================================== --- soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vfsops.c Mon Jun 25 12:30:51 2012 (r238268) +++ soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vfsops.c Mon Jun 25 14:53:18 2012 (r238269) @@ -47,6 +47,7 @@ #include #include +#include struct pefs_opt_descr { char *fs; Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vnops.c ============================================================================== --- soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vnops.c Mon Jun 25 12:30:51 2012 (r238268) +++ soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vnops.c Mon Jun 25 14:53:18 2012 (r238269) @@ -56,8 +56,6 @@ #include #include #include -#include -#include #include #include #include @@ -66,6 +64,7 @@ #include #include +#include #include #define DIRENT_MINSIZE (sizeof(struct dirent) - (MAXNAMLEN + 1)) @@ -472,101 +471,9 @@ return (0); } -/* - * XXXgpf: [TODO] move most, if not all, of the checksum code to a different .c - */ -static uint32_t -pefs_checksum_hash1(struct pefs_checksum *pc, struct pefs_checksum_index_entry *pcie) -{ - uint32_t nbucket; - - nbucket = pcie->pcie_file_id % pc->pcs_hash_table_size; - printf("hash1: goto bucket %d\n", nbucket); - return (nbucket); -} - -static uint32_t -pefs_checksum_hash2(struct pefs_checksum *pc, struct pefs_checksum_index_entry *pcie) -{ - uint32_t nbucket; - - nbucket = fnv_64_buf(&(pcie->pcie_file_id), sizeof(pcie->pcie_file_id), FNV1_64_INIT) - % pc->pcs_hash_table_size; - printf("hash2: goto bucket %d\n", nbucket); - - return (nbucket); -} - -static void -pefs_checksum_index_lookup(struct pefs_checksum_index_entry *pcie, struct vnode *vp) -{ - struct pefs_checksum_index_entry target_pcie; - struct pefs_mount *pm = VFS_TO_PEFS(vp->v_mount); - struct pefs_checksum *pcs = &(pm->pm_checksum); - struct pefs_node *pn = VP_TO_PN(vp); - char *start, *p; - uint32_t pos; - - pos = pefs_checksum_hash1(pcs, pcie); - start = &(pcs->pcs_table1[pos * PEFS_HT_CELL_SIZE]); - p = start; - - memcpy(&(target_pcie.pcie_nhashes), p, sizeof(target_pcie.pcie_nhashes)); - target_pcie.pcie_nhashes = le32toh(target_pcie.pcie_nhashes); - if (target_pcie.pcie_nhashes != 0) { - p+=sizeof(target_pcie.pcie_nhashes); - - memcpy(&(target_pcie.pcie_offset), p, sizeof(target_pcie.pcie_offset)); - target_pcie.pcie_offset = le32toh(target_pcie.pcie_offset); - p+=sizeof(target_pcie.pcie_offset); - - memcpy(&(target_pcie.pcie_file_id), p, sizeof(target_pcie.pcie_file_id)); - target_pcie.pcie_file_id = le64toh(target_pcie.pcie_file_id); - printf("cell %d:\n", pos); - printf("\thashes = %d\n\toffset = %d\n\tfile id = %llu\n", - target_pcie.pcie_nhashes, target_pcie.pcie_offset, target_pcie.pcie_file_id); - - if (target_pcie.pcie_file_id == pcie->pcie_file_id) { - pn->pn_checksum_index_entry = start; - printf("checksum lookup: found1!\n"); - return; - } - } - - pos = pefs_checksum_hash2(pcs, pcie); - start = &(pcs->pcs_table2[pos * PEFS_HT_CELL_SIZE]); - p = start; - - memcpy(&(target_pcie.pcie_nhashes), p, sizeof(target_pcie.pcie_nhashes)); - target_pcie.pcie_nhashes = le32toh(target_pcie.pcie_nhashes); - if (target_pcie.pcie_nhashes != 0) { - p+=sizeof(target_pcie.pcie_nhashes); - - memcpy(&(target_pcie.pcie_offset), p, sizeof(target_pcie.pcie_offset)); - target_pcie.pcie_offset = le32toh(target_pcie.pcie_offset); - p+=sizeof(target_pcie.pcie_offset); - - memcpy(&(target_pcie.pcie_file_id), p, sizeof(target_pcie.pcie_file_id)); - target_pcie.pcie_file_id = le64toh(target_pcie.pcie_file_id); - printf("cell %d:\n", pos); - printf("\thashes = %d\n\toffset = %d\n\tfile id = %llu\n", - target_pcie.pcie_nhashes, target_pcie.pcie_offset, target_pcie.pcie_file_id); - - if (target_pcie.pcie_file_id == pcie->pcie_file_id) { - pn->pn_checksum_index_entry = start; - printf("checksum lookup: found2!\n"); - return; - } - } - - printf("checksum lookup: not found!\n"); - pn->pn_checksum_index_entry = NULL; -} - static int pefs_lookup(struct vop_cachedlookup_args *ap) { - struct pefs_checksum_index_entry pcie; struct componentname *cnp = ap->a_cnp; struct pefs_mount *pm; struct vnode *vp = NULL; @@ -576,10 +483,8 @@ struct pefs_enccn enccn; struct pefs_node *dpn = VP_TO_PN(dvp); uint64_t flags = cnp->cn_flags; - char *enc_name, *buf; int nokey_lookup, skip_lookup; - int error, r; - size_t enc_name_len, buf_len; + int error; printf("pefs_lookup: op=%lx, name=%.*s\n", cnp->cn_nameiop, (int)cnp->cn_namelen, cnp->cn_nameptr); @@ -654,52 +559,19 @@ else error = pefs_node_get_haskey(dvp->v_mount, lvp, &vp, &enccn.pec_tkey); - if (error != 0) { vput(lvp); } else { pm = VFS_TO_PEFS(vp->v_mount); - if ((pm->pm_flags & PM_CHECKSUM) != 0 && cnp->cn_nameiop == LOOKUP && - (vp->v_type == VREG || vp->v_type == VLNK)) { - printf("gpf: checksum code @ lookup\n"); + if ((pm->pm_flags & PM_CHECKSUM) != 0) { if (nokey_lookup) { printf("cnp name=%.*s\n",(int)cnp->cn_namelen, cnp->cn_nameptr); - enc_name = cnp->cn_nameptr; - enc_name_len = cnp->cn_namelen; + pefs_checksum_lookup(cnp->cn_nameptr, cnp->cn_namelen, cnp, vp); } else { printf("enccnp name=%.*s\n",(int)enccn.pec_cn.cn_namelen, enccn.pec_cn.cn_nameptr); - enc_name = enccn.pec_cn.cn_nameptr; - enc_name_len = enccn.pec_cn.cn_namelen; + pefs_checksum_lookup(enccn.pec_cn.cn_nameptr, enccn.pec_cn.cn_namelen, cnp, vp); } - - /* XXXgpf: What if user wants integrity checking for .pefs.db or .conf? */ - /* XXXgpf: [TODO] move this check to a mini function */ - if (strncmp(enc_name, ".pefs.db", enc_name_len) != 0 && - strncmp(enc_name, ".pefs.conf", enc_name_len) != 0 && - strncmp(enc_name, ".pefs.checksum", enc_name_len) != 0) - { - enc_name++; - enc_name_len--; - buf_len = MAXNAMLEN + 1; - buf = malloc(buf_len, M_TEMP, M_WAITOK); - - r = pefs_name_pton(enc_name, enc_name_len, buf, buf_len); - if (r <= 0) { - /* XXXgpf: I sincerely doubt an error can occur here */ - error = EINVAL; - printf("name_pton error: %d\n", error); - } - else { - memcpy(&(pcie.pcie_file_id), buf, sizeof(pcie.pcie_file_id)); - pcie.pcie_file_id = be64toh(pcie.pcie_file_id); - printf("id to lookup: %llu\n", pcie.pcie_file_id); - pefs_checksum_index_lookup(&pcie, vp); - } - - free(buf, M_TEMP); - } - } *ap->a_vpp = vp; if ((cnp->cn_flags & MAKEENTRY) && Modified: soc2012/gpf/pefs_kmod/sys/modules/pefs/Makefile ============================================================================== --- soc2012/gpf/pefs_kmod/sys/modules/pefs/Makefile Mon Jun 25 12:30:51 2012 (r238268) +++ soc2012/gpf/pefs_kmod/sys/modules/pefs/Makefile Mon Jun 25 14:53:18 2012 (r238269) @@ -6,7 +6,8 @@ SRCS= vnode_if.h \ pefs_subr.c pefs_vfsops.c pefs_vnops.c pefs_xbase64.c pefs_crypto.c \ pefs_dircache.c \ - pefs_xts.c vmac.c + pefs_xts.c vmac.c \ + pefs_checksum.c .if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64" SRCS+= pefs_aesni.c