svn commit: r257000 - projects/vps/sys/vps

Will Andrews will at FreeBSD.org
Wed Oct 23 18:32:26 UTC 2013


Author: will
Date: Wed Oct 23 18:32:25 2013
New Revision: 257000
URL: http://svnweb.freebsd.org/changeset/base/257000

Log:
  Sync with svn.7he.at/vps/trunk r195.
  
  r195 | klaus | 2013-07-29 06:35:25 -0600 (Mon, 29 Jul 2013) | 3 lines
  Added support for dumping fsid+fileid instead of path for vnodes.
  
  Submitted by:	Klaus P. Ohrhallinger <k at 7he.at>

Modified:
  projects/vps/sys/vps/vps_libdump.h
  projects/vps/sys/vps/vps_restore.c
  projects/vps/sys/vps/vps_snapst.c

Modified: projects/vps/sys/vps/vps_libdump.h
==============================================================================
--- projects/vps/sys/vps/vps_libdump.h	Wed Oct 23 18:22:27 2013	(r256999)
+++ projects/vps/sys/vps/vps_libdump.h	Wed Oct 23 18:32:25 2013	(r257000)
@@ -127,11 +127,12 @@ void vps_libdump_printheader(struct vps_
 #define VPS_DUMPOBJT_KNOTE              81
 #define VPS_DUMPOBJT_KEVENT             82
 #define VPS_DUMPOBJT_UMTX               90
+#define VPS_DUMPOBJT_FILE_INODENUM      95
 #define VPS_DUMPOBJT_PRISON             100
 #define VPS_DUMPOBJT_UCRED              120
 
 #define VPS_DUMPH_MAGIC			0xc0debabe
-#define VPS_DUMPH_VERSION		0x20130719
+#define VPS_DUMPH_VERSION		0x20130729
 #define VPS_DUMPH_MSB			12
 #define VPS_DUMPH_LSB			21
 #define VPS_DUMPH_32BIT			32
@@ -639,6 +640,12 @@ struct vps_dump_filepath {
 	char fp_path[0];	/* always padded to 64 bit alignment */
 };
 
+struct vps_dump_fileinodenum {
+	uint64 fsid;
+	sint32 fileid;
+	uint32 _pad0;
+};
+
 struct vps_dump_pts {
 	sint32 pt_index;
 	sint32 pt_pgrp_id;

Modified: projects/vps/sys/vps/vps_restore.c
==============================================================================
--- projects/vps/sys/vps/vps_restore.c	Wed Oct 23 18:22:27 2013	(r256999)
+++ projects/vps/sys/vps/vps_restore.c	Wed Oct 23 18:32:25 2013	(r257000)
@@ -2153,6 +2153,94 @@ vps_restore_pathtovnode(struct vps_snaps
 	return (0);
 }
 
+/* EXPERIMENTAL - nfs doesn't support vfs_vget() :-( */
+VPSFUNC
+static int
+vps_restore_inodenumtovnode(struct vps_snapst_ctx *ctx, struct vps *vps,
+    struct vnode **vnp)
+{
+	struct vps_dump_fileinodenum *vdfi;
+	struct vps_dumpobj *o1;
+	struct mount *mp;
+	struct vnode *vp;
+	char *vpsroot;
+	char *mnton;
+	int len;
+	int error;
+
+	o1 = vdo_next(ctx);
+
+	if (o1->type != VPS_DUMPOBJT_FILE_INODENUM)
+		return (EINVAL);
+
+	vdfi = (struct vps_dump_fileinodenum *)o1->data;
+
+	DBGR("%s: fsid=%lu fileid=%d\n", __func__, vdfi->fsid, vdfi->fileid);
+
+	DBGR("%s: vps's rootpath=[%s] vnode=%p\n",
+	     __func__, vps->_rootpath, vps->_rootvnode);
+
+	vpsroot = strdup(vps->_rootpath, M_TEMP);
+	if (vpsroot[strlen(vpsroot) - 1] == '/')
+		vpsroot[strlen(vpsroot) - 1] = '\0';
+	len = strlen(vpsroot);
+
+	mtx_lock(&mountlist_mtx);
+	TAILQ_FOREACH(mp, &mountlist, mnt_list) {
+		mnton = mp->mnt_stat.f_mntonname;
+		if (!(strncmp(vpsroot, mnton, len) == 0 &&
+		    (mnton[len] == '\0' || mnton[len] == '/')))
+			continue;
+
+		if (mp->mnt_stat.f_fsid.val[0] == vdfi->fsid)
+			break;
+	}
+	mtx_unlock(&mountlist_mtx);
+
+	free(vpsroot, M_TEMP);
+
+	if (mp == NULL) {
+		ERRMSG(ctx, "%s: no mount found for fsid [%16x]\n",
+		    __func__, vdfi->fsid);
+		return (ENOENT);
+	} else
+		DBGR("%s: got mount=%p for fsid\n", __func__, mp);
+
+	error = VFS_VGET(mp, vdfi->fileid, LK_SHARED | LK_RETRY, &vp);
+	if (error != 0) {
+		ERRMSG(ctx, "%s: VFS_VGET() error=%d\n",
+		    __func__, error);
+		return (error);
+	}
+
+	*vnp = vp;
+
+	vref(vp);
+	VOP_UNLOCK(vp, 0);
+
+	return (0);
+}
+
+VPSFUNC
+static int
+vps_restore_vnode(struct vps_snapst_ctx *ctx, struct vps *vps,
+    struct vnode **vnp)
+{
+	int error;
+
+	if (vdo_typeofnext(ctx) == VPS_DUMPOBJT_FILE_INODENUM)
+		error = vps_restore_inodenumtovnode(ctx, vps, vnp);
+	else if (vdo_typeofnext(ctx) == VPS_DUMPOBJT_FILE_PATH)
+		error = vps_restore_pathtovnode(ctx, vps, vnp);
+	else {
+		ERRMSG(ctx, "%s: vdo_typeofnext(ctx)=%d\n",
+		    __func__, vdo_typeofnext(ctx));
+		return (EINVAL);
+	}
+
+	return (error);
+}
+
 VPSFUNC
 static int
 vps_restore_file_vnode(struct vps_snapst_ctx *ctx, struct vps *vps,
@@ -2650,17 +2738,17 @@ vps_restore_fdset(struct vps_snapst_ctx 
 	cfd = curthread->td_proc->p_fd;
 
 	if (vdfd->fd_have_cdir != 0) {
-		if ((error = vps_restore_pathtovnode(ctx, vps,
+		if ((error = vps_restore_vnode(ctx, vps,
 		    &p->p_fd->fd_cdir)))
 			return (error);
 	}
 	if (vdfd->fd_have_rdir != 0) {
-		if ((error = vps_restore_pathtovnode(ctx, vps,
+		if ((error = vps_restore_vnode(ctx, vps,
 		    &p->p_fd->fd_rdir)))
 			return (error);
 	}
 	if (vdfd->fd_have_jdir != 0) {
-		if ((error = vps_restore_pathtovnode(ctx, vps,
+		if ((error = vps_restore_vnode(ctx, vps,
 		    &p->p_fd->fd_jdir)))
 			return (error);
 	}
@@ -3589,7 +3677,7 @@ vps_restore_proc_one(struct vps_snapst_c
 
 	/* ktrace */
 	if (vdp->p_have_tracevp) {
-		if ((error = vps_restore_pathtovnode(ctx, vps,
+		if ((error = vps_restore_vnode(ctx, vps,
 		    &np->p_tracevp)))
 			goto out;
 		/*
@@ -3608,7 +3696,7 @@ vps_restore_proc_one(struct vps_snapst_c
 
 	/* textvp */
 	if (vdp->p_have_textvp) {
-		if ((error = vps_restore_pathtovnode(ctx, vps,
+		if ((error = vps_restore_vnode(ctx, vps,
 		    &np->p_textvp)))
 			goto out;
 		DBGR("%s: p_textvp: path [...] got vnode %p\n",
@@ -4387,7 +4475,7 @@ vps_restore_prison_one(struct vps_snapst
 		 */
 		strlcpy(npr->pr_path, vdpr->pr_path, sizeof(vdpr->pr_path));
 
-		if ((error = vps_restore_pathtovnode(ctx, vps,
+		if ((error = vps_restore_vnode(ctx, vps,
 		    &npr->pr_root)))
 			return (error);
 

Modified: projects/vps/sys/vps/vps_snapst.c
==============================================================================
--- projects/vps/sys/vps/vps_snapst.c	Wed Oct 23 18:22:27 2013	(r256999)
+++ projects/vps/sys/vps/vps_snapst.c	Wed Oct 23 18:32:25 2013	(r257000)
@@ -652,7 +652,7 @@ vps_snapshot(struct vps_dev_ctx *dev_ctx
 VPSFUNC
 static int
 vps_snapshot_vnodepath(struct vps_snapst_ctx *ctx, struct vps *vps,
-		struct vnode *vp, int howalloc)
+    struct vnode *vp, int howalloc)
 {
 	struct vps_dumpobj *o1;
 	struct vps_dump_filepath *vdfp;
@@ -667,10 +667,11 @@ vps_snapshot_vnodepath(struct vps_snapst
 	if (vp == NULL)
 		return (0);
 
-	vref(vp);
 	howalloc &= (M_WAITOK|M_NOWAIT);
 	if (howalloc == 0)
 		return (EINVAL);
+
+	vref(vp);
 	buf = malloc(MAXPATHLEN, M_TEMP, howalloc|M_ZERO);
 	if (buf == NULL) {
 		vrele(vp);
@@ -734,6 +735,91 @@ vps_snapshot_vnodepath(struct vps_snapst
 	return (0);
 }
 
+VPSFUNC
+static int
+vps_snapshot_vnodeinodenum(struct vps_snapst_ctx *ctx, struct vps *vps,
+    struct vnode *vp, int howalloc)
+{
+	struct vps_dump_fileinodenum *vdfi;
+	struct vps_dumpobj *o1;
+	struct vattr vattr;
+	int error;
+
+	if (vp == NULL)
+		return (0);
+
+	howalloc &= (M_WAITOK|M_NOWAIT);
+	if (howalloc == 0)
+		return (EINVAL);
+
+	vref(vp);
+	vn_lock(vp, LK_SHARED | LK_RETRY);
+	error = VOP_GETATTR(vp, &vattr, curthread->td_ucred);
+	VOP_UNLOCK(vp, 0);
+
+	if (error != 0) {
+		DBGS("%s: vnode=%p VOP_GETATTR(): error=%d\n",
+		    __func__, vp, error);
+		vrele(vp);
+		return (error);
+	}
+
+	DBGS("%s: vnode=%p fsid=%u fileid=%ld error=%d\n",
+	    __func__, vp, vattr.va_fsid, vattr.va_fileid, error);
+
+	o1 = vdo_create(ctx, VPS_DUMPOBJT_FILE_INODENUM, howalloc);
+	if (o1 == NULL) {
+		vrele(vp);
+		return (ENOMEM);
+	}
+	if ((vdfi = vdo_space(ctx, sizeof(*vdfi), howalloc)) == NULL) {
+		vdo_discard(ctx, o1);
+		vrele(vp);
+		return (ENOMEM);
+	}
+
+	vdfi->fsid = vattr.va_fsid;
+	vdfi->fileid = vattr.va_fileid;
+
+	vdo_close(ctx);
+	vrele(vp);
+
+	return (0);
+}
+
+/*
+ * EXPERIMENTAL:
+ * Depending of kind of filesystem choose whether we snapshot
+ * a path to the vnode (unreliable and sometimes slow) or
+ * the inode number (aka file id).
+ */
+VPSFUNC
+static int
+vps_snapshot_vnode(struct vps_snapst_ctx *ctx, struct vps *vps,
+    struct vnode *vp, int howalloc)
+{
+	int error;
+
+	if (vp == NULL)
+		return (0);
+
+	vref(vp);
+
+	/*
+	nfs doesn't support vfs_vget()
+	if (!strcmp(vp->v_tag, "newnfs")) {
+	*/
+	if (0) {
+		error = vps_snapshot_vnodeinodenum(ctx, vps, vp, howalloc);
+	} else {
+		error = vps_snapshot_vnodepath(ctx, vps, vp, howalloc);
+	}
+
+	vrele(vp);
+
+	return (error);
+}
+
 /*
  * Pseudo teletype device.
  */
@@ -1602,9 +1688,9 @@ vps_snapshot_prison_one(struct vps_snaps
 	pr->pr_ref++;
 	prison_unlock(pr);
 
-	if ((error = vps_snapshot_vnodepath(ctx, vps, rootvp, M_WAITOK))) {
+	if ((error = vps_snapshot_vnode(ctx, vps, rootvp, M_WAITOK))) {
 		vrele(rootvp);
-		DBGS("%s: vps_snapshot_vnodepath: %d\n", __func__, error);
+		DBGS("%s: vps_snapshot_vnode: %d\n", __func__, error);
 		goto out;
 	}
 	vrele(rootvp);
@@ -1726,7 +1812,7 @@ vps_snapshot_proc(struct vps_snapst_ctx 
 			    sizeof(sess->s_login));
 
 			if (sess->s_ttyvp)
-				vps_snapshot_vnodepath(ctx, vps,
+				vps_snapshot_vnode(ctx, vps,
 				    sess->s_ttyvp, M_WAITOK);
 
 			vdo_close(ctx);
@@ -2129,7 +2215,7 @@ vps_snapshot_socket_unix(struct vps_snap
 	if (un_pcb->unp_vnode != NULL) {
 		vdunpcb->unp_have_vnode = 1;
 		/*
-		if ((error = vps_snapshot_vnodepath(ctx, vps,
+		if ((error = vps_snapshot_vnode(ctx, vps,
 		    un_pcb->unp_vnode, M_NOWAIT)))
 			goto drop;
 		*/
@@ -2521,13 +2607,13 @@ vps_snapshot_fdset(struct vps_snapst_ctx
 	vdo_space(ctx, sizeof(vdfd->fd_entries[0]) * vdfd->fd_nfiles,
 	    M_WAITOK);
 
-	if ((error = vps_snapshot_vnodepath(ctx, vps, fdp->fd_cdir,
+	if ((error = vps_snapshot_vnode(ctx, vps, fdp->fd_cdir,
 	    M_WAITOK)))
 		goto out;
-	if ((error = vps_snapshot_vnodepath(ctx, vps, fdp->fd_rdir,
+	if ((error = vps_snapshot_vnode(ctx, vps, fdp->fd_rdir,
 	    M_WAITOK)))
 		goto out;
-	if ((error = vps_snapshot_vnodepath(ctx, vps, fdp->fd_jdir,
+	if ((error = vps_snapshot_vnode(ctx, vps, fdp->fd_jdir,
 	    M_WAITOK)))
 		goto out;
 
@@ -2575,9 +2661,9 @@ vps_snapshot_fdset(struct vps_snapst_ctx
 			       do refer to a vnode ? */
 			if (fp->f_vnode == NULL)
 				break;
-			if ((error = vps_snapshot_vnodepath(ctx, vps,
+			if ((error = vps_snapshot_vnode(ctx, vps,
 			    fp->f_vnode, M_WAITOK))) {
-				ERRMSG(ctx, "%s: vps_snapshot_vnodepath(): "
+				ERRMSG(ctx, "%s: vps_snapshot_vnode(): "
 				    "%d\n", __func__, error);
 				goto out;
 			}
@@ -2975,7 +3061,7 @@ vps_snapshot_vmobject(struct vps_snapst_
 				goto out;
 			}
 #endif
-			error = vps_snapshot_vnodepath(ctx, vps, vp,
+			error = vps_snapshot_vnode(ctx, vps, vp,
 			    M_WAITOK);
 			if (error != 0) {
 				vdo_discard(ctx, o1);
@@ -3438,7 +3524,7 @@ vps_snapshot_proc_one(struct vps_snapst_
 
 	/* ktrace */
 	if (p->p_tracevp != NULL) {
-		if ((error = vps_snapshot_vnodepath(ctx, vps, p->p_tracevp,
+		if ((error = vps_snapshot_vnode(ctx, vps, p->p_tracevp,
 		    M_WAITOK)))
 			goto out;
 		vdp->p_have_tracevp = 1;
@@ -3446,7 +3532,7 @@ vps_snapshot_proc_one(struct vps_snapst_
 
 	/* Executable vnode. */
 	if (p->p_textvp != NULL) {
-		if ((error = vps_snapshot_vnodepath(ctx, vps, p->p_textvp,
+		if ((error = vps_snapshot_vnode(ctx, vps, p->p_textvp,
 		    M_WAITOK)))
 			goto out;
 		vdp->p_have_textvp = 1;


More information about the svn-src-projects mailing list