From owner-svn-soc-all@FreeBSD.ORG Tue Jun 26 15:11:10 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 6903D1065674 for ; Tue, 26 Jun 2012 15:11:08 +0000 (UTC) (envelope-from gpf@FreeBSD.org) Received: by socsvn.FreeBSD.org (sSMTP sendmail emulation); Tue, 26 Jun 2012 15:11:08 +0000 Date: Tue, 26 Jun 2012 15:11:08 +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: <20120626151108.6903D1065674@hub.freebsd.org> Cc: Subject: socsvn commit: r238338 - soc2012/gpf/pefs_kmod/sys/fs/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: Tue, 26 Jun 2012 15:11:10 -0000 Author: gpf Date: Tue Jun 26 15:11:08 2012 New Revision: 238338 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=238338 Log: - lookup vnodes in checksum index tables during pefs_node_get_lookupkey (VFS_VGET, VFS_FHTOVP). I did not test with FHTOVP, NFS tests have a low priority for the moment. - make use of negative hint for these lookups Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs.h soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_checksum.c 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 Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs.h ============================================================================== --- soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs.h Tue Jun 26 15:05:18 2012 (r238337) +++ soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs.h Tue Jun 26 15:11:08 2012 (r238338) @@ -122,6 +122,7 @@ #define PN_WANTRECYCLE 0x000100 #define PN_LOCKBUF_SMALL 0x001000 #define PN_LOCKBUF_LARGE 0x002000 +#define PN_NO_CHECKSUM 0x000010 struct pefs_node { LIST_ENTRY(pefs_node) pn_listentry; Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_checksum.c ============================================================================== --- soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_checksum.c Tue Jun 26 15:05:18 2012 (r238337) +++ soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_checksum.c Tue Jun 26 15:11:08 2012 (r238338) @@ -65,7 +65,7 @@ return (nbucket); } -static void +static int pefs_checksum_index_lookup(struct pefs_checksum_index_entry *pcie, struct vnode *vp) { struct pefs_checksum_index_entry target_pcie; @@ -97,7 +97,7 @@ if (target_pcie.pcie_file_id == pcie->pcie_file_id) { pn->pn_checksum_index_entry = start; printf("checksum lookup: found1!\n"); - return; + return (0); } } @@ -123,32 +123,35 @@ if (target_pcie.pcie_file_id == pcie->pcie_file_id) { pn->pn_checksum_index_entry = start; printf("checksum lookup: found2!\n"); - return; + return (0); } } pn->pn_checksum_index_entry = NULL; printf("checksum lookup: not found!\n"); + return (ENOENT); } void pefs_checksum_lookup(char *enc_name, size_t enc_name_len, struct componentname *cnp, struct vnode *vp) { struct pefs_checksum_index_entry pcie; + struct pefs_node *pn = VP_TO_PN(vp); char *buf; size_t buf_len; int error, r; printf("gpf: checksum code @ lookup\n"); - if (cnp->cn_nameiop != LOOKUP || (vp->v_type != VREG && vp->v_type != VLNK)) - return; + if ((cnp != NULL && cnp->cn_nameiop != LOOKUP) || (vp->v_type != VREG && vp->v_type != VLNK) + || ((pn->pn_flags & PN_NO_CHECKSUM) != 0)) + goto not_found; /* 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) - return; + goto not_found; enc_name++; enc_name_len--; @@ -165,8 +168,16 @@ 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); + error = pefs_checksum_index_lookup(&pcie, vp); + if (error != 0) { + free(buf, M_TEMP); + goto not_found; + } } free(buf, M_TEMP); + return; + +not_found: + pn->pn_flags|= PN_NO_CHECKSUM; } Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_subr.c ============================================================================== --- soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_subr.c Tue Jun 26 15:05:18 2012 (r238337) +++ soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_subr.c Tue Jun 26 15:11:08 2012 (r238338) @@ -52,6 +52,7 @@ #include #include +#include #include typedef int pefs_node_init_fn(struct mount *mp, struct pefs_node *pn, @@ -455,8 +456,24 @@ pefs_node_get_lookupkey(struct mount *mp, struct vnode *lvp, struct vnode **vpp, struct ucred *cred) { + struct pefs_mount *pm = VFS_TO_PEFS(mp); + char *encname; + int encname_len, error; + MPASS(cred != NULL); - return (pefs_node_get(mp, lvp, vpp, pefs_node_init_lookupkey, cred)); + error = pefs_node_get(mp, lvp, vpp, pefs_node_init_lookupkey, cred); + if ((error == 0) && (pm->pm_flags & PM_CHECKSUM) != 0) { + encname_len = MAXNAMLEN + 1; + encname = malloc(encname_len, M_TEMP, M_WAITOK); + + error = pefs_node_lookup_name(lvp, NULL, cred, encname, &encname_len); + if (error == 0) { + printf("lookupkey encname=%.*s\n",(int)encname_len, encname); + pefs_checksum_lookup(encname, encname_len, NULL, *vpp); + } + free(encname, M_TEMP); + } + return (error); } static __inline void Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vfsops.c ============================================================================== --- soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vfsops.c Tue Jun 26 15:05:18 2012 (r238337) +++ soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vfsops.c Tue Jun 26 15:11:08 2012 (r238338) @@ -617,6 +617,7 @@ pefs_vget(struct mount *mp, ino_t ino, int flags, struct vnode **vpp) { int error; + error = VFS_VGET(VFS_TO_PEFS(mp)->pm_lowervfs, ino, flags, vpp); if (error != 0) return (error); Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vnops.c ============================================================================== --- soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vnops.c Tue Jun 26 15:05:18 2012 (r238337) +++ soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vnops.c Tue Jun 26 15:11:08 2012 (r238338) @@ -486,6 +486,7 @@ int nokey_lookup, skip_lookup; int error; + /* XXXgpf: [TODO] PEFSDEBUGs instead of printfs */ printf("pefs_lookup: op=%lx, name=%.*s\n", cnp->cn_nameiop, (int)cnp->cn_namelen, cnp->cn_nameptr);