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;
}