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