Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / fs / puffs / puffs_msgif.h @ 13

History | View | Annotate | Download (18.6 KB)

1
/*        $NetBSD: puffs_msgif.h,v 1.84 2015/02/15 20:21:29 manu Exp $        */
2

    
3
/*
4
 * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
5
 *
6
 * Development of this software was supported by the
7
 * Google Summer of Code program and the Ulla Tuominen Foundation.
8
 * The Google SoC project was mentored by Bill Studenmund.
9
 *
10
 * Redistribution and use in source and binary forms, with or without
11
 * modification, are permitted provided that the following conditions
12
 * are met:
13
 * 1. Redistributions of source code must retain the above copyright
14
 *    notice, this list of conditions and the following disclaimer.
15
 * 2. Redistributions in binary form must reproduce the above copyright
16
 *    notice, this list of conditions and the following disclaimer in the
17
 *    documentation and/or other materials provided with the distribution.
18
 *
19
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
20
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29
 * SUCH DAMAGE.
30
 */
31

    
32
#ifndef _FS_PUFFS_PUFFS_MSGIF_H_
33
#define _FS_PUFFS_PUFFS_MSGIF_H_
34

    
35
#include <sys/param.h>
36
#include <sys/time.h>
37
#include <sys/ioccom.h>
38
#include <sys/uio.h>
39
#include <sys/vnode.h>
40
#include <sys/ucred.h>
41
#include <sys/statvfs.h>
42
#include <sys/dirent.h>
43
#include <sys/fcntl.h>
44

    
45
#if !defined(__minix)
46
#include <dev/putter/putter.h>
47
#endif /* !defined(__minix) */
48

    
49
#include <uvm/uvm_prot.h>
50

    
51
#define PUFFSOP_VFS                0x01        /* kernel-> */
52
#define PUFFSOP_VN                0x02        /* kernel-> */
53
#define PUFFSOP_CACHE                0x03        /* only kernel-> */
54
#define PUFFSOP_ERROR                0x04        /* only kernel-> */
55
#define PUFFSOP_FLUSH                0x05        /* ->kernel */
56
#define PUFFSOP_SUSPEND                0x06        /* ->kernel */
57
#define PUFFSOP_UNMOUNT                0x07        /* ->kernel */
58

    
59
#define PUFFSOPFLAG_FAF                0x10        /* fire-and-forget */
60
#define PUFFSOPFLAG_ISRESPONSE        0x20        /* req is actually a resp */
61

    
62
#define PUFFSOP_OPCMASK                0x07
63
#define PUFFSOP_OPCLASS(a)        ((a) & PUFFSOP_OPCMASK)
64
#define PUFFSOP_WANTREPLY(a)        (((a) & PUFFSOPFLAG_FAF) == 0)
65

    
66
enum {
67
        PUFFS_VFS_MOUNT,        PUFFS_VFS_START,        PUFFS_VFS_UNMOUNT,
68
        PUFFS_VFS_ROOT,                PUFFS_VFS_QUOTACTL,        PUFFS_VFS_STATVFS,
69
        PUFFS_VFS_SYNC,                PUFFS_VFS_VGET,                PUFFS_VFS_FHTOVP,
70
        PUFFS_VFS_VPTOFH,        PUFFS_VFS_INIT,                PUFFS_VFS_DONE,
71
        PUFFS_VFS_SNAPSHOT,        PUFFS_VFS_EXTATTRCTL,        PUFFS_VFS_SUSPEND
72
};
73
#define PUFFS_VFS_MAX PUFFS_VFS_SUSPEND
74

    
75
enum {
76
        PUFFS_VN_LOOKUP,        PUFFS_VN_CREATE,        PUFFS_VN_MKNOD,
77
        PUFFS_VN_OPEN,                PUFFS_VN_CLOSE,                PUFFS_VN_ACCESS,
78
        PUFFS_VN_GETATTR,        PUFFS_VN_SETATTR,        PUFFS_VN_READ,
79
        PUFFS_VN_WRITE,                PUFFS_VN_IOCTL,                PUFFS_VN_FCNTL,
80
        PUFFS_VN_POLL,                PUFFS_VN_KQFILTER,        PUFFS_VN_REVOKE,
81
        PUFFS_VN_MMAP,                PUFFS_VN_FSYNC,                PUFFS_VN_SEEK,
82
        PUFFS_VN_REMOVE,        PUFFS_VN_LINK,                PUFFS_VN_RENAME,
83
        PUFFS_VN_MKDIR,                PUFFS_VN_RMDIR,                PUFFS_VN_SYMLINK,
84
        PUFFS_VN_READDIR,        PUFFS_VN_READLINK,        PUFFS_VN_ABORTOP,
85
        PUFFS_VN_INACTIVE,        PUFFS_VN_RECLAIM,        PUFFS_VN_LOCK,
86
        PUFFS_VN_UNLOCK,        PUFFS_VN_BMAP,                PUFFS_VN_STRATEGY,
87
        PUFFS_VN_PRINT,                PUFFS_VN_ISLOCKED,        PUFFS_VN_PATHCONF,
88
        PUFFS_VN_ADVLOCK,        PUFFS_VN_LEASE,                PUFFS_VN_WHITEOUT,
89
        PUFFS_VN_GETPAGES,        PUFFS_VN_PUTPAGES,        PUFFS_VN_GETEXTATTR,
90
        PUFFS_VN_LISTEXTATTR,        PUFFS_VN_OPENEXTATTR,        PUFFS_VN_DELETEEXTATTR,
91
        PUFFS_VN_SETEXTATTR,        PUFFS_VN_CLOSEEXTATTR,        PUFFS_VN_FALLOCATE,
92
        PUFFS_VN_FDISCARD,
93
        /* NOTE: If you add an op, decrement PUFFS_VN_SPARE accordingly */
94
};
95
#define PUFFS_VN_MAX PUFFS_VN_FDISCARD
96
#define PUFFS_VN_SPARE 30
97

    
98
/*
99
 * These signal invalid parameters the file system returned.
100
 */
