Home | History | Annotate | Line # | Download | only in puffs
puffs_compat.c revision 1.3.2.1
      1  1.3.2.1  skrll /*	$NetBSD: puffs_compat.c,v 1.3.2.1 2015/06/06 14:40:21 skrll Exp $	*/
      2      1.1  pooka 
      3      1.1  pooka /*
      4      1.1  pooka  * Copyright (c) 2010 Antti Kantee.  All Rights Reserved.
      5      1.1  pooka  *
      6      1.1  pooka  * Redistribution and use in source and binary forms, with or without
      7      1.1  pooka  * modification, are permitted provided that the following conditions
      8      1.1  pooka  * are met:
      9      1.1  pooka  * 1. Redistributions of source code must retain the above copyright
     10      1.1  pooka  *    notice, this list of conditions and the following disclaimer.
     11      1.1  pooka  * 2. Redistributions in binary form must reproduce the above copyright
     12      1.1  pooka  *    notice, this list of conditions and the following disclaimer in the
     13      1.1  pooka  *    documentation and/or other materials provided with the distribution.
     14      1.1  pooka  *
     15      1.1  pooka  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
     16      1.1  pooka  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     17      1.1  pooka  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     18      1.1  pooka  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     19      1.1  pooka  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     20      1.1  pooka  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     21      1.1  pooka  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     22      1.1  pooka  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     23      1.1  pooka  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     24      1.1  pooka  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     25      1.1  pooka  * SUCH DAMAGE.
     26      1.1  pooka  */
     27      1.1  pooka 
     28      1.1  pooka /*
     29      1.1  pooka  * This file handles puffs PDUs so that they are compatible between
     30      1.1  pooka  * 32bit<->64bit time_t/dev_t.  It enables running a -current kernel
     31      1.1  pooka  * against a 5.0 userland (assuming the protocol otherwise matches!).
     32      1.1  pooka  */
     33      1.1  pooka 
     34      1.1  pooka #include <sys/cdefs.h>
     35  1.3.2.1  skrll __KERNEL_RCSID(0, "$NetBSD: puffs_compat.c,v 1.3.2.1 2015/06/06 14:40:21 skrll Exp $");
     36      1.1  pooka 
     37      1.1  pooka #include <sys/param.h>
     38      1.1  pooka #include <sys/atomic.h>
     39      1.1  pooka #include <sys/kmem.h>
     40      1.1  pooka #include <sys/kthread.h>
     41      1.1  pooka #include <sys/lock.h>
     42      1.1  pooka #include <sys/mount.h>
     43      1.1  pooka #include <sys/namei.h>
     44      1.1  pooka #include <sys/proc.h>
     45      1.1  pooka #include <sys/vnode.h>
     46      1.1  pooka #include <sys/atomic.h>
     47      1.1  pooka 
     48      1.1  pooka #include <dev/putter/putter_sys.h>
     49      1.1  pooka 
     50      1.1  pooka #include <fs/puffs/puffs_msgif.h>
     51      1.1  pooka #include <fs/puffs/puffs_sys.h>
     52      1.1  pooka 
     53      1.1  pooka #include <compat/sys/time.h>
     54      1.1  pooka 
     55      1.1  pooka /*
     56      1.1  pooka  * compat types
     57      1.1  pooka  */
     58      1.1  pooka struct vattr50 {
     59      1.1  pooka 	enum vtype		va_type;
     60      1.1  pooka 	mode_t			va_mode;
     61      1.1  pooka 	nlink_t			va_nlink;
     62      1.1  pooka 	uid_t			va_uid;
     63      1.1  pooka 	gid_t			va_gid;
     64      1.1  pooka 	uint32_t		va_fsid;
     65      1.1  pooka 	ino_t			va_fileid;
     66      1.1  pooka 	u_quad_t		va_size;
     67      1.1  pooka 	long			va_blocksize;
     68      1.1  pooka 	struct timespec50	va_atime;
     69      1.1  pooka 	struct timespec50	va_mtime;
     70      1.1  pooka 	struct timespec50	va_ctime;
     71      1.1  pooka 	struct timespec50	va_birthtime;
     72      1.1  pooka 	u_long			va_gen;
     73      1.1  pooka 	u_long			va_flags;
     74      1.1  pooka 	uint32_t		va_rdev;
     75      1.1  pooka 	u_quad_t		va_bytes;
     76      1.1  pooka 	u_quad_t		va_filerev;
     77      1.1  pooka 	u_int			va_vaflags;
     78      1.1  pooka 	long			va_spare;
     79      1.1  pooka };
     80      1.1  pooka 
     81      1.1  pooka struct puffs50_vfsmsg_fhtonode {
     82      1.1  pooka 	struct puffs_req	pvfsr_pr;
     83      1.1  pooka 
     84      1.1  pooka 	void			*pvfsr_fhcookie;	/* IN   */
     85      1.1  pooka 	enum vtype		pvfsr_vtype;		/* IN   */
     86      1.1  pooka 	voff_t			pvfsr_size;		/* IN   */
     87      1.1  pooka 	uint32_t		pvfsr_rdev;		/* IN   */
     88      1.1  pooka 
     89      1.1  pooka 	size_t			pvfsr_dsize;		/* OUT */
     90      1.1  pooka 	uint8_t			pvfsr_data[0]		/* OUT, XXX */
     91      1.1  pooka 					__aligned(ALIGNBYTES+1);
     92      1.1  pooka };
     93      1.1  pooka 
     94      1.1  pooka struct puffs50_vnmsg_lookup {
     95      1.1  pooka 	struct puffs_req	pvn_pr;
     96      1.1  pooka 
     97      1.1  pooka 	struct puffs_kcn	pvnr_cn;		/* OUT	*/
     98      1.1  pooka 	struct puffs_kcred	pvnr_cn_cred;		/* OUT	*/
     99      1.1  pooka 
    100      1.1  pooka 	puffs_cookie_t		pvnr_newnode;		/* IN	*/
    101      1.1  pooka 	enum vtype		pvnr_vtype;		/* IN	*/
    102      1.1  pooka 	voff_t			pvnr_size;		/* IN	*/
    103      1.1  pooka 	uint32_t		pvnr_rdev;		/* IN	*/
    104      1.1  pooka };
    105      1.1  pooka 
    106      1.1  pooka struct puffs50_vnmsg_create {
    107      1.1  pooka 	struct puffs_req	pvn_pr;
    108      1.1  pooka 
    109      1.1  pooka 	struct puffs_kcn	pvnr_cn;		/* OUT	*/
    110      1.1  pooka 	struct puffs_kcred	pvnr_cn_cred;		/* OUT	*/
    111      1.1  pooka 
    112      1.1  pooka 	struct vattr50		pvnr_va;		/* OUT	*/
    113      1.1  pooka 	puffs_cookie_t		pvnr_newnode;		/* IN	*/
    114      1.1  pooka };
    115      1.1  pooka 
    116      1.1  pooka struct puffs50_vnmsg_mknod {
    117      1.1  pooka 	struct puffs_req	pvn_pr;
    118      1.1  pooka 
    119      1.1  pooka 	struct puffs_kcn	pvnr_cn;		/* OUT	*/
    120      1.1  pooka 	struct puffs_kcred	pvnr_cn_cred;		/* OUT	*/
    121      1.1  pooka 
    122      1.1  pooka 	struct vattr50		pvnr_va;		/* OUT	*/
    123      1.1  pooka 	puffs_cookie_t		pvnr_newnode;		/* IN	*/
    124      1.1  pooka };
    125      1.1  pooka 
    126      1.1  pooka #define puffs50_vnmsg_setattr puffs50_vnmsg_setgetattr
    127      1.1  pooka #define puffs50_vnmsg_getattr puffs50_vnmsg_setgetattr
    128      1.1  pooka struct puffs50_vnmsg_setgetattr {
    129      1.1  pooka 	struct puffs_req	pvn_pr;
    130      1.1  pooka 
    131      1.1  pooka 	struct puffs_kcred	pvnr_cred;		/* OUT	*/
    132      1.1  pooka 	struct vattr50		pvnr_va;		/* IN/OUT (op depend) */
    133      1.1  pooka };
    134      1.1  pooka 
    135      1.1  pooka struct puffs50_vnmsg_mkdir {
    136      1.1  pooka 	struct puffs_req	pvn_pr;
    137      1.1  pooka 
    138      1.1  pooka 	struct puffs_kcn	pvnr_cn;		/* OUT	*/
    139      1.1  pooka 	struct puffs_kcred	pvnr_cn_cred;		/* OUT	*/
    140      1.1  pooka 
    141      1.1  pooka 	struct vattr50		pvnr_va;		/* OUT	*/
    142      1.1  pooka 	puffs_cookie_t		pvnr_newnode;		/* IN	*/
    143      1.1  pooka };
    144      1.1  pooka 
    145      1.1  pooka struct puffs50_vnmsg_symlink {
    146      1.1  pooka 	struct puffs_req	pvn_pr;
    147      1.1  pooka 
    148      1.1  pooka 	struct puffs_kcn	pvnr_cn;		/* OUT	*/
    149      1.1  pooka 	struct puffs_kcred	pvnr_cn_cred;		/* OUT	*/
    150      1.1  pooka 
    151      1.1  pooka 	struct vattr50		pvnr_va;		/* OUT	*/
    152      1.1  pooka 	puffs_cookie_t		pvnr_newnode;		/* IN	*/
    153      1.1  pooka 	char			pvnr_link[MAXPATHLEN];	/* OUT	*/
    154      1.1  pooka };
    155      1.1  pooka 
    156      1.1  pooka /*
    157      1.1  pooka  * vattr translation routines
    158      1.1  pooka  */
    159      1.1  pooka 
    160  1.3.2.1  skrll #ifdef COMPAT_50
    161      1.1  pooka static void
    162      1.1  pooka vattr_to_50(const struct vattr *va, struct vattr50 *va50)
    163      1.1  pooka {
    164      1.1  pooka 
    165      1.1  pooka 	va50->va_type = va->va_type;
    166      1.1  pooka 	va50->va_mode = va->va_mode;
    167      1.1  pooka 	va50->va_nlink = va->va_nlink;
    168      1.1  pooka 	va50->va_uid = va->va_uid;
    169      1.1  pooka 	va50->va_gid = va->va_gid;
    170      1.1  pooka 	va50->va_fsid = (uint64_t)va->va_fsid;
    171      1.1  pooka 	va50->va_fileid = va->va_fileid;
    172      1.1  pooka 	va50->va_size = va->va_size;
    173      1.1  pooka 	va50->va_blocksize = va->va_blocksize;
    174      1.1  pooka 	timespec_to_timespec50(&va->va_atime, &va50->va_atime);
    175      1.1  pooka 	timespec_to_timespec50(&va->va_ctime, &va50->va_ctime);
    176      1.1  pooka 	timespec_to_timespec50(&va->va_mtime, &va50->va_mtime);
    177      1.1  pooka 	timespec_to_timespec50(&va->va_birthtime, &va50->va_birthtime);
    178      1.1  pooka 	va50->va_gen = va->va_gen;
    179      1.1  pooka 	va50->va_flags = va->va_flags;
    180      1.1  pooka 	va50->va_rdev = (int32_t)va->va_rdev;
    181      1.1  pooka 	va50->va_bytes = va->va_bytes;
    182      1.1  pooka 	va50->va_filerev = va->va_filerev;
    183      1.1  pooka 	va50->va_vaflags = va->va_flags;
    184      1.1  pooka }
    185      1.1  pooka 
    186      1.1  pooka static void
    187      1.1  pooka vattr_from_50(const struct vattr50 *va50, struct vattr *va)
    188      1.1  pooka {
    189      1.1  pooka 
    190      1.1  pooka 	va->va_type = va50->va_type;
    191      1.1  pooka 	va->va_mode = va50->va_mode;
    192      1.1  pooka 	va->va_nlink = va50->va_nlink;
    193      1.1  pooka 	va->va_uid = va50->va_uid;
    194      1.1  pooka 	va->va_gid = va50->va_gid;
    195      1.1  pooka 	va->va_fsid = (uint32_t)va50->va_fsid;
    196      1.1  pooka 	va->va_fileid = va50->va_fileid;
    197      1.1  pooka 	va->va_size = va50->va_size;
    198      1.1  pooka 	va->va_blocksize = va50->va_blocksize;
    199      1.1  pooka 	timespec50_to_timespec(&va50->va_atime, &va->va_atime);
    200      1.1  pooka 	timespec50_to_timespec(&va50->va_ctime, &va->va_ctime);
    201      1.1  pooka 	timespec50_to_timespec(&va50->va_mtime, &va->va_mtime);
    202      1.1  pooka 	timespec50_to_timespec(&va50->va_birthtime, &va->va_birthtime);
    203      1.1  pooka 	va->va_gen = va50->va_gen;
    204      1.1  pooka 	va->va_flags = va50->va_flags;
    205      1.1  pooka 	va->va_rdev = (uint32_t)va50->va_rdev;
    206      1.1  pooka 	va->va_bytes = va50->va_bytes;
    207      1.1  pooka 	va->va_filerev = va50->va_filerev;
    208      1.1  pooka 	va->va_vaflags = va50->va_flags;
    209      1.1  pooka }
    210  1.3.2.1  skrll #endif /* COMPAT_50 */
    211      1.1  pooka 
    212      1.1  pooka /*
    213      1.1  pooka  * XXX: cannot assert that sleeping is possible
    214      1.1  pooka  * (this always a valid assumption for now)
    215      1.1  pooka  */
    216      1.2  pooka #define INIT(name, extra)						\
    217      1.1  pooka 	struct puffs50_##name *cmsg;					\
    218      1.1  pooka 	struct puffs_##name *omsg;					\
    219      1.2  pooka 	creq =kmem_zalloc(sizeof(struct puffs50_##name)+extra,KM_SLEEP);\
    220      1.1  pooka 	cmsg = (struct puffs50_##name *)creq;				\
    221      1.1  pooka 	omsg = (struct puffs_##name *)oreq;				\
    222      1.1  pooka 	delta = sizeof(struct puffs50_##name)-sizeof(struct puffs_##name);
    223      1.1  pooka #define ASSIGN(field)							\
    224      1.1  pooka 	cmsg->field = omsg->field;
    225      1.1  pooka 
    226      1.1  pooka bool
    227      1.1  pooka puffs_compat_outgoing(struct puffs_req *oreq,
    228      1.1  pooka 	struct puffs_req **creqp, ssize_t *deltap)
    229      1.1  pooka {
    230  1.3.2.1  skrll 	bool rv = false;
    231  1.3.2.1  skrll #ifdef COMPAT_50
    232      1.1  pooka 	struct puffs_req *creq = NULL;
    233      1.1  pooka 	ssize_t delta = 0;
    234      1.1  pooka 
    235      1.2  pooka 	if (PUFFSOP_OPCLASS(oreq->preq_opclass) == PUFFSOP_VFS
    236      1.2  pooka 	    && oreq->preq_optype == PUFFS_VFS_FHTOVP) {
    237      1.2  pooka 		INIT(vfsmsg_fhtonode,
    238      1.2  pooka 		    ((struct puffs_vfsmsg_fhtonode *)oreq)->pvfsr_dsize);
    239      1.1  pooka 
    240      1.1  pooka 		ASSIGN(pvfsr_pr);
    241      1.1  pooka 		ASSIGN(pvfsr_dsize);
    242      1.1  pooka 		memcpy(cmsg->pvfsr_data, omsg->pvfsr_data, cmsg->pvfsr_dsize);
    243      1.1  pooka 	} else if (PUFFSOP_OPCLASS(oreq->preq_opclass) == PUFFSOP_VN) {
    244      1.1  pooka 		switch (oreq->preq_optype) {
    245      1.1  pooka 		case PUFFS_VN_LOOKUP:
    246      1.1  pooka 		{
    247      1.2  pooka 			INIT(vnmsg_lookup, 0);
    248      1.1  pooka 
    249      1.1  pooka 			ASSIGN(pvn_pr);
    250      1.1  pooka 			ASSIGN(pvnr_cn);
    251      1.1  pooka 			ASSIGN(pvnr_cn_cred);
    252      1.1  pooka 
    253      1.1  pooka 			break;
    254      1.1  pooka 		}
    255      1.1  pooka 
    256      1.1  pooka 		case PUFFS_VN_CREATE:
    257      1.1  pooka 		{
    258      1.2  pooka 			INIT(vnmsg_create, 0);
    259      1.1  pooka 
    260      1.1  pooka 			ASSIGN(pvn_pr);
    261      1.1  pooka 			ASSIGN(pvnr_cn);
    262      1.1  pooka 			ASSIGN(pvnr_cn_cred);
    263      1.1  pooka 			vattr_to_50(&omsg->pvnr_va, &cmsg->pvnr_va);
    264      1.1  pooka 
    265      1.1  pooka 			break;
    266      1.1  pooka 		}
    267      1.1  pooka 
    268      1.1  pooka 		case PUFFS_VN_MKNOD:
    269      1.1  pooka 		{
    270      1.2  pooka 			INIT(vnmsg_mknod, 0);
    271      1.1  pooka 
    272      1.1  pooka 			ASSIGN(pvn_pr);
    273      1.1  pooka 			ASSIGN(pvnr_cn);
    274      1.1  pooka 			ASSIGN(pvnr_cn_cred);
    275      1.1  pooka 			vattr_to_50(&omsg->pvnr_va, &cmsg->pvnr_va);
    276      1.1  pooka 
    277      1.1  pooka 			break;
    278      1.1  pooka 		}
    279      1.1  pooka 
    280      1.1  pooka 		case PUFFS_VN_MKDIR:
    281      1.1  pooka 		{
    282      1.2  pooka 			INIT(vnmsg_mkdir, 0);
    283      1.1  pooka 
    284      1.1  pooka 			ASSIGN(pvn_pr);
    285      1.1  pooka 			ASSIGN(pvnr_cn);
    286      1.1  pooka 			ASSIGN(pvnr_cn_cred);
    287      1.1  pooka 			vattr_to_50(&omsg->pvnr_va, &cmsg->pvnr_va);
    288      1.1  pooka 
    289      1.1  pooka 			break;
    290      1.1  pooka 		}
    291      1.1  pooka 
    292      1.1  pooka 		case PUFFS_VN_SYMLINK:
    293      1.1  pooka 		{
    294      1.2  pooka 			INIT(vnmsg_symlink, 0);
    295      1.1  pooka 
    296      1.1  pooka 			ASSIGN(pvn_pr);
    297      1.1  pooka 			ASSIGN(pvnr_cn);
    298      1.1  pooka 			ASSIGN(pvnr_cn_cred);
    299      1.1  pooka 			vattr_to_50(&omsg->pvnr_va, &cmsg->pvnr_va);
    300      1.1  pooka 			memcpy(cmsg->pvnr_link, omsg->pvnr_link,
    301      1.1  pooka 			    sizeof(cmsg->pvnr_link));
    302      1.1  pooka 
    303      1.1  pooka 			break;
    304      1.1  pooka 		}
    305      1.1  pooka 
    306      1.1  pooka 		case PUFFS_VN_SETATTR:
    307      1.1  pooka 		{
    308      1.2  pooka 			INIT(vnmsg_setattr, 0);
    309      1.1  pooka 
    310      1.1  pooka 			ASSIGN(pvn_pr);
    311      1.1  pooka 			ASSIGN(pvnr_cred);
    312      1.1  pooka 			vattr_to_50(&omsg->pvnr_va, &cmsg->pvnr_va);
    313      1.1  pooka 
    314      1.1  pooka 			break;
    315      1.1  pooka 		}
    316      1.1  pooka 		case PUFFS_VN_GETATTR:
    317      1.1  pooka 		{
    318      1.2  pooka 			INIT(vnmsg_getattr, 0);
    319      1.1  pooka 
    320      1.1  pooka 			ASSIGN(pvn_pr);
    321      1.1  pooka 			ASSIGN(pvnr_cred);
    322      1.1  pooka 
    323      1.1  pooka 			break;
    324      1.1  pooka 		}
    325      1.1  pooka 
    326      1.1  pooka 		default:
    327      1.1  pooka 			break;
    328      1.1  pooka 		}
    329      1.1  pooka 	}
    330      1.1  pooka 
    331      1.1  pooka 	if (creq) {
    332      1.1  pooka 		*creqp = creq;
    333      1.1  pooka 		*deltap = delta;
    334      1.1  pooka 		rv = true;
    335      1.1  pooka 	}
    336  1.3.2.1  skrll #endif
    337      1.1  pooka 
    338      1.1  pooka 	return rv;
    339      1.1  pooka }
    340      1.1  pooka #undef INIT
    341      1.1  pooka #undef ASSIGN
    342      1.1  pooka 
    343      1.1  pooka #define INIT(name)							\
    344      1.1  pooka 	struct puffs50_##name *cmsg = (void *)preq;			\
    345      1.1  pooka 	struct puffs_##name *omsg = (void *)creq;
    346      1.1  pooka #define ASSIGN(field)							\
    347      1.1  pooka 	omsg->field = cmsg->field;
    348      1.1  pooka 
    349      1.1  pooka void
    350      1.1  pooka puffs_compat_incoming(struct puffs_req *preq, struct puffs_req *creq)
    351      1.1  pooka {
    352      1.1  pooka 
    353  1.3.2.1  skrll #ifdef COMPAT_50
    354      1.2  pooka 	if (PUFFSOP_OPCLASS(preq->preq_opclass) == PUFFSOP_VFS
    355      1.2  pooka 	    && preq->preq_optype == PUFFS_VFS_FHTOVP) {
    356      1.1  pooka 		INIT(vfsmsg_fhtonode);
    357      1.1  pooka 
    358      1.1  pooka 		ASSIGN(pvfsr_pr);
    359      1.1  pooka 
    360      1.1  pooka 		ASSIGN(pvfsr_fhcookie);
    361      1.1  pooka 		ASSIGN(pvfsr_vtype);
    362      1.1  pooka 		ASSIGN(pvfsr_size);
    363      1.1  pooka 		ASSIGN(pvfsr_rdev);
    364      1.1  pooka 	} else if (PUFFSOP_OPCLASS(preq->preq_opclass) == PUFFSOP_VN) {
    365      1.1  pooka 		switch (preq->preq_optype) {
    366      1.1  pooka 		case PUFFS_VN_LOOKUP:
    367      1.1  pooka 		{
    368      1.1  pooka 			INIT(vnmsg_lookup);
    369      1.1  pooka 
    370      1.1  pooka 			ASSIGN(pvn_pr);
    371      1.1  pooka 			ASSIGN(pvnr_newnode);
    372      1.1  pooka 			ASSIGN(pvnr_vtype);
    373      1.1  pooka 			ASSIGN(pvnr_size);
    374      1.1  pooka 			ASSIGN(pvnr_rdev);
    375      1.1  pooka 
    376      1.1  pooka 			break;
    377      1.1  pooka 		}
    378      1.1  pooka 
    379      1.1  pooka 		case PUFFS_VN_CREATE:
    380      1.1  pooka 		{
    381      1.1  pooka 			INIT(vnmsg_create);
    382      1.1  pooka 
    383      1.1  pooka 			ASSIGN(pvn_pr);
    384      1.1  pooka 			ASSIGN(pvnr_newnode);
    385      1.1  pooka 
    386      1.1  pooka 			break;
    387      1.1  pooka 		}
    388      1.1  pooka 
    389      1.1  pooka 		case PUFFS_VN_MKNOD:
    390      1.1  pooka 		{
    391      1.1  pooka 			INIT(vnmsg_mknod);
    392      1.1  pooka 
    393      1.1  pooka 			ASSIGN(pvn_pr);
    394      1.1  pooka 			ASSIGN(pvnr_newnode);
    395      1.1  pooka 
    396      1.1  pooka 			break;
    397      1.1  pooka 		}
    398      1.1  pooka 
    399      1.1  pooka 		case PUFFS_VN_MKDIR:
    400      1.1  pooka 		{
    401      1.1  pooka 			INIT(vnmsg_mkdir);
    402      1.1  pooka 
    403      1.1  pooka 			ASSIGN(pvn_pr);
    404      1.1  pooka 			ASSIGN(pvnr_newnode);
    405      1.1  pooka 
    406      1.1  pooka 			break;
    407      1.1  pooka 		}
    408      1.1  pooka 
    409      1.1  pooka 		case PUFFS_VN_SYMLINK:
    410      1.1  pooka 		{
    411      1.1  pooka 			INIT(vnmsg_symlink);
    412      1.1  pooka 
    413      1.1  pooka 			ASSIGN(pvn_pr);
    414      1.1  pooka 			ASSIGN(pvnr_newnode);
    415      1.1  pooka 
    416      1.1  pooka 			break;
    417      1.1  pooka 		}
    418      1.1  pooka 
    419      1.1  pooka 		case PUFFS_VN_SETATTR:
    420      1.1  pooka 		{
    421      1.1  pooka 			INIT(vnmsg_setattr);
    422      1.1  pooka 
    423      1.1  pooka 			ASSIGN(pvn_pr);
    424      1.1  pooka 
    425      1.1  pooka 			break;
    426      1.1  pooka 		}
    427      1.1  pooka 		case PUFFS_VN_GETATTR:
    428      1.1  pooka 		{
    429      1.1  pooka 			INIT(vnmsg_getattr);
    430      1.1  pooka 
    431      1.1  pooka 			ASSIGN(pvn_pr);
    432      1.1  pooka 			vattr_from_50(&cmsg->pvnr_va, &omsg->pvnr_va);
    433      1.1  pooka 
    434      1.1  pooka 			break;
    435      1.1  pooka 		}
    436      1.1  pooka 
    437      1.1  pooka 		default:
    438      1.1  pooka 			panic("puffs compat ops come in pairs");
    439      1.1  pooka 		}
    440      1.1  pooka 	}
    441  1.3.2.1  skrll #endif /* COMPAT_50 */
    442      1.1  pooka }
    443