1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (c) 2000-2005 Silicon Graphics, Inc. 4 * All Rights Reserved. 5 */ 6 #include "xfs.h" 7 #include "xfs_fs.h" 8 #include "xfs_shared.h" 9 #include "xfs_format.h" 10 #include "xfs_log_format.h" 11 #include "xfs_trans_resv.h" 12 #include "xfs_mount.h" 13 #include "xfs_inode.h" 14 #include "xfs_rtalloc.h" 15 #include "xfs_iwalk.h" 16 #include "xfs_itable.h" 17 #include "xfs_error.h" 18 #include "xfs_da_format.h" 19 #include "xfs_da_btree.h" 20 #include "xfs_attr.h" 21 #include "xfs_bmap.h" 22 #include "xfs_bmap_util.h" 23 #include "xfs_fsops.h" 24 #include "xfs_discard.h" 25 #include "xfs_quota.h" 26 #include "xfs_export.h" 27 #include "xfs_trace.h" 28 #include "xfs_icache.h" 29 #include "xfs_trans.h" 30 #include "xfs_acl.h" 31 #include "xfs_btree.h" 32 #include <linux/fsmap.h> 33 #include "xfs_fsmap.h" 34 #include "scrub/xfs_scrub.h" 35 #include "xfs_sb.h" 36 #include "xfs_ag.h" 37 #include "xfs_health.h" 38 #include "xfs_reflink.h" 39 #include "xfs_ioctl.h" 40 #include "xfs_xattr.h" 41 #include "xfs_rtbitmap.h" 42 43 #include <linux/mount.h> 44 #include <linux/namei.h> 45 #include <linux/fileattr.h> 46 47 /* 48 * xfs_find_handle maps from userspace xfs_fsop_handlereq structure to 49 * a file or fs handle. 50 * 51 * XFS_IOC_PATH_TO_FSHANDLE 52 * returns fs handle for a mount point or path within that mount point 53 * XFS_IOC_FD_TO_HANDLE 54 * returns full handle for a FD opened in user space 55 * XFS_IOC_PATH_TO_HANDLE 56 * returns full handle for a path 57 */ 58 int 59 xfs_find_handle( 60 unsigned int cmd, 61 xfs_fsop_handlereq_t *hreq) 62 { 63 int hsize; 64 xfs_handle_t handle; 65 struct inode *inode; 66 struct fd f = {NULL}; 67 struct path path; 68 int error; 69 struct xfs_inode *ip; 70 71 if (cmd == XFS_IOC_FD_TO_HANDLE) { 72 f = fdget(hreq->fd); 73 if (!f.file) 74 return -EBADF; 75 inode = file_inode(f.file); 76 } else { 77 error = user_path_at(AT_FDCWD, hreq->path, 0, &path); 78 if (error) 79 return error; 80 inode = d_inode(path.dentry); 81 } 82 ip = XFS_I(inode); 83 84 /* 85 * We can only generate handles for inodes residing on a XFS filesystem, 86 * and only for regular files, directories or symbolic links. 87 */ 88 error = -EINVAL; 89 if (inode->i_sb->s_magic != XFS_SB_MAGIC) 90 goto out_put; 91 92 error = -EBADF; 93 if (!S_ISREG(inode->i_mode) && 94 !S_ISDIR(inode->i_mode) && 95 !S_ISLNK(inode->i_mode)) 96 goto out_put; 97 98 99 memcpy(&handle.ha_fsid, ip->i_mount->m_fixedfsid, sizeof(xfs_fsid_t)); 100 101 if (cmd == XFS_IOC_PATH_TO_FSHANDLE) { 102 /* 103 * This handle only contains an fsid, zero the rest. 104 */ 105 memset(&handle.ha_fid, 0, sizeof(handle.ha_fid)); 106 hsize = sizeof(xfs_fsid_t); 107 } else { 108 handle.ha_fid.fid_len = sizeof(xfs_fid_t) - 109 sizeof(handle.ha_fid.fid_len); 110 handle.ha_fid.fid_pad = 0; 111 handle.ha_fid.fid_gen = inode->i_generation; 112 handle.ha_fid.fid_ino = ip->i_ino; 113 hsize = sizeof(xfs_handle_t); 114 } 115 116 error = -EFAULT; 117 if (copy_to_user(hreq->ohandle, &handle, hsize) || 118 copy_to_user(hreq->ohandlen, &hsize, sizeof(__s32))) 119 goto out_put; 120 121 error = 0; 122 123 out_put: 124 if (cmd == XFS_IOC_FD_TO_HANDLE) 125 fdput(f); 126 else 127 path_put(&path); 128 return error; 129 } 130 131 /* 132 * No need to do permission checks on the various pathname components 133 * as the handle operations are privileged. 134 */ 135 STATIC int 136 xfs_handle_acceptable( 137 void *context, 138 struct dentry *dentry) 139 { 140 return 1; 141 } 142 143 /* 144 * Convert userspace handle data into a dentry. 145 */ 146 struct dentry * 147 xfs_handle_to_dentry( 148 struct file *parfilp, 149 void __user *uhandle, 150 u32 hlen) 151 { 152 xfs_handle_t handle; 153 struct xfs_fid64 fid; 154 155 /* 156 * Only allow handle opens under a directory. 157 */ 158 if (!S_ISDIR(file_inode(parfilp)->i_mode)) 159 return ERR_PTR(-ENOTDIR); 160 161 if (hlen != sizeof(xfs_handle_t)) 162 return ERR_PTR(-EINVAL); 163 if (copy_from_user(&handle, uhandle, hlen)) 164 return ERR_PTR(-EFAULT); 165 if (handle.ha_fid.fid_len != 166 sizeof(handle.ha_fid) - sizeof(handle.ha_fid.fid_len)) 167 return ERR_PTR(-EINVAL); 168 169 memset(&fid, 0, sizeof(struct fid)); 170 fid.ino = handle.ha_fid.fid_ino; 171 fid.gen = handle.ha_fid.fid_gen; 172 173 return exportfs_decode_fh(parfilp->f_path.mnt, (struct fid *)&fid, 3, 174 FILEID_INO32_GEN | XFS_FILEID_TYPE_64FLAG, 175 xfs_handle_acceptable, NULL); 176 } 177 178 STATIC struct dentry * 179 xfs_handlereq_to_dentry( 180 struct file *parfilp, 181 xfs_fsop_handlereq_t *hreq) 182 { 183 return xfs_handle_to_dentry(parfilp, hreq->ihandle, hreq->ihandlen); 184 } 185 186 int 187 xfs_open_by_handle( 188 struct file *parfilp, 189 xfs_fsop_handlereq_t *hreq) 190 { 191 const struct cred *cred = current_cred(); 192 int error; 193 int fd; 194 int permflag; 195 struct file *filp; 196 struct inode *inode; 197 struct dentry *dentry; 198 fmode_t fmode; 199 struct path path; 200 201 if (!capable(CAP_SYS_ADMIN)) 202 return -EPERM; 203 204 dentry = xfs_handlereq_to_dentry(parfilp, hreq); 205 if (IS_ERR(dentry)) 206 return PTR_ERR(dentry); 207 inode = d_inode(dentry); 208 209 /* Restrict xfs_open_by_handle to directories & regular files. */ 210 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode))) { 211 error = -EPERM; 212 goto out_dput; 213 } 214 215 #if BITS_PER_LONG != 32 216 hreq->oflags |= O_LARGEFILE; 217 #endif 218 219 permflag = hreq->oflags; 220 fmode = OPEN_FMODE(permflag); 221 if ((!(permflag & O_APPEND) || (permflag & O_TRUNC)) && 222 (fmode & FMODE_WRITE) && IS_APPEND(inode)) { 223 error = -EPERM; 224 goto out_dput; 225 } 226 227 if ((fmode & FMODE_WRITE) && IS_IMMUTABLE(inode)) { 228 error = -EPERM; 229 goto out_dput; 230 } 231 232 /* Can't write directories. */ 233 if (S_ISDIR(inode->i_mode) && (fmode & FMODE_WRITE)) { 234 error = -EISDIR; 235 goto out_dput; 236 } 237 238 fd = get_unused_fd_flags(0); 239 if (fd < 0) { 240 error = fd; 241 goto out_dput; 242 } 243 244 path.mnt = parfilp->f_path.mnt; 245 path.dentry = dentry; 246 filp = dentry_open(&path, hreq->oflags, cred); 247 dput(dentry); 248 if (IS_ERR(filp)) { 249 put_unused_fd(fd); 250 return PTR_ERR(filp); 251 } 252 253 if (S_ISREG(inode->i_mode)) { 254 filp->f_flags |= O_NOATIME; 255 filp->f_mode |= FMODE_NOCMTIME; 256 } 257 258 fd_install(fd, filp); 259 return fd; 260 261 out_dput: 262 dput(dentry); 263 return error; 264 } 265 266 int 267 xfs_readlink_by_handle( 268 struct file *parfilp, 269 xfs_fsop_handlereq_t *hreq) 270 { 271 struct dentry *dentry; 272 __u32 olen; 273 int error; 274 275 if (!capable(CAP_SYS_ADMIN)) 276 return -EPERM; 277 278 dentry = xfs_handlereq_to_dentry(parfilp, hreq); 279 if (IS_ERR(dentry)) 280 return PTR_ERR(dentry); 281 282 /* Restrict this handle operation to symlinks only. */ 283 if (!d_is_symlink(dentry)) { 284 error = -EINVAL; 285 goto out_dput; 286 } 287 288 if (copy_from_user(&olen, hreq->ohandlen, sizeof(__u32))) { 289 error = -EFAULT; 290 goto out_dput; 291 } 292 293 error = vfs_readlink(dentry, hreq->ohandle, olen); 294 295 out_dput: 296 dput(dentry); 297 return error; 298 } 299 300 /* 301 * Format an attribute and copy it out to the user's buffer. 302 * Take care to check values and protect against them changing later, 303 * we may be reading them directly out of a user buffer. 304 */ 305 static void 306 xfs_ioc_attr_put_listent( 307 struct xfs_attr_list_context *context, 308 int flags, 309 unsigned char *name, 310 int namelen, 311 int valuelen) 312 { 313 struct xfs_attrlist *alist = context->buffer; 314 struct xfs_attrlist_ent *aep; 315 int arraytop; 316 317 ASSERT(!context->seen_enough); 318 ASSERT(context->count >= 0); 319 ASSERT(context->count < (ATTR_MAX_VALUELEN/8)); 320 ASSERT(context->firstu >= sizeof(*alist)); 321 ASSERT(context->firstu <= context->bufsize); 322 323 /* 324 * Only list entries in the right namespace. 325 */ 326 if (context->attr_filter != (flags & XFS_ATTR_NSP_ONDISK_MASK)) 327 return; 328 329 arraytop = sizeof(*alist) + 330 context->count * sizeof(alist->al_offset[0]); 331 332 /* decrement by the actual bytes used by the attr */ 333 context->firstu -= round_up(offsetof(struct xfs_attrlist_ent, a_name) + 334 namelen + 1, sizeof(uint32_t)); 335 if (context->firstu < arraytop) { 336 trace_xfs_attr_list_full(context); 337 alist->al_more = 1; 338 context->seen_enough = 1; 339 return; 340 } 341 342 aep = context->buffer + context->firstu; 343 aep->a_valuelen = valuelen; 344 memcpy(aep->a_name, name, namelen); 345 aep->a_name[namelen] = 0; 346 alist->al_offset[context->count++] = context->firstu; 347 alist->al_count = context->count; 348 trace_xfs_attr_list_add(context); 349 } 350 351 static unsigned int 352 xfs_attr_filter( 353 u32 ioc_flags) 354 { 355 if (ioc_flags & XFS_IOC_ATTR_ROOT) 356 return XFS_ATTR_ROOT; 357 if (ioc_flags & XFS_IOC_ATTR_SECURE) 358 return XFS_ATTR_SECURE; 359 return 0; 360 } 361 362 static unsigned int 363 xfs_attr_flags( 364 u32 ioc_flags) 365 { 366 if (ioc_flags & XFS_IOC_ATTR_CREATE) 367 return XATTR_CREATE; 368 if (ioc_flags & XFS_IOC_ATTR_REPLACE) 369 return XATTR_REPLACE; 370 return 0; 371 } 372 373 int 374 xfs_ioc_attr_list( 375 struct xfs_inode *dp, 376 void __user *ubuf, 377 size_t bufsize, 378 int flags, 379 struct xfs_attrlist_cursor __user *ucursor) 380 { 381 struct xfs_attr_list_context context = { }; 382 struct xfs_attrlist *alist; 383 void *buffer; 384 int error; 385 386 if (bufsize < sizeof(struct xfs_attrlist) || 387 bufsize > XFS_XATTR_LIST_MAX) 388 return -EINVAL; 389 390 /* 391 * Reject flags, only allow namespaces. 392 */ 393 if (flags & ~(XFS_IOC_ATTR_ROOT | XFS_IOC_ATTR_SECURE)) 394 return -EINVAL; 395 if (flags == (XFS_IOC_ATTR_ROOT | XFS_IOC_ATTR_SECURE)) 396 return -EINVAL; 397 398 /* 399 * Validate the cursor. 400 */ 401 if (copy_from_user(&context.cursor, ucursor, sizeof(context.cursor))) 402 return -EFAULT; 403 if (context.cursor.pad1 || context.cursor.pad2) 404 return -EINVAL; 405 if (!context.cursor.initted && 406 (context.cursor.hashval || context.cursor.blkno || 407 context.cursor.offset)) 408 return -EINVAL; 409 410 buffer = kvzalloc(bufsize, GFP_KERNEL); 411 if (!buffer) 412 return -ENOMEM; 413 414 /* 415 * Initialize the output buffer. 416 */ 417 context.dp = dp; 418 context.resynch = 1; 419 context.attr_filter = xfs_attr_filter(flags); 420 context.buffer = buffer; 421 context.bufsize = round_down(bufsize, sizeof(uint32_t)); 422 context.firstu = context.bufsize; 423 context.put_listent = xfs_ioc_attr_put_listent; 424 425 alist = context.buffer; 426 alist->al_count = 0; 427 alist->al_more = 0; 428 alist->al_offset[0] = context.bufsize; 429 430 error = xfs_attr_list(&context); 431 if (error) 432 goto out_free; 433 434 if (copy_to_user(ubuf, buffer, bufsize) || 435 copy_to_user(ucursor, &context.cursor, sizeof(context.cursor))) 436 error = -EFAULT; 437 out_free: 438 kvfree(buffer); 439 return error; 440 } 441 442 STATIC int 443 xfs_attrlist_by_handle( 444 struct file *parfilp, 445 struct xfs_fsop_attrlist_handlereq __user *p) 446 { 447 struct xfs_fsop_attrlist_handlereq al_hreq; 448 struct dentry *dentry; 449 int error = -ENOMEM; 450 451 if (!capable(CAP_SYS_ADMIN)) 452 return -EPERM; 453 if (copy_from_user(&al_hreq, p, sizeof(al_hreq))) 454 return -EFAULT; 455 456 dentry = xfs_handlereq_to_dentry(parfilp, &al_hreq.hreq); 457 if (IS_ERR(dentry)) 458 return PTR_ERR(dentry); 459 460 error = xfs_ioc_attr_list(XFS_I(d_inode(dentry)), al_hreq.buffer, 461 al_hreq.buflen, al_hreq.flags, &p->pos); 462 dput(dentry); 463 return error; 464 } 465 466 static int 467 xfs_attrmulti_attr_get( 468 struct inode *inode, 469 unsigned char *name, 470 unsigned char __user *ubuf, 471 uint32_t *len, 472 uint32_t flags) 473 { 474 struct xfs_da_args args = { 475 .dp = XFS_I(inode), 476 .attr_filter = xfs_attr_filter(flags), 477 .attr_flags = xfs_attr_flags(flags), 478 .name = name, 479 .namelen = strlen(name), 480 .valuelen = *len, 481 }; 482 int error; 483 484 if (*len > XFS_XATTR_SIZE_MAX) 485 return -EINVAL; 486 487 error = xfs_attr_get(&args); 488 if (error) 489 goto out_kfree; 490 491 *len = args.valuelen; 492 if (copy_to_user(ubuf, args.value, args.valuelen)) 493 error = -EFAULT; 494 495 out_kfree: 496 kvfree(args.value); 497 return error; 498 } 499 500 static int 501 xfs_attrmulti_attr_set( 502 struct inode *inode, 503 unsigned char *name, 504 const unsigned char __user *ubuf, 505 uint32_t len, 506 uint32_t flags) 507 { 508 struct xfs_da_args args = { 509 .dp = XFS_I(inode), 510 .attr_filter = xfs_attr_filter(flags), 511 .attr_flags = xfs_attr_flags(flags), 512 .name = name, 513 .namelen = strlen(name), 514 }; 515 int error; 516 517 if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) 518 return -EPERM; 519 520 if (ubuf) { 521 if (len > XFS_XATTR_SIZE_MAX) 522 return -EINVAL; 523 args.value = memdup_user(ubuf, len); 524 if (IS_ERR(args.value)) 525 return PTR_ERR(args.value); 526 args.valuelen = len; 527 } 528 529 error = xfs_attr_change(&args); 530 if (!error && (flags & XFS_IOC_ATTR_ROOT)) 531 xfs_forget_acl(inode, name); 532 kfree(args.value); 533 return error; 534 } 535 536 int 537 xfs_ioc_attrmulti_one( 538 struct file *parfilp, 539 struct inode *inode, 540 uint32_t opcode, 541 void __user *uname, 542 void __user *value, 543 uint32_t *len, 544 uint32_t flags) 545 { 546 unsigned char *name; 547 int error; 548 549 if ((flags & XFS_IOC_ATTR_ROOT) && (flags & XFS_IOC_ATTR_SECURE)) 550 return -EINVAL; 551 552 name = strndup_user(uname, MAXNAMELEN); 553 if (IS_ERR(name)) 554 return PTR_ERR(name); 555 556 switch (opcode) { 557 case ATTR_OP_GET: 558 error = xfs_attrmulti_attr_get(inode, name, value, len, flags); 559 break; 560 case ATTR_OP_REMOVE: 561 value = NULL; 562 *len = 0; 563 fallthrough; 564 case ATTR_OP_SET: 565 error = mnt_want_write_file(parfilp); 566 if (error) 567 break; 568 error = xfs_attrmulti_attr_set(inode, name, value, *len, flags); 569 mnt_drop_write_file(parfilp); 570 break; 571 default: 572 error = -EINVAL; 573 break; 574 } 575 576 kfree(name); 577 return error; 578 } 579 580 STATIC int 581 xfs_attrmulti_by_handle( 582 struct file *parfilp, 583 void __user *arg) 584 { 585 int error; 586 xfs_attr_multiop_t *ops; 587 xfs_fsop_attrmulti_handlereq_t am_hreq; 588 struct dentry *dentry; 589 unsigned int i, size; 590 591 if (!capable(CAP_SYS_ADMIN)) 592 return -EPERM; 593 if (copy_from_user(&am_hreq, arg, sizeof(xfs_fsop_attrmulti_handlereq_t))) 594 return -EFAULT; 595 596 /* overflow check */ 597 if (am_hreq.opcount >= INT_MAX / sizeof(xfs_attr_multiop_t)) 598 return -E2BIG; 599 600 dentry = xfs_handlereq_to_dentry(parfilp, &am_hreq.hreq); 601 if (IS_ERR(dentry)) 602 return PTR_ERR(dentry); 603 604 error = -E2BIG; 605 size = am_hreq.opcount * sizeof(xfs_attr_multiop_t); 606 if (!size || size > 16 * PAGE_SIZE) 607 goto out_dput; 608 609 ops = memdup_user(am_hreq.ops, size); 610 if (IS_ERR(ops)) { 611 error = PTR_ERR(ops); 612 goto out_dput; 613 } 614 615 error = 0; 616 for (i = 0; i < am_hreq.opcount; i++) { 617 ops[i].am_error = xfs_ioc_attrmulti_one(parfilp, 618 d_inode(dentry), ops[i].am_opcode, 619 ops[i].am_attrname, ops[i].am_attrvalue, 620 &ops[i].am_length, ops[i].am_flags); 621 } 622 623 if (copy_to_user(am_hreq.ops, ops, size)) 624 error = -EFAULT; 625 626 kfree(ops); 627 out_dput: 628 dput(dentry); 629 return error; 630 } 631 632 /* Return 0 on success or positive error */ 633 int 634 xfs_fsbulkstat_one_fmt( 635 struct xfs_ibulk *breq, 636 const struct xfs_bulkstat *bstat) 637 { 638 struct xfs_bstat bs1; 639 640 xfs_bulkstat_to_bstat(breq->mp, &bs1, bstat); 641 if (copy_to_user(breq->ubuffer, &bs1, sizeof(bs1))) 642 return -EFAULT; 643 return xfs_ibulk_advance(breq, sizeof(struct xfs_bstat)); 644 } 645 646 int 647 xfs_fsinumbers_fmt( 648 struct xfs_ibulk *breq, 649 const struct xfs_inumbers *igrp) 650 { 651 struct xfs_inogrp ig1; 652 653 xfs_inumbers_to_inogrp(&ig1, igrp); 654 if (copy_to_user(breq->ubuffer, &ig1, sizeof(struct xfs_inogrp))) 655 return -EFAULT; 656 return xfs_ibulk_advance(breq, sizeof(struct xfs_inogrp)); 657 } 658 659 STATIC int 660 xfs_ioc_fsbulkstat( 661 struct file *file, 662 unsigned int cmd, 663 void __user *arg) 664 { 665 struct xfs_mount *mp = XFS_I(file_inode(file))->i_mount; 666 struct xfs_fsop_bulkreq bulkreq; 667 struct xfs_ibulk breq = { 668 .mp = mp, 669 .idmap = file_mnt_idmap(file), 670 .ocount = 0, 671 }; 672 xfs_ino_t lastino; 673 int error; 674 675 /* done = 1 if there are more stats to get and if bulkstat */ 676 /* should be called again (unused here, but used in dmapi) */ 677 678 if (!capable(CAP_SYS_ADMIN)) 679 return -EPERM; 680 681 if (xfs_is_shutdown(mp)) 682 return -EIO; 683 684 if (copy_from_user(&bulkreq, arg, sizeof(struct xfs_fsop_bulkreq))) 685 return -EFAULT; 686 687 if (copy_from_user(&lastino, bulkreq.lastip, sizeof(__s64))) 688 return -EFAULT; 689 690 if (bulkreq.icount <= 0) 691 return -EINVAL; 692 693 if (bulkreq.ubuffer == NULL) 694 return -EINVAL; 695 696 breq.ubuffer = bulkreq.ubuffer; 697 breq.icount = bulkreq.icount; 698 699 /* 700 * FSBULKSTAT_SINGLE expects that *lastip contains the inode number 701 * that we want to stat. However, FSINUMBERS and FSBULKSTAT expect 702 * that *lastip contains either zero or the number of the last inode to 703 * be examined by the previous call and return results starting with 704 * the next inode after that. The new bulk request back end functions 705 * take the inode to start with, so we have to compute the startino 706 * parameter from lastino to maintain correct function. lastino == 0 707 * is a special case because it has traditionally meant "first inode 708 * in filesystem". 709 */ 710 if (cmd == XFS_IOC_FSINUMBERS) { 711 breq.startino = lastino ? lastino + 1 : 0; 712 error = xfs_inumbers(&breq, xfs_fsinumbers_fmt); 713 lastino = breq.startino - 1; 714 } else if (cmd == XFS_IOC_FSBULKSTAT_SINGLE) { 715 breq.startino = lastino; 716 breq.icount = 1; 717 error = xfs_bulkstat_one(&breq, xfs_fsbulkstat_one_fmt); 718 } else { /* XFS_IOC_FSBULKSTAT */ 719 breq.startino = lastino ? lastino + 1 : 0; 720 error = xfs_bulkstat(&breq, xfs_fsbulkstat_one_fmt); 721 lastino = breq.startino - 1; 722 } 723 724 if (error) 725 return error; 726 727 if (bulkreq.lastip != NULL && 728 copy_to_user(bulkreq.lastip, &lastino, sizeof(xfs_ino_t))) 729 return -EFAULT; 730 731 if (bulkreq.ocount != NULL && 732 copy_to_user(bulkreq.ocount, &breq.ocount, sizeof(__s32))) 733 return -EFAULT; 734 735 return 0; 736 } 737 738 /* Return 0 on success or positive error */ 739 static int 740 xfs_bulkstat_fmt( 741 struct xfs_ibulk *breq, 742 const struct xfs_bulkstat *bstat) 743 { 744 if (copy_to_user(breq->ubuffer, bstat, sizeof(struct xfs_bulkstat))) 745 return -EFAULT; 746 return xfs_ibulk_advance(breq, sizeof(struct xfs_bulkstat)); 747 } 748 749 /* 750 * Check the incoming bulk request @hdr from userspace and initialize the 751 * internal @breq bulk request appropriately. Returns 0 if the bulk request 752 * should proceed; -ECANCELED if there's nothing to do; or the usual 753 * negative error code. 754 */ 755 static int 756 xfs_bulk_ireq_setup( 757 struct xfs_mount *mp, 758 const struct xfs_bulk_ireq *hdr, 759 struct xfs_ibulk *breq, 760 void __user *ubuffer) 761 { 762 if (hdr->icount == 0 || 763 (hdr->flags & ~XFS_BULK_IREQ_FLAGS_ALL) || 764 memchr_inv(hdr->reserved, 0, sizeof(hdr->reserved))) 765 return -EINVAL; 766 767 breq->startino = hdr->ino; 768 breq->ubuffer = ubuffer; 769 breq->icount = hdr->icount; 770 breq->ocount = 0; 771 breq->flags = 0; 772 773 /* 774 * The @ino parameter is a special value, so we must look it up here. 775 * We're not allowed to have IREQ_AGNO, and we only return one inode 776 * worth of data. 777 */ 778 if (hdr->flags & XFS_BULK_IREQ_SPECIAL) { 779 if (hdr->flags & XFS_BULK_IREQ_AGNO) 780 return -EINVAL; 781 782 switch (hdr->ino) { 783 case XFS_BULK_IREQ_SPECIAL_ROOT: 784 breq->startino = mp->m_sb.sb_rootino; 785 break; 786 default: 787 return -EINVAL; 788 } 789 breq->icount = 1; 790 } 791 792 /* 793 * The IREQ_AGNO flag means that we only want results from a given AG. 794 * If @hdr->ino is zero, we start iterating in that AG. If @hdr->ino is 795 * beyond the specified AG then we return no results. 796 */ 797 if (hdr->flags & XFS_BULK_IREQ_AGNO) { 798 if (hdr->agno >= mp->m_sb.sb_agcount) 799 return -EINVAL; 800 801 if (breq->startino == 0) 802 breq->startino = XFS_AGINO_TO_INO(mp, hdr->agno, 0); 803 else if (XFS_INO_TO_AGNO(mp, breq->startino) < hdr->agno) 804 return -EINVAL; 805 806 breq->flags |= XFS_IBULK_SAME_AG; 807 808 /* Asking for an inode past the end of the AG? We're done! */ 809 if (XFS_INO_TO_AGNO(mp, breq->startino) > hdr->agno) 810 return -ECANCELED; 811 } else if (hdr->agno) 812 return -EINVAL; 813 814 /* Asking for an inode past the end of the FS? We're done! */ 815 if (XFS_INO_TO_AGNO(mp, breq->startino) >= mp->m_sb.sb_agcount) 816 return -ECANCELED; 817 818 if (hdr->flags & XFS_BULK_IREQ_NREXT64) 819 breq->flags |= XFS_IBULK_NREXT64; 820 821 return 0; 822 } 823 824 /* 825 * Update the userspace bulk request @hdr to reflect the end state of the 826 * internal bulk request @breq. 827 */ 828 static void 829 xfs_bulk_ireq_teardown( 830 struct xfs_bulk_ireq *hdr, 831 struct xfs_ibulk *breq) 832 { 833 hdr->ino = breq->startino; 834 hdr->ocount = breq->ocount; 835 } 836 837 /* Handle the v5 bulkstat ioctl. */ 838 STATIC int 839 xfs_ioc_bulkstat( 840 struct file *file, 841 unsigned int cmd, 842 struct xfs_bulkstat_req __user *arg) 843 { 844 struct xfs_mount *mp = XFS_I(file_inode(file))->i_mount; 845 struct xfs_bulk_ireq hdr; 846 struct xfs_ibulk breq = { 847 .mp = mp, 848 .idmap = file_mnt_idmap(file), 849 }; 850 int error; 851 852 if (!capable(CAP_SYS_ADMIN)) 853 return -EPERM; 854 855 if (xfs_is_shutdown(mp)) 856 return -EIO; 857 858 if (copy_from_user(&hdr, &arg->hdr, sizeof(hdr))) 859 return -EFAULT; 860 861 error = xfs_bulk_ireq_setup(mp, &hdr, &breq, arg->bulkstat); 862 if (error == -ECANCELED) 863 goto out_teardown; 864 if (error < 0) 865 return error; 866 867 error = xfs_bulkstat(&breq, xfs_bulkstat_fmt); 868 if (error) 869 return error; 870 871 out_teardown: 872 xfs_bulk_ireq_teardown(&hdr, &breq); 873 if (copy_to_user(&arg->hdr, &hdr, sizeof(hdr))) 874 return -EFAULT; 875 876 return 0; 877 } 878 879 STATIC int 880 xfs_inumbers_fmt( 881 struct xfs_ibulk *breq, 882 const struct xfs_inumbers *igrp) 883 { 884 if (copy_to_user(breq->ubuffer, igrp, sizeof(struct xfs_inumbers))) 885 return -EFAULT; 886 return xfs_ibulk_advance(breq, sizeof(struct xfs_inumbers)); 887 } 888 889 /* Handle the v5 inumbers ioctl. */ 890 STATIC int 891 xfs_ioc_inumbers( 892 struct xfs_mount *mp, 893 unsigned int cmd, 894 struct xfs_inumbers_req __user *arg) 895 { 896 struct xfs_bulk_ireq hdr; 897 struct xfs_ibulk breq = { 898 .mp = mp, 899 }; 900 int error; 901 902 if (!capable(CAP_SYS_ADMIN)) 903 return -EPERM; 904 905 if (xfs_is_shutdown(mp)) 906 return -EIO; 907 908 if (copy_from_user(&hdr, &arg->hdr, sizeof(hdr))) 909 return -EFAULT; 910 911 error = xfs_bulk_ireq_setup(mp, &hdr, &breq, arg->inumbers); 912 if (error == -ECANCELED) 913 goto out_teardown; 914 if (error < 0) 915 return error; 916 917 error = xfs_inumbers(&breq, xfs_inumbers_fmt); 918 if (error) 919 return error; 920 921 out_teardown: 922 xfs_bulk_ireq_teardown(&hdr, &breq); 923 if (copy_to_user(&arg->hdr, &hdr, sizeof(hdr))) 924 return -EFAULT; 925 926 return 0; 927 } 928 929 STATIC int 930 xfs_ioc_fsgeometry( 931 struct xfs_mount *mp, 932 void __user *arg, 933 int struct_version) 934 { 935 struct xfs_fsop_geom fsgeo; 936 size_t len; 937 938 xfs_fs_geometry(mp, &fsgeo, struct_version); 939 940 if (struct_version <= 3) 941 len = sizeof(struct xfs_fsop_geom_v1); 942 else if (struct_version == 4) 943 len = sizeof(struct xfs_fsop_geom_v4); 944 else { 945 xfs_fsop_geom_health(mp, &fsgeo); 946 len = sizeof(fsgeo); 947 } 948 949 if (copy_to_user(arg, &fsgeo, len)) 950 return -EFAULT; 951 return 0; 952 } 953 954 STATIC int 955 xfs_ioc_ag_geometry( 956 struct xfs_mount *mp, 957 void __user *arg) 958 { 959 struct xfs_perag *pag; 960 struct xfs_ag_geometry ageo; 961 int error; 962 963 if (copy_from_user(&ageo, arg, sizeof(ageo))) 964 return -EFAULT; 965 if (ageo.ag_flags) 966 return -EINVAL; 967 if (memchr_inv(&ageo.ag_reserved, 0, sizeof(ageo.ag_reserved))) 968 return -EINVAL; 969 970 pag = xfs_perag_get(mp, ageo.ag_number); 971 if (!pag) 972 return -EINVAL; 973 974 error = xfs_ag_get_geometry(pag, &ageo); 975 xfs_perag_put(pag); 976 if (error) 977 return error; 978 979 if (copy_to_user(arg, &ageo, sizeof(ageo))) 980 return -EFAULT; 981 return 0; 982 } 983 984 /* 985 * Linux extended inode flags interface. 986 */ 987 988 static void 989 xfs_fill_fsxattr( 990 struct xfs_inode *ip, 991 int whichfork, 992 struct fileattr *fa) 993 { 994 struct xfs_mount *mp = ip->i_mount; 995 struct xfs_ifork *ifp = xfs_ifork_ptr(ip, whichfork); 996 997 fileattr_fill_xflags(fa, xfs_ip2xflags(ip)); 998 999 if (ip->i_diflags & XFS_DIFLAG_EXTSIZE) { 1000 fa->fsx_extsize = XFS_FSB_TO_B(mp, ip->i_extsize); 1001 } else if (ip->i_diflags & XFS_DIFLAG_EXTSZINHERIT) { 1002 /* 1003 * Don't let a misaligned extent size hint on a directory 1004 * escape to userspace if it won't pass the setattr checks 1005 * later. 1006 */ 1007 if ((ip->i_diflags & XFS_DIFLAG_RTINHERIT) && 1008 xfs_extlen_to_rtxmod(mp, ip->i_extsize) > 0) { 1009 fa->fsx_xflags &= ~(FS_XFLAG_EXTSIZE | 1010 FS_XFLAG_EXTSZINHERIT); 1011 fa->fsx_extsize = 0; 1012 } else { 1013 fa->fsx_extsize = XFS_FSB_TO_B(mp, ip->i_extsize); 1014 } 1015 } 1016 1017 if (ip->i_diflags2 & XFS_DIFLAG2_COWEXTSIZE) 1018 fa->fsx_cowextsize = XFS_FSB_TO_B(mp, ip->i_cowextsize); 1019 fa->fsx_projid = ip->i_projid; 1020 if (ifp && !xfs_need_iread_extents(ifp)) 1021 fa->fsx_nextents = xfs_iext_count(ifp); 1022 else 1023 fa->fsx_nextents = xfs_ifork_nextents(ifp); 1024 } 1025 1026 STATIC int 1027 xfs_ioc_fsgetxattra( 1028 xfs_inode_t *ip, 1029 void __user *arg) 1030 { 1031 struct fileattr fa; 1032 1033 xfs_ilock(ip, XFS_ILOCK_SHARED); 1034 xfs_fill_fsxattr(ip, XFS_ATTR_FORK, &fa); 1035 xfs_iunlock(ip, XFS_ILOCK_SHARED); 1036 1037 return copy_fsxattr_to_user(&fa, arg); 1038 } 1039 1040 int 1041 xfs_fileattr_get( 1042 struct dentry *dentry, 1043 struct fileattr *fa) 1044 { 1045 struct xfs_inode *ip = XFS_I(d_inode(dentry)); 1046 1047 if (d_is_special(dentry)) 1048 return -ENOTTY; 1049 1050 xfs_ilock(ip, XFS_ILOCK_SHARED); 1051 xfs_fill_fsxattr(ip, XFS_DATA_FORK, fa); 1052 xfs_iunlock(ip, XFS_ILOCK_SHARED); 1053 1054 return 0; 1055 } 1056 1057 STATIC uint16_t 1058 xfs_flags2diflags( 1059 struct xfs_inode *ip, 1060 unsigned int xflags) 1061 { 1062 /* can't set PREALLOC this way, just preserve it */ 1063 uint16_t di_flags = 1064 (ip->i_diflags & XFS_DIFLAG_PREALLOC); 1065 1066 if (xflags & FS_XFLAG_IMMUTABLE) 1067 di_flags |= XFS_DIFLAG_IMMUTABLE; 1068 if (xflags & FS_XFLAG_APPEND) 1069 di_flags |= XFS_DIFLAG_APPEND; 1070 if (xflags & FS_XFLAG_SYNC) 1071 di_flags |= XFS_DIFLAG_SYNC; 1072 if (xflags & FS_XFLAG_NOATIME) 1073 di_flags |= XFS_DIFLAG_NOATIME; 1074 if (xflags & FS_XFLAG_NODUMP) 1075 di_flags |= XFS_DIFLAG_NODUMP; 1076 if (xflags & FS_XFLAG_NODEFRAG) 1077 di_flags |= XFS_DIFLAG_NODEFRAG; 1078 if (xflags & FS_XFLAG_FILESTREAM) 1079 di_flags |= XFS_DIFLAG_FILESTREAM; 1080 if (S_ISDIR(VFS_I(ip)->i_mode)) { 1081 if (xflags & FS_XFLAG_RTINHERIT) 1082 di_flags |= XFS_DIFLAG_RTINHERIT; 1083 if (xflags & FS_XFLAG_NOSYMLINKS) 1084 di_flags |= XFS_DIFLAG_NOSYMLINKS; 1085 if (xflags & FS_XFLAG_EXTSZINHERIT) 1086 di_flags |= XFS_DIFLAG_EXTSZINHERIT; 1087 if (xflags & FS_XFLAG_PROJINHERIT) 1088 di_flags |= XFS_DIFLAG_PROJINHERIT; 1089 } else if (S_ISREG(VFS_I(ip)->i_mode)) { 1090 if (xflags & FS_XFLAG_REALTIME) 1091 di_flags |= XFS_DIFLAG_REALTIME; 1092 if (xflags & FS_XFLAG_EXTSIZE) 1093 di_flags |= XFS_DIFLAG_EXTSIZE; 1094 } 1095 1096 return di_flags; 1097 } 1098 1099 STATIC uint64_t 1100 xfs_flags2diflags2( 1101 struct xfs_inode *ip, 1102 unsigned int xflags) 1103 { 1104 uint64_t di_flags2 = 1105 (ip->i_diflags2 & (XFS_DIFLAG2_REFLINK | 1106 XFS_DIFLAG2_BIGTIME | 1107 XFS_DIFLAG2_NREXT64)); 1108 1109 if (xflags & FS_XFLAG_DAX) 1110 di_flags2 |= XFS_DIFLAG2_DAX; 1111 if (xflags & FS_XFLAG_COWEXTSIZE) 1112 di_flags2 |= XFS_DIFLAG2_COWEXTSIZE; 1113 1114 return di_flags2; 1115 } 1116 1117 static int 1118 xfs_ioctl_setattr_xflags( 1119 struct xfs_trans *tp, 1120 struct xfs_inode *ip, 1121 struct fileattr *fa) 1122 { 1123 struct xfs_mount *mp = ip->i_mount; 1124 bool rtflag = (fa->fsx_xflags & FS_XFLAG_REALTIME); 1125 uint64_t i_flags2; 1126 1127 if (rtflag != XFS_IS_REALTIME_INODE(ip)) { 1128 /* Can't change realtime flag if any extents are allocated. */ 1129 if (ip->i_df.if_nextents || ip->i_delayed_blks) 1130 return -EINVAL; 1131 } 1132 1133 if (rtflag) { 1134 /* If realtime flag is set then must have realtime device */ 1135 if (mp->m_sb.sb_rblocks == 0 || mp->m_sb.sb_rextsize == 0 || 1136 xfs_extlen_to_rtxmod(mp, ip->i_extsize)) 1137 return -EINVAL; 1138 1139 /* Clear reflink if we are actually able to set the rt flag. */ 1140 if (xfs_is_reflink_inode(ip)) 1141 ip->i_diflags2 &= ~XFS_DIFLAG2_REFLINK; 1142 } 1143 1144 /* diflags2 only valid for v3 inodes. */ 1145 i_flags2 = xfs_flags2diflags2(ip, fa->fsx_xflags); 1146 if (i_flags2 && !xfs_has_v3inodes(mp)) 1147 return -EINVAL; 1148 1149 ip->i_diflags = xfs_flags2diflags(ip, fa->fsx_xflags); 1150 ip->i_diflags2 = i_flags2; 1151 1152 xfs_diflags_to_iflags(ip, false); 1153 1154 /* 1155 * Make the stable writes flag match that of the device the inode 1156 * resides on when flipping the RT flag. 1157 */ 1158 if (rtflag != XFS_IS_REALTIME_INODE(ip) && S_ISREG(VFS_I(ip)->i_mode)) 1159 xfs_update_stable_writes(ip); 1160 1161 xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG); 1162 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); 1163 XFS_STATS_INC(mp, xs_ig_attrchg); 1164 return 0; 1165 } 1166 1167 static void 1168 xfs_ioctl_setattr_prepare_dax( 1169 struct xfs_inode *ip, 1170 struct fileattr *fa) 1171 { 1172 struct xfs_mount *mp = ip->i_mount; 1173 struct inode *inode = VFS_I(ip); 1174 1175 if (S_ISDIR(inode->i_mode)) 1176 return; 1177 1178 if (xfs_has_dax_always(mp) || xfs_has_dax_never(mp)) 1179 return; 1180 1181 if (((fa->fsx_xflags & FS_XFLAG_DAX) && 1182 !(ip->i_diflags2 & XFS_DIFLAG2_DAX)) || 1183 (!(fa->fsx_xflags & FS_XFLAG_DAX) && 1184 (ip->i_diflags2 & XFS_DIFLAG2_DAX))) 1185 d_mark_dontcache(inode); 1186 } 1187 1188 /* 1189 * Set up the transaction structure for the setattr operation, checking that we 1190 * have permission to do so. On success, return a clean transaction and the 1191 * inode locked exclusively ready for further operation specific checks. On 1192 * failure, return an error without modifying or locking the inode. 1193 */ 1194 static struct xfs_trans * 1195 xfs_ioctl_setattr_get_trans( 1196 struct xfs_inode *ip, 1197 struct xfs_dquot *pdqp) 1198 { 1199 struct xfs_mount *mp = ip->i_mount; 1200 struct xfs_trans *tp; 1201 int error = -EROFS; 1202 1203 if (xfs_is_readonly(mp)) 1204 goto out_error; 1205 error = -EIO; 1206 if (xfs_is_shutdown(mp)) 1207 goto out_error; 1208 1209 error = xfs_trans_alloc_ichange(ip, NULL, NULL, pdqp, 1210 has_capability_noaudit(current, CAP_FOWNER), &tp); 1211 if (error) 1212 goto out_error; 1213 1214 if (xfs_has_wsync(mp)) 1215 xfs_trans_set_sync(tp); 1216 1217 return tp; 1218 1219 out_error: 1220 return ERR_PTR(error); 1221 } 1222 1223 /* 1224 * Validate a proposed extent size hint. For regular files, the hint can only 1225 * be changed if no extents are allocated. 1226 */ 1227 static int 1228 xfs_ioctl_setattr_check_extsize( 1229 struct xfs_inode *ip, 1230 struct fileattr *fa) 1231 { 1232 struct xfs_mount *mp = ip->i_mount; 1233 xfs_failaddr_t failaddr; 1234 uint16_t new_diflags; 1235 1236 if (!fa->fsx_valid) 1237 return 0; 1238 1239 if (S_ISREG(VFS_I(ip)->i_mode) && ip->i_df.if_nextents && 1240 XFS_FSB_TO_B(mp, ip->i_extsize) != fa->fsx_extsize) 1241 return -EINVAL; 1242 1243 if (fa->fsx_extsize & mp->m_blockmask) 1244 return -EINVAL; 1245 1246 new_diflags = xfs_flags2diflags(ip, fa->fsx_xflags); 1247 1248 /* 1249 * Inode verifiers do not check that the extent size hint is an integer 1250 * multiple of the rt extent size on a directory with both rtinherit 1251 * and extszinherit flags set. Don't let sysadmins misconfigure 1252 * directories. 1253 */ 1254 if ((new_diflags & XFS_DIFLAG_RTINHERIT) && 1255 (new_diflags & XFS_DIFLAG_EXTSZINHERIT)) { 1256 unsigned int rtextsize_bytes; 1257 1258 rtextsize_bytes = XFS_FSB_TO_B(mp, mp->m_sb.sb_rextsize); 1259 if (fa->fsx_extsize % rtextsize_bytes) 1260 return -EINVAL; 1261 } 1262 1263 failaddr = xfs_inode_validate_extsize(ip->i_mount, 1264 XFS_B_TO_FSB(mp, fa->fsx_extsize), 1265 VFS_I(ip)->i_mode, new_diflags); 1266 return failaddr != NULL ? -EINVAL : 0; 1267 } 1268 1269 static int 1270 xfs_ioctl_setattr_check_cowextsize( 1271 struct xfs_inode *ip, 1272 struct fileattr *fa) 1273 { 1274 struct xfs_mount *mp = ip->i_mount; 1275 xfs_failaddr_t failaddr; 1276 uint64_t new_diflags2; 1277 uint16_t new_diflags; 1278 1279 if (!fa->fsx_valid) 1280 return 0; 1281 1282 if (fa->fsx_cowextsize & mp->m_blockmask) 1283 return -EINVAL; 1284 1285 new_diflags = xfs_flags2diflags(ip, fa->fsx_xflags); 1286 new_diflags2 = xfs_flags2diflags2(ip, fa->fsx_xflags); 1287 1288 failaddr = xfs_inode_validate_cowextsize(ip->i_mount, 1289 XFS_B_TO_FSB(mp, fa->fsx_cowextsize), 1290 VFS_I(ip)->i_mode, new_diflags, new_diflags2); 1291 return failaddr != NULL ? -EINVAL : 0; 1292 } 1293 1294 static int 1295 xfs_ioctl_setattr_check_projid( 1296 struct xfs_inode *ip, 1297 struct fileattr *fa) 1298 { 1299 if (!fa->fsx_valid) 1300 return 0; 1301 1302 /* Disallow 32bit project ids if 32bit IDs are not enabled. */ 1303 if (fa->fsx_projid > (uint16_t)-1 && 1304 !xfs_has_projid32(ip->i_mount)) 1305 return -EINVAL; 1306 return 0; 1307 } 1308 1309 int 1310 xfs_fileattr_set( 1311 struct mnt_idmap *idmap, 1312 struct dentry *dentry, 1313 struct fileattr *fa) 1314 { 1315 struct xfs_inode *ip = XFS_I(d_inode(dentry)); 1316 struct xfs_mount *mp = ip->i_mount; 1317 struct xfs_trans *tp; 1318 struct xfs_dquot *pdqp = NULL; 1319 struct xfs_dquot *olddquot = NULL; 1320 int error; 1321 1322 trace_xfs_ioctl_setattr(ip); 1323 1324 if (d_is_special(dentry)) 1325 return -ENOTTY; 1326 1327 if (!fa->fsx_valid) { 1328 if (fa->flags & ~(FS_IMMUTABLE_FL | FS_APPEND_FL | 1329 FS_NOATIME_FL | FS_NODUMP_FL | 1330 FS_SYNC_FL | FS_DAX_FL | FS_PROJINHERIT_FL)) 1331 return -EOPNOTSUPP; 1332 } 1333 1334 error = xfs_ioctl_setattr_check_projid(ip, fa); 1335 if (error) 1336 return error; 1337 1338 /* 1339 * If disk quotas is on, we make sure that the dquots do exist on disk, 1340 * before we start any other transactions. Trying to do this later 1341 * is messy. We don't care to take a readlock to look at the ids 1342 * in inode here, because we can't hold it across the trans_reserve. 1343 * If the IDs do change before we take the ilock, we're covered 1344 * because the i_*dquot fields will get updated anyway. 1345 */ 1346 if (fa->fsx_valid && XFS_IS_QUOTA_ON(mp)) { 1347 error = xfs_qm_vop_dqalloc(ip, VFS_I(ip)->i_uid, 1348 VFS_I(ip)->i_gid, fa->fsx_projid, 1349 XFS_QMOPT_PQUOTA, NULL, NULL, &pdqp); 1350 if (error) 1351 return error; 1352 } 1353 1354 xfs_ioctl_setattr_prepare_dax(ip, fa); 1355 1356 tp = xfs_ioctl_setattr_get_trans(ip, pdqp); 1357 if (IS_ERR(tp)) { 1358 error = PTR_ERR(tp); 1359 goto error_free_dquots; 1360 } 1361 1362 error = xfs_ioctl_setattr_check_extsize(ip, fa); 1363 if (error) 1364 goto error_trans_cancel; 1365 1366 error = xfs_ioctl_setattr_check_cowextsize(ip, fa); 1367 if (error) 1368 goto error_trans_cancel; 1369 1370 error = xfs_ioctl_setattr_xflags(tp, ip, fa); 1371 if (error) 1372 goto error_trans_cancel; 1373 1374 if (!fa->fsx_valid) 1375 goto skip_xattr; 1376 /* 1377 * Change file ownership. Must be the owner or privileged. CAP_FSETID 1378 * overrides the following restrictions: 1379 * 1380 * The set-user-ID and set-group-ID bits of a file will be cleared upon 1381 * successful return from chown() 1382 */ 1383 1384 if ((VFS_I(ip)->i_mode & (S_ISUID|S_ISGID)) && 1385 !capable_wrt_inode_uidgid(idmap, VFS_I(ip), CAP_FSETID)) 1386 VFS_I(ip)->i_mode &= ~(S_ISUID|S_ISGID); 1387 1388 /* Change the ownerships and register project quota modifications */ 1389 if (ip->i_projid != fa->fsx_projid) { 1390 if (XFS_IS_PQUOTA_ON(mp)) { 1391 olddquot = xfs_qm_vop_chown(tp, ip, 1392 &ip->i_pdquot, pdqp); 1393 } 1394 ip->i_projid = fa->fsx_projid; 1395 } 1396 1397 /* 1398 * Only set the extent size hint if we've already determined that the 1399 * extent size hint should be set on the inode. If no extent size flags 1400 * are set on the inode then unconditionally clear the extent size hint. 1401 */ 1402 if (ip->i_diflags & (XFS_DIFLAG_EXTSIZE | XFS_DIFLAG_EXTSZINHERIT)) 1403 ip->i_extsize = XFS_B_TO_FSB(mp, fa->fsx_extsize); 1404 else 1405 ip->i_extsize = 0; 1406 1407 if (xfs_has_v3inodes(mp)) { 1408 if (ip->i_diflags2 & XFS_DIFLAG2_COWEXTSIZE) 1409 ip->i_cowextsize = XFS_B_TO_FSB(mp, fa->fsx_cowextsize); 1410 else 1411 ip->i_cowextsize = 0; 1412 } 1413 1414 skip_xattr: 1415 error = xfs_trans_commit(tp); 1416 1417 /* 1418 * Release any dquot(s) the inode had kept before chown. 1419 */ 1420 xfs_qm_dqrele(olddquot); 1421 xfs_qm_dqrele(pdqp); 1422 1423 return error; 1424 1425 error_trans_cancel: 1426 xfs_trans_cancel(tp); 1427 error_free_dquots: 1428 xfs_qm_dqrele(pdqp); 1429 return error; 1430 } 1431 1432 static bool 1433 xfs_getbmap_format( 1434 struct kgetbmap *p, 1435 struct getbmapx __user *u, 1436 size_t recsize) 1437 { 1438 if (put_user(p->bmv_offset, &u->bmv_offset) || 1439 put_user(p->bmv_block, &u->bmv_block) || 1440 put_user(p->bmv_length, &u->bmv_length) || 1441 put_user(0, &u->bmv_count) || 1442 put_user(0, &u->bmv_entries)) 1443 return false; 1444 if (recsize < sizeof(struct getbmapx)) 1445 return true; 1446 if (put_user(0, &u->bmv_iflags) || 1447 put_user(p->bmv_oflags, &u->bmv_oflags) || 1448 put_user(0, &u->bmv_unused1) || 1449 put_user(0, &u->bmv_unused2)) 1450 return false; 1451 return true; 1452 } 1453 1454 STATIC int 1455 xfs_ioc_getbmap( 1456 struct file *file, 1457 unsigned int cmd, 1458 void __user *arg) 1459 { 1460 struct getbmapx bmx = { 0 }; 1461 struct kgetbmap *buf; 1462 size_t recsize; 1463 int error, i; 1464 1465 switch (cmd) { 1466 case XFS_IOC_GETBMAPA: 1467 bmx.bmv_iflags = BMV_IF_ATTRFORK; 1468 fallthrough; 1469 case XFS_IOC_GETBMAP: 1470 /* struct getbmap is a strict subset of struct getbmapx. */ 1471 recsize = sizeof(struct getbmap); 1472 break; 1473 case XFS_IOC_GETBMAPX: 1474 recsize = sizeof(struct getbmapx); 1475 break; 1476 default: 1477 return -EINVAL; 1478 } 1479 1480 if (copy_from_user(&bmx, arg, recsize)) 1481 return -EFAULT; 1482 1483 if (bmx.bmv_count < 2) 1484 return -EINVAL; 1485 if (bmx.bmv_count >= INT_MAX / recsize) 1486 return -ENOMEM; 1487 1488 buf = kvcalloc(bmx.bmv_count, sizeof(*buf), GFP_KERNEL); 1489 if (!buf) 1490 return -ENOMEM; 1491 1492 error = xfs_getbmap(XFS_I(file_inode(file)), &bmx, buf); 1493 if (error) 1494 goto out_free_buf; 1495 1496 error = -EFAULT; 1497 if (copy_to_user(arg, &bmx, recsize)) 1498 goto out_free_buf; 1499 arg += recsize; 1500 1501 for (i = 0; i < bmx.bmv_entries; i++) { 1502 if (!xfs_getbmap_format(buf + i, arg, recsize)) 1503 goto out_free_buf; 1504 arg += recsize; 1505 } 1506 1507 error = 0; 1508 out_free_buf: 1509 kvfree(buf); 1510 return error; 1511 } 1512 1513 STATIC int 1514 xfs_ioc_getfsmap( 1515 struct xfs_inode *ip, 1516 struct fsmap_head __user *arg) 1517 { 1518 struct xfs_fsmap_head xhead = {0}; 1519 struct fsmap_head head; 1520 struct fsmap *recs; 1521 unsigned int count; 1522 __u32 last_flags = 0; 1523 bool done = false; 1524 int error; 1525 1526 if (copy_from_user(&head, arg, sizeof(struct fsmap_head))) 1527 return -EFAULT; 1528 if (memchr_inv(head.fmh_reserved, 0, sizeof(head.fmh_reserved)) || 1529 memchr_inv(head.fmh_keys[0].fmr_reserved, 0, 1530 sizeof(head.fmh_keys[0].fmr_reserved)) || 1531 memchr_inv(head.fmh_keys[1].fmr_reserved, 0, 1532 sizeof(head.fmh_keys[1].fmr_reserved))) 1533 return -EINVAL; 1534 1535 /* 1536 * Use an internal memory buffer so that we don't have to copy fsmap 1537 * data to userspace while holding locks. Start by trying to allocate 1538 * up to 128k for the buffer, but fall back to a single page if needed. 1539 */ 1540 count = min_t(unsigned int, head.fmh_count, 1541 131072 / sizeof(struct fsmap)); 1542 recs = kvcalloc(count, sizeof(struct fsmap), GFP_KERNEL); 1543 if (!recs) { 1544 count = min_t(unsigned int, head.fmh_count, 1545 PAGE_SIZE / sizeof(struct fsmap)); 1546 recs = kvcalloc(count, sizeof(struct fsmap), GFP_KERNEL); 1547 if (!recs) 1548 return -ENOMEM; 1549 } 1550 1551 xhead.fmh_iflags = head.fmh_iflags; 1552 xfs_fsmap_to_internal(&xhead.fmh_keys[0], &head.fmh_keys[0]); 1553 xfs_fsmap_to_internal(&xhead.fmh_keys[1], &head.fmh_keys[1]); 1554 1555 trace_xfs_getfsmap_low_key(ip->i_mount, &xhead.fmh_keys[0]); 1556 trace_xfs_getfsmap_high_key(ip->i_mount, &xhead.fmh_keys[1]); 1557 1558 head.fmh_entries = 0; 1559 do { 1560 struct fsmap __user *user_recs; 1561 struct fsmap *last_rec; 1562 1563 user_recs = &arg->fmh_recs[head.fmh_entries]; 1564 xhead.fmh_entries = 0; 1565 xhead.fmh_count = min_t(unsigned int, count, 1566 head.fmh_count - head.fmh_entries); 1567 1568 /* Run query, record how many entries we got. */ 1569 error = xfs_getfsmap(ip->i_mount, &xhead, recs); 1570 switch (error) { 1571 case 0: 1572 /* 1573 * There are no more records in the result set. Copy 1574 * whatever we got to userspace and break out. 1575 */ 1576 done = true; 1577 break; 1578 case -ECANCELED: 1579 /* 1580 * The internal memory buffer is full. Copy whatever 1581 * records we got to userspace and go again if we have 1582 * not yet filled the userspace buffer. 1583 */ 1584 error = 0; 1585 break; 1586 default: 1587 goto out_free; 1588 } 1589 head.fmh_entries += xhead.fmh_entries; 1590 head.fmh_oflags = xhead.fmh_oflags; 1591 1592 /* 1593 * If the caller wanted a record count or there aren't any 1594 * new records to return, we're done. 1595 */ 1596 if (head.fmh_count == 0 || xhead.fmh_entries == 0) 1597 break; 1598 1599 /* Copy all the records we got out to userspace. */ 1600 if (copy_to_user(user_recs, recs, 1601 xhead.fmh_entries * sizeof(struct fsmap))) { 1602 error = -EFAULT; 1603 goto out_free; 1604 } 1605 1606 /* Remember the last record flags we copied to userspace. */ 1607 last_rec = &recs[xhead.fmh_entries - 1]; 1608 last_flags = last_rec->fmr_flags; 1609 1610 /* Set up the low key for the next iteration. */ 1611 xfs_fsmap_to_internal(&xhead.fmh_keys[0], last_rec); 1612 trace_xfs_getfsmap_low_key(ip->i_mount, &xhead.fmh_keys[0]); 1613 } while (!done && head.fmh_entries < head.fmh_count); 1614 1615 /* 1616 * If there are no more records in the query result set and we're not 1617 * in counting mode, mark the last record returned with the LAST flag. 1618 */ 1619 if (done && head.fmh_count > 0 && head.fmh_entries > 0) { 1620 struct fsmap __user *user_rec; 1621 1622 last_flags |= FMR_OF_LAST; 1623 user_rec = &arg->fmh_recs[head.fmh_entries - 1]; 1624 1625 if (copy_to_user(&user_rec->fmr_flags, &last_flags, 1626 sizeof(last_flags))) { 1627 error = -EFAULT; 1628 goto out_free; 1629 } 1630 } 1631 1632 /* copy back header */ 1633 if (copy_to_user(arg, &head, sizeof(struct fsmap_head))) { 1634 error = -EFAULT; 1635 goto out_free; 1636 } 1637 1638 out_free: 1639 kvfree(recs); 1640 return error; 1641 } 1642 1643 STATIC int 1644 xfs_ioc_scrub_metadata( 1645 struct file *file, 1646 void __user *arg) 1647 { 1648 struct xfs_scrub_metadata scrub; 1649 int error; 1650 1651 if (!capable(CAP_SYS_ADMIN)) 1652 return -EPERM; 1653 1654 if (copy_from_user(&scrub, arg, sizeof(scrub))) 1655 return -EFAULT; 1656 1657 error = xfs_scrub_metadata(file, &scrub); 1658 if (error) 1659 return error; 1660 1661 if (copy_to_user(arg, &scrub, sizeof(scrub))) 1662 return -EFAULT; 1663 1664 return 0; 1665 } 1666 1667 int 1668 xfs_ioc_swapext( 1669 xfs_swapext_t *sxp) 1670 { 1671 xfs_inode_t *ip, *tip; 1672 struct fd f, tmp; 1673 int error = 0; 1674 1675 /* Pull information for the target fd */ 1676 f = fdget((int)sxp->sx_fdtarget); 1677 if (!f.file) { 1678 error = -EINVAL; 1679 goto out; 1680 } 1681 1682 if (!(f.file->f_mode & FMODE_WRITE) || 1683 !(f.file->f_mode & FMODE_READ) || 1684 (f.file->f_flags & O_APPEND)) { 1685 error = -EBADF; 1686 goto out_put_file; 1687 } 1688 1689 tmp = fdget((int)sxp->sx_fdtmp); 1690 if (!tmp.file) { 1691 error = -EINVAL; 1692 goto out_put_file; 1693 } 1694 1695 if (!(tmp.file->f_mode & FMODE_WRITE) || 1696 !(tmp.file->f_mode & FMODE_READ) || 1697 (tmp.file->f_flags & O_APPEND)) { 1698 error = -EBADF; 1699 goto out_put_tmp_file; 1700 } 1701 1702 if (IS_SWAPFILE(file_inode(f.file)) || 1703 IS_SWAPFILE(file_inode(tmp.file))) { 1704 error = -EINVAL; 1705 goto out_put_tmp_file; 1706 } 1707 1708 /* 1709 * We need to ensure that the fds passed in point to XFS inodes 1710 * before we cast and access them as XFS structures as we have no 1711 * control over what the user passes us here. 1712 */ 1713 if (f.file->f_op != &xfs_file_operations || 1714 tmp.file->f_op != &xfs_file_operations) { 1715 error = -EINVAL; 1716 goto out_put_tmp_file; 1717 } 1718 1719 ip = XFS_I(file_inode(f.file)); 1720 tip = XFS_I(file_inode(tmp.file)); 1721 1722 if (ip->i_mount != tip->i_mount) { 1723 error = -EINVAL; 1724 goto out_put_tmp_file; 1725 } 1726 1727 if (ip->i_ino == tip->i_ino) { 1728 error = -EINVAL; 1729 goto out_put_tmp_file; 1730 } 1731 1732 if (xfs_is_shutdown(ip->i_mount)) { 1733 error = -EIO; 1734 goto out_put_tmp_file; 1735 } 1736 1737 error = xfs_swap_extents(ip, tip, sxp); 1738 1739 out_put_tmp_file: 1740 fdput(tmp); 1741 out_put_file: 1742 fdput(f); 1743 out: 1744 return error; 1745 } 1746 1747 static int 1748 xfs_ioc_getlabel( 1749 struct xfs_mount *mp, 1750 char __user *user_label) 1751 { 1752 struct xfs_sb *sbp = &mp->m_sb; 1753 char label[XFSLABEL_MAX + 1]; 1754 1755 /* Paranoia */ 1756 BUILD_BUG_ON(sizeof(sbp->sb_fname) > FSLABEL_MAX); 1757 1758 /* 1 larger than sb_fname, so this ensures a trailing NUL char */ 1759 memset(label, 0, sizeof(label)); 1760 spin_lock(&mp->m_sb_lock); 1761 strncpy(label, sbp->sb_fname, XFSLABEL_MAX); 1762 spin_unlock(&mp->m_sb_lock); 1763 1764 if (copy_to_user(user_label, label, sizeof(label))) 1765 return -EFAULT; 1766 return 0; 1767 } 1768 1769 static int 1770 xfs_ioc_setlabel( 1771 struct file *filp, 1772 struct xfs_mount *mp, 1773 char __user *newlabel) 1774 { 1775 struct xfs_sb *sbp = &mp->m_sb; 1776 char label[XFSLABEL_MAX + 1]; 1777 size_t len; 1778 int error; 1779 1780 if (!capable(CAP_SYS_ADMIN)) 1781 return -EPERM; 1782 /* 1783 * The generic ioctl allows up to FSLABEL_MAX chars, but XFS is much 1784 * smaller, at 12 bytes. We copy one more to be sure we find the 1785 * (required) NULL character to test the incoming label length. 1786 * NB: The on disk label doesn't need to be null terminated. 1787 */ 1788 if (copy_from_user(label, newlabel, XFSLABEL_MAX + 1)) 1789 return -EFAULT; 1790 len = strnlen(label, XFSLABEL_MAX + 1); 1791 if (len > sizeof(sbp->sb_fname)) 1792 return -EINVAL; 1793 1794 error = mnt_want_write_file(filp); 1795 if (error) 1796 return error; 1797 1798 spin_lock(&mp->m_sb_lock); 1799 memset(sbp->sb_fname, 0, sizeof(sbp->sb_fname)); 1800 memcpy(sbp->sb_fname, label, len); 1801 spin_unlock(&mp->m_sb_lock); 1802 1803 /* 1804 * Now we do several things to satisfy userspace. 1805 * In addition to normal logging of the primary superblock, we also 1806 * immediately write these changes to sector zero for the primary, then 1807 * update all backup supers (as xfs_db does for a label change), then 1808 * invalidate the block device page cache. This is so that any prior 1809 * buffered reads from userspace (i.e. from blkid) are invalidated, 1810 * and userspace will see the newly-written label. 1811 */ 1812 error = xfs_sync_sb_buf(mp); 1813 if (error) 1814 goto out; 1815 /* 1816 * growfs also updates backup supers so lock against that. 1817 */ 1818 mutex_lock(&mp->m_growlock); 1819 error = xfs_update_secondary_sbs(mp); 1820 mutex_unlock(&mp->m_growlock); 1821 1822 invalidate_bdev(mp->m_ddev_targp->bt_bdev); 1823 1824 out: 1825 mnt_drop_write_file(filp); 1826 return error; 1827 } 1828 1829 static inline int 1830 xfs_fs_eofblocks_from_user( 1831 struct xfs_fs_eofblocks *src, 1832 struct xfs_icwalk *dst) 1833 { 1834 if (src->eof_version != XFS_EOFBLOCKS_VERSION) 1835 return -EINVAL; 1836 1837 if (src->eof_flags & ~XFS_EOF_FLAGS_VALID) 1838 return -EINVAL; 1839 1840 if (memchr_inv(&src->pad32, 0, sizeof(src->pad32)) || 1841 memchr_inv(src->pad64, 0, sizeof(src->pad64))) 1842 return -EINVAL; 1843 1844 dst->icw_flags = 0; 1845 if (src->eof_flags & XFS_EOF_FLAGS_SYNC) 1846 dst->icw_flags |= XFS_ICWALK_FLAG_SYNC; 1847 if (src->eof_flags & XFS_EOF_FLAGS_UID) 1848 dst->icw_flags |= XFS_ICWALK_FLAG_UID; 1849 if (src->eof_flags & XFS_EOF_FLAGS_GID) 1850 dst->icw_flags |= XFS_ICWALK_FLAG_GID; 1851 if (src->eof_flags & XFS_EOF_FLAGS_PRID) 1852 dst->icw_flags |= XFS_ICWALK_FLAG_PRID; 1853 if (src->eof_flags & XFS_EOF_FLAGS_MINFILESIZE) 1854 dst->icw_flags |= XFS_ICWALK_FLAG_MINFILESIZE; 1855 1856 dst->icw_prid = src->eof_prid; 1857 dst->icw_min_file_size = src->eof_min_file_size; 1858 1859 dst->icw_uid = INVALID_UID; 1860 if (src->eof_flags & XFS_EOF_FLAGS_UID) { 1861 dst->icw_uid = make_kuid(current_user_ns(), src->eof_uid); 1862 if (!uid_valid(dst->icw_uid)) 1863 return -EINVAL; 1864 } 1865 1866 dst->icw_gid = INVALID_GID; 1867 if (src->eof_flags & XFS_EOF_FLAGS_GID) { 1868 dst->icw_gid = make_kgid(current_user_ns(), src->eof_gid); 1869 if (!gid_valid(dst->icw_gid)) 1870 return -EINVAL; 1871 } 1872 return 0; 1873 } 1874 1875 static int 1876 xfs_ioctl_getset_resblocks( 1877 struct file *filp, 1878 unsigned int cmd, 1879 void __user *arg) 1880 { 1881 struct xfs_mount *mp = XFS_I(file_inode(filp))->i_mount; 1882 struct xfs_fsop_resblks fsop = { }; 1883 int error; 1884 1885 if (!capable(CAP_SYS_ADMIN)) 1886 return -EPERM; 1887 1888 if (cmd == XFS_IOC_SET_RESBLKS) { 1889 if (xfs_is_readonly(mp)) 1890 return -EROFS; 1891 1892 if (copy_from_user(&fsop, arg, sizeof(fsop))) 1893 return -EFAULT; 1894 1895 error = mnt_want_write_file(filp); 1896 if (error) 1897 return error; 1898 error = xfs_reserve_blocks(mp, fsop.resblks); 1899 mnt_drop_write_file(filp); 1900 if (error) 1901 return error; 1902 } 1903 1904 spin_lock(&mp->m_sb_lock); 1905 fsop.resblks = mp->m_resblks; 1906 fsop.resblks_avail = mp->m_resblks_avail; 1907 spin_unlock(&mp->m_sb_lock); 1908 1909 if (copy_to_user(arg, &fsop, sizeof(fsop))) 1910 return -EFAULT; 1911 return 0; 1912 } 1913 1914 static int 1915 xfs_ioctl_fs_counts( 1916 struct xfs_mount *mp, 1917 struct xfs_fsop_counts __user *uarg) 1918 { 1919 struct xfs_fsop_counts out = { 1920 .allocino = percpu_counter_read_positive(&mp->m_icount), 1921 .freeino = percpu_counter_read_positive(&mp->m_ifree), 1922 .freedata = percpu_counter_read_positive(&mp->m_fdblocks) - 1923 xfs_fdblocks_unavailable(mp), 1924 .freertx = percpu_counter_read_positive(&mp->m_frextents), 1925 }; 1926 1927 if (copy_to_user(uarg, &out, sizeof(out))) 1928 return -EFAULT; 1929 return 0; 1930 } 1931 1932 /* 1933 * These long-unused ioctls were removed from the official ioctl API in 5.17, 1934 * but retain these definitions so that we can log warnings about them. 1935 */ 1936 #define XFS_IOC_ALLOCSP _IOW ('X', 10, struct xfs_flock64) 1937 #define XFS_IOC_FREESP _IOW ('X', 11, struct xfs_flock64) 1938 #define XFS_IOC_ALLOCSP64 _IOW ('X', 36, struct xfs_flock64) 1939 #define XFS_IOC_FREESP64 _IOW ('X', 37, struct xfs_flock64) 1940 1941 /* 1942 * Note: some of the ioctl's return positive numbers as a 1943 * byte count indicating success, such as readlink_by_handle. 1944 * So we don't "sign flip" like most other routines. This means 1945 * true errors need to be returned as a negative value. 1946 */ 1947 long 1948 xfs_file_ioctl( 1949 struct file *filp, 1950 unsigned int cmd, 1951 unsigned long p) 1952 { 1953 struct inode *inode = file_inode(filp); 1954 struct xfs_inode *ip = XFS_I(inode); 1955 struct xfs_mount *mp = ip->i_mount; 1956 void __user *arg = (void __user *)p; 1957 int error; 1958 1959 trace_xfs_file_ioctl(ip); 1960 1961 switch (cmd) { 1962 case FITRIM: 1963 return xfs_ioc_trim(mp, arg); 1964 case FS_IOC_GETFSLABEL: 1965 return xfs_ioc_getlabel(mp, arg); 1966 case FS_IOC_SETFSLABEL: 1967 return xfs_ioc_setlabel(filp, mp, arg); 1968 case XFS_IOC_ALLOCSP: 1969 case XFS_IOC_FREESP: 1970 case XFS_IOC_ALLOCSP64: 1971 case XFS_IOC_FREESP64: 1972 xfs_warn_once(mp, 1973 "%s should use fallocate; XFS_IOC_{ALLOC,FREE}SP ioctl unsupported", 1974 current->comm); 1975 return -ENOTTY; 1976 case XFS_IOC_DIOINFO: { 1977 struct xfs_buftarg *target = xfs_inode_buftarg(ip); 1978 struct dioattr da; 1979 1980 da.d_mem = da.d_miniosz = target->bt_logical_sectorsize; 1981 da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1); 1982 1983 if (copy_to_user(arg, &da, sizeof(da))) 1984 return -EFAULT; 1985 return 0; 1986 } 1987 1988 case XFS_IOC_FSBULKSTAT_SINGLE: 1989 case XFS_IOC_FSBULKSTAT: 1990 case XFS_IOC_FSINUMBERS: 1991 return xfs_ioc_fsbulkstat(filp, cmd, arg); 1992 1993 case XFS_IOC_BULKSTAT: 1994 return xfs_ioc_bulkstat(filp, cmd, arg); 1995 case XFS_IOC_INUMBERS: 1996 return xfs_ioc_inumbers(mp, cmd, arg); 1997 1998 case XFS_IOC_FSGEOMETRY_V1: 1999 return xfs_ioc_fsgeometry(mp, arg, 3); 2000 case XFS_IOC_FSGEOMETRY_V4: 2001 return xfs_ioc_fsgeometry(mp, arg, 4); 2002 case XFS_IOC_FSGEOMETRY: 2003 return xfs_ioc_fsgeometry(mp, arg, 5); 2004 2005 case XFS_IOC_AG_GEOMETRY: 2006 return xfs_ioc_ag_geometry(mp, arg); 2007 2008 case XFS_IOC_GETVERSION: 2009 return put_user(inode->i_generation, (int __user *)arg); 2010 2011 case XFS_IOC_FSGETXATTRA: 2012 return xfs_ioc_fsgetxattra(ip, arg); 2013 2014 case XFS_IOC_GETBMAP: 2015 case XFS_IOC_GETBMAPA: 2016 case XFS_IOC_GETBMAPX: 2017 return xfs_ioc_getbmap(filp, cmd, arg); 2018 2019 case FS_IOC_GETFSMAP: 2020 return xfs_ioc_getfsmap(ip, arg); 2021 2022 case XFS_IOC_SCRUB_METADATA: 2023 return xfs_ioc_scrub_metadata(filp, arg); 2024 2025 case XFS_IOC_FD_TO_HANDLE: 2026 case XFS_IOC_PATH_TO_HANDLE: 2027 case XFS_IOC_PATH_TO_FSHANDLE: { 2028 xfs_fsop_handlereq_t hreq; 2029 2030 if (copy_from_user(&hreq, arg, sizeof(hreq))) 2031 return -EFAULT; 2032 return xfs_find_handle(cmd, &hreq); 2033 } 2034 case XFS_IOC_OPEN_BY_HANDLE: { 2035 xfs_fsop_handlereq_t hreq; 2036 2037 if (copy_from_user(&hreq, arg, sizeof(xfs_fsop_handlereq_t))) 2038 return -EFAULT; 2039 return xfs_open_by_handle(filp, &hreq); 2040 } 2041 2042 case XFS_IOC_READLINK_BY_HANDLE: { 2043 xfs_fsop_handlereq_t hreq; 2044 2045 if (copy_from_user(&hreq, arg, sizeof(xfs_fsop_handlereq_t))) 2046 return -EFAULT; 2047 return xfs_readlink_by_handle(filp, &hreq); 2048 } 2049 case XFS_IOC_ATTRLIST_BY_HANDLE: 2050 return xfs_attrlist_by_handle(filp, arg); 2051 2052 case XFS_IOC_ATTRMULTI_BY_HANDLE: 2053 return xfs_attrmulti_by_handle(filp, arg); 2054 2055 case XFS_IOC_SWAPEXT: { 2056 struct xfs_swapext sxp; 2057 2058 if (copy_from_user(&sxp, arg, sizeof(xfs_swapext_t))) 2059 return -EFAULT; 2060 error = mnt_want_write_file(filp); 2061 if (error) 2062 return error; 2063 error = xfs_ioc_swapext(&sxp); 2064 mnt_drop_write_file(filp); 2065 return error; 2066 } 2067 2068 case XFS_IOC_FSCOUNTS: 2069 return xfs_ioctl_fs_counts(mp, arg); 2070 2071 case XFS_IOC_SET_RESBLKS: 2072 case XFS_IOC_GET_RESBLKS: 2073 return xfs_ioctl_getset_resblocks(filp, cmd, arg); 2074 2075 case XFS_IOC_FSGROWFSDATA: { 2076 struct xfs_growfs_data in; 2077 2078 if (copy_from_user(&in, arg, sizeof(in))) 2079 return -EFAULT; 2080 2081 error = mnt_want_write_file(filp); 2082 if (error) 2083 return error; 2084 error = xfs_growfs_data(mp, &in); 2085 mnt_drop_write_file(filp); 2086 return error; 2087 } 2088 2089 case XFS_IOC_FSGROWFSLOG: { 2090 struct xfs_growfs_log in; 2091 2092 if (copy_from_user(&in, arg, sizeof(in))) 2093 return -EFAULT; 2094 2095 error = mnt_want_write_file(filp); 2096 if (error) 2097 return error; 2098 error = xfs_growfs_log(mp, &in); 2099 mnt_drop_write_file(filp); 2100 return error; 2101 } 2102 2103 case XFS_IOC_FSGROWFSRT: { 2104 xfs_growfs_rt_t in; 2105 2106 if (copy_from_user(&in, arg, sizeof(in))) 2107 return -EFAULT; 2108 2109 error = mnt_want_write_file(filp); 2110 if (error) 2111 return error; 2112 error = xfs_growfs_rt(mp, &in); 2113 mnt_drop_write_file(filp); 2114 return error; 2115 } 2116 2117 case XFS_IOC_GOINGDOWN: { 2118 uint32_t in; 2119 2120 if (!capable(CAP_SYS_ADMIN)) 2121 return -EPERM; 2122 2123 if (get_user(in, (uint32_t __user *)arg)) 2124 return -EFAULT; 2125 2126 return xfs_fs_goingdown(mp, in); 2127 } 2128 2129 case XFS_IOC_ERROR_INJECTION: { 2130 xfs_error_injection_t in; 2131 2132 if (!capable(CAP_SYS_ADMIN)) 2133 return -EPERM; 2134 2135 if (copy_from_user(&in, arg, sizeof(in))) 2136 return -EFAULT; 2137 2138 return xfs_errortag_add(mp, in.errtag); 2139 } 2140 2141 case XFS_IOC_ERROR_CLEARALL: 2142 if (!capable(CAP_SYS_ADMIN)) 2143 return -EPERM; 2144 2145 return xfs_errortag_clearall(mp); 2146 2147 case XFS_IOC_FREE_EOFBLOCKS: { 2148 struct xfs_fs_eofblocks eofb; 2149 struct xfs_icwalk icw; 2150 2151 if (!capable(CAP_SYS_ADMIN)) 2152 return -EPERM; 2153 2154 if (xfs_is_readonly(mp)) 2155 return -EROFS; 2156 2157 if (copy_from_user(&eofb, arg, sizeof(eofb))) 2158 return -EFAULT; 2159 2160 error = xfs_fs_eofblocks_from_user(&eofb, &icw); 2161 if (error) 2162 return error; 2163 2164 trace_xfs_ioc_free_eofblocks(mp, &icw, _RET_IP_); 2165 2166 sb_start_write(mp->m_super); 2167 error = xfs_blockgc_free_space(mp, &icw); 2168 sb_end_write(mp->m_super); 2169 return error; 2170 } 2171 2172 default: 2173 return -ENOTTY; 2174 } 2175 } 2176