Whamcloud - gitweb
LU-2304 tests: fsx log print file descriptor number
[fs/lustre-release.git] / lustre / include / ioctl.h
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License version 2 for more details (a copy is included
14  * in the LICENSE file that accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License
17  * version 2 along with this program; If not, see
18  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
19  *
20  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21  * CA 95054 USA or visit www.sun.com if you need additional information or
22  * have any questions.
23  *
24  * GPL HEADER END
25  */
26 /*
27  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
28  * Use is subject to license terms.
29  */
30 /*
31  * This file is part of Lustre, http://www.lustre.org/
32  * Lustre is a trademark of Sun Microsystems, Inc.
33  */
34
35 #ifndef _IOWR
36
37 /* On i386 and x86_64, _ASM_I386_IOCTL_H is defined by the kernel's ioctl.h,
38  * and on newer kernels this header is shared as _ASM_GENERIC_IOCTL_H.
39  *
40  * We can avoid any problems with the kernel header being included again by
41  * defining _ASM_I386_IOCTL_H here so that a later occurence of <asm/ioctl.h>
42  * does not include the kernel's ioctl.h after this one. b=14746 */
43 #define _ASM_I386_IOCTL_H
44 #define _ASM_GENERIC_IOCTL_H
45
46 /* ioctl command encoding: 32 bits total, command in lower 16 bits,
47  * size of the parameter structure in the lower 14 bits of the
48  * upper 16 bits.
49  * Encoding the size of the parameter structure in the ioctl request
50  * The highest 2 bits are reserved for indicating the ``access mode''.
51  * NOTE: This limits the max parameter size to 16kB -1 !
52  */
53
54 /*
55  * The following is for compatibility across the various Linux
56  * platforms.  The i386 ioctl numbering scheme doesn't really enforce
57  * a type field.  De facto, however, the top 8 bits of the lower 16
58  * bits are indeed used as a type field, so we might just as well make
59  * this explicit here.  Please be sure to use the decoding macros
60  * below from now on.
61  */
62 #define _IOC_NRBITS     8
63 #define _IOC_TYPEBITS   8
64 #define _IOC_SIZEBITS   14
65 #define _IOC_DIRBITS    2
66
67 #define _IOC_NRMASK     ((1 << _IOC_NRBITS)-1)
68 #define _IOC_TYPEMASK   ((1 << _IOC_TYPEBITS)-1)
69 #define _IOC_SIZEMASK   ((1 << _IOC_SIZEBITS)-1)
70 #define _IOC_DIRMASK    ((1 << _IOC_DIRBITS)-1)
71
72 #define _IOC_NRSHIFT    0
73 #define _IOC_TYPESHIFT  (_IOC_NRSHIFT+_IOC_NRBITS)
74 #define _IOC_SIZESHIFT  (_IOC_TYPESHIFT+_IOC_TYPEBITS)
75 #define _IOC_DIRSHIFT   (_IOC_SIZESHIFT+_IOC_SIZEBITS)
76
77 /*
78  * Direction bits.
79  */
80 #define _IOC_NONE       0U
81 #define _IOC_WRITE      1U
82 #define _IOC_READ       2U
83
84 #define _IOC(dir,type,nr,size) (((dir)  << _IOC_DIRSHIFT) | ((type) << _IOC_TYPESHIFT) | ((nr)   << _IOC_NRSHIFT) | ((size) << _IOC_SIZESHIFT))
85
86 /* used to create numbers */
87 #define _IO(type,nr)            _IOC(_IOC_NONE,(type),(nr),0)
88 #define _IOR(type,nr,size)      _IOC(_IOC_READ,(type),(nr),sizeof(size))
89 #define _IOW(type,nr,size)      _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
90 #define _IOWR(type,nr,size)     _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
91
92 /* used to decode ioctl numbers.. */
93 #define _IOC_DIR(nr)            (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
94 #define _IOC_TYPE(nr)           (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
95 #define _IOC_NR(nr)             (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
96 #define _IOC_SIZE(nr)           (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
97
98 /* ...and for the drivers/sound files... */
99
100 #define IOC_IN          (_IOC_WRITE << _IOC_DIRSHIFT)
101 #define IOC_OUT         (_IOC_READ << _IOC_DIRSHIFT)
102 #define IOC_INOUT       ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
103 #define IOCSIZE_MASK    (_IOC_SIZEMASK << _IOC_SIZESHIFT)
104 #define IOCSIZE_SHIFT   (_IOC_SIZESHIFT)
105
106 #endif /* _IOWR */