Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/include/net/9p/9p.h
10818 views
1
/*
2
* include/net/9p/9p.h
3
*
4
* 9P protocol definitions.
5
*
6
* Copyright (C) 2005 by Latchesar Ionkov <[email protected]>
7
* Copyright (C) 2004 by Eric Van Hensbergen <[email protected]>
8
* Copyright (C) 2002 by Ron Minnich <[email protected]>
9
*
10
* This program is free software; you can redistribute it and/or modify
11
* it under the terms of the GNU General Public License version 2
12
* as published by the Free Software Foundation.
13
*
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
18
*
19
* You should have received a copy of the GNU General Public License
20
* along with this program; if not, write to:
21
* Free Software Foundation
22
* 51 Franklin Street, Fifth Floor
23
* Boston, MA 02111-1301 USA
24
*
25
*/
26
27
#ifndef NET_9P_H
28
#define NET_9P_H
29
30
/**
31
* enum p9_debug_flags - bits for mount time debug parameter
32
* @P9_DEBUG_ERROR: more verbose error messages including original error string
33
* @P9_DEBUG_9P: 9P protocol tracing
34
* @P9_DEBUG_VFS: VFS API tracing
35
* @P9_DEBUG_CONV: protocol conversion tracing
36
* @P9_DEBUG_MUX: trace management of concurrent transactions
37
* @P9_DEBUG_TRANS: transport tracing
38
* @P9_DEBUG_SLABS: memory management tracing
39
* @P9_DEBUG_FCALL: verbose dump of protocol messages
40
* @P9_DEBUG_FID: fid allocation/deallocation tracking
41
* @P9_DEBUG_PKT: packet marshalling/unmarshalling
42
* @P9_DEBUG_FSC: FS-cache tracing
43
*
44
* These flags are passed at mount time to turn on various levels of
45
* verbosity and tracing which will be output to the system logs.
46
*/
47
48
enum p9_debug_flags {
49
P9_DEBUG_ERROR = (1<<0),
50
P9_DEBUG_9P = (1<<2),
51
P9_DEBUG_VFS = (1<<3),
52
P9_DEBUG_CONV = (1<<4),
53
P9_DEBUG_MUX = (1<<5),
54
P9_DEBUG_TRANS = (1<<6),
55
P9_DEBUG_SLABS = (1<<7),
56
P9_DEBUG_FCALL = (1<<8),
57
P9_DEBUG_FID = (1<<9),
58
P9_DEBUG_PKT = (1<<10),
59
P9_DEBUG_FSC = (1<<11),
60
};
61
62
#ifdef CONFIG_NET_9P_DEBUG
63
extern unsigned int p9_debug_level;
64
65
#define P9_DPRINTK(level, format, arg...) \
66
do { \
67
if ((p9_debug_level & level) == level) {\
68
if (level == P9_DEBUG_9P) \
69
printk(KERN_NOTICE "(%8.8d) " \
70
format , task_pid_nr(current) , ## arg); \
71
else \
72
printk(KERN_NOTICE "-- %s (%d): " \
73
format , __func__, task_pid_nr(current) , ## arg); \
74
} \
75
} while (0)
76
77
#else
78
#define P9_DPRINTK(level, format, arg...) do { } while (0)
79
#endif
80
81
#define P9_EPRINTK(level, format, arg...) \
82
do { \
83
printk(level "9p: %s (%d): " \
84
format , __func__, task_pid_nr(current), ## arg); \
85
} while (0)
86
87
/**
88
* enum p9_msg_t - 9P message types
89
* @P9_TLERROR: not used
90
* @P9_RLERROR: response for any failed request for 9P2000.L
91
* @P9_TSTATFS: file system status request
92
* @P9_RSTATFS: file system status response
93
* @P9_TSYMLINK: make symlink request
94
* @P9_RSYMLINK: make symlink response
95
* @P9_TMKNOD: create a special file object request
96
* @P9_RMKNOD: create a special file object response
97
* @P9_TLCREATE: prepare a handle for I/O on an new file for 9P2000.L
98
* @P9_RLCREATE: response with file access information for 9P2000.L
99
* @P9_TRENAME: rename request
100
* @P9_RRENAME: rename response
101
* @P9_TMKDIR: create a directory request
102
* @P9_RMKDIR: create a directory response
103
* @P9_TVERSION: version handshake request
104
* @P9_RVERSION: version handshake response
105
* @P9_TAUTH: request to establish authentication channel
106
* @P9_RAUTH: response with authentication information
107
* @P9_TATTACH: establish user access to file service
108
* @P9_RATTACH: response with top level handle to file hierarchy
109
* @P9_TERROR: not used
110
* @P9_RERROR: response for any failed request
111
* @P9_TFLUSH: request to abort a previous request
112
* @P9_RFLUSH: response when previous request has been cancelled
113
* @P9_TWALK: descend a directory hierarchy
114
* @P9_RWALK: response with new handle for position within hierarchy
115
* @P9_TOPEN: prepare a handle for I/O on an existing file
116
* @P9_ROPEN: response with file access information
117
* @P9_TCREATE: prepare a handle for I/O on a new file
118
* @P9_RCREATE: response with file access information
119
* @P9_TREAD: request to transfer data from a file or directory
120
* @P9_RREAD: response with data requested
121
* @P9_TWRITE: reuqest to transfer data to a file
122
* @P9_RWRITE: response with out much data was transferred to file
123
* @P9_TCLUNK: forget about a handle to an entity within the file system
124
* @P9_RCLUNK: response when server has forgotten about the handle
125
* @P9_TREMOVE: request to remove an entity from the hierarchy
126
* @P9_RREMOVE: response when server has removed the entity
127
* @P9_TSTAT: request file entity attributes
128
* @P9_RSTAT: response with file entity attributes
129
* @P9_TWSTAT: request to update file entity attributes
130
* @P9_RWSTAT: response when file entity attributes are updated
131
*
132
* There are 14 basic operations in 9P2000, paired as
133
* requests and responses. The one special case is ERROR
134
* as there is no @P9_TERROR request for clients to transmit to
135
* the server, but the server may respond to any other request
136
* with an @P9_RERROR.
137
*
138
* See Also: http://plan9.bell-labs.com/sys/man/5/INDEX.html
139
*/
140
141
enum p9_msg_t {
142
P9_TLERROR = 6,
143
P9_RLERROR,
144
P9_TSTATFS = 8,
145
P9_RSTATFS,
146
P9_TLOPEN = 12,
147
P9_RLOPEN,
148
P9_TLCREATE = 14,
149
P9_RLCREATE,
150
P9_TSYMLINK = 16,
151
P9_RSYMLINK,
152
P9_TMKNOD = 18,
153
P9_RMKNOD,
154
P9_TRENAME = 20,
155
P9_RRENAME,
156
P9_TREADLINK = 22,
157
P9_RREADLINK,
158
P9_TGETATTR = 24,
159
P9_RGETATTR,
160
P9_TSETATTR = 26,
161
P9_RSETATTR,
162
P9_TXATTRWALK = 30,
163
P9_RXATTRWALK,
164
P9_TXATTRCREATE = 32,
165
P9_RXATTRCREATE,
166
P9_TREADDIR = 40,
167
P9_RREADDIR,
168
P9_TFSYNC = 50,
169
P9_RFSYNC,
170
P9_TLOCK = 52,
171
P9_RLOCK,
172
P9_TGETLOCK = 54,
173
P9_RGETLOCK,
174
P9_TLINK = 70,
175
P9_RLINK,
176
P9_TMKDIR = 72,
177
P9_RMKDIR,
178
P9_TVERSION = 100,
179
P9_RVERSION,
180
P9_TAUTH = 102,
181
P9_RAUTH,
182
P9_TATTACH = 104,
183
P9_RATTACH,
184
P9_TERROR = 106,
185
P9_RERROR,
186
P9_TFLUSH = 108,
187
P9_RFLUSH,
188
P9_TWALK = 110,
189
P9_RWALK,
190
P9_TOPEN = 112,
191
P9_ROPEN,
192
P9_TCREATE = 114,
193
P9_RCREATE,
194
P9_TREAD = 116,
195
P9_RREAD,
196
P9_TWRITE = 118,
197
P9_RWRITE,
198
P9_TCLUNK = 120,
199
P9_RCLUNK,
200
P9_TREMOVE = 122,
201
P9_RREMOVE,
202
P9_TSTAT = 124,
203
P9_RSTAT,
204
P9_TWSTAT = 126,
205
P9_RWSTAT,
206
};
207
208
/**
209
* enum p9_open_mode_t - 9P open modes
210
* @P9_OREAD: open file for reading only
211
* @P9_OWRITE: open file for writing only
212
* @P9_ORDWR: open file for reading or writing
213
* @P9_OEXEC: open file for execution
214
* @P9_OTRUNC: truncate file to zero-length before opening it
215
* @P9_OREXEC: close the file when an exec(2) system call is made
216
* @P9_ORCLOSE: remove the file when the file is closed
217
* @P9_OAPPEND: open the file and seek to the end
218
* @P9_OEXCL: only create a file, do not open it
219
*
220
* 9P open modes differ slightly from Posix standard modes.
221
* In particular, there are extra modes which specify different
222
* semantic behaviors than may be available on standard Posix
223
* systems. For example, @P9_OREXEC and @P9_ORCLOSE are modes that
224
* most likely will not be issued from the Linux VFS client, but may
225
* be supported by servers.
226
*
227
* See Also: http://plan9.bell-labs.com/magic/man2html/2/open
228
*/
229
230
enum p9_open_mode_t {
231
P9_OREAD = 0x00,
232
P9_OWRITE = 0x01,
233
P9_ORDWR = 0x02,
234
P9_OEXEC = 0x03,
235
P9_OTRUNC = 0x10,
236
P9_OREXEC = 0x20,
237
P9_ORCLOSE = 0x40,
238
P9_OAPPEND = 0x80,
239
P9_OEXCL = 0x1000,
240
};
241
242
/**
243
* enum p9_perm_t - 9P permissions
244
* @P9_DMDIR: mode bit for directories
245
* @P9_DMAPPEND: mode bit for is append-only
246
* @P9_DMEXCL: mode bit for excluse use (only one open handle allowed)
247
* @P9_DMMOUNT: mode bit for mount points
248
* @P9_DMAUTH: mode bit for authentication file
249
* @P9_DMTMP: mode bit for non-backed-up files
250
* @P9_DMSYMLINK: mode bit for symbolic links (9P2000.u)
251
* @P9_DMLINK: mode bit for hard-link (9P2000.u)
252
* @P9_DMDEVICE: mode bit for device files (9P2000.u)
253
* @P9_DMNAMEDPIPE: mode bit for named pipe (9P2000.u)
254
* @P9_DMSOCKET: mode bit for socket (9P2000.u)
255
* @P9_DMSETUID: mode bit for setuid (9P2000.u)
256
* @P9_DMSETGID: mode bit for setgid (9P2000.u)
257
* @P9_DMSETVTX: mode bit for sticky bit (9P2000.u)
258
*
259
* 9P permissions differ slightly from Posix standard modes.
260
*
261
* See Also: http://plan9.bell-labs.com/magic/man2html/2/stat
262
*/
263
enum p9_perm_t {
264
P9_DMDIR = 0x80000000,
265
P9_DMAPPEND = 0x40000000,
266
P9_DMEXCL = 0x20000000,
267
P9_DMMOUNT = 0x10000000,
268
P9_DMAUTH = 0x08000000,
269
P9_DMTMP = 0x04000000,
270
/* 9P2000.u extensions */
271
P9_DMSYMLINK = 0x02000000,
272
P9_DMLINK = 0x01000000,
273
P9_DMDEVICE = 0x00800000,
274
P9_DMNAMEDPIPE = 0x00200000,
275
P9_DMSOCKET = 0x00100000,
276
P9_DMSETUID = 0x00080000,
277
P9_DMSETGID = 0x00040000,
278
P9_DMSETVTX = 0x00010000,
279
};
280
281
/**
282
* enum p9_qid_t - QID types
283
* @P9_QTDIR: directory
284
* @P9_QTAPPEND: append-only
285
* @P9_QTEXCL: excluse use (only one open handle allowed)
286
* @P9_QTMOUNT: mount points
287
* @P9_QTAUTH: authentication file
288
* @P9_QTTMP: non-backed-up files
289
* @P9_QTSYMLINK: symbolic links (9P2000.u)
290
* @P9_QTLINK: hard-link (9P2000.u)
291
* @P9_QTFILE: normal files
292
*
293
* QID types are a subset of permissions - they are primarily
294
* used to differentiate semantics for a file system entity via
295
* a jump-table. Their value is also the most significant 16 bits
296
* of the permission_t
297
*
298
* See Also: http://plan9.bell-labs.com/magic/man2html/2/stat
299
*/
300
enum p9_qid_t {
301
P9_QTDIR = 0x80,
302
P9_QTAPPEND = 0x40,
303
P9_QTEXCL = 0x20,
304
P9_QTMOUNT = 0x10,
305
P9_QTAUTH = 0x08,
306
P9_QTTMP = 0x04,
307
P9_QTSYMLINK = 0x02,
308
P9_QTLINK = 0x01,
309
P9_QTFILE = 0x00,
310
};
311
312
/* 9P Magic Numbers */
313
#define P9_NOTAG (u16)(~0)
314
#define P9_NOFID (u32)(~0)
315
#define P9_MAXWELEM 16
316
317
/* ample room for Twrite/Rread header */
318
#define P9_IOHDRSZ 24
319
320
/* Room for readdir header */
321
#define P9_READDIRHDRSZ 24
322
323
/**
324
* struct p9_str - length prefixed string type
325
* @len: length of the string
326
* @str: the string
327
*
328
* The protocol uses length prefixed strings for all
329
* string data, so we replicate that for our internal
330
* string members.
331
*/
332
333
struct p9_str {
334
u16 len;
335
char *str;
336
};
337
338
/**
339
* struct p9_qid - file system entity information
340
* @type: 8-bit type &p9_qid_t
341
* @version: 16-bit monotonically incrementing version number
342
* @path: 64-bit per-server-unique ID for a file system element
343
*
344
* qids are identifiers used by 9P servers to track file system
345
* entities. The type is used to differentiate semantics for operations
346
* on the entity (ie. read means something different on a directory than
347
* on a file). The path provides a server unique index for an entity
348
* (roughly analogous to an inode number), while the version is updated
349
* every time a file is modified and can be used to maintain cache
350
* coherency between clients and serves.
351
* Servers will often differentiate purely synthetic entities by setting
352
* their version to 0, signaling that they should never be cached and
353
* should be accessed synchronously.
354
*
355
* See Also://plan9.bell-labs.com/magic/man2html/2/stat
356
*/
357
358
struct p9_qid {
359
u8 type;
360
u32 version;
361
u64 path;
362
};
363
364
/**
365
* struct p9_wstat - file system metadata information
366
* @size: length prefix for this stat structure instance
367
* @type: the type of the server (equivalent to a major number)
368
* @dev: the sub-type of the server (equivalent to a minor number)
369
* @qid: unique id from the server of type &p9_qid
370
* @mode: Plan 9 format permissions of type &p9_perm_t
371
* @atime: Last access/read time
372
* @mtime: Last modify/write time
373
* @length: file length
374
* @name: last element of path (aka filename) in type &p9_str
375
* @uid: owner name in type &p9_str
376
* @gid: group owner in type &p9_str
377
* @muid: last modifier in type &p9_str
378
* @extension: area used to encode extended UNIX support in type &p9_str
379
* @n_uid: numeric user id of owner (part of 9p2000.u extension)
380
* @n_gid: numeric group id (part of 9p2000.u extension)
381
* @n_muid: numeric user id of laster modifier (part of 9p2000.u extension)
382
*
383
* See Also: http://plan9.bell-labs.com/magic/man2html/2/stat
384
*/
385
386
struct p9_wstat {
387
u16 size;
388
u16 type;
389
u32 dev;
390
struct p9_qid qid;
391
u32 mode;
392
u32 atime;
393
u32 mtime;
394
u64 length;
395
char *name;
396
char *uid;
397
char *gid;
398
char *muid;
399
char *extension; /* 9p2000.u extensions */
400
u32 n_uid; /* 9p2000.u extensions */
401
u32 n_gid; /* 9p2000.u extensions */
402
u32 n_muid; /* 9p2000.u extensions */
403
};
404
405
struct p9_stat_dotl {
406
u64 st_result_mask;
407
struct p9_qid qid;
408
u32 st_mode;
409
u32 st_uid;
410
u32 st_gid;
411
u64 st_nlink;
412
u64 st_rdev;
413
u64 st_size;
414
u64 st_blksize;
415
u64 st_blocks;
416
u64 st_atime_sec;
417
u64 st_atime_nsec;
418
u64 st_mtime_sec;
419
u64 st_mtime_nsec;
420
u64 st_ctime_sec;
421
u64 st_ctime_nsec;
422
u64 st_btime_sec;
423
u64 st_btime_nsec;
424
u64 st_gen;
425
u64 st_data_version;
426
};
427
428
#define P9_STATS_MODE 0x00000001ULL
429
#define P9_STATS_NLINK 0x00000002ULL
430
#define P9_STATS_UID 0x00000004ULL
431
#define P9_STATS_GID 0x00000008ULL
432
#define P9_STATS_RDEV 0x00000010ULL
433
#define P9_STATS_ATIME 0x00000020ULL
434
#define P9_STATS_MTIME 0x00000040ULL
435
#define P9_STATS_CTIME 0x00000080ULL
436
#define P9_STATS_INO 0x00000100ULL
437
#define P9_STATS_SIZE 0x00000200ULL
438
#define P9_STATS_BLOCKS 0x00000400ULL
439
440
#define P9_STATS_BTIME 0x00000800ULL
441
#define P9_STATS_GEN 0x00001000ULL
442
#define P9_STATS_DATA_VERSION 0x00002000ULL
443
444
#define P9_STATS_BASIC 0x000007ffULL /* Mask for fields up to BLOCKS */
445
#define P9_STATS_ALL 0x00003fffULL /* Mask for All fields above */
446
447
/**
448
* struct p9_iattr_dotl - P9 inode attribute for setattr
449
* @valid: bitfield specifying which fields are valid
450
* same as in struct iattr
451
* @mode: File permission bits
452
* @uid: user id of owner
453
* @gid: group id
454
* @size: File size
455
* @atime_sec: Last access time, seconds
456
* @atime_nsec: Last access time, nanoseconds
457
* @mtime_sec: Last modification time, seconds
458
* @mtime_nsec: Last modification time, nanoseconds
459
*/
460
461
struct p9_iattr_dotl {
462
u32 valid;
463
u32 mode;
464
u32 uid;
465
u32 gid;
466
u64 size;
467
u64 atime_sec;
468
u64 atime_nsec;
469
u64 mtime_sec;
470
u64 mtime_nsec;
471
};
472
473
#define P9_LOCK_SUCCESS 0
474
#define P9_LOCK_BLOCKED 1
475
#define P9_LOCK_ERROR 2
476
#define P9_LOCK_GRACE 3
477
478
#define P9_LOCK_FLAGS_BLOCK 1
479
#define P9_LOCK_FLAGS_RECLAIM 2
480
481
/* struct p9_flock: POSIX lock structure
482
* @type - type of lock
483
* @flags - lock flags
484
* @start - starting offset of the lock
485
* @length - number of bytes
486
* @proc_id - process id which wants to take lock
487
* @client_id - client id
488
*/
489
490
struct p9_flock {
491
u8 type;
492
u32 flags;
493
u64 start;
494
u64 length;
495
u32 proc_id;
496
char *client_id;
497
};
498
499
/* struct p9_getlock: getlock structure
500
* @type - type of lock
501
* @start - starting offset of the lock
502
* @length - number of bytes
503
* @proc_id - process id which wants to take lock
504
* @client_id - client id
505
*/
506
507
struct p9_getlock {
508
u8 type;
509
u64 start;
510
u64 length;
511
u32 proc_id;
512
char *client_id;
513
};
514
515
/* Structures for Protocol Operations */
516
struct p9_tstatfs {
517
u32 fid;
518
};
519
520
struct p9_rstatfs {
521
u32 type;
522
u32 bsize;
523
u64 blocks;
524
u64 bfree;
525
u64 bavail;
526
u64 files;
527
u64 ffree;
528
u64 fsid;
529
u32 namelen;
530
};
531
532
struct p9_trename {
533
u32 fid;
534
u32 newdirfid;
535
struct p9_str name;
536
};
537
538
struct p9_rrename {
539
};
540
541
struct p9_tversion {
542
u32 msize;
543
struct p9_str version;
544
};
545
546
struct p9_rversion {
547
u32 msize;
548
struct p9_str version;
549
};
550
551
struct p9_tauth {
552
u32 afid;
553
struct p9_str uname;
554
struct p9_str aname;
555
u32 n_uname; /* 9P2000.u extensions */
556
};
557
558
struct p9_rauth {
559
struct p9_qid qid;
560
};
561
562
struct p9_rerror {
563
struct p9_str error;
564
u32 errno; /* 9p2000.u extension */
565
};
566
567
struct p9_tflush {
568
u16 oldtag;
569
};
570
571
struct p9_rflush {
572
};
573
574
struct p9_tattach {
575
u32 fid;
576
u32 afid;
577
struct p9_str uname;
578
struct p9_str aname;
579
u32 n_uname; /* 9P2000.u extensions */
580
};
581
582
struct p9_rattach {
583
struct p9_qid qid;
584
};
585
586
struct p9_twalk {
587
u32 fid;
588
u32 newfid;
589
u16 nwname;
590
struct p9_str wnames[16];
591
};
592
593
struct p9_rwalk {
594
u16 nwqid;
595
struct p9_qid wqids[16];
596
};
597
598
struct p9_topen {
599
u32 fid;
600
u8 mode;
601
};
602
603
struct p9_ropen {
604
struct p9_qid qid;
605
u32 iounit;
606
};
607
608
struct p9_tcreate {
609
u32 fid;
610
struct p9_str name;
611
u32 perm;
612
u8 mode;
613
struct p9_str extension;
614
};
615
616
struct p9_rcreate {
617
struct p9_qid qid;
618
u32 iounit;
619
};
620
621
struct p9_tread {
622
u32 fid;
623
u64 offset;
624
u32 count;
625
};
626
627
struct p9_rread {
628
u32 count;
629
u8 *data;
630
};
631
632
struct p9_twrite {
633
u32 fid;
634
u64 offset;
635
u32 count;
636
u8 *data;
637
};
638
639
struct p9_rwrite {
640
u32 count;
641
};
642
643
struct p9_treaddir {
644
u32 fid;
645
u64 offset;
646
u32 count;
647
};
648
649
struct p9_rreaddir {
650
u32 count;
651
u8 *data;
652
};
653
654
655
struct p9_tclunk {
656
u32 fid;
657
};
658
659
struct p9_rclunk {
660
};
661
662
struct p9_tremove {
663
u32 fid;
664
};
665
666
struct p9_rremove {
667
};
668
669
struct p9_tstat {
670
u32 fid;
671
};
672
673
struct p9_rstat {
674
struct p9_wstat stat;
675
};
676
677
struct p9_twstat {
678
u32 fid;
679
struct p9_wstat stat;
680
};
681
682
struct p9_rwstat {
683
};
684
685
/**
686
* struct p9_fcall - primary packet structure
687
* @size: prefixed length of the structure
688
* @id: protocol operating identifier of type &p9_msg_t
689
* @tag: transaction id of the request
690
* @offset: used by marshalling routines to track current position in buffer
691
* @capacity: used by marshalling routines to track total malloc'd capacity
692
* @pubuf: Payload user buffer given by the caller
693
* @pkbuf: Payload kernel buffer given by the caller
694
* @pbuf_size: pubuf/pkbuf(only one will be !NULL) size to be read/write.
695
* @private: For transport layer's use.
696
* @sdata: payload
697
*
698
* &p9_fcall represents the structure for all 9P RPC
699
* transactions. Requests are packaged into fcalls, and reponses
700
* must be extracted from them.
701
*
702
* See Also: http://plan9.bell-labs.com/magic/man2html/2/fcall
703
*/
704
705
struct p9_fcall {
706
u32 size;
707
u8 id;
708
u16 tag;
709
710
size_t offset;
711
size_t capacity;
712
char __user *pubuf;
713
char *pkbuf;
714
size_t pbuf_size;
715
void *private;
716
717
u8 *sdata;
718
};
719
720
struct p9_idpool;
721
722
int p9_errstr2errno(char *errstr, int len);
723
724
struct p9_idpool *p9_idpool_create(void);
725
void p9_idpool_destroy(struct p9_idpool *);
726
int p9_idpool_get(struct p9_idpool *p);
727
void p9_idpool_put(int id, struct p9_idpool *p);
728
int p9_idpool_check(int id, struct p9_idpool *p);
729
730
int p9_error_init(void);
731
int p9_trans_fd_init(void);
732
void p9_trans_fd_exit(void);
733
#endif /* NET_9P_H */
734
735