101
enum {
102
        PUFFS_ERR_ERROR,
103
        PUFFS_ERR_MAKENODE,        PUFFS_ERR_LOOKUP,        PUFFS_ERR_READDIR,
104
        PUFFS_ERR_READLINK,        PUFFS_ERR_READ,                PUFFS_ERR_WRITE,
105
        PUFFS_ERR_VPTOFH,        PUFFS_ERR_GETEXTATTR,        PUFFS_ERR_LISTEXTATTR
106
};
107
#define PUFFS_ERR_MAX PUFFS_ERR_LISTEXTATTR
108

    
109
#define PUFFSVERSION        30
110
#define PUFFSNAMESIZE        32
111

    
112
#define PUFFS_TYPEPREFIX "puffs|"
113

    
114
#define PUFFS_TYPELEN (_VFS_NAMELEN - (sizeof(PUFFS_TYPEPREFIX)+1))
115
#define PUFFS_NAMELEN (_VFS_MNAMELEN-1)
116

    
117
/* 
118
 * Just a weak typedef for code clarity.  Additionally, we have a
119
 * more appropriate vanity type for puffs:
120
 * <uep> it should be croissant, not cookie.
121
 */
122
typedef void *puffs_cookie_t;
123
typedef puffs_cookie_t puffs_croissant_t;
124

    
125
struct puffs_kargs {
126
        unsigned int        pa_vers;
127
        int                pa_fd;
128

    
129
        uint32_t        pa_flags;
130

    
131
        size_t                pa_maxmsglen;
132
        int                pa_nhashbuckets;
133

    
134
        size_t                pa_fhsize;
135
        int                pa_fhflags;
136

    
137
        uint8_t                pa_vnopmask[PUFFS_VN_MAX + PUFFS_VN_SPARE];
138

    
139
        char                pa_typename[_VFS_NAMELEN];
140
        char                pa_mntfromname[_VFS_MNAMELEN];
141

    
142
        puffs_cookie_t        pa_root_cookie;
143
        enum vtype        pa_root_vtype;
144
        voff_t                pa_root_vsize;
145
        union {
146
                dev_t                dev;
147
                uint64_t        container;
148
        } devunion;
149

    
150
        struct statvfs        pa_svfsb;
151

    
152
        uint32_t        pa_time32;
153

    
154
        uint32_t        pa_spare[127];
155
};
156
#define pa_root_rdev devunion.dev
157

    
158
#define PUFFS_KFLAG_NOCACHE_NAME        0x001        /* don't use name cache     */
159
#define PUFFS_KFLAG_NOCACHE_PAGE        0x002        /* don't use page cache            */
160
#define PUFFS_KFLAG_NOCACHE                0x003        /* no cache whatsoever      */
161
#define PUFFS_KFLAG_ALLOPS                0x004        /* ignore pa_vnopmask       */
162
#define PUFFS_KFLAG_WTCACHE                0x008        /* write-through page cache */
163
#define PUFFS_KFLAG_IAONDEMAND                0x010        /* inactive only on demand  */
164
#define PUFFS_KFLAG_LOOKUP_FULLPNBUF        0x020        /* full pnbuf in lookup     */
165
#define PUFFS_KFLAG_NOCACHE_ATTR        0x040        /* no attrib cache (unused) */
166
#define PUFFS_KFLAG_CACHE_FS_TTL        0x080        /* cache use TTL from FS    */
167
#define PUFFS_KFLAG_CACHE_DOTDOT        0x100        /* don't send lookup for .. */
168
#define PUFFS_KFLAG_NOFLUSH_META        0x200        /* don't flush metadata cache*/
169
#define PUFFS_KFLAG_MASK                0x3bf
170

    
171
#define PUFFS_FHFLAG_DYNAMIC                0x01
172
#define PUFFS_FHFLAG_NFSV2                0x02
173
#define PUFFS_FHFLAG_NFSV3                0x04
174
#define PUFFS_FHFLAG_PROTOMASK                0x06
175
#define PUFFS_FHFLAG_PASSTHROUGH        0x08
176
#define PUFFS_FHFLAG_MASK                0x0f
177

    
178
#define PUFFS_FHSIZE_MAX        1020        /* FHANDLE_SIZE_MAX - 4 */
179

    
180
struct puffs_req {
181
#if !defined(__minix)
182
        struct putter_hdr        preq_pth;
183
#endif /* ! defined(__minix) */
184

    
185
        uint64_t                preq_id;
186
        puffs_cookie_t                preq_cookie;
187

    
188
        uint16_t                preq_opclass;
189
        uint16_t                preq_optype;
190
        int                        preq_rv;
191

    
192
        uint32_t                preq_setbacks;
193

    
194
        /* Who is making the call?  Eventually host id is also needed. */
195
        pid_t                        preq_pid;
196
        lwpid_t                        preq_lid;
197

    
198
        /*
199
         * the following helper pads the struct size to md alignment
200
         * multiple (should size_t not cut it).  it makes sure that
201
         * whatever comes after this struct is aligned
202
         */
203
        size_t                  preq_buflen;
204
        uint8_t        preq_buf[0] __aligned(ALIGNBYTES+1);
205
};
206

    
207
#define PUFFS_SETBACK_INACT_N1        0x01        /* set VOP_INACTIVE for node 1 */
208
#define PUFFS_SETBACK_INACT_N2        0x02        /* set VOP_INACTIVE for node 2 */
209
#define PUFFS_SETBACK_NOREF_N1        0x04        /* set pn PN_NOREFS for node 1 */
210
#define PUFFS_SETBACK_NOREF_N2        0x08        /* set pn PN_NOREFS for node 2 */
211
#define PUFFS_SETBACK_MASK        0x0f
212

    
213
/*
214
 * Flush operation.  This can be used to invalidate:
215
 * 1) name cache for one node
216
 * 2) name cache for all children 
217
 * 3) name cache for the entire mount
218
 * 4) page cache for a set of ranges in one node
219
 * 5) page cache for one entire node
220
 *
221
 * It can be used to flush:
222
 * 1) page cache for a set of ranges in one node
223
 * 2) page cache for one entire node
224
 */
