Commit ffae263a640b736a7206a0d7bd14ab44eb58cd28
Committed by
Lachlan McIlroy
1 parent
743bb4650d
Exists in
master
and in
7 other branches
[XFS] Move compat ioctl structs & numbers into xfs_ioctl32.h
This makes the c file less cluttered and a bit more readable. Consistently name the ioctl number macros with "_32" and the compatibility stuctures with "_compat." Rename the helpers which simply copy in the arg with "_copyin" for easy identification. Finally, for a few of the existing helpers, modify them so that they directly call the native ioctl helper after userspace argument fixup. Signed-off-by: Eric Sandeen <sandeen@sandeen.net> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
Showing 3 changed files with 150 additions and 139 deletions Side-by-side Diff
fs/xfs/linux-2.6/xfs_ioctl32.c
... | ... | @@ -48,36 +48,12 @@ |
48 | 48 | #define _NATIVE_IOC(cmd, type) \ |
49 | 49 | _IOC(_IOC_DIR(cmd), _IOC_TYPE(cmd), _IOC_NR(cmd), sizeof(type)) |
50 | 50 | |
51 | -#if defined(CONFIG_IA64) || defined(CONFIG_X86_64) | |
52 | -#define BROKEN_X86_ALIGNMENT | |
53 | -#define _PACKED __attribute__((packed)) | |
54 | -/* on ia32 l_start is on a 32-bit boundary */ | |
55 | -typedef struct xfs_flock64_32 { | |
56 | - __s16 l_type; | |
57 | - __s16 l_whence; | |
58 | - __s64 l_start __attribute__((packed)); | |
59 | - /* len == 0 means until end of file */ | |
60 | - __s64 l_len __attribute__((packed)); | |
61 | - __s32 l_sysid; | |
62 | - __u32 l_pid; | |
63 | - __s32 l_pad[4]; /* reserve area */ | |
64 | -} xfs_flock64_32_t; | |
65 | - | |
66 | -#define XFS_IOC_ALLOCSP_32 _IOW ('X', 10, struct xfs_flock64_32) | |
67 | -#define XFS_IOC_FREESP_32 _IOW ('X', 11, struct xfs_flock64_32) | |
68 | -#define XFS_IOC_ALLOCSP64_32 _IOW ('X', 36, struct xfs_flock64_32) | |
69 | -#define XFS_IOC_FREESP64_32 _IOW ('X', 37, struct xfs_flock64_32) | |
70 | -#define XFS_IOC_RESVSP_32 _IOW ('X', 40, struct xfs_flock64_32) | |
71 | -#define XFS_IOC_UNRESVSP_32 _IOW ('X', 41, struct xfs_flock64_32) | |
72 | -#define XFS_IOC_RESVSP64_32 _IOW ('X', 42, struct xfs_flock64_32) | |
73 | -#define XFS_IOC_UNRESVSP64_32 _IOW ('X', 43, struct xfs_flock64_32) | |
74 | - | |
75 | -/* just account for different alignment */ | |
51 | +#ifdef BROKEN_X86_ALIGNMENT | |
76 | 52 | STATIC unsigned long |
77 | 53 | xfs_ioctl32_flock( |
78 | 54 | unsigned long arg) |
79 | 55 | { |
80 | - xfs_flock64_32_t __user *p32 = (void __user *)arg; | |
56 | + compat_xfs_flock64_t __user *p32 = (void __user *)arg; | |
81 | 57 | xfs_flock64_t __user *p = compat_alloc_user_space(sizeof(*p)); |
82 | 58 | |
83 | 59 | if (copy_in_user(&p->l_type, &p32->l_type, sizeof(s16)) || |
... | ... | @@ -92,32 +68,6 @@ |
92 | 68 | return (unsigned long)p; |
93 | 69 | } |
94 | 70 | |
95 | -typedef struct compat_xfs_fsop_geom_v1 { | |
96 | - __u32 blocksize; /* filesystem (data) block size */ | |
97 | - __u32 rtextsize; /* realtime extent size */ | |
98 | - __u32 agblocks; /* fsblocks in an AG */ | |
99 | - __u32 agcount; /* number of allocation groups */ | |
100 | - __u32 logblocks; /* fsblocks in the log */ | |
101 | - __u32 sectsize; /* (data) sector size, bytes */ | |
102 | - __u32 inodesize; /* inode size in bytes */ | |
103 | - __u32 imaxpct; /* max allowed inode space(%) */ | |
104 | - __u64 datablocks; /* fsblocks in data subvolume */ | |
105 | - __u64 rtblocks; /* fsblocks in realtime subvol */ | |
106 | - __u64 rtextents; /* rt extents in realtime subvol*/ | |
107 | - __u64 logstart; /* starting fsblock of the log */ | |
108 | - unsigned char uuid[16]; /* unique id of the filesystem */ | |
109 | - __u32 sunit; /* stripe unit, fsblocks */ | |
110 | - __u32 swidth; /* stripe width, fsblocks */ | |
111 | - __s32 version; /* structure version */ | |
112 | - __u32 flags; /* superblock version flags */ | |
113 | - __u32 logsectsize; /* log sector size, bytes */ | |
114 | - __u32 rtsectsize; /* realtime sector size, bytes */ | |
115 | - __u32 dirblocksize; /* directory block size, bytes */ | |
116 | -} __attribute__((packed)) compat_xfs_fsop_geom_v1_t; | |
117 | - | |
118 | -#define XFS_IOC_FSGEOMETRY_V1_32 \ | |
119 | - _IOR ('X', 100, struct compat_xfs_fsop_geom_v1) | |
120 | - | |
121 | 71 | STATIC unsigned long xfs_ioctl32_geom_v1(unsigned long arg) |
122 | 72 | { |
123 | 73 | compat_xfs_fsop_geom_v1_t __user *p32 = (void __user *)arg; |
... | ... | @@ -128,12 +78,6 @@ |
128 | 78 | return (unsigned long)p; |
129 | 79 | } |
130 | 80 | |
131 | -typedef struct compat_xfs_inogrp { | |
132 | - __u64 xi_startino; /* starting inode number */ | |
133 | - __s32 xi_alloccount; /* # bits set in allocmask */ | |
134 | - __u64 xi_allocmask; /* mask of allocated inodes */ | |
135 | -} __attribute__((packed)) compat_xfs_inogrp_t; | |
136 | - | |
137 | 81 | STATIC int xfs_inumbers_fmt_compat( |
138 | 82 | void __user *ubuffer, |
139 | 83 | const xfs_inogrp_t *buffer, |
140 | 84 | |
141 | 85 | |
... | ... | @@ -154,19 +98,11 @@ |
154 | 98 | } |
155 | 99 | |
156 | 100 | #else |
157 | - | |
158 | 101 | #define xfs_inumbers_fmt_compat xfs_inumbers_fmt |
159 | -#define _PACKED | |
160 | - | |
161 | 102 | #endif |
162 | 103 | |
163 | 104 | /* XFS_IOC_FSBULKSTAT and friends */ |
164 | 105 | |
165 | -typedef struct compat_xfs_bstime { | |
166 | - __s32 tv_sec; /* seconds */ | |
167 | - __s32 tv_nsec; /* and nanoseconds */ | |
168 | -} compat_xfs_bstime_t; | |
169 | - | |
170 | 106 | STATIC int xfs_bstime_store_compat( |
171 | 107 | compat_xfs_bstime_t __user *p32, |
172 | 108 | const xfs_bstime_t *p) |
... | ... | @@ -180,30 +116,6 @@ |
180 | 116 | return 0; |
181 | 117 | } |
182 | 118 | |
183 | -typedef struct compat_xfs_bstat { | |
184 | - __u64 bs_ino; /* inode number */ | |
185 | - __u16 bs_mode; /* type and mode */ | |
186 | - __u16 bs_nlink; /* number of links */ | |
187 | - __u32 bs_uid; /* user id */ | |
188 | - __u32 bs_gid; /* group id */ | |
189 | - __u32 bs_rdev; /* device value */ | |
190 | - __s32 bs_blksize; /* block size */ | |
191 | - __s64 bs_size; /* file size */ | |
192 | - compat_xfs_bstime_t bs_atime; /* access time */ | |
193 | - compat_xfs_bstime_t bs_mtime; /* modify time */ | |
194 | - compat_xfs_bstime_t bs_ctime; /* inode change time */ | |
195 | - int64_t bs_blocks; /* number of blocks */ | |
196 | - __u32 bs_xflags; /* extended flags */ | |
197 | - __s32 bs_extsize; /* extent size */ | |
198 | - __s32 bs_extents; /* number of extents */ | |
199 | - __u32 bs_gen; /* generation count */ | |
200 | - __u16 bs_projid; /* project id */ | |
201 | - unsigned char bs_pad[14]; /* pad space, unused */ | |
202 | - __u32 bs_dmevmask; /* DMIG event mask */ | |
203 | - __u16 bs_dmstate; /* DMIG state info */ | |
204 | - __u16 bs_aextents; /* attribute number of extents */ | |
205 | -} _PACKED compat_xfs_bstat_t; | |
206 | - | |
207 | 119 | STATIC int xfs_bulkstat_one_fmt_compat( |
208 | 120 | void __user *ubuffer, |
209 | 121 | const xfs_bstat_t *buffer) |
... | ... | @@ -234,22 +146,6 @@ |
234 | 146 | return sizeof(*p32); |
235 | 147 | } |
236 | 148 | |
237 | - | |
238 | - | |
239 | -typedef struct compat_xfs_fsop_bulkreq { | |
240 | - compat_uptr_t lastip; /* last inode # pointer */ | |
241 | - __s32 icount; /* count of entries in buffer */ | |
242 | - compat_uptr_t ubuffer; /* user buffer for inode desc. */ | |
243 | - compat_uptr_t ocount; /* output count pointer */ | |
244 | -} compat_xfs_fsop_bulkreq_t; | |
245 | - | |
246 | -#define XFS_IOC_FSBULKSTAT_32 \ | |
247 | - _IOWR('X', 101, struct compat_xfs_fsop_bulkreq) | |
248 | -#define XFS_IOC_FSBULKSTAT_SINGLE_32 \ | |
249 | - _IOWR('X', 102, struct compat_xfs_fsop_bulkreq) | |
250 | -#define XFS_IOC_FSINUMBERS_32 \ | |
251 | - _IOWR('X', 103, struct compat_xfs_fsop_bulkreq) | |
252 | - | |
253 | 149 | /* copied from xfs_ioctl.c */ |
254 | 150 | STATIC int |
255 | 151 | xfs_ioc_bulkstat_compat( |
... | ... | @@ -320,29 +216,6 @@ |
320 | 216 | return 0; |
321 | 217 | } |
322 | 218 | |
323 | - | |
324 | - | |
325 | -typedef struct compat_xfs_fsop_handlereq { | |
326 | - __u32 fd; /* fd for FD_TO_HANDLE */ | |
327 | - compat_uptr_t path; /* user pathname */ | |
328 | - __u32 oflags; /* open flags */ | |
329 | - compat_uptr_t ihandle; /* user supplied handle */ | |
330 | - __u32 ihandlen; /* user supplied length */ | |
331 | - compat_uptr_t ohandle; /* user buffer for handle */ | |
332 | - compat_uptr_t ohandlen; /* user buffer length */ | |
333 | -} compat_xfs_fsop_handlereq_t; | |
334 | - | |
335 | -#define XFS_IOC_PATH_TO_FSHANDLE_32 \ | |
336 | - _IOWR('X', 104, struct compat_xfs_fsop_handlereq) | |
337 | -#define XFS_IOC_PATH_TO_HANDLE_32 \ | |
338 | - _IOWR('X', 105, struct compat_xfs_fsop_handlereq) | |
339 | -#define XFS_IOC_FD_TO_HANDLE_32 \ | |
340 | - _IOWR('X', 106, struct compat_xfs_fsop_handlereq) | |
341 | -#define XFS_IOC_OPEN_BY_HANDLE_32 \ | |
342 | - _IOWR('X', 107, struct compat_xfs_fsop_handlereq) | |
343 | -#define XFS_IOC_READLINK_BY_HANDLE_32 \ | |
344 | - _IOWR('X', 108, struct compat_xfs_fsop_handlereq) | |
345 | - | |
346 | 219 | STATIC unsigned long xfs_ioctl32_fshandle(unsigned long arg) |
347 | 220 | { |
348 | 221 | compat_xfs_fsop_handlereq_t __user *p32 = (void __user *)arg; |
... | ... | @@ -365,7 +238,6 @@ |
365 | 238 | return (unsigned long)p; |
366 | 239 | } |
367 | 240 | |
368 | - | |
369 | 241 | STATIC long |
370 | 242 | xfs_compat_ioctl( |
371 | 243 | int mode, |
... | ... | @@ -404,9 +276,9 @@ |
404 | 276 | case XFS_IOC_ERROR_CLEARALL: |
405 | 277 | break; |
406 | 278 | |
407 | - case XFS_IOC32_GETXFLAGS: | |
408 | - case XFS_IOC32_SETXFLAGS: | |
409 | - case XFS_IOC32_GETVERSION: | |
279 | + case XFS_IOC_GETXFLAGS_32: | |
280 | + case XFS_IOC_SETXFLAGS_32: | |
281 | + case XFS_IOC_GETVERSION_32: | |
410 | 282 | cmd = _NATIVE_IOC(cmd, long); |
411 | 283 | break; |
412 | 284 | #ifdef BROKEN_X86_ALIGNMENT |
... | ... | @@ -426,7 +298,6 @@ |
426 | 298 | arg = xfs_ioctl32_geom_v1(arg); |
427 | 299 | cmd = _NATIVE_IOC(cmd, struct xfs_fsop_geom_v1); |
428 | 300 | break; |
429 | - | |
430 | 301 | #else /* These are handled fine if no alignment issues */ |
431 | 302 | case XFS_IOC_ALLOCSP: |
432 | 303 | case XFS_IOC_FREESP: |
... | ... | @@ -464,7 +335,6 @@ |
464 | 335 | |
465 | 336 | error = xfs_ioctl(XFS_I(inode), file, mode, cmd, (void __user *)arg); |
466 | 337 | xfs_iflags_set(XFS_I(inode), XFS_IMODIFIED); |
467 | - | |
468 | 338 | return error; |
469 | 339 | } |
470 | 340 |
fs/xfs/linux-2.6/xfs_ioctl32.h
... | ... | @@ -18,8 +18,153 @@ |
18 | 18 | #ifndef __XFS_IOCTL32_H__ |
19 | 19 | #define __XFS_IOCTL32_H__ |
20 | 20 | |
21 | +#include <linux/compat.h> | |
22 | + | |
21 | 23 | extern long xfs_file_compat_ioctl(struct file *, unsigned, unsigned long); |
22 | 24 | extern long xfs_file_compat_invis_ioctl(struct file *, unsigned, unsigned long); |
25 | + | |
26 | +/* | |
27 | + * on 32-bit arches, ioctl argument structures may have different sizes | |
28 | + * and/or alignment. We define compat structures which match the | |
29 | + * 32-bit sizes/alignments here, and their associated ioctl numbers. | |
30 | + * | |
31 | + * xfs_ioctl32.c contains routines to copy these structures in and out. | |
32 | + */ | |
33 | + | |
34 | +/* stock kernel-level ioctls we support */ | |
35 | +#define XFS_IOC_GETXFLAGS_32 FS_IOC32_GETFLAGS | |
36 | +#define XFS_IOC_SETXFLAGS_32 FS_IOC32_SETFLAGS | |
37 | +#define XFS_IOC_GETVERSION_32 FS_IOC32_GETVERSION | |
38 | + | |
39 | +/* | |
40 | + * On intel, even if sizes match, alignment and/or padding may differ. | |
41 | + */ | |
42 | +#if defined(CONFIG_IA64) || defined(CONFIG_X86_64) | |
43 | +#define BROKEN_X86_ALIGNMENT | |
44 | +#define __compat_packed __attribute__((packed)) | |
45 | +#else | |
46 | +#define __compat_packed | |
47 | +#endif | |
48 | + | |
49 | +typedef struct compat_xfs_bstime { | |
50 | + compat_time_t tv_sec; /* seconds */ | |
51 | + __s32 tv_nsec; /* and nanoseconds */ | |
52 | +} compat_xfs_bstime_t; | |
53 | + | |
54 | +typedef struct compat_xfs_bstat { | |
55 | + __u64 bs_ino; /* inode number */ | |
56 | + __u16 bs_mode; /* type and mode */ | |
57 | + __u16 bs_nlink; /* number of links */ | |
58 | + __u32 bs_uid; /* user id */ | |
59 | + __u32 bs_gid; /* group id */ | |
60 | + __u32 bs_rdev; /* device value */ | |
61 | + __s32 bs_blksize; /* block size */ | |
62 | + __s64 bs_size; /* file size */ | |
63 | + compat_xfs_bstime_t bs_atime; /* access time */ | |
64 | + compat_xfs_bstime_t bs_mtime; /* modify time */ | |
65 | + compat_xfs_bstime_t bs_ctime; /* inode change time */ | |
66 | + int64_t bs_blocks; /* number of blocks */ | |
67 | + __u32 bs_xflags; /* extended flags */ | |
68 | + __s32 bs_extsize; /* extent size */ | |
69 | + __s32 bs_extents; /* number of extents */ | |
70 | + __u32 bs_gen; /* generation count */ | |
71 | + __u16 bs_projid; /* project id */ | |
72 | + unsigned char bs_pad[14]; /* pad space, unused */ | |
73 | + __u32 bs_dmevmask; /* DMIG event mask */ | |
74 | + __u16 bs_dmstate; /* DMIG state info */ | |
75 | + __u16 bs_aextents; /* attribute number of extents */ | |
76 | +} __compat_packed compat_xfs_bstat_t; | |
77 | + | |
78 | +typedef struct compat_xfs_fsop_bulkreq { | |
79 | + compat_uptr_t lastip; /* last inode # pointer */ | |
80 | + __s32 icount; /* count of entries in buffer */ | |
81 | + compat_uptr_t ubuffer; /* user buffer for inode desc. */ | |
82 | + compat_uptr_t ocount; /* output count pointer */ | |
83 | +} compat_xfs_fsop_bulkreq_t; | |
84 | + | |
85 | +#define XFS_IOC_FSBULKSTAT_32 \ | |
86 | + _IOWR('X', 101, struct compat_xfs_fsop_bulkreq) | |
87 | +#define XFS_IOC_FSBULKSTAT_SINGLE_32 \ | |
88 | + _IOWR('X', 102, struct compat_xfs_fsop_bulkreq) | |
89 | +#define XFS_IOC_FSINUMBERS_32 \ | |
90 | + _IOWR('X', 103, struct compat_xfs_fsop_bulkreq) | |
91 | + | |
92 | +typedef struct compat_xfs_fsop_handlereq { | |
93 | + __u32 fd; /* fd for FD_TO_HANDLE */ | |
94 | + compat_uptr_t path; /* user pathname */ | |
95 | + __u32 oflags; /* open flags */ | |
96 | + compat_uptr_t ihandle; /* user supplied handle */ | |
97 | + __u32 ihandlen; /* user supplied length */ | |
98 | + compat_uptr_t ohandle; /* user buffer for handle */ | |
99 | + compat_uptr_t ohandlen; /* user buffer length */ | |
100 | +} compat_xfs_fsop_handlereq_t; | |
101 | + | |
102 | +#define XFS_IOC_PATH_TO_FSHANDLE_32 \ | |
103 | + _IOWR('X', 104, struct compat_xfs_fsop_handlereq) | |
104 | +#define XFS_IOC_PATH_TO_HANDLE_32 \ | |
105 | + _IOWR('X', 105, struct compat_xfs_fsop_handlereq) | |
106 | +#define XFS_IOC_FD_TO_HANDLE_32 \ | |
107 | + _IOWR('X', 106, struct compat_xfs_fsop_handlereq) | |
108 | +#define XFS_IOC_OPEN_BY_HANDLE_32 \ | |
109 | + _IOWR('X', 107, struct compat_xfs_fsop_handlereq) | |
110 | +#define XFS_IOC_READLINK_BY_HANDLE_32 \ | |
111 | + _IOWR('X', 108, struct compat_xfs_fsop_handlereq) | |
112 | + | |
113 | +#ifdef BROKEN_X86_ALIGNMENT | |
114 | +/* on ia32 l_start is on a 32-bit boundary */ | |
115 | +typedef struct compat_xfs_flock64 { | |
116 | + __s16 l_type; | |
117 | + __s16 l_whence; | |
118 | + __s64 l_start __attribute__((packed)); | |
119 | + /* len == 0 means until end of file */ | |
120 | + __s64 l_len __attribute__((packed)); | |
121 | + __s32 l_sysid; | |
122 | + __u32 l_pid; | |
123 | + __s32 l_pad[4]; /* reserve area */ | |
124 | +} compat_xfs_flock64_t; | |
125 | + | |
126 | +#define XFS_IOC_ALLOCSP_32 _IOW('X', 10, struct compat_xfs_flock64) | |
127 | +#define XFS_IOC_FREESP_32 _IOW('X', 11, struct compat_xfs_flock64) | |
128 | +#define XFS_IOC_ALLOCSP64_32 _IOW('X', 36, struct compat_xfs_flock64) | |
129 | +#define XFS_IOC_FREESP64_32 _IOW('X', 37, struct compat_xfs_flock64) | |
130 | +#define XFS_IOC_RESVSP_32 _IOW('X', 40, struct compat_xfs_flock64) | |
131 | +#define XFS_IOC_UNRESVSP_32 _IOW('X', 41, struct compat_xfs_flock64) | |
132 | +#define XFS_IOC_RESVSP64_32 _IOW('X', 42, struct compat_xfs_flock64) | |
133 | +#define XFS_IOC_UNRESVSP64_32 _IOW('X', 43, struct compat_xfs_flock64) | |
134 | + | |
135 | +typedef struct compat_xfs_fsop_geom_v1 { | |
136 | + __u32 blocksize; /* filesystem (data) block size */ | |
137 | + __u32 rtextsize; /* realtime extent size */ | |
138 | + __u32 agblocks; /* fsblocks in an AG */ | |
139 | + __u32 agcount; /* number of allocation groups */ | |
140 | + __u32 logblocks; /* fsblocks in the log */ | |
141 | + __u32 sectsize; /* (data) sector size, bytes */ | |
142 | + __u32 inodesize; /* inode size in bytes */ | |
143 | + __u32 imaxpct; /* max allowed inode space(%) */ | |
144 | + __u64 datablocks; /* fsblocks in data subvolume */ | |
145 | + __u64 rtblocks; /* fsblocks in realtime subvol */ | |
146 | + __u64 rtextents; /* rt extents in realtime subvol*/ | |
147 | + __u64 logstart; /* starting fsblock of the log */ | |
148 | + unsigned char uuid[16]; /* unique id of the filesystem */ | |
149 | + __u32 sunit; /* stripe unit, fsblocks */ | |
150 | + __u32 swidth; /* stripe width, fsblocks */ | |
151 | + __s32 version; /* structure version */ | |
152 | + __u32 flags; /* superblock version flags */ | |
153 | + __u32 logsectsize; /* log sector size, bytes */ | |
154 | + __u32 rtsectsize; /* realtime sector size, bytes */ | |
155 | + __u32 dirblocksize; /* directory block size, bytes */ | |
156 | +} __attribute__((packed)) compat_xfs_fsop_geom_v1_t; | |
157 | + | |
158 | +#define XFS_IOC_FSGEOMETRY_V1_32 \ | |
159 | + _IOR('X', 100, struct compat_xfs_fsop_geom_v1) | |
160 | + | |
161 | +typedef struct compat_xfs_inogrp { | |
162 | + __u64 xi_startino; /* starting inode number */ | |
163 | + __s32 xi_alloccount; /* # bits set in allocmask */ | |
164 | + __u64 xi_allocmask; /* mask of allocated inodes */ | |
165 | +} __attribute__((packed)) compat_xfs_inogrp_t; | |
166 | + | |
167 | +#endif /* BROKEN_X86_ALIGNMENT */ | |
23 | 168 | |
24 | 169 | #endif /* __XFS_IOCTL32_H__ */ |
fs/xfs/xfs_fs.h
... | ... | @@ -418,10 +418,6 @@ |
418 | 418 | #define XFS_IOC_GETXFLAGS FS_IOC_GETFLAGS |
419 | 419 | #define XFS_IOC_SETXFLAGS FS_IOC_SETFLAGS |
420 | 420 | #define XFS_IOC_GETVERSION FS_IOC_GETVERSION |
421 | -/* 32-bit compat counterparts */ | |
422 | -#define XFS_IOC32_GETXFLAGS FS_IOC32_GETFLAGS | |
423 | -#define XFS_IOC32_SETXFLAGS FS_IOC32_SETFLAGS | |
424 | -#define XFS_IOC32_GETVERSION FS_IOC32_GETVERSION | |
425 | 421 | |
426 | 422 | /* |
427 | 423 | * ioctl commands that replace IRIX fcntl()'s |