Module Name:    src
Committed By:   pooka
Date:           Fri May 22 10:53:59 UTC 2009

Modified Files:
        src/lib/libp2k: p2k.c

Log Message:
Support mounting post-time_t rump file systems on a pre-time_t host.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/lib/libp2k/p2k.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libp2k/p2k.c
diff -u src/lib/libp2k/p2k.c:1.13 src/lib/libp2k/p2k.c:1.14
--- src/lib/libp2k/p2k.c:1.13	Sun May  3 20:26:42 2009
+++ src/lib/libp2k/p2k.c	Fri May 22 10:53:59 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: p2k.c,v 1.13 2009/05/03 20:26:42 pooka Exp $	*/
+/*	$NetBSD: p2k.c,v 1.14 2009/05/22 10:53:59 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007 Antti Kantee.  All Rights Reserved.
@@ -346,7 +346,7 @@
 	struct vnode *vp;
 	enum vtype vtype;
 	voff_t vsize;
-	dev_t rdev;
+	uint64_t rdev; /* XXX: uint64_t because of stack overwrite in compat */
 	int rv;
 
 	rv = rump_vfs_fhtovp(mp, fid, &vp);
@@ -354,7 +354,7 @@
 		return rv;
 
 	puffs_newinfo_setcookie(pni, vp);
-	rump_getvninfo(vp, &vtype, &vsize, &rdev);
+	rump_getvninfo(vp, &vtype, &vsize, (void *)&rdev);
 	puffs_newinfo_setvtype(pni, vtype);
 	puffs_newinfo_setsize(pni, vsize);
 	puffs_newinfo_setrdev(pni, rdev);
@@ -381,7 +381,7 @@
 	struct vnode *vp;
 	enum vtype vtype;
 	voff_t vsize;
-	dev_t rdev;
+	uint64_t rdev; /* XXX: uint64_t because of stack overwrite in compat */
 	int rv;
 
 	cn = makecn(pcn);
@@ -397,7 +397,7 @@
 	VUL(vp);
 
 	puffs_newinfo_setcookie(pni, vp);
-	rump_getvninfo(vp, &vtype, &vsize, &rdev);
+	rump_getvninfo(vp, &vtype, &vsize, (void *)&rdev);
 	puffs_newinfo_setvtype(pni, vtype);
 	puffs_newinfo_setsize(pni, vsize);
 	puffs_newinfo_setrdev(pni, rdev);
@@ -405,6 +405,31 @@
 	return 0;
 }
 
+#define VERS_TIMECHANGE 599000700
+static int
+needcompat(void)
+{
+
+	return __NetBSD_Version__ < VERS_TIMECHANGE
+	    && rump_getversion() >= VERS_TIMECHANGE;
+}
+
+#define DOCOMPAT(va, va_compat)						\
+do {									\
+	if (needcompat()) {						\
+		va_compat = rump_vattr_init();				\
+		rump_vattr50_to_vattr(va, va_compat);			\
+	} else {							\
+		va_compat = __UNCONST(va);				\
+	}								\
+} while (/*CONSTCOND*/0)
+
+#define UNDOCOMPAT(va_compat)						\
+do {									\
+	if (needcompat())						\
+		rump_vattr_free(va_compat);				\
+} while (/*CONSTCOND*/0)
+
 /*ARGSUSED*/
 int
 p2k_node_create(struct puffs_usermount *pu, puffs_cookie_t opc,
@@ -412,13 +437,16 @@
 	const struct vattr *vap)
 {
 	struct componentname *cn;
+	struct vattr *va_x;
 	struct vnode *vp;
 	int rv;
 
+	DOCOMPAT(vap, va_x);
+
 	cn = makecn(pcn);
 	VLE(opc);
 	rump_vp_incref(opc);
-	rv = RUMP_VOP_CREATE(opc, &vp, cn, __UNCONST(vap));
+	rv = RUMP_VOP_CREATE(opc, &vp, cn, va_x);
 	AUL(opc);
 	freecn(cn, 0);
 	if (rv == 0) {
@@ -426,6 +454,8 @@
 		puffs_newinfo_setcookie(pni, vp);
 	}
 
+	UNDOCOMPAT(va_x);
+
 	return rv;
 }
 