225

    
226
struct puffs_flush {
227
        struct puffs_req        pf_req;
228

    
229
        puffs_cookie_t                pf_cookie;
230

    
231
        int                        pf_op;
232
        off_t                        pf_start;
233
        off_t                        pf_end;
234
};
235
#define PUFFS_INVAL_NAMECACHE_NODE                0
236
#define PUFFS_INVAL_NAMECACHE_DIR                1
237
#define PUFFS_INVAL_NAMECACHE_ALL                2
238
#define PUFFS_INVAL_PAGECACHE_NODE_RANGE        3
239
#define PUFFS_FLUSH_PAGECACHE_NODE_RANGE        4
240

    
241
/*
242
 * Credentials for an operation.  Can be either struct uucred for
243
 * ops called from a credential context or NOCRED/FSCRED for ops
244
 * called from within the kernel.  It is up to the implementation
245
 * if it makes a difference between these two and the super-user.
246
 */
247
struct puffs_kcred {
248
        struct uucred        pkcr_uuc;
249
        uint8_t                pkcr_type;
250
        uint8_t                pkcr_internal;
251
};
252
#define PUFFCRED_TYPE_UUC        1
253
#define PUFFCRED_TYPE_INTERNAL        2
254
#define PUFFCRED_CRED_NOCRED        1
255
#define PUFFCRED_CRED_FSCRED        2
256

    
257
/*
258
 * 2*MAXPHYS is the max size the system will attempt to copy,
259
 * else treated as garbage
260
 */
