diff options
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_ioctl32.c')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_ioctl32.c | 321 |
1 files changed, 293 insertions, 28 deletions
diff --git a/fs/xfs/linux-2.6/xfs_ioctl32.c b/fs/xfs/linux-2.6/xfs_ioctl32.c index b83cebc165f1..141cf15067c2 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl32.c +++ b/fs/xfs/linux-2.6/xfs_ioctl32.c | |||
@@ -23,10 +23,25 @@ | |||
23 | #include <linux/fs.h> | 23 | #include <linux/fs.h> |
24 | #include <asm/uaccess.h> | 24 | #include <asm/uaccess.h> |
25 | #include "xfs.h" | 25 | #include "xfs.h" |
26 | #include "xfs_types.h" | ||
27 | #include "xfs_fs.h" | 26 | #include "xfs_fs.h" |
27 | #include "xfs_bit.h" | ||
28 | #include "xfs_log.h" | ||
29 | #include "xfs_inum.h" | ||
30 | #include "xfs_trans.h" | ||
31 | #include "xfs_sb.h" | ||
32 | #include "xfs_ag.h" | ||
33 | #include "xfs_dir2.h" | ||
34 | #include "xfs_dmapi.h" | ||
35 | #include "xfs_mount.h" | ||
36 | #include "xfs_bmap_btree.h" | ||
37 | #include "xfs_attr_sf.h" | ||
38 | #include "xfs_dir2_sf.h" | ||
28 | #include "xfs_vfs.h" | 39 | #include "xfs_vfs.h" |
29 | #include "xfs_vnode.h" | 40 | #include "xfs_vnode.h" |
41 | #include "xfs_dinode.h" | ||
42 | #include "xfs_inode.h" | ||
43 | #include "xfs_itable.h" | ||
44 | #include "xfs_error.h" | ||
30 | #include "xfs_dfrag.h" | 45 | #include "xfs_dfrag.h" |
31 | 46 | ||
32 | #define _NATIVE_IOC(cmd, type) \ | 47 | #define _NATIVE_IOC(cmd, type) \ |
@@ -34,6 +49,7 @@ | |||
34 | 49 | ||
35 | #if defined(CONFIG_IA64) || defined(CONFIG_X86_64) | 50 | #if defined(CONFIG_IA64) || defined(CONFIG_X86_64) |
36 | #define BROKEN_X86_ALIGNMENT | 51 | #define BROKEN_X86_ALIGNMENT |
52 | #define _PACKED __attribute__((packed)) | ||
37 | /* on ia32 l_start is on a 32-bit boundary */ | 53 | /* on ia32 l_start is on a 32-bit boundary */ |
38 | typedef struct xfs_flock64_32 { | 54 | typedef struct xfs_flock64_32 { |
39 | __s16 l_type; | 55 | __s16 l_type; |
@@ -75,35 +91,276 @@ xfs_ioctl32_flock( | |||
75 | return (unsigned long)p; | 91 | return (unsigned long)p; |
76 | } | 92 | } |
77 | 93 | ||
94 | typedef struct compat_xfs_fsop_geom_v1 { | ||
95 | __u32 blocksize; /* filesystem (data) block size */ | ||
96 | __u32 rtextsize; /* realtime extent size */ | ||
97 | __u32 agblocks; /* fsblocks in an AG */ | ||
98 | __u32 agcount; /* number of allocation groups */ | ||
99 | __u32 logblocks; /* fsblocks in the log */ | ||
100 | __u32 sectsize; /* (data) sector size, bytes */ | ||
101 | __u32 inodesize; /* inode size in bytes */ | ||
102 | __u32 imaxpct; /* max allowed inode space(%) */ | ||
103 | __u64 datablocks; /* fsblocks in data subvolume */ | ||
104 | __u64 rtblocks; /* fsblocks in realtime subvol */ | ||
105 | __u64 rtextents; /* rt extents in realtime subvol*/ | ||
106 | __u64 logstart; /* starting fsblock of the log */ | ||
107 | unsigned char uuid[16]; /* unique id of the filesystem */ | ||
108 | __u32 sunit; /* stripe unit, fsblocks */ | ||
109 | __u32 swidth; /* stripe width, fsblocks */ | ||
110 | __s32 version; /* structure version */ | ||
111 | __u32 flags; /* superblock version flags */ | ||
112 | __u32 logsectsize; /* log sector size, bytes */ | ||
113 | __u32 rtsectsize; /* realtime sector size, bytes */ | ||
114 | __u32 dirblocksize; /* directory block size, bytes */ | ||
115 | } __attribute__((packed)) compat_xfs_fsop_geom_v1_t; | ||
116 | |||
117 | #define XFS_IOC_FSGEOMETRY_V1_32 \ | ||
118 | _IOR ('X', 100, struct compat_xfs_fsop_geom_v1) | ||
119 | |||
120 | STATIC unsigned long xfs_ioctl32_geom_v1(unsigned long arg) | ||
121 | { | ||
122 | compat_xfs_fsop_geom_v1_t __user *p32 = (void __user *)arg; | ||
123 | xfs_fsop_geom_v1_t __user *p = compat_alloc_user_space(sizeof(*p)); | ||
124 | |||
125 | if (copy_in_user(p, p32, sizeof(*p32))) | ||
126 | return -EFAULT; | ||
127 | return (unsigned long)p; | ||
128 | } | ||
129 | |||
130 | typedef struct compat_xfs_inogrp { | ||
131 | __u64 xi_startino; /* starting inode number */ | ||
132 | __s32 xi_alloccount; /* # bits set in allocmask */ | ||
133 | __u64 xi_allocmask; /* mask of allocated inodes */ | ||
134 | } __attribute__((packed)) compat_xfs_inogrp_t; | ||
135 | |||
136 | STATIC int xfs_inumbers_fmt_compat( | ||
137 | void __user *ubuffer, | ||
138 | const xfs_inogrp_t *buffer, | ||
139 | long count, | ||
140 | long *written) | ||
141 | { | ||
142 | compat_xfs_inogrp_t *p32 = ubuffer; | ||
143 | long i; | ||
144 | |||
145 | for (i = 0; i < count; i++) { | ||
146 | if (put_user(buffer[i].xi_startino, &p32[i].xi_startino) || | ||
147 | put_user(buffer[i].xi_alloccount, &p32[i].xi_alloccount) || | ||
148 | put_user(buffer[i].xi_allocmask, &p32[i].xi_allocmask)) | ||
149 | return -EFAULT; | ||
150 | } | ||
151 | *written = count * sizeof(*p32); | ||
152 | return 0; | ||
153 | } | ||
154 | |||
78 | #else | 155 | #else |
79 | 156 | ||
80 | typedef struct xfs_fsop_bulkreq32 { | 157 | #define xfs_inumbers_fmt_compat xfs_inumbers_fmt |
158 | #define _PACKED | ||
159 | |||
160 | #endif | ||
161 | |||
162 | /* XFS_IOC_FSBULKSTAT and friends */ | ||
163 | |||
164 | typedef struct compat_xfs_bstime { | ||
165 | __s32 tv_sec; /* seconds */ | ||
166 | __s32 tv_nsec; /* and nanoseconds */ | ||
167 | } compat_xfs_bstime_t; | ||
168 | |||
169 | STATIC int xfs_bstime_store_compat( | ||
170 | compat_xfs_bstime_t __user *p32, | ||
171 | const xfs_bstime_t *p) | ||
172 | { | ||
173 | __s32 sec32; | ||
174 | |||
175 | sec32 = p->tv_sec; | ||
176 | if (put_user(sec32, &p32->tv_sec) || | ||
177 | put_user(p->tv_nsec, &p32->tv_nsec)) | ||
178 | return -EFAULT; | ||
179 | return 0; | ||
180 | } | ||
181 | |||
182 | typedef struct compat_xfs_bstat { | ||
183 | __u64 bs_ino; /* inode number */ | ||
184 | __u16 bs_mode; /* type and mode */ | ||
185 | __u16 bs_nlink; /* number of links */ | ||
186 | __u32 bs_uid; /* user id */ | ||
187 | __u32 bs_gid; /* group id */ | ||
188 | __u32 bs_rdev; /* device value */ | ||
189 | __s32 bs_blksize; /* block size */ | ||
190 | __s64 bs_size; /* file size */ | ||
191 | compat_xfs_bstime_t bs_atime; /* access time */ | ||
192 | compat_xfs_bstime_t bs_mtime; /* modify time */ | ||
193 | compat_xfs_bstime_t bs_ctime; /* inode change time */ | ||
194 | int64_t bs_blocks; /* number of blocks */ | ||
195 | __u32 bs_xflags; /* extended flags */ | ||
196 | __s32 bs_extsize; /* extent size */ | ||
197 | __s32 bs_extents; /* number of extents */ | ||
198 | __u32 bs_gen; /* generation count */ | ||
199 | __u16 bs_projid; /* project id */ | ||
200 | unsigned char bs_pad[14]; /* pad space, unused */ | ||
201 | __u32 bs_dmevmask; /* DMIG event mask */ | ||
202 | __u16 bs_dmstate; /* DMIG state info */ | ||
203 | __u16 bs_aextents; /* attribute number of extents */ | ||
204 | } _PACKED compat_xfs_bstat_t; | ||
205 | |||
206 | STATIC int xfs_bulkstat_one_fmt_compat( | ||
207 | void __user *ubuffer, | ||
208 | const xfs_bstat_t *buffer) | ||
209 | { | ||
210 | compat_xfs_bstat_t __user *p32 = ubuffer; | ||
211 | |||
212 | if (put_user(buffer->bs_ino, &p32->bs_ino) || | ||
213 | put_user(buffer->bs_mode, &p32->bs_mode) || | ||
214 | put_user(buffer->bs_nlink, &p32->bs_nlink) || | ||
215 | put_user(buffer->bs_uid, &p32->bs_uid) || | ||
216 | put_user(buffer->bs_gid, &p32->bs_gid) || | ||
217 | put_user(buffer->bs_rdev, &p32->bs_rdev) || | ||
218 | put_user(buffer->bs_blksize, &p32->bs_blksize) || | ||
219 | put_user(buffer->bs_size, &p32->bs_size) || | ||
220 | xfs_bstime_store_compat(&p32->bs_atime, &buffer->bs_atime) || | ||
221 | xfs_bstime_store_compat(&p32->bs_mtime, &buffer->bs_mtime) || | ||
222 | xfs_bstime_store_compat(&p32->bs_ctime, &buffer->bs_ctime) || | ||
223 | put_user(buffer->bs_blocks, &p32->bs_blocks) || | ||
224 | put_user(buffer->bs_xflags, &p32->bs_xflags) || | ||
225 | put_user(buffer->bs_extsize, &p32->bs_extsize) || | ||
226 | put_user(buffer->bs_extents, &p32->bs_extents) || | ||
227 | put_user(buffer->bs_gen, &p32->bs_gen) || | ||
228 | put_user(buffer->bs_projid, &p32->bs_projid) || | ||
229 | put_user(buffer->bs_dmevmask, &p32->bs_dmevmask) || | ||
230 | put_user(buffer->bs_dmstate, &p32->bs_dmstate) || | ||
231 | put_user(buffer->bs_aextents, &p32->bs_aextents)) | ||
232 | return -EFAULT; | ||
233 | return sizeof(*p32); | ||
234 | } | ||
235 | |||
236 | |||
237 | |||
238 | typedef struct compat_xfs_fsop_bulkreq { | ||
81 | compat_uptr_t lastip; /* last inode # pointer */ | 239 | compat_uptr_t lastip; /* last inode # pointer */ |
82 | __s32 icount; /* count of entries in buffer */ | 240 | __s32 icount; /* count of entries in buffer */ |
83 | compat_uptr_t ubuffer; /* user buffer for inode desc. */ | 241 | compat_uptr_t ubuffer; /* user buffer for inode desc. */ |
84 | __s32 ocount; /* output count pointer */ | 242 | compat_uptr_t ocount; /* output count pointer */ |
85 | } xfs_fsop_bulkreq32_t; | 243 | } compat_xfs_fsop_bulkreq_t; |
86 | 244 | ||
87 | STATIC unsigned long | 245 | #define XFS_IOC_FSBULKSTAT_32 \ |
88 | xfs_ioctl32_bulkstat( | 246 | _IOWR('X', 101, struct compat_xfs_fsop_bulkreq) |
89 | unsigned long arg) | 247 | #define XFS_IOC_FSBULKSTAT_SINGLE_32 \ |
248 | _IOWR('X', 102, struct compat_xfs_fsop_bulkreq) | ||
249 | #define XFS_IOC_FSINUMBERS_32 \ | ||
250 | _IOWR('X', 103, struct compat_xfs_fsop_bulkreq) | ||
251 | |||
252 | /* copied from xfs_ioctl.c */ | ||
253 | STATIC int | ||
254 | xfs_ioc_bulkstat_compat( | ||
255 | xfs_mount_t *mp, | ||
256 | unsigned int cmd, | ||
257 | void __user *arg) | ||
90 | { | 258 | { |
91 | xfs_fsop_bulkreq32_t __user *p32 = (void __user *)arg; | 259 | compat_xfs_fsop_bulkreq_t __user *p32 = (void __user *)arg; |
92 | xfs_fsop_bulkreq_t __user *p = compat_alloc_user_space(sizeof(*p)); | ||
93 | u32 addr; | 260 | u32 addr; |
261 | xfs_fsop_bulkreq_t bulkreq; | ||
262 | int count; /* # of records returned */ | ||
263 | xfs_ino_t inlast; /* last inode number */ | ||
264 | int done; | ||
265 | int error; | ||
266 | |||
267 | /* done = 1 if there are more stats to get and if bulkstat */ | ||
268 | /* should be called again (unused here, but used in dmapi) */ | ||
269 | |||
270 | if (!capable(CAP_SYS_ADMIN)) | ||
271 | return -EPERM; | ||
272 | |||
273 | if (XFS_FORCED_SHUTDOWN(mp)) | ||
274 | return -XFS_ERROR(EIO); | ||
275 | |||
276 | if (get_user(addr, &p32->lastip)) | ||
277 | return -EFAULT; | ||
278 | bulkreq.lastip = compat_ptr(addr); | ||
279 | if (get_user(bulkreq.icount, &p32->icount) || | ||
280 | get_user(addr, &p32->ubuffer)) | ||
281 | return -EFAULT; | ||
282 | bulkreq.ubuffer = compat_ptr(addr); | ||
283 | if (get_user(addr, &p32->ocount)) | ||
284 | return -EFAULT; | ||
285 | bulkreq.ocount = compat_ptr(addr); | ||
286 | |||
287 | if (copy_from_user(&inlast, bulkreq.lastip, sizeof(__s64))) | ||
288 | return -XFS_ERROR(EFAULT); | ||
289 | |||
290 | if ((count = bulkreq.icount) <= 0) | ||
291 | return -XFS_ERROR(EINVAL); | ||
292 | |||
293 | if (cmd == XFS_IOC_FSINUMBERS) | ||
294 | error = xfs_inumbers(mp, &inlast, &count, | ||
295 | bulkreq.ubuffer, xfs_inumbers_fmt_compat); | ||
296 | else { | ||
297 | /* declare a var to get a warning in case the type changes */ | ||
298 | bulkstat_one_fmt_pf formatter = xfs_bulkstat_one_fmt_compat; | ||
299 | error = xfs_bulkstat(mp, &inlast, &count, | ||
300 | xfs_bulkstat_one, formatter, | ||
301 | sizeof(compat_xfs_bstat_t), bulkreq.ubuffer, | ||
302 | BULKSTAT_FG_QUICK, &done); | ||
303 | } | ||
304 | if (error) | ||
305 | return -error; | ||
306 | |||
307 | if (bulkreq.ocount != NULL) { | ||
308 | if (copy_to_user(bulkreq.lastip, &inlast, | ||
309 | sizeof(xfs_ino_t))) | ||
310 | return -XFS_ERROR(EFAULT); | ||
311 | |||
312 | if (copy_to_user(bulkreq.ocount, &count, sizeof(count))) | ||
313 | return -XFS_ERROR(EFAULT); | ||
314 | } | ||
315 | |||
316 | return 0; | ||
317 | } | ||
318 | |||
319 | |||
320 | |||
321 | typedef struct compat_xfs_fsop_handlereq { | ||
322 | __u32 fd; /* fd for FD_TO_HANDLE */ | ||
323 | compat_uptr_t path; /* user pathname */ | ||
324 | __u32 oflags; /* open flags */ | ||
325 | compat_uptr_t ihandle; /* user supplied handle */ | ||
326 | __u32 ihandlen; /* user supplied length */ | ||
327 | compat_uptr_t ohandle; /* user buffer for handle */ | ||
328 | compat_uptr_t ohandlen; /* user buffer length */ | ||
329 | } compat_xfs_fsop_handlereq_t; | ||
330 | |||
331 | #define XFS_IOC_PATH_TO_FSHANDLE_32 \ | ||
332 | _IOWR('X', 104, struct compat_xfs_fsop_handlereq) | ||
333 | #define XFS_IOC_PATH_TO_HANDLE_32 \ | ||
334 | _IOWR('X', 105, struct compat_xfs_fsop_handlereq) | ||
335 | #define XFS_IOC_FD_TO_HANDLE_32 \ | ||
336 | _IOWR('X', 106, struct compat_xfs_fsop_handlereq) | ||
337 | #define XFS_IOC_OPEN_BY_HANDLE_32 \ | ||
338 | _IOWR('X', 107, struct compat_xfs_fsop_handlereq) | ||
339 | #define XFS_IOC_READLINK_BY_HANDLE_32 \ | ||
340 | _IOWR('X', 108, struct compat_xfs_fsop_handlereq) | ||
341 | |||
342 | STATIC unsigned long xfs_ioctl32_fshandle(unsigned long arg) | ||
343 | { | ||
344 | compat_xfs_fsop_handlereq_t __user *p32 = (void __user *)arg; | ||
345 | xfs_fsop_handlereq_t __user *p = compat_alloc_user_space(sizeof(*p)); | ||
346 | u32 addr; | ||
94 | 347 | ||
95 | if (get_user(addr, &p32->lastip) || | 348 | if (copy_in_user(&p->fd, &p32->fd, sizeof(__u32)) || |
96 | put_user(compat_ptr(addr), &p->lastip) || | 349 | get_user(addr, &p32->path) || |
97 | copy_in_user(&p->icount, &p32->icount, sizeof(s32)) || | 350 | put_user(compat_ptr(addr), &p->path) || |
98 | get_user(addr, &p32->ubuffer) || | 351 | copy_in_user(&p->oflags, &p32->oflags, sizeof(__u32)) || |
99 | put_user(compat_ptr(addr), &p->ubuffer) || | 352 | get_user(addr, &p32->ihandle) || |
100 | get_user(addr, &p32->ocount) || | 353 | put_user(compat_ptr(addr), &p->ihandle) || |
101 | put_user(compat_ptr(addr), &p->ocount)) | 354 | copy_in_user(&p->ihandlen, &p32->ihandlen, sizeof(__u32)) || |
355 | get_user(addr, &p32->ohandle) || | ||
356 | put_user(compat_ptr(addr), &p->ohandle) || | ||
357 | get_user(addr, &p32->ohandlen) || | ||
358 | put_user(compat_ptr(addr), &p->ohandlen)) | ||
102 | return -EFAULT; | 359 | return -EFAULT; |
103 | 360 | ||
104 | return (unsigned long)p; | 361 | return (unsigned long)p; |
105 | } | 362 | } |
106 | #endif | 363 | |
107 | 364 | ||
108 | STATIC long | 365 | STATIC long |
109 | xfs_compat_ioctl( | 366 | xfs_compat_ioctl( |
@@ -118,7 +375,6 @@ xfs_compat_ioctl( | |||
118 | 375 | ||
119 | switch (cmd) { | 376 | switch (cmd) { |
120 | case XFS_IOC_DIOINFO: | 377 | case XFS_IOC_DIOINFO: |
121 | case XFS_IOC_FSGEOMETRY_V1: | ||
122 | case XFS_IOC_FSGEOMETRY: | 378 | case XFS_IOC_FSGEOMETRY: |
123 | case XFS_IOC_GETVERSION: | 379 | case XFS_IOC_GETVERSION: |
124 | case XFS_IOC_GETXFLAGS: | 380 | case XFS_IOC_GETXFLAGS: |
@@ -131,12 +387,7 @@ xfs_compat_ioctl( | |||
131 | case XFS_IOC_GETBMAPA: | 387 | case XFS_IOC_GETBMAPA: |
132 | case XFS_IOC_GETBMAPX: | 388 | case XFS_IOC_GETBMAPX: |
133 | /* not handled | 389 | /* not handled |
134 | case XFS_IOC_FD_TO_HANDLE: | ||
135 | case XFS_IOC_PATH_TO_HANDLE: | ||
136 | case XFS_IOC_PATH_TO_FSHANDLE: | ||
137 | case XFS_IOC_OPEN_BY_HANDLE: | ||
138 | case XFS_IOC_FSSETDM_BY_HANDLE: | 390 | case XFS_IOC_FSSETDM_BY_HANDLE: |
139 | case XFS_IOC_READLINK_BY_HANDLE: | ||
140 | case XFS_IOC_ATTRLIST_BY_HANDLE: | 391 | case XFS_IOC_ATTRLIST_BY_HANDLE: |
141 | case XFS_IOC_ATTRMULTI_BY_HANDLE: | 392 | case XFS_IOC_ATTRMULTI_BY_HANDLE: |
142 | */ | 393 | */ |
@@ -166,6 +417,10 @@ xfs_compat_ioctl( | |||
166 | arg = xfs_ioctl32_flock(arg); | 417 | arg = xfs_ioctl32_flock(arg); |
167 | cmd = _NATIVE_IOC(cmd, struct xfs_flock64); | 418 | cmd = _NATIVE_IOC(cmd, struct xfs_flock64); |
168 | break; | 419 | break; |
420 | case XFS_IOC_FSGEOMETRY_V1_32: | ||
421 | arg = xfs_ioctl32_geom_v1(arg); | ||
422 | cmd = _NATIVE_IOC(cmd, struct xfs_fsop_geom_v1); | ||
423 | break; | ||
169 | 424 | ||
170 | #else /* These are handled fine if no alignment issues */ | 425 | #else /* These are handled fine if no alignment issues */ |
171 | case XFS_IOC_ALLOCSP: | 426 | case XFS_IOC_ALLOCSP: |
@@ -176,18 +431,28 @@ xfs_compat_ioctl( | |||
176 | case XFS_IOC_FREESP64: | 431 | case XFS_IOC_FREESP64: |
177 | case XFS_IOC_RESVSP64: | 432 | case XFS_IOC_RESVSP64: |
178 | case XFS_IOC_UNRESVSP64: | 433 | case XFS_IOC_UNRESVSP64: |
434 | case XFS_IOC_FSGEOMETRY_V1: | ||
179 | break; | 435 | break; |
180 | 436 | ||
181 | /* xfs_bstat_t still has wrong u32 vs u64 alignment */ | 437 | /* xfs_bstat_t still has wrong u32 vs u64 alignment */ |
182 | case XFS_IOC_SWAPEXT: | 438 | case XFS_IOC_SWAPEXT: |
183 | break; | 439 | break; |
184 | 440 | ||
185 | case XFS_IOC_FSBULKSTAT_SINGLE: | ||
186 | case XFS_IOC_FSBULKSTAT: | ||
187 | case XFS_IOC_FSINUMBERS: | ||
188 | arg = xfs_ioctl32_bulkstat(arg); | ||
189 | break; | ||
190 | #endif | 441 | #endif |
442 | case XFS_IOC_FSBULKSTAT_32: | ||
443 | case XFS_IOC_FSBULKSTAT_SINGLE_32: | ||
444 | case XFS_IOC_FSINUMBERS_32: | ||
445 | cmd = _NATIVE_IOC(cmd, struct xfs_fsop_bulkreq); | ||
446 | return xfs_ioc_bulkstat_compat(XFS_BHVTOI(VNHEAD(vp))->i_mount, | ||
447 | cmd, (void*)arg); | ||
448 | case XFS_IOC_FD_TO_HANDLE_32: | ||
449 | case XFS_IOC_PATH_TO_HANDLE_32: | ||
450 | case XFS_IOC_PATH_TO_FSHANDLE_32: | ||
451 | case XFS_IOC_OPEN_BY_HANDLE_32: | ||
452 | case XFS_IOC_READLINK_BY_HANDLE_32: | ||
453 | arg = xfs_ioctl32_fshandle(arg); | ||
454 | cmd = _NATIVE_IOC(cmd, struct xfs_fsop_handlereq); | ||
455 | break; | ||
191 | default: | 456 | default: |
192 | return -ENOIOCTLCMD; | 457 | return -ENOIOCTLCMD; |
193 | } | 458 | } |