@@ -436,13 +466,16 @@
 	const struct vattr *vap)
 {
 	struct componentname *cn;
+	struct vattr *va_x;
 	struct vnode *vp;
 	int rv;
 
+	DOCOMPAT(vap, va_x);
+
 	cn = makecn(pcn);
 	VLE(opc);
 	rump_vp_incref(opc);
-	rv = RUMP_VOP_MKNOD(opc, &vp, cn, __UNCONST(vap));
+	rv = RUMP_VOP_MKNOD(opc, &vp, cn, va_x);
 	AUL(opc);
 	freecn(cn, 0);
 	if (rv == 0) {
@@ -450,6 +483,8 @@
 		puffs_newinfo_setcookie(pni, vp);
 	}
 
+	UNDOCOMPAT(va_x);
+
 	return rv;
 }
 
@@ -509,14 +544,26 @@
 	struct vattr *vap, const struct puffs_cred *pcr)
 {
 	kauth_cred_t cred;
+	struct vattr *va_x;
 	int rv;
 
+	if (needcompat()) {
+		va_x = rump_vattr_init();
+	} else {
+		va_x = vap;
+	}
+
 	cred = cred_create(pcr);
 	VLE(opc);
-	rv = RUMP_VOP_GETATTR(opc, vap, cred);
+	rv = RUMP_VOP_GETATTR(opc, va_x, cred);
 	VUL(opc);
 	cred_destroy(cred);
 
+	if (needcompat()) {
+		rump_vattr_to_vattr50(va_x, vap);
+		rump_vattr_free(va_x);
+	}
+
 	return rv;
 }
 
@@ -526,14 +573,19 @@
 	const struct vattr *vap, const struct puffs_cred *pcr)
 {
 	kauth_cred_t cred;
+	struct vattr *va_x;
 	int rv;
 
+	DOCOMPAT(vap, va_x);
+
 	cred = cred_create(pcr);
 	VLE(opc);
-	rv = RUMP_VOP_SETATTR(opc, __UNCONST(vap), cred);
+	rv = RUMP_VOP_SETATTR(opc, va_x, cred);
 	VUL(opc);
 	cred_destroy(cred);
 
+	UNDOCOMPAT(va_x);
+
 	return rv;
 }
 
@@ -662,13 +714,16 @@
 	const struct vattr *vap)
 {
 	struct componentname *cn;
+	struct vattr *va_x;
 	struct vnode *vp;
 	int rv;
 
+	DOCOMPAT(vap, va_x);
+
 	cn = makecn(pcn);
 	VLE(opc);
 	rump_vp_incref(opc);
-	rv = RUMP_VOP_MKDIR(opc, &vp, cn, __UNCONST(vap));
+	rv = RUMP_VOP_MKDIR(opc, &vp, cn, va_x);
 	AUL(opc);
 	freecn(cn, 0);
 	if (rv == 0) {
@@ -676,6 +731,8 @@
 		puffs_newinfo_setcookie(pni, vp);
 	}
 
+	UNDOCOMPAT(va_x);
+
 	return rv;
 }
 
@@ -707,14 +764,16 @@
 	const struct vattr *vap, const char *link_target)
 {
 	struct componentname *cn;
+	struct vattr *va_x;
 	struct vnode *vp;
 	int rv;
 
+	DOCOMPAT(vap, va_x);
+
 	cn = makecn(pcn_src);
 	VLE(opc);
 	rump_vp_incref(opc);
-	rv = RUMP_VOP_SYMLINK(opc, &vp, cn,
-	    __UNCONST(vap), __UNCONST(link_target));
+	rv = RUMP_VOP_SYMLINK(opc, &vp, cn, va_x, __UNCONST(link_target));
 	AUL(opc);
 	freecn(cn, 0);
 	if (rv == 0) {
@@ -722,6 +781,8 @@
 		puffs_newinfo_setcookie(pni, vp);
 	}
 
+	UNDOCOMPAT(va_x);
+
 	return rv;
 }
 

Reply via email to