Date: Tue, 12 Jun 2012 14:05:43 +0000 From: gpf@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r237552 - in soc2012/gpf/pefs_kmod: sbin/pefs sys/fs/pefs Message-ID: <20120612140543.D93931065670@hub.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: gpf Date: Tue Jun 12 14:05:43 2012 New Revision: 237552 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=237552 Log: - try to acquire a vnode for .pefs.checksum during pefs_mount [buggy] Modified: soc2012/gpf/pefs_kmod/sbin/pefs/pefs_checksum.c soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs.h soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vfsops.c Modified: soc2012/gpf/pefs_kmod/sbin/pefs/pefs_checksum.c ============================================================================== --- soc2012/gpf/pefs_kmod/sbin/pefs/pefs_checksum.c Tue Jun 12 13:57:56 2012 (r237551) +++ soc2012/gpf/pefs_kmod/sbin/pefs/pefs_checksum.c Tue Jun 12 14:05:43 2012 (r237552) @@ -924,7 +924,7 @@ * A1) semantic checks: * A1a) file should reside in pefs filesystem & file should be regular file. * A1b) if symlink, acquire and save the absolute path of the symlink's - * target. Try to stat() the target but don't do anything else. + * target. Try to lstat() the target but don't do anything else. * A1c) If hardlink, save a reference to this file entry in our rb tree. * rb-tree uses inodes as keys and is used in part C to print warnings. * A1d) Open and store file descriptors to file & parent_directory. Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs.h ============================================================================== --- soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs.h Tue Jun 12 13:57:56 2012 (r237551) +++ soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs.h Tue Jun 12 14:05:43 2012 (r237552) @@ -118,6 +118,13 @@ char ptk_tweak[PEFS_TWEAK_SIZE]; }; +/* XXXgpf: fill this in */ +#define PEFS_FILE_CHECKSUM ".pefs.checksum" + +struct pefs_checksum { + int pcs_int; +}; + #define PN_HASKEY 0x000001 #define PN_WANTRECYCLE 0x000100 #define PN_LOCKBUF_SMALL 0x001000 @@ -138,12 +145,14 @@ #define PM_ROOT_CANRECURSE 0x01 #define PM_DIRCACHE 0x02 #define PM_ASYNCRECLAIM 0x04 +#define PM_CHECKSUM 0x08 struct pefs_mount { struct mount *pm_lowervfs; struct vnode *pm_rootvp; struct mtx pm_keys_lock; struct pefs_key_head pm_keys; + struct pefs_checksum pm_checksum; int pm_flags; }; Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vfsops.c ============================================================================== --- soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vfsops.c Tue Jun 12 13:57:56 2012 (r237551) +++ soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vfsops.c Tue Jun 12 14:05:43 2012 (r237552) @@ -72,6 +72,7 @@ "dircache", "nodircache", "asyncreclaim", + "checksum", NULL }; @@ -119,6 +120,65 @@ return (0); } +/* xxxgpf: tmp 4 dbg purposes */ +static void +pefs_dbg_vnode(struct vnode *vp, char *str) +{ + printf("%s is locked: %d\n", str, VOP_ISLOCKED(vp)); + printf("%s usecount: %d\n", str, vp->v_usecount); + printf("%s holdcnt: %d\n", str, vp->v_holdcnt); + printf("%s writecount: %d\n", str, vp->v_writecount); +} + +/* + * XXXgpf: + * get vp for checksum + * read header info + * then read index into 2 huge mallocd char*s + * should also worry about pefs_init(), pefs_uninit(), and unmount + */ +static int +pefs_checksum_load(struct mount *mp) +{ + struct nameidata nd, *ndp = &nd; + struct pefs_mount *pm; + struct vnode *checksumvp; + char path[MAXPATHLEN + 1]; + int error; + + pm = VFS_TO_PEFS(mp); + + printf("from = %s\n", mp->mnt_stat.f_mntfromname); + //printf("to = %s\n", mp->mnt_stat.f_mntonname); + snprintf(path, sizeof(path), "%s/%s", mp->mnt_stat.f_mntfromname, PEFS_FILE_CHECKSUM); + printf("path = %s\n", path); + + pefs_dbg_vnode(pm->pm_rootvp, "start rootvp"); + + NDINIT(ndp, LOOKUP, 0, UIO_SYSSPACE, path, curthread); + error = namei(ndp); + + pefs_dbg_vnode(pm->pm_rootvp, "after namei rootvp"); + + if (error != 0) { + printf("pefs_checksum_load: namei error %d\n", error); + // tmp change + return (0); + } + + checksumvp = ndp->ni_vp; + NDFREE(ndp, NDF_NO_VP_RELE); + + /* XXXgpf: temporary vrele of checksumvp */ + pefs_dbg_vnode(checksumvp, "before vrele checksumvp"); + vrele(checksumvp); + pefs_dbg_vnode(checksumvp, "after vrele checksumvp"); + + pefs_dbg_vnode(pm->pm_rootvp, "end rootvp"); + + return (0); +} + /* * Mount null layer */ @@ -131,7 +191,7 @@ struct pefs_mount *pm; char *from, *from_free; int isvnunlocked = 0, len; - int opt_dircache, opt_asyncreclaim; + int opt_checksum, opt_dircache, opt_asyncreclaim; int error = 0; PEFSDEBUG("pefs_mount(mp = %p)\n", (void *)mp); @@ -155,6 +215,12 @@ vfs_deleteopt(mp->mnt_optnew, "asyncreclaim"); opt_asyncreclaim = 1; } + opt_checksum = -1; + if (vfs_flagopt(mp->mnt_optnew, "checksum", NULL, 0)) { + vfs_deleteopt(mp->mnt_optnew, "checksum"); + printf("checksum!\n"); + opt_checksum = 1; + } if (mp->mnt_flag & MNT_UPDATE) { error = EOPNOTSUPP; @@ -170,6 +236,9 @@ PM_ASYNCRECLAIM, "asyncreclaim"); error = 0; } + /* + * XXXgpf: should we allow opt_checksum with MNT_UPDATE? + */ return (error); } @@ -262,6 +331,7 @@ pm->pm_flags |= PM_ROOT_CANRECURSE; pefs_opt_set(mp, opt_dircache, pm, PM_DIRCACHE, "dircache"); pefs_opt_set(mp, opt_asyncreclaim, pm, PM_ASYNCRECLAIM, "asyncreclaim"); + pefs_opt_set(mp, opt_checksum, pm, PM_CHECKSUM, "checksum"); /* * Save reference. Each mount also holds @@ -302,6 +372,17 @@ mp->mnt_data = pm; vfs_getnewfsid(mp); + if ((pm->pm_flags & PM_CHECKSUM) != 0) { + pefs_dbg_vnode(lowerrootvp, "BEFORE lowerootvp"); + error = pefs_checksum_load(mp); + pefs_dbg_vnode(lowerrootvp, "AFTER lowerootvp"); + if (error != 0) { + /* XXXgpf: what should be done for lowerrootvp? vput? */ + free(pm, M_PEFSMNT); + return (error); + } + } + PEFSDEBUG("pefs_mount: lower %s, alias at %s\n", mp->mnt_stat.f_mntfromname, mp->mnt_stat.f_mntonname); return (0);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120612140543.D93931065670>