1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * linux/fs/ioctl.c 4 * 5 * Copyright (C) 1991, 1992 Linus Torvalds 6 */ 7 8 #include <linux/syscalls.h> 9 #include <linux/mm.h> 10 #include <linux/capability.h> 11 #include <linux/compat.h> 12 #include <linux/file.h> 13 #include <linux/fs.h> 14 #include <linux/security.h> 15 #include <linux/export.h> 16 #include <linux/uaccess.h> 17 #include <linux/writeback.h> 18 #include <linux/buffer_head.h> 19 #include <linux/falloc.h> 20 #include <linux/sched/signal.h> 21 #include <linux/fiemap.h> 22 23 #include "internal.h" 24 25 #include <asm/ioctls.h> 26 27 /* So that the fiemap access checks can't overflow on 32 bit machines. */ 28 #define FIEMAP_MAX_EXTENTS (UINT_MAX / sizeof(struct fiemap_extent)) 29 30 /** 31 * vfs_ioctl - call filesystem specific ioctl methods 32 * @filp: open file to invoke ioctl method on 33 * @cmd: ioctl command to execute 34 * @arg: command-specific argument for ioctl 35 * 36 * Invokes filesystem specific ->unlocked_ioctl, if one exists; otherwise 37 * returns -ENOTTY. 38 * 39 * Returns 0 on success, -errno on error. 40 */ 41 long vfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 42 { 43 int error = -ENOTTY; 44 45 if (!filp->f_op->unlocked_ioctl) 46 goto out; 47 48 error = filp->f_op->unlocked_ioctl(filp, cmd, arg); 49 if (error == -ENOIOCTLCMD) 50 error = -ENOTTY; 51 out: 52 return error; 53 } 54 EXPORT_SYMBOL(vfs_ioctl); 55 56 static int ioctl_fibmap(struct file *filp, int __user *p) 57 { 58 struct inode *inode = file_inode(filp); 59 struct super_block *sb = inode->i_sb; 60 int error, ur_block; 61 sector_t block; 62 63 if (!capable(CAP_SYS_RAWIO)) 64 return -EPERM; 65 66 error = get_user(ur_block, p); 67 if (error) 68 return error; 69 70 if (ur_block < 0) 71 return -EINVAL; 72 73 block = ur_block; 74 error = bmap(inode, &block); 75 76 if (block > INT_MAX) { 77 error = -ERANGE; 78 pr_warn_ratelimited("[%s/%d] FS: %s File: %pD4 would truncate fibmap result\n", 79 current->comm, task_pid_nr(current), 80 sb->s_id, filp); 81 } 82 83 if (error) 84 ur_block = 0; 85 else 86 ur_block = block; 87 88 if (put_user(ur_block, p)) 89 error = -EFAULT; 90 91 return error; 92 } 93 94 /** 95 * fiemap_fill_next_extent - Fiemap helper function 96 * @fieinfo: Fiemap context passed into ->fiemap 97 * @logical: Extent logical start offset, in bytes 98 * @phys: Extent physical start offset, in bytes 99 * @len: Extent length, in bytes 100 * @flags: FIEMAP_EXTENT flags that describe this extent 101 * 102 * Called from file system ->fiemap callback. Will populate extent 103 * info as passed in via arguments and copy to user memory. On 104 * success, extent count on fieinfo is incremented. 105 * 106 * Returns 0 on success, -errno on error, 1 if this was the last 107 * extent that will fit in user array. 108 */ 109 #define SET_UNKNOWN_FLAGS (FIEMAP_EXTENT_DELALLOC) 110 #define SET_NO_UNMOUNTED_IO_FLAGS (FIEMAP_EXTENT_DATA_ENCRYPTED) 111 #define SET_NOT_ALIGNED_FLAGS (FIEMAP_EXTENT_DATA_TAIL|FIEMAP_EXTENT_DATA_INLINE) 112 int fiemap_fill_next_extent(struct fiemap_extent_info *fieinfo, u64 logical, 113 u64 phys, u64 len, u32 flags) 114 { 115 struct fiemap_extent extent; 116 struct fiemap_extent __user *dest = fieinfo->fi_extents_start; 117 118 /* only count the extents */ 119 if (fieinfo->fi_extents_max == 0) { 120 fieinfo->fi_extents_mapped++; 121 return (flags & FIEMAP_EXTENT_LAST) ? 1 : 0; 122 } 123 124 if (fieinfo->fi_extents_mapped >= fieinfo->fi_extents_max) 125 return 1; 126 127 if (flags & SET_UNKNOWN_FLAGS) 128 flags |= FIEMAP_EXTENT_UNKNOWN; 129 if (flags & SET_NO_UNMOUNTED_IO_FLAGS) 130 flags |= FIEMAP_EXTENT_ENCODED; 131 if (flags & SET_NOT_ALIGNED_FLAGS) 132 flags |= FIEMAP_EXTENT_NOT_ALIGNED; 133 134 memset(&extent, 0, sizeof(extent)); 135 extent.fe_logical = logical; 136 extent.fe_physical = phys; 137 extent.fe_length = len; 138 extent.fe_flags = flags; 139 140 dest += fieinfo->fi_extents_mapped; 141 if (copy_to_user(dest, &extent, sizeof(extent))) 142 return -EFAULT; 143 144 fieinfo->fi_extents_mapped++; 145 if (fieinfo->fi_extents_mapped == fieinfo->fi_extents_max) 146 return 1; 147 return (flags & FIEMAP_EXTENT_LAST) ? 1 : 0; 148 } 149 EXPORT_SYMBOL(fiemap_fill_next_extent); 150 151 /** 152 * fiemap_prep - check validity of requested flags for fiemap 153 * @inode: Inode to operate on 154 * @fieinfo: Fiemap context passed into ->fiemap 155 * @start: Start of the mapped range 156 * @len: Length of the mapped range, can be truncated by this function. 157 * @supported_flags: Set of fiemap flags that the file system understands 158 * 159 * This function must be called from each ->fiemap instance to validate the 160 * fiemap request against the file system parameters. 161 * 162 * Returns 0 on success, or a negative error on failure. 163 */ 164 int fiemap_prep(struct inode *inode, struct fiemap_extent_info *fieinfo, 165 u64 start, u64 *len, u32 supported_flags) 166 { 167 u64 maxbytes = inode->i_sb->s_maxbytes; 168 u32 incompat_flags; 169 int ret = 0; 170 171 if (*len == 0) 172 return -EINVAL; 173 if (start > maxbytes) 174 return -EFBIG; 175 176 /* 177 * Shrink request scope to what the fs can actually handle. 178 */ 179 if (*len > maxbytes || (maxbytes - *len) < start) 180 *len = maxbytes - start; 181 182 supported_flags |= FIEMAP_FLAG_SYNC; 183 supported_flags &= FIEMAP_FLAGS_COMPAT; 184 incompat_flags = fieinfo->fi_flags & ~supported_flags; 185 if (incompat_flags) { 186 fieinfo->fi_flags = incompat_flags; 187 return -EBADR; 188 } 189 190 if (fieinfo->fi_flags & FIEMAP_FLAG_SYNC) 191 ret = filemap_write_and_wait(inode->i_mapping); 192 return ret; 193 } 194 EXPORT_SYMBOL(fiemap_prep); 195 196 static int ioctl_fiemap(struct file *filp, struct fiemap __user *ufiemap) 197 { 198 struct fiemap fiemap; 199 struct fiemap_extent_info fieinfo = { 0, }; 200 struct inode *inode = file_inode(filp); 201 int error; 202 203 if (!inode->i_op->fiemap) 204 return -EOPNOTSUPP; 205 206 if (copy_from_user(&fiemap, ufiemap, sizeof(fiemap))) 207 return -EFAULT; 208 209 if (fiemap.fm_extent_count > FIEMAP_MAX_EXTENTS) 210 return -EINVAL; 211 212 fieinfo.fi_flags = fiemap.fm_flags; 213 fieinfo.fi_extents_max = fiemap.fm_extent_count; 214 fieinfo.fi_extents_start = ufiemap->fm_extents; 215 216 error = inode->i_op->fiemap(inode, &fieinfo, fiemap.fm_start, 217 fiemap.fm_length); 218 219 fiemap.fm_flags = fieinfo.fi_flags; 220 fiemap.fm_mapped_extents = fieinfo.fi_extents_mapped; 221 if (copy_to_user(ufiemap, &fiemap, sizeof(fiemap))) 222 error = -EFAULT; 223 224 return error; 225 } 226 227 static long ioctl_file_clone(struct file *dst_file, unsigned long srcfd, 228 u64 off, u64 olen, u64 destoff) 229 { 230 struct fd src_file = fdget(srcfd); 231 loff_t cloned; 232 int ret; 233 234 if (!src_file.file) 235 return -EBADF; 236 ret = -EXDEV; 237 if (src_file.file->f_path.mnt != dst_file->f_path.mnt) 238 goto fdput; 239 cloned = vfs_clone_file_range(src_file.file, off, dst_file, destoff, 240 olen, 0); 241 if (cloned < 0) 242 ret = cloned; 243 else if (olen && cloned != olen) 244 ret = -EINVAL; 245 else 246 ret = 0; 247 fdput: 248 fdput(src_file); 249 return ret; 250 } 251 252 static long ioctl_file_clone_range(struct file *file, 253 struct file_clone_range __user *argp) 254 { 255 struct file_clone_range args; 256 257 if (copy_from_user(&args, argp, sizeof(args))) 258 return -EFAULT; 259 return ioctl_file_clone(file, args.src_fd, args.src_offset, 260 args.src_length, args.dest_offset); 261 } 262 263 #ifdef CONFIG_BLOCK 264 265 static inline sector_t logical_to_blk(struct inode *inode, loff_t offset) 266 { 267 return (offset >> inode->i_blkbits); 268 } 269 270 static inline loff_t blk_to_logical(struct inode *inode, sector_t blk) 271 { 272 return (blk << inode->i_blkbits); 273 } 274 275 /** 276 * __generic_block_fiemap - FIEMAP for block based inodes (no locking) 277 * @inode: the inode to map 278 * @fieinfo: the fiemap info struct that will be passed back to userspace 279 * @start: where to start mapping in the inode 280 * @len: how much space to map 281 * @get_block: the fs's get_block function 282 * 283 * This does FIEMAP for block based inodes. Basically it will just loop 284 * through get_block until we hit the number of extents we want to map, or we 285 * go past the end of the file and hit a hole. 286 * 287 * If it is possible to have data blocks beyond a hole past @inode->i_size, then 288 * please do not use this function, it will stop at the first unmapped block 289 * beyond i_size. 290 * 291 * If you use this function directly, you need to do your own locking. Use 292 * generic_block_fiemap if you want the locking done for you. 293 */ 294 static int __generic_block_fiemap(struct inode *inode, 295 struct fiemap_extent_info *fieinfo, loff_t start, 296 loff_t len, get_block_t *get_block) 297 { 298 struct buffer_head map_bh; 299 sector_t start_blk, last_blk; 300 loff_t isize = i_size_read(inode); 301 u64 logical = 0, phys = 0, size = 0; 302 u32 flags = FIEMAP_EXTENT_MERGED; 303 bool past_eof = false, whole_file = false; 304 int ret = 0; 305 306 ret = fiemap_prep(inode, fieinfo, start, &len, FIEMAP_FLAG_SYNC); 307 if (ret) 308 return ret; 309 310 /* 311 * Either the i_mutex or other appropriate locking needs to be held 312 * since we expect isize to not change at all through the duration of 313 * this call. 314 */ 315 if (len >= isize) { 316 whole_file = true; 317 len = isize; 318 } 319 320 /* 321 * Some filesystems can't deal with being asked to map less than 322 * blocksize, so make sure our len is at least block length. 323 */ 324 if (logical_to_blk(inode, len) == 0) 325 len = blk_to_logical(inode, 1); 326 327 start_blk = logical_to_blk(inode, start); 328 last_blk = logical_to_blk(inode, start + len - 1); 329 330 do { 331 /* 332 * we set b_size to the total size we want so it will map as 333 * many contiguous blocks as possible at once 334 */ 335 memset(&map_bh, 0, sizeof(struct buffer_head)); 336 map_bh.b_size = len; 337 338 ret = get_block(inode, start_blk, &map_bh, 0); 339 if (ret) 340 break; 341 342 /* HOLE */ 343 if (!buffer_mapped(&map_bh)) { 344 start_blk++; 345 346 /* 347 * We want to handle the case where there is an 348 * allocated block at the front of the file, and then 349 * nothing but holes up to the end of the file properly, 350 * to make sure that extent at the front gets properly 351 * marked with FIEMAP_EXTENT_LAST 352 */ 353 if (!past_eof && 354 blk_to_logical(inode, start_blk) >= isize) 355 past_eof = 1; 356 357 /* 358 * First hole after going past the EOF, this is our 359 * last extent 360 */ 361 if (past_eof && size) { 362 flags = FIEMAP_EXTENT_MERGED|FIEMAP_EXTENT_LAST; 363 ret = fiemap_fill_next_extent(fieinfo, logical, 364 phys, size, 365 flags); 366 } else if (size) { 367 ret = fiemap_fill_next_extent(fieinfo, logical, 368 phys, size, flags); 369 size = 0; 370 } 371 372 /* if we have holes up to/past EOF then we're done */ 373 if (start_blk > last_blk || past_eof || ret) 374 break; 375 } else { 376 /* 377 * We have gone over the length of what we wanted to 378 * map, and it wasn't the entire file, so add the extent 379 * we got last time and exit. 380 * 381 * This is for the case where say we want to map all the 382 * way up to the second to the last block in a file, but 383 * the last block is a hole, making the second to last 384 * block FIEMAP_EXTENT_LAST. In this case we want to 385 * see if there is a hole after the second to last block 386 * so we can mark it properly. If we found data after 387 * we exceeded the length we were requesting, then we 388 * are good to go, just add the extent to the fieinfo 389 * and break 390 */ 391 if (start_blk > last_blk && !whole_file) { 392 ret = fiemap_fill_next_extent(fieinfo, logical, 393 phys, size, 394 flags); 395 break; 396 } 397 398 /* 399 * if size != 0 then we know we already have an extent 400 * to add, so add it. 401 */ 402 if (size) { 403 ret = fiemap_fill_next_extent(fieinfo, logical, 404 phys, size, 405 flags); 406 if (ret) 407 break; 408 } 409 410 logical = blk_to_logical(inode, start_blk); 411 phys = blk_to_logical(inode, map_bh.b_blocknr); 412 size = map_bh.b_size; 413 flags = FIEMAP_EXTENT_MERGED; 414 415 start_blk += logical_to_blk(inode, size); 416 417 /* 418 * If we are past the EOF, then we need to make sure as 419 * soon as we find a hole that the last extent we found 420 * is marked with FIEMAP_EXTENT_LAST 421 */ 422 if (!past_eof && logical + size >= isize) 423 past_eof = true; 424 } 425 cond_resched(); 426 if (fatal_signal_pending(current)) { 427 ret = -EINTR; 428 break; 429 } 430 431 } while (1); 432 433 /* If ret is 1 then we just hit the end of the extent array */ 434 if (ret == 1) 435 ret = 0; 436 437 return ret; 438 } 439 440 /** 441 * generic_block_fiemap - FIEMAP for block based inodes 442 * @inode: The inode to map 443 * @fieinfo: The mapping information 444 * @start: The initial block to map 445 * @len: The length of the extect to attempt to map 446 * @get_block: The block mapping function for the fs 447 * 448 * Calls __generic_block_fiemap to map the inode, after taking 449 * the inode's mutex lock. 450 */ 451 452 int generic_block_fiemap(struct inode *inode, 453 struct fiemap_extent_info *fieinfo, u64 start, 454 u64 len, get_block_t *get_block) 455 { 456 int ret; 457 inode_lock(inode); 458 ret = __generic_block_fiemap(inode, fieinfo, start, len, get_block); 459 inode_unlock(inode); 460 return ret; 461 } 462 EXPORT_SYMBOL(generic_block_fiemap); 463 464 #endif /* CONFIG_BLOCK */ 465 466 /* 467 * This provides compatibility with legacy XFS pre-allocation ioctls 468 * which predate the fallocate syscall. 469 * 470 * Only the l_start, l_len and l_whence fields of the 'struct space_resv' 471 * are used here, rest are ignored. 472 */ 473 static int ioctl_preallocate(struct file *filp, int mode, void __user *argp) 474 { 475 struct inode *inode = file_inode(filp); 476 struct space_resv sr; 477 478 if (copy_from_user(&sr, argp, sizeof(sr))) 479 return -EFAULT; 480 481 switch (sr.l_whence) { 482 case SEEK_SET: 483 break; 484 case SEEK_CUR: 485 sr.l_start += filp->f_pos; 486 break; 487 case SEEK_END: 488 sr.l_start += i_size_read(inode); 489 break; 490 default: 491 return -EINVAL; 492 } 493 494 return vfs_fallocate(filp, mode | FALLOC_FL_KEEP_SIZE, sr.l_start, 495 sr.l_len); 496 } 497 498 /* on ia32 l_start is on a 32-bit boundary */ 499 #if defined CONFIG_COMPAT && defined(CONFIG_X86_64) 500 /* just account for different alignment */ 501 static int compat_ioctl_preallocate(struct file *file, int mode, 502 struct space_resv_32 __user *argp) 503 { 504 struct inode *inode = file_inode(file); 505 struct space_resv_32 sr; 506 507 if (copy_from_user(&sr, argp, sizeof(sr))) 508 return -EFAULT; 509 510 switch (sr.l_whence) { 511 case SEEK_SET: 512 break; 513 case SEEK_CUR: 514 sr.l_start += file->f_pos; 515 break; 516 case SEEK_END: 517 sr.l_start += i_size_read(inode); 518 break; 519 default: 520 return -EINVAL; 521 } 522 523 return vfs_fallocate(file, mode | FALLOC_FL_KEEP_SIZE, sr.l_start, sr.l_len); 524 } 525 #endif 526 527 static int file_ioctl(struct file *filp, unsigned int cmd, int __user *p) 528 { 529 switch (cmd) { 530 case FIBMAP: 531 return ioctl_fibmap(filp, p); 532 case FS_IOC_RESVSP: 533 case FS_IOC_RESVSP64: 534 return ioctl_preallocate(filp, 0, p); 535 case FS_IOC_UNRESVSP: 536 case FS_IOC_UNRESVSP64: 537 return ioctl_preallocate(filp, FALLOC_FL_PUNCH_HOLE, p); 538 case FS_IOC_ZERO_RANGE: 539 return ioctl_preallocate(filp, FALLOC_FL_ZERO_RANGE, p); 540 } 541 542 return -ENOIOCTLCMD; 543 } 544 545 static int ioctl_fionbio(struct file *filp, int __user *argp) 546 { 547 unsigned int flag; 548 int on, error; 549 550 error = get_user(on, argp); 551 if (error) 552 return error; 553 flag = O_NONBLOCK; 554 #ifdef __sparc__ 555 /* SunOS compatibility item. */ 556 if (O_NONBLOCK != O_NDELAY) 557 flag |= O_NDELAY; 558 #endif 559 spin_lock(&filp->f_lock); 560 if (on) 561 filp->f_flags |= flag; 562 else 563 filp->f_flags &= ~flag; 564 spin_unlock(&filp->f_lock); 565 return error; 566 } 567 568 static int ioctl_fioasync(unsigned int fd, struct file *filp, 569 int __user *argp) 570 { 571 unsigned int flag; 572 int on, error; 573 574 error = get_user(on, argp); 575 if (error) 576 return error; 577 flag = on ? FASYNC : 0; 578 579 /* Did FASYNC state change ? */ 580 if ((flag ^ filp->f_flags) & FASYNC) { 581 if (filp->f_op->fasync) 582 /* fasync() adjusts filp->f_flags */ 583 error = filp->f_op->fasync(fd, filp, on); 584 else 585 error = -ENOTTY; 586 } 587 return error < 0 ? error : 0; 588 } 589 590 static int ioctl_fsfreeze(struct file *filp) 591 { 592 struct super_block *sb = file_inode(filp)->i_sb; 593 594 if (!ns_capable(sb->s_user_ns, CAP_SYS_ADMIN)) 595 return -EPERM; 596 597 /* If filesystem doesn't support freeze feature, return. */ 598 if (sb->s_op->freeze_fs == NULL && sb->s_op->freeze_super == NULL) 599 return -EOPNOTSUPP; 600 601 /* Freeze */ 602 if (sb->s_op->freeze_super) 603 return sb->s_op->freeze_super(sb); 604 return freeze_super(sb); 605 } 606 607 static int ioctl_fsthaw(struct file *filp) 608 { 609 struct super_block *sb = file_inode(filp)->i_sb; 610 611 if (!ns_capable(sb->s_user_ns, CAP_SYS_ADMIN)) 612 return -EPERM; 613 614 /* Thaw */ 615 if (sb->s_op->thaw_super) 616 return sb->s_op->thaw_super(sb); 617 return thaw_super(sb); 618 } 619 620 static int ioctl_file_dedupe_range(struct file *file, 621 struct file_dedupe_range __user *argp) 622 { 623 struct file_dedupe_range *same = NULL; 624 int ret; 625 unsigned long size; 626 u16 count; 627 628 if (get_user(count, &argp->dest_count)) { 629 ret = -EFAULT; 630 goto out; 631 } 632 633 size = offsetof(struct file_dedupe_range __user, info[count]); 634 if (size > PAGE_SIZE) { 635 ret = -ENOMEM; 636 goto out; 637 } 638 639 same = memdup_user(argp, size); 640 if (IS_ERR(same)) { 641 ret = PTR_ERR(same); 642 same = NULL; 643 goto out; 644 } 645 646 same->dest_count = count; 647 ret = vfs_dedupe_file_range(file, same); 648 if (ret) 649 goto out; 650 651 ret = copy_to_user(argp, same, size); 652 if (ret) 653 ret = -EFAULT; 654 655 out: 656 kfree(same); 657 return ret; 658 } 659 660 /* 661 * do_vfs_ioctl() is not for drivers and not intended to be EXPORT_SYMBOL()'d. 662 * It's just a simple helper for sys_ioctl and compat_sys_ioctl. 663 * 664 * When you add any new common ioctls to the switches above and below, 665 * please ensure they have compatible arguments in compat mode. 666 */ 667 static int do_vfs_ioctl(struct file *filp, unsigned int fd, 668 unsigned int cmd, unsigned long arg) 669 { 670 void __user *argp = (void __user *)arg; 671 struct inode *inode = file_inode(filp); 672 673 switch (cmd) { 674 case FIOCLEX: 675 set_close_on_exec(fd, 1); 676 return 0; 677 678 case FIONCLEX: 679 set_close_on_exec(fd, 0); 680 return 0; 681 682 case FIONBIO: 683 return ioctl_fionbio(filp, argp); 684 685 case FIOASYNC: 686 return ioctl_fioasync(fd, filp, argp); 687 688 case FIOQSIZE: 689 if (S_ISDIR(inode->i_mode) || S_ISREG(inode->i_mode) || 690 S_ISLNK(inode->i_mode)) { 691 loff_t res = inode_get_bytes(inode); 692 return copy_to_user(argp, &res, sizeof(res)) ? 693 -EFAULT : 0; 694 } 695 696 return -ENOTTY; 697 698 case FIFREEZE: 699 return ioctl_fsfreeze(filp); 700 701 case FITHAW: 702 return ioctl_fsthaw(filp); 703 704 case FS_IOC_FIEMAP: 705 return ioctl_fiemap(filp, argp); 706 707 case FIGETBSZ: 708 /* anon_bdev filesystems may not have a block size */ 709 if (!inode->i_sb->s_blocksize) 710 return -EINVAL; 711 712 return put_user(inode->i_sb->s_blocksize, (int __user *)argp); 713 714 case FICLONE: 715 return ioctl_file_clone(filp, arg, 0, 0, 0); 716 717 case FICLONERANGE: 718 return ioctl_file_clone_range(filp, argp); 719 720 case FIDEDUPERANGE: 721 return ioctl_file_dedupe_range(filp, argp); 722 723 case FIONREAD: 724 if (!S_ISREG(inode->i_mode)) 725 return vfs_ioctl(filp, cmd, arg); 726 727 return put_user(i_size_read(inode) - filp->f_pos, 728 (int __user *)argp); 729 730 default: 731 if (S_ISREG(inode->i_mode)) 732 return file_ioctl(filp, cmd, argp); 733 break; 734 } 735 736 return -ENOIOCTLCMD; 737 } 738 739 SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) 740 { 741 struct fd f = fdget(fd); 742 int error; 743 744 if (!f.file) 745 return -EBADF; 746 747 error = security_file_ioctl(f.file, cmd, arg); 748 if (error) 749 goto out; 750 751 error = do_vfs_ioctl(f.file, fd, cmd, arg); 752 if (error == -ENOIOCTLCMD) 753 error = vfs_ioctl(f.file, cmd, arg); 754 755 out: 756 fdput(f); 757 return error; 758 } 759 760 #ifdef CONFIG_COMPAT 761 /** 762 * compat_ptr_ioctl - generic implementation of .compat_ioctl file operation 763 * 764 * This is not normally called as a function, but instead set in struct 765 * file_operations as 766 * 767 * .compat_ioctl = compat_ptr_ioctl, 768 * 769 * On most architectures, the compat_ptr_ioctl() just passes all arguments 770 * to the corresponding ->ioctl handler. The exception is arch/s390, where 771 * compat_ptr() clears the top bit of a 32-bit pointer value, so user space 772 * pointers to the second 2GB alias the first 2GB, as is the case for 773 * native 32-bit s390 user space. 774 * 775 * The compat_ptr_ioctl() function must therefore be used only with ioctl 776 * functions that either ignore the argument or pass a pointer to a 777 * compatible data type. 778 * 779 * If any ioctl command handled by fops->unlocked_ioctl passes a plain 780 * integer instead of a pointer, or any of the passed data types 781 * is incompatible between 32-bit and 64-bit architectures, a proper 782 * handler is required instead of compat_ptr_ioctl. 783 */ 784 long compat_ptr_ioctl(struct file *file, unsigned int cmd, unsigned long arg) 785 { 786 if (!file->f_op->unlocked_ioctl) 787 return -ENOIOCTLCMD; 788 789 return file->f_op->unlocked_ioctl(file, cmd, (unsigned long)compat_ptr(arg)); 790 } 791 EXPORT_SYMBOL(compat_ptr_ioctl); 792 793 COMPAT_SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, 794 compat_ulong_t, arg) 795 { 796 struct fd f = fdget(fd); 797 int error; 798 799 if (!f.file) 800 return -EBADF; 801 802 /* RED-PEN how should LSM module know it's handling 32bit? */ 803 error = security_file_ioctl(f.file, cmd, arg); 804 if (error) 805 goto out; 806 807 switch (cmd) { 808 /* FICLONE takes an int argument, so don't use compat_ptr() */ 809 case FICLONE: 810 error = ioctl_file_clone(f.file, arg, 0, 0, 0); 811 break; 812 813 #if defined(CONFIG_X86_64) 814 /* these get messy on amd64 due to alignment differences */ 815 case FS_IOC_RESVSP_32: 816 case FS_IOC_RESVSP64_32: 817 error = compat_ioctl_preallocate(f.file, 0, compat_ptr(arg)); 818 break; 819 case FS_IOC_UNRESVSP_32: 820 case FS_IOC_UNRESVSP64_32: 821 error = compat_ioctl_preallocate(f.file, FALLOC_FL_PUNCH_HOLE, 822 compat_ptr(arg)); 823 break; 824 case FS_IOC_ZERO_RANGE_32: 825 error = compat_ioctl_preallocate(f.file, FALLOC_FL_ZERO_RANGE, 826 compat_ptr(arg)); 827 break; 828 #endif 829 830 /* 831 * everything else in do_vfs_ioctl() takes either a compatible 832 * pointer argument or no argument -- call it with a modified 833 * argument. 834 */ 835 default: 836 error = do_vfs_ioctl(f.file, fd, cmd, 837 (unsigned long)compat_ptr(arg)); 838 if (error != -ENOIOCTLCMD) 839 break; 840 841 if (f.file->f_op->compat_ioctl) 842 error = f.file->f_op->compat_ioctl(f.file, cmd, arg); 843 if (error == -ENOIOCTLCMD) 844 error = -ENOTTY; 845 break; 846 } 847 848 out: 849 fdput(f); 850 851 return error; 852 } 853 #endif 854