- more 2.6.17 port work (still does not build)
[linux-flexiantxendom0-3.2.10.git] / fs / dmapi / dmapi.h
1 /*
2  * Copyright (c) 1995-2003 Silicon Graphics, Inc.  All Rights Reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of version 2.1 of the GNU Lesser General Public License
6  * as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it would be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11  *
12  * Further, this software is distributed without any warranty that it is
13  * free of the rightful claim of any third person regarding infringement
14  * or the like.  Any license provided herein, whether implied or
15  * otherwise, applies only to this software file.  Patent licenses, if
16  * any, provided herein do not apply to combinations of this program with
17  * other software, or any other product whatsoever.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this program; if not, write the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307,
22  * USA.
23  *
24  * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
25  * Mountain View, CA  94043, or:
26  *
27  * http://www.sgi.com
28  *
29  * For further information regarding this notice, see:
30  *
31  * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
32  */
33
34 #ifndef __DMAPI_H__
35 #define __DMAPI_H__
36
37 #ifdef  __cplusplus
38 extern  "C" {
39 #endif
40
41 #ifndef __KERNEL__
42 #include <sys/types.h>
43 #endif
44 #include <linux/types.h>
45
46 #ifndef __user
47 #define __user
48 #endif
49
50 /**************************************************************************
51  *                                                                        *
52  * The SGI implementation of DMAPI is based upon the X/Open document      *
53  *      Systems Management: Data Storage Managment (XDSM) API             *
54  * dated February 1997.  Not all DMAPI functions and structure fields     *
55  * have been implemented.  Most importantly, the DMAPI functions          *
56  * dm_request_right, dm_release_right, dm_query_right, dm_upgrade_right   *
57  * and dm_downgrade_right do not work as described in the specification.  *
58  *                                                                        *
59  * The XFS filesystem currently does not allow its locking mechanisms to  *
60  * be externally accessed from user space.  While the above-mentioned     *
61  * dm_xxx_right functions exist and can be called by applications, they   *
62  * always return successfully without actually obtaining any locks        *
63  * within the filesystem.                                                 *
64  *                                                                        *
65  * Applications which do not need full rights support and which only      *
66  * make dm_xxx_right calls in order to satisfy the input requirements of  *
67  * other DMAPI calls should be able to use these routines to avoid        *
68  * having to implement special-case code for SGI platforms.  Applications *
69  * which truely need the capabilities of a full implementation of rights  *
70  * will unfortunately have to come up with alternate software solutions   *
71  * until such time as rights can be completely implemented.               *
72  *                                                                        *
73  * Functions and structure fields defined within this file which are not  *
74  * supported in the SGI implementation of DMAPI are indicated by comments *
75  * following their definitions such as "not supported", or "not           *
76  * completely supported".  Any function or field not so marked may be     *
77  * assumed to work exactly according to the spec.                         *
78  *                                                                        *
79  **************************************************************************/
80
81
82
83 /* The first portion of this file contains defines and typedefs that are
84    DMAPI implementation-dependent, and could be different on other platforms.
85 */
86
87 typedef __s64           dm_attrloc_t;
88 typedef unsigned int    dm_boolean_t;
89 typedef __u64           dm_eventset_t;
90 typedef __u64           dm_fsid_t;
91 typedef __u64           dm_ino_t;
92 typedef __u32           dm_igen_t;
93 typedef __s64           dm_off_t;
94 typedef unsigned int    dm_sequence_t;
95 typedef int             dm_sessid_t;
96 typedef __u64           dm_size_t;
97 typedef __s64           dm_ssize_t;
98 typedef int             dm_token_t;
99
100 /* XXX dev_t, mode_t, and nlink_t are not the same size in kernel space
101    and user space.  This affects the field offsets for dm_stat_t.
102    The following solution is temporary.
103
104    user space sizes:  dev_t=8  mode_t=4  nlink_t=4
105    kernel space    :  dev_t=2  mode_t=2  nlink_t=2
106
107 */
108 typedef __s64           dm_dev_t;
109 typedef int             dm_mode_t;
110 typedef int             dm_nlink_t;
111
112
113 #define DM_REGION_NOEVENT       0x0
114 #define DM_REGION_READ          0x1
115 #define DM_REGION_WRITE         0x2
116 #define DM_REGION_TRUNCATE      0x4
117
118 /* Values for the mask argument used with dm_get_fileattr, dm_get_bulkattr,
119    dm_get_dirattrs, and dm_set_fileattr.
120 */
121
122 #define DM_AT_MODE      0x0001
123 #define DM_AT_UID       0x0002
124 #define DM_AT_GID       0x0004
125 #define DM_AT_ATIME     0x0008
126 #define DM_AT_MTIME     0x0010
127 #define DM_AT_CTIME     0x0020
128 #define DM_AT_SIZE      0x0040
129 #define DM_AT_DTIME     0x0080
130 #define DM_AT_HANDLE    0x0100
131 #define DM_AT_EMASK     0x0200
132 #define DM_AT_PMANR     0x0400
133 #define DM_AT_PATTR     0x0800
134 #define DM_AT_STAT      0x1000
135 #define DM_AT_CFLAG     0x2000
136
137 #define DM_EV_WAIT      0x1             /* used in dm_get_events() */
138
139 #define DM_MOUNT_RDONLY 0x1             /* me_mode field in dm_mount_event_t */
140
141 #define DM_RR_WAIT      0x1
142
143 #define DM_UNMOUNT_FORCE 0x1            /* ne_mode field in dm_namesp_event_t */
144
145 #define DM_WRITE_SYNC   0x1             /* used in dm_write_invis() */
146
147 #define DM_SESSION_INFO_LEN     256
148 #define DM_NO_SESSION           0
149 #define DM_TRUE                 1
150 #define DM_FALSE                0
151 #define DM_INVALID_TOKEN        0
152 #define DM_NO_TOKEN             (-1)
153 #define DM_INVALID_HANP         NULL
154 #define DM_INVALID_HLEN         0
155 #define DM_GLOBAL_HANP          ((void *)(1LL))
156 #define DM_GLOBAL_HLEN          ((size_t)(1))
157 #define DM_VER_STR_CONTENTS     "SGI DMAPI (XDSM) API, Release 1.1."
158
159
160 #define DMEV_SET(event_type, event_list) \
161         ((event_list) |= (1 << (event_type)))
162 #define DMEV_CLR(event_type, event_list) \
163         ((event_list) &= ~(1 << (event_type)))
164 #define DMEV_ISSET(event_type, event_list) \
165         (int)(((event_list) & (1 << (event_type))) != 0)
166 #define DMEV_ZERO(event_list) \
167         (event_list) = 0
168
169
170 typedef struct {
171         int     vd_offset;      /* offset from start of containing struct */
172         unsigned int    vd_length;      /* length of data starting at vd_offset */
173 } dm_vardata_t;
174
175 #define DM_GET_VALUE(p, field, type) \
176         ((type) ((char *)(p) + (p)->field.vd_offset))
177
178 #define DM_GET_LEN(p, field) \
179         ((p)->field.vd_length)
180
181 #define DM_STEP_TO_NEXT(p, type) \
182         ((type) ((p)->_link ? (char *)(p) + (p)->_link : NULL))
183
184
185
186
187 /* The remainder of this include file contains defines, typedefs, and
188    structures which are strictly defined by the DMAPI 2.3 specification.
189
190    (The _link field which appears in several structures is an
191    implementation-specific way to implement DM_STEP_TO_NEXT, and
192    should not be referenced directly by application code.)
193 */
194
195
196 #define DM_ATTR_NAME_SIZE       8
197
198
199 struct dm_attrname {
200         unsigned char   an_chars[DM_ATTR_NAME_SIZE];
201 };
202 typedef struct dm_attrname      dm_attrname_t;
203
204
205 struct dm_attrlist {
206         int             _link;
207         dm_attrname_t   al_name;
208         dm_vardata_t    al_data;
209 };
210 typedef struct dm_attrlist      dm_attrlist_t;
211
212
213 typedef enum {
214         DM_CONFIG_INVALID,
215         DM_CONFIG_BULKALL,
216         DM_CONFIG_CREATE_BY_HANDLE,
217         DM_CONFIG_DTIME_OVERLOAD,
218         DM_CONFIG_LEGACY,
219         DM_CONFIG_LOCK_UPGRADE,
220         DM_CONFIG_MAX_ATTR_ON_DESTROY,
221         DM_CONFIG_MAX_ATTRIBUTE_SIZE,
222         DM_CONFIG_MAX_HANDLE_SIZE,
223         DM_CONFIG_MAX_MANAGED_REGIONS,
224         DM_CONFIG_MAX_MESSAGE_DATA,
225         DM_CONFIG_OBJ_REF,
226         DM_CONFIG_PENDING,
227         DM_CONFIG_PERS_ATTRIBUTES,
228         DM_CONFIG_PERS_EVENTS,
229         DM_CONFIG_PERS_INHERIT_ATTRIBS,
230         DM_CONFIG_PERS_MANAGED_REGIONS,
231         DM_CONFIG_PUNCH_HOLE,
232         DM_CONFIG_TOTAL_ATTRIBUTE_SPACE,
233         DM_CONFIG_WILL_RETRY
234 } dm_config_t;
235
236
237 struct  dm_dioinfo {                    /* non-standard SGI addition */
238         unsigned int    d_mem;
239         unsigned int    d_miniosz;
240         unsigned int    d_maxiosz;
241         dm_boolean_t    d_dio_only;
242 };
243 typedef struct dm_dioinfo       dm_dioinfo_t;
244
245
246 struct dm_dispinfo {
247         int             _link;
248         unsigned int    di_pad1;                /* reserved; do not reference */
249         dm_vardata_t    di_fshandle;
250         dm_eventset_t   di_eventset;
251 };
252 typedef struct dm_dispinfo      dm_dispinfo_t;
253
254
255 #ifndef HAVE_DM_EVENTTYPE_T
256 #define HAVE_DM_EVENTTYPE_T
257 typedef enum {
258         DM_EVENT_INVALID        = -1,
259         DM_EVENT_CANCEL         = 0,            /* not supported */
260         DM_EVENT_MOUNT          = 1,
261         DM_EVENT_PREUNMOUNT     = 2,
262         DM_EVENT_UNMOUNT        = 3,
263         DM_EVENT_DEBUT          = 4,            /* not supported */
264         DM_EVENT_CREATE         = 5,
265         DM_EVENT_CLOSE          = 6,            /* not supported */
266         DM_EVENT_POSTCREATE     = 7,
267         DM_EVENT_REMOVE         = 8,
268         DM_EVENT_POSTREMOVE     = 9,
269         DM_EVENT_RENAME         = 10,
270         DM_EVENT_POSTRENAME     = 11,
271         DM_EVENT_LINK           = 12,
272         DM_EVENT_POSTLINK       = 13,
273         DM_EVENT_SYMLINK        = 14,
274         DM_EVENT_POSTSYMLINK    = 15,
275         DM_EVENT_READ           = 16,
276         DM_EVENT_WRITE          = 17,
277         DM_EVENT_TRUNCATE       = 18,
278         DM_EVENT_ATTRIBUTE      = 19,
279         DM_EVENT_DESTROY        = 20,
280         DM_EVENT_NOSPACE        = 21,
281         DM_EVENT_USER           = 22,
282         DM_EVENT_MAX            = 23
283 } dm_eventtype_t;
284 #endif
285
286
287 struct dm_eventmsg {
288         int             _link;
289         dm_eventtype_t  ev_type;
290         dm_token_t      ev_token;
291         dm_sequence_t   ev_sequence;
292         dm_vardata_t    ev_data;
293 };
294 typedef struct dm_eventmsg      dm_eventmsg_t;
295
296
297 struct dm_cancel_event {                        /* not supported */
298         dm_sequence_t   ce_sequence;
299         dm_token_t      ce_token;
300 };
301 typedef struct dm_cancel_event  dm_cancel_event_t;
302
303
304 struct dm_data_event {
305         dm_vardata_t    de_handle;
306         dm_off_t        de_offset;
307         dm_size_t       de_length;
308 };
309 typedef struct dm_data_event dm_data_event_t;
310
311 struct dm_destroy_event {
312         dm_vardata_t            ds_handle;
313         dm_attrname_t           ds_attrname;
314         dm_vardata_t            ds_attrcopy;
315 };
316 typedef struct dm_destroy_event dm_destroy_event_t;
317
318 struct dm_mount_event {
319         dm_mode_t       me_mode;
320         dm_vardata_t    me_handle1;
321         dm_vardata_t    me_handle2;
322         dm_vardata_t    me_name1;
323         dm_vardata_t    me_name2;
324         dm_vardata_t    me_roothandle;
325 };
326 typedef struct dm_mount_event dm_mount_event_t;
327
328 struct dm_namesp_event {
329         dm_mode_t       ne_mode;
330         dm_vardata_t    ne_handle1;
331         dm_vardata_t    ne_handle2;
332         dm_vardata_t    ne_name1;
333         dm_vardata_t    ne_name2;
334         int             ne_retcode;
335 };
336 typedef struct dm_namesp_event dm_namesp_event_t;
337
338
339 typedef enum {
340         DM_EXTENT_INVALID,
341         DM_EXTENT_RES,
342         DM_EXTENT_HOLE
343 } dm_extenttype_t;
344
345
346 struct dm_extent {
347         dm_extenttype_t ex_type;
348         unsigned int    ex_pad1;                /* reserved; do not reference */
349         dm_off_t        ex_offset;
350         dm_size_t       ex_length;
351 };
352 typedef struct dm_extent dm_extent_t;
353
354 struct dm_fileattr {
355         dm_mode_t       fa_mode;
356         uid_t           fa_uid;
357         gid_t           fa_gid;
358         time_t          fa_atime;
359         time_t          fa_mtime;
360         time_t          fa_ctime;
361         time_t          fa_dtime;
362         unsigned int    fa_pad1;                /* reserved; do not reference */
363         dm_off_t        fa_size;
364 };
365 typedef struct dm_fileattr dm_fileattr_t;
366
367
368 struct dm_inherit {                             /* not supported */
369         dm_attrname_t   ih_name;
370         dm_mode_t       ih_filetype;
371 };
372 typedef struct dm_inherit dm_inherit_t;
373
374
375 typedef enum {
376         DM_MSGTYPE_INVALID,
377         DM_MSGTYPE_SYNC,
378         DM_MSGTYPE_ASYNC
379 } dm_msgtype_t;
380
381
382 struct dm_region {
383         dm_off_t        rg_offset;
384         dm_size_t       rg_size;
385         unsigned int    rg_flags;
386         unsigned int    rg_pad1;                /* reserved; do not reference */
387 };
388 typedef struct dm_region dm_region_t;
389
390
391 typedef enum {
392         DM_RESP_INVALID,
393         DM_RESP_CONTINUE,
394         DM_RESP_ABORT,
395         DM_RESP_DONTCARE
396 } dm_response_t;
397
398
399 #ifndef HAVE_DM_RIGHT_T
400 #define HAVE_DM_RIGHT_T
401 typedef enum {
402         DM_RIGHT_NULL,
403         DM_RIGHT_SHARED,
404         DM_RIGHT_EXCL
405 } dm_right_t;
406 #endif
407
408
409 struct dm_stat {
410         int             _link;
411         dm_vardata_t    dt_handle;
412         dm_vardata_t    dt_compname;
413         int             dt_nevents;
414         dm_eventset_t   dt_emask;
415         int             dt_pers;                /* field not supported */
416         int             dt_pmanreg;
417         time_t          dt_dtime;
418         unsigned int    dt_change;              /* field not supported */
419         unsigned int    dt_pad1;                /* reserved; do not reference */
420         dm_dev_t        dt_dev;
421         dm_ino_t        dt_ino;
422         dm_mode_t       dt_mode;
423         dm_nlink_t      dt_nlink;
424         uid_t           dt_uid;
425         gid_t           dt_gid;
426         dm_dev_t        dt_rdev;
427         unsigned int    dt_pad2;                /* reserved; do not reference */
428         dm_off_t        dt_size;
429         time_t          dt_atime;
430         time_t          dt_mtime;
431         time_t          dt_ctime;
432         unsigned int    dt_blksize;
433         dm_size_t       dt_blocks;
434
435         /* Non-standard filesystem-specific fields.  Currently XFS is the only
436            supported filesystem type.
437         */
438
439         __u64   dt_pad3;        /* reserved; do not reference */
440         int             dt_fstype;      /* filesystem index; see sysfs(2) */
441         union   {
442                 struct  {
443                         dm_igen_t       igen;
444                         unsigned int    xflags;
445                         unsigned int    extsize;
446                         unsigned int    extents;
447                         unsigned short  aextents;
448                         unsigned short  dmstate;
449                 } sgi_xfs;
450         } fsys_dep;
451 };
452 typedef struct dm_stat  dm_stat_t;
453
454 #define dt_xfs_igen     fsys_dep.sgi_xfs.igen
455 #define dt_xfs_xflags   fsys_dep.sgi_xfs.xflags
456 #define dt_xfs_extsize  fsys_dep.sgi_xfs.extsize
457 #define dt_xfs_extents  fsys_dep.sgi_xfs.extents
458 #define dt_xfs_aextents fsys_dep.sgi_xfs.aextents
459 #define dt_xfs_dmstate  fsys_dep.sgi_xfs.dmstate
460
461 /* Flags for the non-standard dt_xfs_xflags field. */
462
463 #define DM_XFLAG_REALTIME       0x00000001
464 #define DM_XFLAG_PREALLOC       0x00000002
465 #define DM_XFLAG_IMMUTABLE      0x00000008
466 #define DM_XFLAG_APPEND         0x00000010
467 #define DM_XFLAG_SYNC           0x00000020
468 #define DM_XFLAG_NOATIME        0x00000040
469 #define DM_XFLAG_NODUMP         0x00000080
470 #define DM_XFLAG_HASATTR        0x80000000
471
472
473 struct  dm_timestruct {
474         time_t          dm_tv_sec;
475         int             dm_tv_nsec;
476 };
477 typedef struct dm_timestruct dm_timestruct_t;
478
479
480 struct  dm_xstat {                              /* not supported */
481         dm_stat_t       dx_statinfo;
482         dm_vardata_t    dx_attrdata;
483 };
484 typedef struct dm_xstat dm_xstat_t;
485
486
487 #define MAXDMFSFIDSZ    46
488
489 struct dm_fid {
490         __u16   dm_fid_len;             /* length of remainder  */
491         __u16   dm_fid_pad;
492         __u32   dm_fid_gen;             /* generation number    */
493         __u64   dm_fid_ino;             /* 64 bits inode number */
494 };
495 typedef struct dm_fid dm_fid_t;
496
497
498 struct dm_handle {
499         union {
500                 __s64       align;      /* force alignment of ha_fid     */
501                 dm_fsid_t  _ha_fsid;    /* unique file system identifier */
502         } ha_u;
503         dm_fid_t        ha_fid;         /* file system specific file ID  */
504 };
505 typedef struct dm_handle dm_handle_t;
506 #define ha_fsid ha_u._ha_fsid
507
508 #define DM_HSIZE(handle)        (((char *) &(handle).ha_fid.dm_fid_pad   \
509                                  - (char *) &(handle))                    \
510                                  + (handle).ha_fid.dm_fid_len)
511
512 #define DM_HANDLE_CMP(h1, h2)   memcmp(h1, h2, sizeof(dm_handle_t))
513
514 #define DM_FSHSIZE              sizeof(dm_fsid_t)
515
516
517 /* The following list provides the prototypes for all functions defined in
518    the DMAPI interface.
519 */
520
521 extern int
522 dm_clear_inherit(                               /* not supported */
523         dm_sessid_t     sid,
524         void            __user *hanp,
525         size_t          hlen,
526         dm_token_t      token,
527         dm_attrname_t   __user *attrnamep);
528
529 extern int
530 dm_create_by_handle(                            /* not supported */
531         dm_sessid_t     sid,
532         void            __user *dirhanp,
533         size_t          dirhlen,
534         dm_token_t      token,
535         void            __user *hanp,
536         size_t          hlen,
537         char            __user *cname);
538
539 extern int
540 dm_create_session(
541         dm_sessid_t     oldsid,
542         char            __user *sessinfop,
543         dm_sessid_t     __user *newsidp);
544
545 extern int
546 dm_create_userevent(
547         dm_sessid_t     sid,
548         size_t          msglen,
549         void            __user *msgdatap,
550         dm_token_t      __user *tokenp);
551
552 extern int
553 dm_destroy_session(
554         dm_sessid_t     sid);
555
556 extern int
557 dm_downgrade_right(             /* not completely supported; see caveat above */
558         dm_sessid_t     sid,
559         void            __user *hanp,
560         size_t          hlen,
561         dm_token_t      token);
562
563 extern int
564 dm_fd_to_handle(
565         int             fd,
566         void            **hanpp,
567         size_t          *hlenp);
568
569 extern int
570 dm_find_eventmsg(
571         dm_sessid_t     sid,
572         dm_token_t      token,
573         size_t          buflen,
574         void            __user *bufp,
575         size_t          __user *rlenp);
576
577 extern int
578 dm_get_allocinfo(
579         dm_sessid_t     sid,
580         void            __user *hanp,
581         size_t          hlen,
582         dm_token_t      token,
583         dm_off_t        *offp,
584         unsigned int    nelem,
585         dm_extent_t     *extentp,
586         unsigned int    *nelemp);
587
588 extern int
589 dm_get_bulkall(                                 /* not supported */
590         dm_sessid_t     sid,
591         void            __user *hanp,
592         size_t          hlen,
593         dm_token_t      token,
594         unsigned int    mask,
595         dm_attrname_t   *attrnamep,
596         dm_attrloc_t    *locp,
597         size_t          buflen,
598         void            *bufp,
599         size_t          *rlenp);
600
601 extern int
602 dm_get_bulkattr(
603         dm_sessid_t     sid,
604         void            __user *hanp,
605         size_t          hlen,
606         dm_token_t      token,
607         unsigned int    mask,
608         dm_attrloc_t    *locp,
609         size_t          buflen,
610         void            *bufp,
611         size_t          *rlenp);
612
613 extern int
614 dm_get_config(
615         void            __user *hanp,
616         size_t          hlen,
617         dm_config_t     flagname,
618         dm_size_t       __user *retvalp);
619
620 extern int
621 dm_get_config_events(
622         void            __user *hanp,
623         size_t          hlen,
624         unsigned int    nelem,
625         dm_eventset_t   __user *eventsetp,
626         unsigned int    __user *nelemp);
627
628 extern int
629 dm_get_dirattrs(
630         dm_sessid_t     sid,
631         void            __user *hanp,
632         size_t          hlen,
633         dm_token_t      token,
634         unsigned int    mask,
635         dm_attrloc_t    *locp,
636         size_t          buflen,
637         void            *bufp,
638         size_t          *rlenp);
639
640 extern int
641 dm_get_dmattr(
642         dm_sessid_t     sid,
643         void            __user *hanp,
644         size_t          hlen,
645         dm_token_t      token,
646         dm_attrname_t   __user *attrnamep,
647         size_t          buflen,
648         void            __user *bufp,
649         size_t          __user *rlenp);
650
651 extern int
652 dm_get_eventlist(
653         dm_sessid_t     sid,
654         void            __user *hanp,
655         size_t          hlen,
656         dm_token_t      token,
657         unsigned int    nelem,
658         dm_eventset_t   __user *eventsetp,
659         unsigned int    __user *nelemp);
660
661 extern int
662 dm_get_events(
663         dm_sessid_t     sid,
664         unsigned int    maxmsgs,
665         unsigned int    flags,
666         size_t          buflen,
667         void            __user *bufp,
668         size_t          __user *rlenp);
669
670 extern int
671 dm_get_fileattr(
672         dm_sessid_t     sid,
673         void            __user *hanp,
674         size_t          hlen,
675         dm_token_t      token,
676         unsigned int    mask,
677         dm_stat_t       __user *statp);
678
679 extern int
680 dm_get_mountinfo(
681         dm_sessid_t     sid,
682         void            __user *hanp,
683         size_t          hlen,
684         dm_token_t      token,
685         size_t          buflen,
686         void            __user *bufp,
687         size_t          __user *rlenp);
688
689 extern int
690 dm_get_region(
691         dm_sessid_t     sid,
692         void            __user *hanp,
693         size_t          hlen,
694         dm_token_t      token,
695         unsigned int    nelem,
696         dm_region_t     __user *regbufp,
697         unsigned int    __user *nelemp);
698
699 extern int
700 dm_getall_disp(
701         dm_sessid_t     sid,
702         size_t          buflen,
703         void            __user *bufp,
704         size_t          __user *rlenp);
705
706 extern int
707 dm_getall_dmattr(
708         dm_sessid_t     sid,
709         void            __user *hanp,
710         size_t          hlen,
711         dm_token_t      token,
712         size_t          buflen,
713         void            __user *bufp,
714         size_t          __user *rlenp);
715
716 extern int
717 dm_getall_inherit(                              /* not supported */
718         dm_sessid_t     sid,
719         void            __user *hanp,
720         size_t          hlen,
721         dm_token_t      token,
722         unsigned int    nelem,
723         dm_inherit_t    __user *inheritbufp,
724         unsigned int    __user *nelemp);
725
726 extern int
727 dm_getall_sessions(
728         unsigned int    nelem,
729         dm_sessid_t     __user *sidbufp,
730         unsigned int    __user *nelemp);
731
732 extern int
733 dm_getall_tokens(
734         dm_sessid_t     sid,
735         unsigned int    nelem,
736         dm_token_t      __user *tokenbufp,
737         unsigned int    __user *nelemp);
738
739 extern int
740 dm_handle_cmp(
741         void            *hanp1,
742         size_t          hlen1,
743         void            *hanp2,
744         size_t          hlen2);
745
746 extern void
747 dm_handle_free(
748         void            *hanp,
749         size_t          hlen);
750
751 extern u_int
752 dm_handle_hash(
753         void            *hanp,
754         size_t          hlen);
755
756 extern dm_boolean_t
757 dm_handle_is_valid(
758         void            *hanp,
759         size_t          hlen);
760
761 extern int
762 dm_handle_to_fshandle(
763         void            *hanp,
764         size_t          hlen,
765         void            **fshanpp,
766         size_t          *fshlenp);
767
768 extern int
769 dm_handle_to_fsid(
770         void            *hanp,
771         size_t          hlen,
772         dm_fsid_t       *fsidp);
773
774 extern int
775 dm_handle_to_igen(
776         void            *hanp,
777         size_t          hlen,
778         dm_igen_t       *igenp);
779
780 extern int
781 dm_handle_to_ino(
782         void            *hanp,
783         size_t          hlen,
784         dm_ino_t        *inop);
785
786 extern int
787 dm_handle_to_path(
788         void            *dirhanp,
789         size_t          dirhlen,
790         void            *targhanp,
791         size_t          targhlen,
792         size_t          buflen,
793         char            *pathbufp,
794         size_t          *rlenp);
795
796 extern int
797 dm_init_attrloc(
798         dm_sessid_t     sid,
799         void            __user *hanp,
800         size_t          hlen,
801         dm_token_t      token,
802         dm_attrloc_t    __user *locp);
803
804 extern int
805 dm_init_service(
806         char            **versionstrpp);
807
808 extern int
809 dm_make_handle(
810         dm_fsid_t       *fsidp,
811         dm_ino_t        *inop,
812         dm_igen_t       *igenp,
813         void            **hanpp,
814         size_t          *hlenp);
815
816 extern int
817 dm_make_fshandle(
818         dm_fsid_t       *fsidp,
819         void            **hanpp,
820         size_t          *hlenp);
821
822 extern int
823 dm_mkdir_by_handle(                             /* not supported */
824         dm_sessid_t     sid,
825         void            __user *dirhanp,
826         size_t          dirhlen,
827         dm_token_t      token,
828         void            __user *hanp,
829         size_t          hlen,
830         char            __user *cname);
831
832 extern int
833 dm_move_event(
834         dm_sessid_t     srcsid,
835         dm_token_t      token,
836         dm_sessid_t     targetsid,
837         dm_token_t      __user *rtokenp);
838
839 extern int
840 dm_obj_ref_hold(
841         dm_sessid_t     sid,
842         dm_token_t      token,
843         void            __user *hanp,
844         size_t          hlen);
845
846 extern int
847 dm_obj_ref_query(
848         dm_sessid_t     sid,
849         dm_token_t      token,
850         void            *hanp,
851         size_t          hlen);
852
853 extern int
854 dm_obj_ref_rele(
855         dm_sessid_t     sid,
856         dm_token_t      token,
857         void            __user *hanp,
858         size_t          hlen);
859
860 extern int
861 dm_path_to_fshandle(
862         char            *path,
863         void            **hanpp,
864         size_t          *hlenp);
865
866 extern int
867 dm_path_to_handle(
868         char            *path,
869         void            **hanpp,
870         size_t          *hlenp);
871
872 extern int
873 dm_pending(
874         dm_sessid_t     sid,
875         dm_token_t      token,
876         dm_timestruct_t __user *delay);
877
878 extern int
879 dm_probe_hole(
880         dm_sessid_t     sid,
881         void            __user *hanp,
882         size_t          hlen,
883         dm_token_t      token,
884         dm_off_t        off,
885         dm_size_t       len,
886         dm_off_t        __user  *roffp,
887         dm_size_t       __user *rlenp);
888
889 extern int
890 dm_punch_hole(
891         dm_sessid_t     sid,
892         void            __user *hanp,
893         size_t          hlen,
894         dm_token_t      token,
895         dm_off_t        off,
896         dm_size_t       len);
897
898 extern int
899 dm_query_right(                 /* not completely supported; see caveat above */
900         dm_sessid_t     sid,
901         void            __user *hanp,
902         size_t          hlen,
903         dm_token_t      token,
904         dm_right_t      __user *rightp);
905
906 extern int
907 dm_query_session(
908         dm_sessid_t     sid,
909         size_t          buflen,
910         void            __user *bufp,
911         size_t          __user *rlenp);
912
913 extern dm_ssize_t
914 dm_read_invis(
915         dm_sessid_t     sid,
916         void            *hanp,
917         size_t          hlen,
918         dm_token_t      token,
919         dm_off_t        off,
920         dm_size_t       len,
921         void            *bufp);
922
923 extern int
924 dm_release_right(               /* not completely supported; see caveat above */
925         dm_sessid_t     sid,
926         void            __user *hanp,
927         size_t          hlen,
928         dm_token_t      token);
929
930 extern int
931 dm_remove_dmattr(
932         dm_sessid_t     sid,
933         void            __user *hanp,
934         size_t          hlen,
935         dm_token_t      token,
936         int             setdtime,
937         dm_attrname_t   __user *attrnamep);
938
939 extern int
940 dm_request_right(               /* not completely supported; see caveat above */
941         dm_sessid_t     sid,
942         void            __user *hanp,
943         size_t          hlen,
944         dm_token_t      token,
945         unsigned int    flags,
946         dm_right_t      right);
947
948 extern int
949 dm_respond_event(
950         dm_sessid_t     sid,
951         dm_token_t      token,
952         dm_response_t   response,
953         int             reterror,
954         size_t          buflen,
955         void            __user *respbufp);
956
957 extern int
958 dm_send_msg(
959         dm_sessid_t     targetsid,
960         dm_msgtype_t    msgtype,
961         size_t          buflen,
962         void            __user *bufp);
963
964 extern int
965 dm_set_disp(
966         dm_sessid_t     sid,
967         void            __user *hanp,
968         size_t          hlen,
969         dm_token_t      token,
970         dm_eventset_t   __user *eventsetp,
971         unsigned int    maxevent);
972
973 extern int
974 dm_set_dmattr(
975         dm_sessid_t     sid,
976         void            __user *hanp,
977         size_t          hlen,
978         dm_token_t      token,
979         dm_attrname_t   __user *attrnamep,
980         int             setdtime,
981         size_t          buflen,
982         void            __user *bufp);
983
984 extern int
985 dm_set_eventlist(
986         dm_sessid_t     sid,
987         void            __user *hanp,
988         size_t          hlen,
989         dm_token_t      token,
990         dm_eventset_t   __user *eventsetp,
991         unsigned int    maxevent);
992
993 extern int
994 dm_set_fileattr(
995         dm_sessid_t     sid,
996         void            __user *hanp,
997         size_t          hlen,
998         dm_token_t      token,
999         unsigned int    mask,
1000         dm_fileattr_t   __user *attrp);
1001
1002 extern int
1003 dm_set_inherit(                                 /* not supported */
1004         dm_sessid_t     sid,
1005         void            __user *hanp,
1006         size_t          hlen,
1007         dm_token_t      token,
1008         dm_attrname_t   __user *attrnamep,
1009         mode_t          mode);
1010
1011 extern int
1012 dm_set_region(
1013         dm_sessid_t     sid,
1014         void            __user *hanp,
1015         size_t          hlen,
1016         dm_token_t      token,
1017         unsigned int    nelem,
1018         dm_region_t     __user *regbufp,
1019         dm_boolean_t    __user *exactflagp);
1020
1021 extern int
1022 dm_set_return_on_destroy(
1023         dm_sessid_t     sid,
1024         void            __user *hanp,
1025         size_t          hlen,
1026         dm_token_t      token,
1027         dm_attrname_t   __user *attrnamep,
1028         dm_boolean_t    enable);
1029
1030 extern int
1031 dm_symlink_by_handle(                           /* not supported */
1032         dm_sessid_t     sid,
1033         void            __user *dirhanp,
1034         size_t          dirhlen,
1035         dm_token_t      token,
1036         void            __user *hanp,
1037         size_t          hlen,
1038         char            __user *cname,
1039         char            __user *path);
1040
1041 extern int
1042 dm_sync_by_handle(
1043         dm_sessid_t     sid,
1044         void            __user *hanp,
1045         size_t          hlen,
1046         dm_token_t      token);
1047
1048 extern int
1049 dm_upgrade_right(               /* not completely supported; see caveat above */
1050         dm_sessid_t     sid,
1051         void            __user *hanp,
1052         size_t          hlen,
1053         dm_token_t      token);
1054
1055 extern dm_ssize_t
1056 dm_write_invis(
1057         dm_sessid_t     sid,
1058         void            *hanp,
1059         size_t          hlen,
1060         dm_token_t      token,
1061         int             flags,
1062         dm_off_t        off,
1063         dm_size_t       len,
1064         void            *bufp);
1065
1066 /* Non-standard SGI additions to the DMAPI interface. */
1067
1068 int
1069 dm_open_by_handle(
1070         void            __user *hanp,
1071         size_t          hlen,
1072         int             mode);
1073
1074 extern int
1075 dm_get_dioinfo(
1076         dm_sessid_t     sid,
1077         void            __user *hanp,
1078         size_t          hlen,
1079         dm_token_t      token,
1080         dm_dioinfo_t    __user *diop);
1081
1082 #ifdef  __cplusplus
1083 }
1084 #endif
1085
1086 #endif /* __DMAPI_H__ */