socsvn commit: r238338 - soc2012/gpf/pefs_kmod/sys/fs/pefs
gpf at FreeBSD.org
gpf at FreeBSD.org
Tue Jun 26 15:11:10 UTC 2012
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 <sys/vnode.h>
#include <fs/pefs/pefs.h>
+#include <fs/pefs/pefs_checksum.h>
#include <fs/pefs/pefs_dircache.h>
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);
More information about the svn-soc-all
mailing list