261
#define PUFFS_MSG_MAXSIZE        2*MAXPHYS
262
#define PUFFS_MSGSTRUCT_MAX        4096 /* approximate */
263

    
264
#define PUFFS_EXTNAMELEN KERNEL_NAME_MAX /* currently same as EXTATTR_MAXNAMELEN */
265

    
266
#define PUFFS_TOMOVE(a,b) (MIN((a), b->pmp_msg_maxsize - PUFFS_MSGSTRUCT_MAX))
267

    
268
/* puffs struct componentname built by kernel */
269
struct puffs_kcn {
270
        /* args */
271
        uint32_t                pkcn_nameiop;        /* namei operation        */
272
        uint32_t                pkcn_flags;        /* flags                */
273

    
274
        char pkcn_name[MAXPATHLEN];        /* nulterminated path component */
275
        size_t pkcn_namelen;                /* current component length        */
276
        size_t pkcn_consume;                /* IN: extra chars server ate   */
277
};
278

    
279

    
280
/*
281
 * Next come the individual requests.  They are all subclassed from
282
 * puffs_req and contain request-specific fields in addition.  Note
283
 * that there are some requests which have to handle arbitrary-length
284
 * buffers.
285
 *
286
 * The division is the following: puffs_req is to be touched only
287
 * by generic routines while the other stuff is supposed to be
288
 * modified only by specific routines.
289
 */
290

    
291
/*
292
 * aux structures for vfs operations.
293
 */
294
struct puffs_vfsmsg_unmount {
295
        struct puffs_req        pvfsr_pr;
296

    
297
        int                        pvfsr_flags;
298
};
299

    
300
struct puffs_vfsmsg_statvfs {
301
        struct puffs_req        pvfsr_pr;
302

    
303
        struct statvfs                pvfsr_sb;
304
};
305

    
306
struct puffs_vfsmsg_sync {
307
        struct puffs_req        pvfsr_pr;
308

    
309
        struct puffs_kcred        pvfsr_cred;
310
        int                        pvfsr_waitfor;
311
};
312

    
313
struct puffs_vfsmsg_fhtonode {
314
        struct puffs_req        pvfsr_pr;
315

    
316
        void                        *pvfsr_fhcookie;        /* IN        */
317
        enum vtype                pvfsr_vtype;                /* IN        */
318
        voff_t                        pvfsr_size;                /* IN        */
319
        dev_t                        pvfsr_rdev;                /* IN        */
320

    
321
        size_t                        pvfsr_dsize;                /* OUT */
322
        uint8_t                        pvfsr_data[0]                /* OUT, XXX */
323
                                    __aligned(ALIGNBYTES+1);
324
};
325

    
326
struct puffs_vfsmsg_nodetofh {
327
        struct puffs_req        pvfsr_pr;
328

    
329
        void                        *pvfsr_fhcookie;        /* OUT        */
330

    
331
        size_t                        pvfsr_dsize;                /* OUT/IN  */
332
        uint8_t                        pvfsr_data[0]                /* IN, XXX */
333
                                    __aligned(ALIGNBYTES+1);
334
};
335

    
336
struct puffs_vfsmsg_suspend {
337
        struct puffs_req        pvfsr_pr;
338

    
339
        int                        pvfsr_status;
340
};
341
#define PUFFS_SUSPEND_START        0
342
#define PUFFS_SUSPEND_SUSPENDED        1
343
#define PUFFS_SUSPEND_RESUME        2
344
#define PUFFS_SUSPEND_ERROR        3
345

    
346
#define PUFFS_EXTATTRCTL_HASNODE        0x01
347
#define PUFFS_EXTATTRCTL_HASATTRNAME        0x02
348

    
349
#define        PUFFS_OPEN_IO_DIRECT        0x01
350

    
351
struct puffs_vfsmsg_extattrctl {
352
        struct puffs_req        pvfsr_pr;
353

    
354
        int                        pvfsr_cmd;                          /* OUT */
355
        int                        pvfsr_attrnamespace;                  /* OUT */
356
        int                        pvfsr_flags;                          /* OUT */
357
        char                        pvfsr_attrname[PUFFS_EXTNAMELEN]; /* OUT */
358
};
359

    
360
/*
361
 * aux structures for vnode operations.
362
 */
363

    
364
struct puffs_vnmsg_lookup {
365
        struct puffs_req        pvn_pr;
366

    
367
        struct puffs_kcn        pvnr_cn;                /* OUT        */
368
        struct puffs_kcred        pvnr_cn_cred;                /* OUT        */
369

    
370
        puffs_cookie_t                pvnr_newnode;                /* IN        */
371
        enum vtype                pvnr_vtype;                /* IN        */
372
        voff_t                        pvnr_size;                /* IN        */
373
        dev_t                        pvnr_rdev;                /* IN        */
374
        /* Used only if PUFFS_KFLAG_CACHE_USE_TTL */
375
        struct vattr                pvnr_va;                /* IN        */
376
        struct timespec                pvnr_va_ttl;                /* IN        */
377
        struct timespec                pvnr_cn_ttl;                /* IN        */
378
};
379

    
380
struct puffs_vnmsg_create {
381
        struct puffs_req        pvn_pr;
382

    
383
        struct puffs_kcn        pvnr_cn;                /* OUT        */
384
        struct puffs_kcred        pvnr_cn_cred;                /* OUT        */
385

    
386
        struct vattr                pvnr_va;                /* OUT        */
387
        puffs_cookie_t                pvnr_newnode;                /* IN        */
388
        /* Used only if PUFFS_KFLAG_CACHE_USE_TTL */
389
        struct timespec                pvnr_va_ttl;                /* IN        */
390
        struct timespec                pvnr_cn_ttl;                /* IN        */
391
};
392

    
393
struct puffs_vnmsg_mknod {
394
        struct puffs_req        pvn_pr;
395

    
396
        struct puffs_kcn        pvnr_cn;                /* OUT        */
397
        struct puffs_kcred        pvnr_cn_cred;                /* OUT        */
398

    
399
        struct vattr                pvnr_va;                /* OUT        */
400
        puffs_cookie_t                pvnr_newnode;                /* IN        */
401
        /* Used only if PUFFS_KFLAG_CACHE_USE_TTL */
402
        struct timespec                pvnr_va_ttl;                /* IN        */
403
        struct timespec                pvnr_cn_ttl;                /* IN        */
404
};
405

    
406
struct puffs_vnmsg_open {
407
        struct puffs_req        pvn_pr;
408

    
409
        struct puffs_kcred        pvnr_cred;                /* OUT        */
410
        int                        pvnr_mode;                /* OUT        */
411
        int                        pvnr_oflags;                /* IN        */
412
};
413

    
414
struct puffs_vnmsg_close {
415
        struct puffs_req        pvn_pr;
416

    
417
        struct puffs_kcred        pvnr_cred;                /* OUT        */
418
        int                        pvnr_fflag;                /* OUT        */
419
};
420

    
421
struct puffs_vnmsg_access {
422
        struct puffs_req        pvn_pr;
423

    
424
        struct puffs_kcred        pvnr_cred;                /* OUT        */
425
        int                        pvnr_mode;                /* OUT        */
426
};
427

    
428
#define puffs_vnmsg_setattr puffs_vnmsg_setgetattr
429
#define puffs_vnmsg_getattr puffs_vnmsg_setgetattr
430
struct puffs_vnmsg_setgetattr {
431
        struct puffs_req        pvn_pr;
432

    
433
        struct puffs_kcred        pvnr_cred;                /* OUT        */
434
        struct vattr                pvnr_va;                /* IN/OUT (op depend) */
435
        /* Used only if PUFFS_KFLAG_CACHE_USE_TTL */
436
        struct timespec                pvnr_va_ttl;                /* IN        */
437
};
438

    
439
#define puffs_vnmsg_read puffs_vnmsg_rw
440
#define puffs_vnmsg_write puffs_vnmsg_rw
441
struct puffs_vnmsg_rw {
442
        struct puffs_req        pvn_pr;
443

    
444
        struct puffs_kcred        pvnr_cred;                /* OUT          */
445
        off_t                        pvnr_offset;                /* OUT          */
446
        size_t                        pvnr_resid;                /* IN/OUT */
447
        int                        pvnr_ioflag;                /* OUT          */
448

    
449
        uint8_t                        pvnr_data[0];                /* IN/OUT (wr/rd) */
450
};
451

    
452
#define puffs_vnmsg_ioctl puffs_vnreq_fcnioctl
453
#define puffs_vnmsg_fcntl puffs_vnreq_fcnioctl
454
struct puffs_vnmsg_fcnioctl {
455
        struct puffs_req        pvn_pr;
456

    
457
        struct puffs_kcred        pvnr_cred;
458
        u_long                        pvnr_command;
459
        pid_t                        pvnr_pid;
460
        int                        pvnr_fflag;
461

    
462
        void                        *pvnr_data;
463
        size_t                        pvnr_datalen;
464
        int                        pvnr_copyback;
465
};
466

    
467
struct puffs_vnmsg_poll {
468
        struct puffs_req        pvn_pr;
469

    
470
        int                        pvnr_events;                /* IN/OUT */
471
};
472

    
473
struct puffs_vnmsg_fsync {
474
        struct puffs_req        pvn_pr;
475

    
476
        struct puffs_kcred        pvnr_cred;                /* OUT        */
477
        off_t                        pvnr_offlo;                /* OUT        */
478
        off_t                        pvnr_offhi;                /* OUT        */
479
        int                        pvnr_flags;                /* OUT        */
480
};
481

    
482
struct puffs_vnmsg_seek {
483
        struct puffs_req        pvn_pr;
484

    
485
        struct puffs_kcred        pvnr_cred;                /* OUT        */
486
        off_t                        pvnr_oldoff;                /* OUT        */
487
        off_t                        pvnr_newoff;                /* OUT        */
488
};
489

    
490
struct puffs_vnmsg_remove {
491
        struct puffs_req        pvn_pr;
492

    
493
        struct puffs_kcn        pvnr_cn;                /* OUT        */
494
        struct puffs_kcred        pvnr_cn_cred;                /* OUT        */
495

    
496
        puffs_cookie_t                pvnr_cookie_targ;        /* OUT        */
497
};
498

    
499
struct puffs_vnmsg_mkdir {
500
        struct puffs_req        pvn_pr;
501

    
502
        struct puffs_kcn        pvnr_cn;                /* OUT        */
503
        struct puffs_kcred        pvnr_cn_cred;                /* OUT        */
504

    
505
        struct vattr                pvnr_va;                /* OUT        */
506
        puffs_cookie_t                pvnr_newnode;                /* IN        */
507
        /* Used only if PUFFS_KFLAG_CACHE_USE_TTL */
508
        struct timespec                pvnr_va_ttl;                /* IN        */
509
        struct timespec                pvnr_cn_ttl;                /* IN        */
510
};
511

    
512
struct puffs_vnmsg_rmdir {
513
        struct puffs_req        pvn_pr;
514

    
515
        struct puffs_kcn        pvnr_cn;                /* OUT        */
516
        struct puffs_kcred        pvnr_cn_cred;                /* OUT        */
517

    
518
        puffs_cookie_t                pvnr_cookie_targ;        /* OUT        */
519
};
520

    
521
struct puffs_vnmsg_link {
522
        struct puffs_req        pvn_pr;
523

    
524
        struct puffs_kcn        pvnr_cn;                /* OUT        */
525
        struct puffs_kcred        pvnr_cn_cred;                /* OUT        */
526

    
527
        puffs_cookie_t                pvnr_cookie_targ;        /* OUT        */
528
};
529

    
530
struct puffs_vnmsg_rename {
531
        struct puffs_req        pvn_pr;
532

    
533
        struct puffs_kcn        pvnr_cn_src;                /* OUT        */
534
        struct puffs_kcred        pvnr_cn_src_cred;        /* OUT        */
535
        struct puffs_kcn        pvnr_cn_targ;                /* OUT        */
536
        struct puffs_kcred        pvnr_cn_targ_cred;        /* OUT        */
537

    
538
        puffs_cookie_t                pvnr_cookie_src;        /* OUT        */
539
        puffs_cookie_t                pvnr_cookie_targ;        /* OUT        */
540
        puffs_cookie_t                pvnr_cookie_targdir;        /* OUT        */
541
};
542

    
543
struct puffs_vnmsg_symlink {
544
        struct puffs_req        pvn_pr;
545

    
546
        struct puffs_kcn        pvnr_cn;                /* OUT        */
547
        struct puffs_kcred        pvnr_cn_cred;                /* OUT        */
548

    
549
        struct vattr                pvnr_va;                /* OUT        */
550
        puffs_cookie_t                pvnr_newnode;                /* IN        */
551
        char                        pvnr_link[MAXPATHLEN];        /* OUT        */
552
        /* Used only if PUFFS_KFLAG_CACHE_USE_TTL */
553
        struct timespec                pvnr_va_ttl;                /* IN        */
554
        struct timespec                pvnr_cn_ttl;                /* IN        */
555
};
556

    
557
struct puffs_vnmsg_readdir {
558
        struct puffs_req        pvn_pr;
559

    
560
        struct puffs_kcred        pvnr_cred;                /* OUT          */
561
        off_t                        pvnr_offset;                /* IN/OUT */
562
        size_t                        pvnr_resid;                /* IN/OUT */
563
        size_t                        pvnr_ncookies;                /* IN/OUT */
564
        int                        pvnr_eofflag;                /* IN     */
565

    
566
        size_t                        pvnr_dentoff;                /* OUT    */
567
        uint8_t                        pvnr_data[0]                /* IN            */
568
                                    __aligned(ALIGNBYTES+1);
569
};
570

    
571
struct puffs_vnmsg_readlink {
572
        struct puffs_req        pvn_pr;
573

    
574
        struct puffs_kcred        pvnr_cred;                /* OUT */
575
        size_t                        pvnr_linklen;                /* IN  */
576
        char                        pvnr_link[MAXPATHLEN];        /* IN  */
577
};
578

    
579
struct puffs_vnmsg_reclaim {
580
        struct puffs_req        pvn_pr;
581

    
582
        int                        pvnr_nlookup;                /* OUT */
583
};
584

    
585
struct puffs_vnmsg_inactive {
586
        struct puffs_req        pvn_pr;
587
};
588

    
589
struct puffs_vnmsg_print {
590
        struct puffs_req        pvn_pr;
591

    
592
        /* empty */
593
};
594

    
595
struct puffs_vnmsg_pathconf {
596
        struct puffs_req        pvn_pr;
597

    
598
        int                        pvnr_name;                /* OUT        */
599
        register_t                pvnr_retval;                /* IN        */
600
};
601

    
602
struct puffs_vnmsg_advlock {
603
        struct puffs_req        pvn_pr;
604

    
605
        struct flock                pvnr_fl;                /* OUT        */
606
        void                        *pvnr_id;                /* OUT        */
607
        int                        pvnr_op;                /* OUT        */
608
        int                        pvnr_flags;                /* OUT        */
609
};
610

    
611
struct puffs_vnmsg_mmap {
612
        struct puffs_req        pvn_pr;
613

    
614
        vm_prot_t                pvnr_prot;                /* OUT        */
615
        struct puffs_kcred        pvnr_cred;                /* OUT        */
616
};
617

    
618
struct puffs_vnmsg_abortop {
619
        struct puffs_req        pvn_pr;
620

    
621
        struct puffs_kcn        pvnr_cn;                /* OUT        */
622
        struct puffs_kcred        pvnr_cn_cred;                /* OUT        */
623
};
624

    
625
struct puffs_vnmsg_getextattr {
626
        struct puffs_req        pvn_pr;
627

    
628
        int                        pvnr_attrnamespace;                /* OUT          */
629
        char                        pvnr_attrname[PUFFS_EXTNAMELEN];/* OUT          */
630

    
631
        struct puffs_kcred        pvnr_cred;                        /* OUT          */
632
        size_t                        pvnr_datasize;                        /* IN          */
633

    
634
        size_t                        pvnr_resid;                        /* IN/OUT */
635
        uint8_t                        pvnr_data[0]                        /* IN          */
636
                                    __aligned(ALIGNBYTES+1);
637
};
638

    
639
struct puffs_vnmsg_setextattr {
640
        struct puffs_req        pvn_pr;
641

    
642
        int                        pvnr_attrnamespace;                /* OUT          */
643
        char                        pvnr_attrname[PUFFS_EXTNAMELEN];/* OUT          */
644

    
645
        struct puffs_kcred        pvnr_cred;                        /* OUT        */
646

    
647
        size_t                        pvnr_resid;                        /* IN/OUT */
648
        uint8_t                        pvnr_data[0]                        /* OUT          */
649
                                    __aligned(ALIGNBYTES+1);
650
};
651

    
652
struct puffs_vnmsg_listextattr {
653
        struct puffs_req        pvn_pr;
654

    
655
        int                        pvnr_attrnamespace;                /* OUT          */
656

    
657
        struct puffs_kcred        pvnr_cred;                        /* OUT        */
658
        size_t                        pvnr_datasize;                        /* IN          */
659

    
660
        size_t                        pvnr_resid;                        /* IN/OUT */
661
        int                        pvnr_flag;                        /* OUT */
662
        uint8_t                        pvnr_data[0]                        /* IN          */
663
                                    __aligned(ALIGNBYTES+1);
664
};
665

    
666
struct puffs_vnmsg_deleteextattr {
667
        struct puffs_req        pvn_pr;
668

    
669
        int                        pvnr_attrnamespace;                /* OUT          */
670
        char                        pvnr_attrname[PUFFS_EXTNAMELEN];/* OUT          */
671

    
672
        struct puffs_kcred        pvnr_cred;                        /* OUT        */
673
};
674

    
675
#define PUFFS_HAVE_FALLOCATE 1
676
struct puffs_vnmsg_fallocate {
677
        struct puffs_req        pvn_pr;
678
        off_t                        pvnr_off;                        /* OUT    */
679
        off_t                        pvnr_len;                        /* OUT    */
680
};
681

    
682
struct puffs_vnmsg_fdiscard {
683
        struct puffs_req        pvn_pr;
684
        off_t                        pvnr_off;                        /* OUT    */
685
        off_t                        pvnr_len;                        /* OUT    */
686
};
687

    
688
/*
689
 * For cache reports.  Everything is always out-out-out, no replies
690
 */
691

    
692
struct puffs_cacherun {
693
        off_t                        pcache_runstart;
694
        off_t                        pcache_runend;
695
};
696

    
697
/* cache info.  old used for write now */
698
struct puffs_cacheinfo {
699
        struct puffs_req        pcache_pr;
700

    
701
        int                        pcache_type;
702
        size_t                        pcache_nruns;                
703
        struct puffs_cacherun        pcache_runs[0];
704
};
705
#define PCACHE_TYPE_READ        0
706
#define PCACHE_TYPE_WRITE        1
707

    
708
/*
709
 * Error notification.  Always outgoing, no response, no remorse.
710
 */
711
struct puffs_error {
712
        struct puffs_req        perr_pr;
713

    
714
        int                        perr_error;
715
        char                        perr_str[256];
716
};
717

    
718
#endif /* _FS_PUFFS_PUFFS_MSGIF_H_ */