root/fs/xfs/xfs_ioctl.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. xfs_find_handle
  2. xfs_handle_acceptable
  3. xfs_handle_to_dentry
  4. xfs_handlereq_to_dentry
  5. xfs_open_by_handle
  6. xfs_readlink_by_handle
  7. xfs_set_dmattrs
  8. xfs_fssetdm_by_handle
  9. xfs_attrlist_by_handle
  10. xfs_attrmulti_attr_get
  11. xfs_attrmulti_attr_set
  12. xfs_attrmulti_attr_remove
  13. xfs_attrmulti_by_handle
  14. xfs_ioc_space
  15. xfs_fsbulkstat_one_fmt
  16. xfs_fsinumbers_fmt
  17. xfs_ioc_fsbulkstat
  18. xfs_bulkstat_fmt
  19. xfs_bulk_ireq_setup
  20. xfs_bulk_ireq_teardown
  21. xfs_ioc_bulkstat
  22. xfs_inumbers_fmt
  23. xfs_ioc_inumbers
  24. xfs_ioc_fsgeometry
  25. xfs_ioc_ag_geometry
  26. xfs_merge_ioc_xflags
  27. xfs_di2lxflags
  28. xfs_fill_fsxattr
  29. xfs_ioc_fsgetxattr
  30. xfs_flags2diflags
  31. xfs_flags2diflags2
  32. xfs_diflags_to_linux
  33. xfs_ioctl_setattr_xflags
  34. xfs_ioctl_setattr_dax_invalidate
  35. xfs_ioctl_setattr_get_trans
  36. xfs_ioctl_setattr_check_extsize
  37. xfs_ioctl_setattr_check_cowextsize
  38. xfs_ioctl_setattr_check_projid
  39. xfs_ioctl_setattr
  40. xfs_ioc_fssetxattr
  41. xfs_ioc_getxflags
  42. xfs_ioc_setxflags
  43. xfs_getbmap_format
  44. xfs_ioc_getbmap
  45. xfs_getfsmap_format
  46. xfs_ioc_getfsmap
  47. xfs_ioc_scrub_metadata
  48. xfs_ioc_swapext
  49. xfs_ioc_getlabel
  50. xfs_ioc_setlabel
  51. xfs_file_ioctl

   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_attr.h"
  19 #include "xfs_bmap.h"
  20 #include "xfs_bmap_util.h"
  21 #include "xfs_fsops.h"
  22 #include "xfs_discard.h"
  23 #include "xfs_quota.h"
  24 #include "xfs_export.h"
  25 #include "xfs_trace.h"
  26 #include "xfs_icache.h"
  27 #include "xfs_trans.h"
  28 #include "xfs_acl.h"
  29 #include "xfs_btree.h"
  30 #include <linux/fsmap.h>
  31 #include "xfs_fsmap.h"
  32 #include "scrub/xfs_scrub.h"
  33 #include "xfs_sb.h"
  34 #include "xfs_ag.h"
  35 #include "xfs_health.h"
  36 
  37 #include <linux/mount.h>
  38 #include <linux/namei.h>
  39 
  40 /*
  41  * xfs_find_handle maps from userspace xfs_fsop_handlereq structure to
  42  * a file or fs handle.
  43  *
  44  * XFS_IOC_PATH_TO_FSHANDLE
  45  *    returns fs handle for a mount point or path within that mount point
  46  * XFS_IOC_FD_TO_HANDLE
  47  *    returns full handle for a FD opened in user space
  48  * XFS_IOC_PATH_TO_HANDLE
  49  *    returns full handle for a path
  50  */
  51 int
  52 xfs_find_handle(
  53         unsigned int            cmd,
  54         xfs_fsop_handlereq_t    *hreq)
  55 {
  56         int                     hsize;
  57         xfs_handle_t            handle;
  58         struct inode            *inode;
  59         struct fd               f = {NULL};
  60         struct path             path;
  61         int                     error;
  62         struct xfs_inode        *ip;
  63 
  64         if (cmd == XFS_IOC_FD_TO_HANDLE) {
  65                 f = fdget(hreq->fd);
  66                 if (!f.file)
  67                         return -EBADF;
  68                 inode = file_inode(f.file);
  69         } else {
  70                 error = user_path_at(AT_FDCWD, hreq->path, 0, &path);
  71                 if (error)
  72                         return error;
  73                 inode = d_inode(path.dentry);
  74         }
  75         ip = XFS_I(inode);
  76 
  77         /*
  78          * We can only generate handles for inodes residing on a XFS filesystem,
  79          * and only for regular files, directories or symbolic links.
  80          */
  81         error = -EINVAL;
  82         if (inode->i_sb->s_magic != XFS_SB_MAGIC)
  83                 goto out_put;
  84 
  85         error = -EBADF;
  86         if (!S_ISREG(inode->i_mode) &&
  87             !S_ISDIR(inode->i_mode) &&
  88             !S_ISLNK(inode->i_mode))
  89                 goto out_put;
  90 
  91 
  92         memcpy(&handle.ha_fsid, ip->i_mount->m_fixedfsid, sizeof(xfs_fsid_t));
  93 
  94         if (cmd == XFS_IOC_PATH_TO_FSHANDLE) {
  95                 /*
  96                  * This handle only contains an fsid, zero the rest.
  97                  */
  98                 memset(&handle.ha_fid, 0, sizeof(handle.ha_fid));
  99                 hsize = sizeof(xfs_fsid_t);
 100         } else {
 101                 handle.ha_fid.fid_len = sizeof(xfs_fid_t) -
 102                                         sizeof(handle.ha_fid.fid_len);
 103                 handle.ha_fid.fid_pad = 0;
 104                 handle.ha_fid.fid_gen = inode->i_generation;
 105                 handle.ha_fid.fid_ino = ip->i_ino;
 106                 hsize = sizeof(xfs_handle_t);
 107         }
 108 
 109         error = -EFAULT;
 110         if (copy_to_user(hreq->ohandle, &handle, hsize) ||
 111             copy_to_user(hreq->ohandlen, &hsize, sizeof(__s32)))
 112                 goto out_put;
 113 
 114         error = 0;
 115 
 116  out_put:
 117         if (cmd == XFS_IOC_FD_TO_HANDLE)
 118                 fdput(f);
 119         else
 120                 path_put(&path);
 121         return error;
 122 }
 123 
 124 /*
 125  * No need to do permission checks on the various pathname components
 126  * as the handle operations are privileged.
 127  */
 128 STATIC int
 129 xfs_handle_acceptable(
 130         void                    *context,
 131         struct dentry           *dentry)
 132 {
 133         return 1;
 134 }
 135 
 136 /*
 137  * Convert userspace handle data into a dentry.
 138  */
 139 struct dentry *
 140 xfs_handle_to_dentry(
 141         struct file             *parfilp,
 142         void __user             *uhandle,
 143         u32                     hlen)
 144 {
 145         xfs_handle_t            handle;
 146         struct xfs_fid64        fid;
 147 
 148         /*
 149          * Only allow handle opens under a directory.
 150          */
 151         if (!S_ISDIR(file_inode(parfilp)->i_mode))
 152                 return ERR_PTR(-ENOTDIR);
 153 
 154         if (hlen != sizeof(xfs_handle_t))
 155                 return ERR_PTR(-EINVAL);
 156         if (copy_from_user(&handle, uhandle, hlen))
 157                 return ERR_PTR(-EFAULT);
 158         if (handle.ha_fid.fid_len !=
 159             sizeof(handle.ha_fid) - sizeof(handle.ha_fid.fid_len))
 160                 return ERR_PTR(-EINVAL);
 161 
 162         memset(&fid, 0, sizeof(struct fid));
 163         fid.ino = handle.ha_fid.fid_ino;
 164         fid.gen = handle.ha_fid.fid_gen;
 165 
 166         return exportfs_decode_fh(parfilp->f_path.mnt, (struct fid *)&fid, 3,
 167                         FILEID_INO32_GEN | XFS_FILEID_TYPE_64FLAG,
 168                         xfs_handle_acceptable, NULL);
 169 }
 170 
 171 STATIC struct dentry *
 172 xfs_handlereq_to_dentry(
 173         struct file             *parfilp,
 174         xfs_fsop_handlereq_t    *hreq)
 175 {
 176         return xfs_handle_to_dentry(parfilp, hreq->ihandle, hreq->ihandlen);
 177 }
 178 
 179 int
 180 xfs_open_by_handle(
 181         struct file             *parfilp,
 182         xfs_fsop_handlereq_t    *hreq)
 183 {
 184         const struct cred       *cred = current_cred();
 185         int                     error;
 186         int                     fd;
 187         int                     permflag;
 188         struct file             *filp;
 189         struct inode            *inode;
 190         struct dentry           *dentry;
 191         fmode_t                 fmode;
 192         struct path             path;
 193 
 194         if (!capable(CAP_SYS_ADMIN))
 195                 return -EPERM;
 196 
 197         dentry = xfs_handlereq_to_dentry(parfilp, hreq);
 198         if (IS_ERR(dentry))
 199                 return PTR_ERR(dentry);
 200         inode = d_inode(dentry);
 201 
 202         /* Restrict xfs_open_by_handle to directories & regular files. */
 203         if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode))) {
 204                 error = -EPERM;
 205                 goto out_dput;
 206         }
 207 
 208 #if BITS_PER_LONG != 32
 209         hreq->oflags |= O_LARGEFILE;
 210 #endif
 211 
 212         permflag = hreq->oflags;
 213         fmode = OPEN_FMODE(permflag);
 214         if ((!(permflag & O_APPEND) || (permflag & O_TRUNC)) &&
 215             (fmode & FMODE_WRITE) && IS_APPEND(inode)) {
 216                 error = -EPERM;
 217                 goto out_dput;
 218         }
 219 
 220         if ((fmode & FMODE_WRITE) && IS_IMMUTABLE(inode)) {
 221                 error = -EPERM;
 222                 goto out_dput;
 223         }
 224 
 225         /* Can't write directories. */
 226         if (S_ISDIR(inode->i_mode) && (fmode & FMODE_WRITE)) {
 227                 error = -EISDIR;
 228                 goto out_dput;
 229         }
 230 
 231         fd = get_unused_fd_flags(0);
 232         if (fd < 0) {
 233                 error = fd;
 234                 goto out_dput;
 235         }
 236 
 237         path.mnt = parfilp->f_path.mnt;
 238         path.dentry = dentry;
 239         filp = dentry_open(&path, hreq->oflags, cred);
 240         dput(dentry);
 241         if (IS_ERR(filp)) {
 242                 put_unused_fd(fd);
 243                 return PTR_ERR(filp);
 244         }
 245 
 246         if (S_ISREG(inode->i_mode)) {
 247                 filp->f_flags |= O_NOATIME;
 248                 filp->f_mode |= FMODE_NOCMTIME;
 249         }
 250 
 251         fd_install(fd, filp);
 252         return fd;
 253 
 254  out_dput:
 255         dput(dentry);
 256         return error;
 257 }
 258 
 259 int
 260 xfs_readlink_by_handle(
 261         struct file             *parfilp,
 262         xfs_fsop_handlereq_t    *hreq)
 263 {
 264         struct dentry           *dentry;
 265         __u32                   olen;
 266         int                     error;
 267 
 268         if (!capable(CAP_SYS_ADMIN))
 269                 return -EPERM;
 270 
 271         dentry = xfs_handlereq_to_dentry(parfilp, hreq);
 272         if (IS_ERR(dentry))
 273                 return PTR_ERR(dentry);
 274 
 275         /* Restrict this handle operation to symlinks only. */
 276         if (!d_is_symlink(dentry)) {
 277                 error = -EINVAL;
 278                 goto out_dput;
 279         }
 280 
 281         if (copy_from_user(&olen, hreq->ohandlen, sizeof(__u32))) {
 282                 error = -EFAULT;
 283                 goto out_dput;
 284         }
 285 
 286         error = vfs_readlink(dentry, hreq->ohandle, olen);
 287 
 288  out_dput:
 289         dput(dentry);
 290         return error;
 291 }
 292 
 293 int
 294 xfs_set_dmattrs(
 295         xfs_inode_t     *ip,
 296         uint            evmask,
 297         uint16_t        state)
 298 {
 299         xfs_mount_t     *mp = ip->i_mount;
 300         xfs_trans_t     *tp;
 301         int             error;
 302 
 303         if (!capable(CAP_SYS_ADMIN))
 304                 return -EPERM;
 305 
 306         if (XFS_FORCED_SHUTDOWN(mp))
 307                 return -EIO;
 308 
 309         error = xfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 0, 0, 0, &tp);
 310         if (error)
 311                 return error;
 312 
 313         xfs_ilock(ip, XFS_ILOCK_EXCL);
 314         xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
 315 
 316         ip->i_d.di_dmevmask = evmask;
 317         ip->i_d.di_dmstate  = state;
 318 
 319         xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
 320         error = xfs_trans_commit(tp);
 321 
 322         return error;
 323 }
 324 
 325 STATIC int
 326 xfs_fssetdm_by_handle(
 327         struct file             *parfilp,
 328         void                    __user *arg)
 329 {
 330         int                     error;
 331         struct fsdmidata        fsd;
 332         xfs_fsop_setdm_handlereq_t dmhreq;
 333         struct dentry           *dentry;
 334 
 335         if (!capable(CAP_MKNOD))
 336                 return -EPERM;
 337         if (copy_from_user(&dmhreq, arg, sizeof(xfs_fsop_setdm_handlereq_t)))
 338                 return -EFAULT;
 339 
 340         error = mnt_want_write_file(parfilp);
 341         if (error)
 342                 return error;
 343 
 344         dentry = xfs_handlereq_to_dentry(parfilp, &dmhreq.hreq);
 345         if (IS_ERR(dentry)) {
 346                 mnt_drop_write_file(parfilp);
 347                 return PTR_ERR(dentry);
 348         }
 349 
 350         if (IS_IMMUTABLE(d_inode(dentry)) || IS_APPEND(d_inode(dentry))) {
 351                 error = -EPERM;
 352                 goto out;
 353         }
 354 
 355         if (copy_from_user(&fsd, dmhreq.data, sizeof(fsd))) {
 356                 error = -EFAULT;
 357                 goto out;
 358         }
 359 
 360         error = xfs_set_dmattrs(XFS_I(d_inode(dentry)), fsd.fsd_dmevmask,
 361                                  fsd.fsd_dmstate);
 362 
 363  out:
 364         mnt_drop_write_file(parfilp);
 365         dput(dentry);
 366         return error;
 367 }
 368 
 369 STATIC int
 370 xfs_attrlist_by_handle(
 371         struct file             *parfilp,
 372         void                    __user *arg)
 373 {
 374         int                     error = -ENOMEM;
 375         attrlist_cursor_kern_t  *cursor;
 376         struct xfs_fsop_attrlist_handlereq __user       *p = arg;
 377         xfs_fsop_attrlist_handlereq_t al_hreq;
 378         struct dentry           *dentry;
 379         char                    *kbuf;
 380 
 381         if (!capable(CAP_SYS_ADMIN))
 382                 return -EPERM;
 383         if (copy_from_user(&al_hreq, arg, sizeof(xfs_fsop_attrlist_handlereq_t)))
 384                 return -EFAULT;
 385         if (al_hreq.buflen < sizeof(struct attrlist) ||
 386             al_hreq.buflen > XFS_XATTR_LIST_MAX)
 387                 return -EINVAL;
 388 
 389         /*
 390          * Reject flags, only allow namespaces.
 391          */
 392         if (al_hreq.flags & ~(ATTR_ROOT | ATTR_SECURE))
 393                 return -EINVAL;
 394 
 395         dentry = xfs_handlereq_to_dentry(parfilp, &al_hreq.hreq);
 396         if (IS_ERR(dentry))
 397                 return PTR_ERR(dentry);
 398 
 399         kbuf = kmem_zalloc_large(al_hreq.buflen, 0);
 400         if (!kbuf)
 401                 goto out_dput;
 402 
 403         cursor = (attrlist_cursor_kern_t *)&al_hreq.pos;
 404         error = xfs_attr_list(XFS_I(d_inode(dentry)), kbuf, al_hreq.buflen,
 405                                         al_hreq.flags, cursor);
 406         if (error)
 407                 goto out_kfree;
 408 
 409         if (copy_to_user(&p->pos, cursor, sizeof(attrlist_cursor_kern_t))) {
 410                 error = -EFAULT;
 411                 goto out_kfree;
 412         }
 413 
 414         if (copy_to_user(al_hreq.buffer, kbuf, al_hreq.buflen))
 415                 error = -EFAULT;
 416 
 417 out_kfree:
 418         kmem_free(kbuf);
 419 out_dput:
 420         dput(dentry);
 421         return error;
 422 }
 423 
 424 int
 425 xfs_attrmulti_attr_get(
 426         struct inode            *inode,
 427         unsigned char           *name,
 428         unsigned char           __user *ubuf,
 429         uint32_t                *len,
 430         uint32_t                flags)
 431 {
 432         unsigned char           *kbuf;
 433         int                     error = -EFAULT;
 434 
 435         if (*len > XFS_XATTR_SIZE_MAX)
 436                 return -EINVAL;
 437         kbuf = kmem_zalloc_large(*len, 0);
 438         if (!kbuf)
 439                 return -ENOMEM;
 440 
 441         error = xfs_attr_get(XFS_I(inode), name, &kbuf, (int *)len, flags);
 442         if (error)
 443                 goto out_kfree;
 444 
 445         if (copy_to_user(ubuf, kbuf, *len))
 446                 error = -EFAULT;
 447 
 448 out_kfree:
 449         kmem_free(kbuf);
 450         return error;
 451 }
 452 
 453 int
 454 xfs_attrmulti_attr_set(
 455         struct inode            *inode,
 456         unsigned char           *name,
 457         const unsigned char     __user *ubuf,
 458         uint32_t                len,
 459         uint32_t                flags)
 460 {
 461         unsigned char           *kbuf;
 462         int                     error;
 463 
 464         if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
 465                 return -EPERM;
 466         if (len > XFS_XATTR_SIZE_MAX)
 467                 return -EINVAL;
 468 
 469         kbuf = memdup_user(ubuf, len);
 470         if (IS_ERR(kbuf))
 471                 return PTR_ERR(kbuf);
 472 
 473         error = xfs_attr_set(XFS_I(inode), name, kbuf, len, flags);
 474         if (!error)
 475                 xfs_forget_acl(inode, name, flags);
 476         kfree(kbuf);
 477         return error;
 478 }
 479 
 480 int
 481 xfs_attrmulti_attr_remove(
 482         struct inode            *inode,
 483         unsigned char           *name,
 484         uint32_t                flags)
 485 {
 486         int                     error;
 487 
 488         if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
 489                 return -EPERM;
 490         error = xfs_attr_remove(XFS_I(inode), name, flags);
 491         if (!error)
 492                 xfs_forget_acl(inode, name, flags);
 493         return error;
 494 }
 495 
 496 STATIC int
 497 xfs_attrmulti_by_handle(
 498         struct file             *parfilp,
 499         void                    __user *arg)
 500 {
 501         int                     error;
 502         xfs_attr_multiop_t      *ops;
 503         xfs_fsop_attrmulti_handlereq_t am_hreq;
 504         struct dentry           *dentry;
 505         unsigned int            i, size;
 506         unsigned char           *attr_name;
 507 
 508         if (!capable(CAP_SYS_ADMIN))
 509                 return -EPERM;
 510         if (copy_from_user(&am_hreq, arg, sizeof(xfs_fsop_attrmulti_handlereq_t)))
 511                 return -EFAULT;
 512 
 513         /* overflow check */
 514         if (am_hreq.opcount >= INT_MAX / sizeof(xfs_attr_multiop_t))
 515                 return -E2BIG;
 516 
 517         dentry = xfs_handlereq_to_dentry(parfilp, &am_hreq.hreq);
 518         if (IS_ERR(dentry))
 519                 return PTR_ERR(dentry);
 520 
 521         error = -E2BIG;
 522         size = am_hreq.opcount * sizeof(xfs_attr_multiop_t);
 523         if (!size || size > 16 * PAGE_SIZE)
 524                 goto out_dput;
 525 
 526         ops = memdup_user(am_hreq.ops, size);
 527         if (IS_ERR(ops)) {
 528                 error = PTR_ERR(ops);
 529                 goto out_dput;
 530         }
 531 
 532         error = -ENOMEM;
 533         attr_name = kmalloc(MAXNAMELEN, GFP_KERNEL);
 534         if (!attr_name)
 535                 goto out_kfree_ops;
 536 
 537         error = 0;
 538         for (i = 0; i < am_hreq.opcount; i++) {
 539                 ops[i].am_flags &= ~ATTR_KERNEL_FLAGS;
 540 
 541                 ops[i].am_error = strncpy_from_user((char *)attr_name,
 542                                 ops[i].am_attrname, MAXNAMELEN);
 543                 if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN)
 544                         error = -ERANGE;
 545                 if (ops[i].am_error < 0)
 546                         break;
 547 
 548                 switch (ops[i].am_opcode) {
 549                 case ATTR_OP_GET:
 550                         ops[i].am_error = xfs_attrmulti_attr_get(
 551                                         d_inode(dentry), attr_name,
 552                                         ops[i].am_attrvalue, &ops[i].am_length,
 553                                         ops[i].am_flags);
 554                         break;
 555                 case ATTR_OP_SET:
 556                         ops[i].am_error = mnt_want_write_file(parfilp);
 557                         if (ops[i].am_error)
 558                                 break;
 559                         ops[i].am_error = xfs_attrmulti_attr_set(
 560                                         d_inode(dentry), attr_name,
 561                                         ops[i].am_attrvalue, ops[i].am_length,
 562                                         ops[i].am_flags);
 563                         mnt_drop_write_file(parfilp);
 564                         break;
 565                 case ATTR_OP_REMOVE:
 566                         ops[i].am_error = mnt_want_write_file(parfilp);
 567                         if (ops[i].am_error)
 568                                 break;
 569                         ops[i].am_error = xfs_attrmulti_attr_remove(
 570                                         d_inode(dentry), attr_name,
 571                                         ops[i].am_flags);
 572                         mnt_drop_write_file(parfilp);
 573                         break;
 574                 default:
 575                         ops[i].am_error = -EINVAL;
 576                 }
 577         }
 578 
 579         if (copy_to_user(am_hreq.ops, ops, size))
 580                 error = -EFAULT;
 581 
 582         kfree(attr_name);
 583  out_kfree_ops:
 584         kfree(ops);
 585  out_dput:
 586         dput(dentry);
 587         return error;
 588 }
 589 
 590 int
 591 xfs_ioc_space(
 592         struct file             *filp,
 593         unsigned int            cmd,
 594         xfs_flock64_t           *bf)
 595 {
 596         struct inode            *inode = file_inode(filp);
 597         struct xfs_inode        *ip = XFS_I(inode);
 598         struct iattr            iattr;
 599         enum xfs_prealloc_flags flags = 0;
 600         uint                    iolock = XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL;
 601         int                     error;
 602 
 603         if (inode->i_flags & (S_IMMUTABLE|S_APPEND))
 604                 return -EPERM;
 605 
 606         if (!(filp->f_mode & FMODE_WRITE))
 607                 return -EBADF;
 608 
 609         if (!S_ISREG(inode->i_mode))
 610                 return -EINVAL;
 611 
 612         if (filp->f_flags & O_DSYNC)
 613                 flags |= XFS_PREALLOC_SYNC;
 614         if (filp->f_mode & FMODE_NOCMTIME)
 615                 flags |= XFS_PREALLOC_INVISIBLE;
 616 
 617         error = mnt_want_write_file(filp);
 618         if (error)
 619                 return error;
 620 
 621         xfs_ilock(ip, iolock);
 622         error = xfs_break_layouts(inode, &iolock, BREAK_UNMAP);
 623         if (error)
 624                 goto out_unlock;
 625 
 626         switch (bf->l_whence) {
 627         case 0: /*SEEK_SET*/
 628                 break;
 629         case 1: /*SEEK_CUR*/
 630                 bf->l_start += filp->f_pos;
 631                 break;
 632         case 2: /*SEEK_END*/
 633                 bf->l_start += XFS_ISIZE(ip);
 634                 break;
 635         default:
 636                 error = -EINVAL;
 637                 goto out_unlock;
 638         }
 639 
 640         /*
 641          * length of <= 0 for resv/unresv/zero is invalid.  length for
 642          * alloc/free is ignored completely and we have no idea what userspace
 643          * might have set it to, so set it to zero to allow range
 644          * checks to pass.
 645          */
 646         switch (cmd) {
 647         case XFS_IOC_ZERO_RANGE:
 648         case XFS_IOC_RESVSP:
 649         case XFS_IOC_RESVSP64:
 650         case XFS_IOC_UNRESVSP:
 651         case XFS_IOC_UNRESVSP64:
 652                 if (bf->l_len <= 0) {
 653                         error = -EINVAL;
 654                         goto out_unlock;
 655                 }
 656                 break;
 657         default:
 658                 bf->l_len = 0;
 659                 break;
 660         }
 661 
 662         if (bf->l_start < 0 ||
 663             bf->l_start > inode->i_sb->s_maxbytes ||
 664             bf->l_start + bf->l_len < 0 ||
 665             bf->l_start + bf->l_len >= inode->i_sb->s_maxbytes) {
 666                 error = -EINVAL;
 667                 goto out_unlock;
 668         }
 669 
 670         switch (cmd) {
 671         case XFS_IOC_ZERO_RANGE:
 672                 flags |= XFS_PREALLOC_SET;
 673                 error = xfs_zero_file_space(ip, bf->l_start, bf->l_len);
 674                 break;
 675         case XFS_IOC_RESVSP:
 676         case XFS_IOC_RESVSP64:
 677                 flags |= XFS_PREALLOC_SET;
 678                 error = xfs_alloc_file_space(ip, bf->l_start, bf->l_len,
 679                                                 XFS_BMAPI_PREALLOC);
 680                 break;
 681         case XFS_IOC_UNRESVSP:
 682         case XFS_IOC_UNRESVSP64:
 683                 error = xfs_free_file_space(ip, bf->l_start, bf->l_len);
 684                 break;
 685         case XFS_IOC_ALLOCSP:
 686         case XFS_IOC_ALLOCSP64:
 687         case XFS_IOC_FREESP:
 688         case XFS_IOC_FREESP64:
 689                 flags |= XFS_PREALLOC_CLEAR;
 690                 if (bf->l_start > XFS_ISIZE(ip)) {
 691                         error = xfs_alloc_file_space(ip, XFS_ISIZE(ip),
 692                                         bf->l_start - XFS_ISIZE(ip), 0);
 693                         if (error)
 694                                 goto out_unlock;
 695                 }
 696 
 697                 iattr.ia_valid = ATTR_SIZE;
 698                 iattr.ia_size = bf->l_start;
 699 
 700                 error = xfs_vn_setattr_size(file_dentry(filp), &iattr);
 701                 break;
 702         default:
 703                 ASSERT(0);
 704                 error = -EINVAL;
 705         }
 706 
 707         if (error)
 708                 goto out_unlock;
 709 
 710         error = xfs_update_prealloc_flags(ip, flags);
 711 
 712 out_unlock:
 713         xfs_iunlock(ip, iolock);
 714         mnt_drop_write_file(filp);
 715         return error;
 716 }
 717 
 718 /* Return 0 on success or positive error */
 719 int
 720 xfs_fsbulkstat_one_fmt(
 721         struct xfs_ibulk                *breq,
 722         const struct xfs_bulkstat       *bstat)
 723 {
 724         struct xfs_bstat                bs1;
 725 
 726         xfs_bulkstat_to_bstat(breq->mp, &bs1, bstat);
 727         if (copy_to_user(breq->ubuffer, &bs1, sizeof(bs1)))
 728                 return -EFAULT;
 729         return xfs_ibulk_advance(breq, sizeof(struct xfs_bstat));
 730 }
 731 
 732 int
 733 xfs_fsinumbers_fmt(
 734         struct xfs_ibulk                *breq,
 735         const struct xfs_inumbers       *igrp)
 736 {
 737         struct xfs_inogrp               ig1;
 738 
 739         xfs_inumbers_to_inogrp(&ig1, igrp);
 740         if (copy_to_user(breq->ubuffer, &ig1, sizeof(struct xfs_inogrp)))
 741                 return -EFAULT;
 742         return xfs_ibulk_advance(breq, sizeof(struct xfs_inogrp));
 743 }
 744 
 745 STATIC int
 746 xfs_ioc_fsbulkstat(
 747         xfs_mount_t             *mp,
 748         unsigned int            cmd,
 749         void                    __user *arg)
 750 {
 751         struct xfs_fsop_bulkreq bulkreq;
 752         struct xfs_ibulk        breq = {
 753                 .mp             = mp,
 754                 .ocount         = 0,
 755         };
 756         xfs_ino_t               lastino;
 757         int                     error;
 758 
 759         /* done = 1 if there are more stats to get and if bulkstat */
 760         /* should be called again (unused here, but used in dmapi) */
 761 
 762         if (!capable(CAP_SYS_ADMIN))
 763                 return -EPERM;
 764 
 765         if (XFS_FORCED_SHUTDOWN(mp))
 766                 return -EIO;
 767 
 768         if (copy_from_user(&bulkreq, arg, sizeof(struct xfs_fsop_bulkreq)))
 769                 return -EFAULT;
 770 
 771         if (copy_from_user(&lastino, bulkreq.lastip, sizeof(__s64)))
 772                 return -EFAULT;
 773 
 774         if (bulkreq.icount <= 0)
 775                 return -EINVAL;
 776 
 777         if (bulkreq.ubuffer == NULL)
 778                 return -EINVAL;
 779 
 780         breq.ubuffer = bulkreq.ubuffer;
 781         breq.icount = bulkreq.icount;
 782 
 783         /*
 784          * FSBULKSTAT_SINGLE expects that *lastip contains the inode number
 785          * that we want to stat.  However, FSINUMBERS and FSBULKSTAT expect
 786          * that *lastip contains either zero or the number of the last inode to
 787          * be examined by the previous call and return results starting with
 788          * the next inode after that.  The new bulk request back end functions
 789          * take the inode to start with, so we have to compute the startino
 790          * parameter from lastino to maintain correct function.  lastino == 0
 791          * is a special case because it has traditionally meant "first inode
 792          * in filesystem".
 793          */
 794         if (cmd == XFS_IOC_FSINUMBERS) {
 795                 breq.startino = lastino ? lastino + 1 : 0;
 796                 error = xfs_inumbers(&breq, xfs_fsinumbers_fmt);
 797                 lastino = breq.startino - 1;
 798         } else if (cmd == XFS_IOC_FSBULKSTAT_SINGLE) {
 799                 breq.startino = lastino;
 800                 breq.icount = 1;
 801                 error = xfs_bulkstat_one(&breq, xfs_fsbulkstat_one_fmt);
 802         } else {        /* XFS_IOC_FSBULKSTAT */
 803                 breq.startino = lastino ? lastino + 1 : 0;
 804                 error = xfs_bulkstat(&breq, xfs_fsbulkstat_one_fmt);
 805                 lastino = breq.startino - 1;
 806         }
 807 
 808         if (error)
 809                 return error;
 810 
 811         if (bulkreq.lastip != NULL &&
 812             copy_to_user(bulkreq.lastip, &lastino, sizeof(xfs_ino_t)))
 813                 return -EFAULT;
 814 
 815         if (bulkreq.ocount != NULL &&
 816             copy_to_user(bulkreq.ocount, &breq.ocount, sizeof(__s32)))
 817                 return -EFAULT;
 818 
 819         return 0;
 820 }
 821 
 822 /* Return 0 on success or positive error */
 823 static int
 824 xfs_bulkstat_fmt(
 825         struct xfs_ibulk                *breq,
 826         const struct xfs_bulkstat       *bstat)
 827 {
 828         if (copy_to_user(breq->ubuffer, bstat, sizeof(struct xfs_bulkstat)))
 829                 return -EFAULT;
 830         return xfs_ibulk_advance(breq, sizeof(struct xfs_bulkstat));
 831 }
 832 
 833 /*
 834  * Check the incoming bulk request @hdr from userspace and initialize the
 835  * internal @breq bulk request appropriately.  Returns 0 if the bulk request
 836  * should proceed; -ECANCELED if there's nothing to do; or the usual
 837  * negative error code.
 838  */
 839 static int
 840 xfs_bulk_ireq_setup(
 841         struct xfs_mount        *mp,
 842         struct xfs_bulk_ireq    *hdr,
 843         struct xfs_ibulk        *breq,
 844         void __user             *ubuffer)
 845 {
 846         if (hdr->icount == 0 ||
 847             (hdr->flags & ~XFS_BULK_IREQ_FLAGS_ALL) ||
 848             memchr_inv(hdr->reserved, 0, sizeof(hdr->reserved)))
 849                 return -EINVAL;
 850 
 851         breq->startino = hdr->ino;
 852         breq->ubuffer = ubuffer;
 853         breq->icount = hdr->icount;
 854         breq->ocount = 0;
 855         breq->flags = 0;
 856 
 857         /*
 858          * The @ino parameter is a special value, so we must look it up here.
 859          * We're not allowed to have IREQ_AGNO, and we only return one inode
 860          * worth of data.
 861          */
 862         if (hdr->flags & XFS_BULK_IREQ_SPECIAL) {
 863                 if (hdr->flags & XFS_BULK_IREQ_AGNO)
 864                         return -EINVAL;
 865 
 866                 switch (hdr->ino) {
 867                 case XFS_BULK_IREQ_SPECIAL_ROOT:
 868                         hdr->ino = mp->m_sb.sb_rootino;
 869                         break;
 870                 default:
 871                         return -EINVAL;
 872                 }
 873                 breq->icount = 1;
 874         }
 875 
 876         /*
 877          * The IREQ_AGNO flag means that we only want results from a given AG.
 878          * If @hdr->ino is zero, we start iterating in that AG.  If @hdr->ino is
 879          * beyond the specified AG then we return no results.
 880          */
 881         if (hdr->flags & XFS_BULK_IREQ_AGNO) {
 882                 if (hdr->agno >= mp->m_sb.sb_agcount)
 883                         return -EINVAL;
 884 
 885                 if (breq->startino == 0)
 886                         breq->startino = XFS_AGINO_TO_INO(mp, hdr->agno, 0);
 887                 else if (XFS_INO_TO_AGNO(mp, breq->startino) < hdr->agno)
 888                         return -EINVAL;
 889 
 890                 breq->flags |= XFS_IBULK_SAME_AG;
 891 
 892                 /* Asking for an inode past the end of the AG?  We're done! */
 893                 if (XFS_INO_TO_AGNO(mp, breq->startino) > hdr->agno)
 894                         return -ECANCELED;
 895         } else if (hdr->agno)
 896                 return -EINVAL;
 897 
 898         /* Asking for an inode past the end of the FS?  We're done! */
 899         if (XFS_INO_TO_AGNO(mp, breq->startino) >= mp->m_sb.sb_agcount)
 900                 return -ECANCELED;
 901 
 902         return 0;
 903 }
 904 
 905 /*
 906  * Update the userspace bulk request @hdr to reflect the end state of the
 907  * internal bulk request @breq.
 908  */
 909 static void
 910 xfs_bulk_ireq_teardown(
 911         struct xfs_bulk_ireq    *hdr,
 912         struct xfs_ibulk        *breq)
 913 {
 914         hdr->ino = breq->startino;
 915         hdr->ocount = breq->ocount;
 916 }
 917 
 918 /* Handle the v5 bulkstat ioctl. */
 919 STATIC int
 920 xfs_ioc_bulkstat(
 921         struct xfs_mount                *mp,
 922         unsigned int                    cmd,
 923         struct xfs_bulkstat_req __user  *arg)
 924 {
 925         struct xfs_bulk_ireq            hdr;
 926         struct xfs_ibulk                breq = {
 927                 .mp                     = mp,
 928         };
 929         int                             error;
 930 
 931         if (!capable(CAP_SYS_ADMIN))
 932                 return -EPERM;
 933 
 934         if (XFS_FORCED_SHUTDOWN(mp))
 935                 return -EIO;
 936 
 937         if (copy_from_user(&hdr, &arg->hdr, sizeof(hdr)))
 938                 return -EFAULT;
 939 
 940         error = xfs_bulk_ireq_setup(mp, &hdr, &breq, arg->bulkstat);
 941         if (error == -ECANCELED)
 942                 goto out_teardown;
 943         if (error < 0)
 944                 return error;
 945 
 946         error = xfs_bulkstat(&breq, xfs_bulkstat_fmt);
 947         if (error)
 948                 return error;
 949 
 950 out_teardown:
 951         xfs_bulk_ireq_teardown(&hdr, &breq);
 952         if (copy_to_user(&arg->hdr, &hdr, sizeof(hdr)))
 953                 return -EFAULT;
 954 
 955         return 0;
 956 }
 957 
 958 STATIC int
 959 xfs_inumbers_fmt(
 960         struct xfs_ibulk                *breq,
 961         const struct xfs_inumbers       *igrp)
 962 {
 963         if (copy_to_user(breq->ubuffer, igrp, sizeof(struct xfs_inumbers)))
 964                 return -EFAULT;
 965         return xfs_ibulk_advance(breq, sizeof(struct xfs_inumbers));
 966 }
 967 
 968 /* Handle the v5 inumbers ioctl. */
 969 STATIC int
 970 xfs_ioc_inumbers(
 971         struct xfs_mount                *mp,
 972         unsigned int                    cmd,
 973         struct xfs_inumbers_req __user  *arg)
 974 {
 975         struct xfs_bulk_ireq            hdr;
 976         struct xfs_ibulk                breq = {
 977                 .mp                     = mp,
 978         };
 979         int                             error;
 980 
 981         if (!capable(CAP_SYS_ADMIN))
 982                 return -EPERM;
 983 
 984         if (XFS_FORCED_SHUTDOWN(mp))
 985                 return -EIO;
 986 
 987         if (copy_from_user(&hdr, &arg->hdr, sizeof(hdr)))
 988                 return -EFAULT;
 989 
 990         error = xfs_bulk_ireq_setup(mp, &hdr, &breq, arg->inumbers);
 991         if (error == -ECANCELED)
 992                 goto out_teardown;
 993         if (error < 0)
 994                 return error;
 995 
 996         error = xfs_inumbers(&breq, xfs_inumbers_fmt);
 997         if (error)
 998                 return error;
 999 
1000 out_teardown:
1001         xfs_bulk_ireq_teardown(&hdr, &breq);
1002         if (copy_to_user(&arg->hdr, &hdr, sizeof(hdr)))
1003                 return -EFAULT;
1004 
1005         return 0;
1006 }
1007 
1008 STATIC int
1009 xfs_ioc_fsgeometry(
1010         struct xfs_mount        *mp,
1011         void                    __user *arg,
1012         int                     struct_version)
1013 {
1014         struct xfs_fsop_geom    fsgeo;
1015         size_t                  len;
1016 
1017         xfs_fs_geometry(&mp->m_sb, &fsgeo, struct_version);
1018 
1019         if (struct_version <= 3)
1020                 len = sizeof(struct xfs_fsop_geom_v1);
1021         else if (struct_version == 4)
1022                 len = sizeof(struct xfs_fsop_geom_v4);
1023         else {
1024                 xfs_fsop_geom_health(mp, &fsgeo);
1025                 len = sizeof(fsgeo);
1026         }
1027 
1028         if (copy_to_user(arg, &fsgeo, len))
1029                 return -EFAULT;
1030         return 0;
1031 }
1032 
1033 STATIC int
1034 xfs_ioc_ag_geometry(
1035         struct xfs_mount        *mp,
1036         void                    __user *arg)
1037 {
1038         struct xfs_ag_geometry  ageo;
1039         int                     error;
1040 
1041         if (copy_from_user(&ageo, arg, sizeof(ageo)))
1042                 return -EFAULT;
1043         if (ageo.ag_flags)
1044                 return -EINVAL;
1045         if (memchr_inv(&ageo.ag_reserved, 0, sizeof(ageo.ag_reserved)))
1046                 return -EINVAL;
1047 
1048         error = xfs_ag_get_geometry(mp, ageo.ag_number, &ageo);
1049         if (error)
1050                 return error;
1051 
1052         if (copy_to_user(arg, &ageo, sizeof(ageo)))
1053                 return -EFAULT;
1054         return 0;
1055 }
1056 
1057 /*
1058  * Linux extended inode flags interface.
1059  */
1060 
1061 STATIC unsigned int
1062 xfs_merge_ioc_xflags(
1063         unsigned int    flags,
1064         unsigned int    start)
1065 {
1066         unsigned int    xflags = start;
1067 
1068         if (flags & FS_IMMUTABLE_FL)
1069                 xflags |= FS_XFLAG_IMMUTABLE;
1070         else
1071                 xflags &= ~FS_XFLAG_IMMUTABLE;
1072         if (flags & FS_APPEND_FL)
1073                 xflags |= FS_XFLAG_APPEND;
1074         else
1075                 xflags &= ~FS_XFLAG_APPEND;
1076         if (flags & FS_SYNC_FL)
1077                 xflags |= FS_XFLAG_SYNC;
1078         else
1079                 xflags &= ~FS_XFLAG_SYNC;
1080         if (flags & FS_NOATIME_FL)
1081                 xflags |= FS_XFLAG_NOATIME;
1082         else
1083                 xflags &= ~FS_XFLAG_NOATIME;
1084         if (flags & FS_NODUMP_FL)
1085                 xflags |= FS_XFLAG_NODUMP;
1086         else
1087                 xflags &= ~FS_XFLAG_NODUMP;
1088 
1089         return xflags;
1090 }
1091 
1092 STATIC unsigned int
1093 xfs_di2lxflags(
1094         uint16_t        di_flags)
1095 {
1096         unsigned int    flags = 0;
1097 
1098         if (di_flags & XFS_DIFLAG_IMMUTABLE)
1099                 flags |= FS_IMMUTABLE_FL;
1100         if (di_flags & XFS_DIFLAG_APPEND)
1101                 flags |= FS_APPEND_FL;
1102         if (di_flags & XFS_DIFLAG_SYNC)
1103                 flags |= FS_SYNC_FL;
1104         if (di_flags & XFS_DIFLAG_NOATIME)
1105                 flags |= FS_NOATIME_FL;
1106         if (di_flags & XFS_DIFLAG_NODUMP)
1107                 flags |= FS_NODUMP_FL;
1108         return flags;
1109 }
1110 
1111 static void
1112 xfs_fill_fsxattr(
1113         struct xfs_inode        *ip,
1114         bool                    attr,
1115         struct fsxattr          *fa)
1116 {
1117         simple_fill_fsxattr(fa, xfs_ip2xflags(ip));
1118         fa->fsx_extsize = ip->i_d.di_extsize << ip->i_mount->m_sb.sb_blocklog;
1119         fa->fsx_cowextsize = ip->i_d.di_cowextsize <<
1120                         ip->i_mount->m_sb.sb_blocklog;
1121         fa->fsx_projid = xfs_get_projid(ip);
1122 
1123         if (attr) {
1124                 if (ip->i_afp) {
1125                         if (ip->i_afp->if_flags & XFS_IFEXTENTS)
1126                                 fa->fsx_nextents = xfs_iext_count(ip->i_afp);
1127                         else
1128                                 fa->fsx_nextents = ip->i_d.di_anextents;
1129                 } else
1130                         fa->fsx_nextents = 0;
1131         } else {
1132                 if (ip->i_df.if_flags & XFS_IFEXTENTS)
1133                         fa->fsx_nextents = xfs_iext_count(&ip->i_df);
1134                 else
1135                         fa->fsx_nextents = ip->i_d.di_nextents;
1136         }
1137 }
1138 
1139 STATIC int
1140 xfs_ioc_fsgetxattr(
1141         xfs_inode_t             *ip,
1142         int                     attr,
1143         void                    __user *arg)
1144 {
1145         struct fsxattr          fa;
1146 
1147         xfs_ilock(ip, XFS_ILOCK_SHARED);
1148         xfs_fill_fsxattr(ip, attr, &fa);
1149         xfs_iunlock(ip, XFS_ILOCK_SHARED);
1150 
1151         if (copy_to_user(arg, &fa, sizeof(fa)))
1152                 return -EFAULT;
1153         return 0;
1154 }
1155 
1156 STATIC uint16_t
1157 xfs_flags2diflags(
1158         struct xfs_inode        *ip,
1159         unsigned int            xflags)
1160 {
1161         /* can't set PREALLOC this way, just preserve it */
1162         uint16_t                di_flags =
1163                 (ip->i_d.di_flags & XFS_DIFLAG_PREALLOC);
1164 
1165         if (xflags & FS_XFLAG_IMMUTABLE)
1166                 di_flags |= XFS_DIFLAG_IMMUTABLE;
1167         if (xflags & FS_XFLAG_APPEND)
1168                 di_flags |= XFS_DIFLAG_APPEND;
1169         if (xflags & FS_XFLAG_SYNC)
1170                 di_flags |= XFS_DIFLAG_SYNC;
1171         if (xflags & FS_XFLAG_NOATIME)
1172                 di_flags |= XFS_DIFLAG_NOATIME;
1173         if (xflags & FS_XFLAG_NODUMP)
1174                 di_flags |= XFS_DIFLAG_NODUMP;
1175         if (xflags & FS_XFLAG_NODEFRAG)
1176                 di_flags |= XFS_DIFLAG_NODEFRAG;
1177         if (xflags & FS_XFLAG_FILESTREAM)
1178                 di_flags |= XFS_DIFLAG_FILESTREAM;
1179         if (S_ISDIR(VFS_I(ip)->i_mode)) {
1180                 if (xflags & FS_XFLAG_RTINHERIT)
1181                         di_flags |= XFS_DIFLAG_RTINHERIT;
1182                 if (xflags & FS_XFLAG_NOSYMLINKS)
1183                         di_flags |= XFS_DIFLAG_NOSYMLINKS;
1184                 if (xflags & FS_XFLAG_EXTSZINHERIT)
1185                         di_flags |= XFS_DIFLAG_EXTSZINHERIT;
1186                 if (xflags & FS_XFLAG_PROJINHERIT)
1187                         di_flags |= XFS_DIFLAG_PROJINHERIT;
1188         } else if (S_ISREG(VFS_I(ip)->i_mode)) {
1189                 if (xflags & FS_XFLAG_REALTIME)
1190                         di_flags |= XFS_DIFLAG_REALTIME;
1191                 if (xflags & FS_XFLAG_EXTSIZE)
1192                         di_flags |= XFS_DIFLAG_EXTSIZE;
1193         }
1194 
1195         return di_flags;
1196 }
1197 
1198 STATIC uint64_t
1199 xfs_flags2diflags2(
1200         struct xfs_inode        *ip,
1201         unsigned int            xflags)
1202 {
1203         uint64_t                di_flags2 =
1204                 (ip->i_d.di_flags2 & XFS_DIFLAG2_REFLINK);
1205 
1206         if (xflags & FS_XFLAG_DAX)
1207                 di_flags2 |= XFS_DIFLAG2_DAX;
1208         if (xflags & FS_XFLAG_COWEXTSIZE)
1209                 di_flags2 |= XFS_DIFLAG2_COWEXTSIZE;
1210 
1211         return di_flags2;
1212 }
1213 
1214 STATIC void
1215 xfs_diflags_to_linux(
1216         struct xfs_inode        *ip)
1217 {
1218         struct inode            *inode = VFS_I(ip);
1219         unsigned int            xflags = xfs_ip2xflags(ip);
1220 
1221         if (xflags & FS_XFLAG_IMMUTABLE)
1222                 inode->i_flags |= S_IMMUTABLE;
1223         else
1224                 inode->i_flags &= ~S_IMMUTABLE;
1225         if (xflags & FS_XFLAG_APPEND)
1226                 inode->i_flags |= S_APPEND;
1227         else
1228                 inode->i_flags &= ~S_APPEND;
1229         if (xflags & FS_XFLAG_SYNC)
1230                 inode->i_flags |= S_SYNC;
1231         else
1232                 inode->i_flags &= ~S_SYNC;
1233         if (xflags & FS_XFLAG_NOATIME)
1234                 inode->i_flags |= S_NOATIME;
1235         else
1236                 inode->i_flags &= ~S_NOATIME;
1237 #if 0   /* disabled until the flag switching races are sorted out */
1238         if (xflags & FS_XFLAG_DAX)
1239                 inode->i_flags |= S_DAX;
1240         else
1241                 inode->i_flags &= ~S_DAX;
1242 #endif
1243 }
1244 
1245 static int
1246 xfs_ioctl_setattr_xflags(
1247         struct xfs_trans        *tp,
1248         struct xfs_inode        *ip,
1249         struct fsxattr          *fa)
1250 {
1251         struct xfs_mount        *mp = ip->i_mount;
1252         uint64_t                di_flags2;
1253 
1254         /* Can't change realtime flag if any extents are allocated. */
1255         if ((ip->i_d.di_nextents || ip->i_delayed_blks) &&
1256             XFS_IS_REALTIME_INODE(ip) != (fa->fsx_xflags & FS_XFLAG_REALTIME))
1257                 return -EINVAL;
1258 
1259         /* If realtime flag is set then must have realtime device */
1260         if (fa->fsx_xflags & FS_XFLAG_REALTIME) {
1261                 if (mp->m_sb.sb_rblocks == 0 || mp->m_sb.sb_rextsize == 0 ||
1262                     (ip->i_d.di_extsize % mp->m_sb.sb_rextsize))
1263                         return -EINVAL;
1264         }
1265 
1266         /* Clear reflink if we are actually able to set the rt flag. */
1267         if ((fa->fsx_xflags & FS_XFLAG_REALTIME) && xfs_is_reflink_inode(ip))
1268                 ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK;
1269 
1270         /* Don't allow us to set DAX mode for a reflinked file for now. */
1271         if ((fa->fsx_xflags & FS_XFLAG_DAX) && xfs_is_reflink_inode(ip))
1272                 return -EINVAL;
1273 
1274         /* diflags2 only valid for v3 inodes. */
1275         di_flags2 = xfs_flags2diflags2(ip, fa->fsx_xflags);
1276         if (di_flags2 && ip->i_d.di_version < 3)
1277                 return -EINVAL;
1278 
1279         ip->i_d.di_flags = xfs_flags2diflags(ip, fa->fsx_xflags);
1280         ip->i_d.di_flags2 = di_flags2;
1281 
1282         xfs_diflags_to_linux(ip);
1283         xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG);
1284         xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
1285         XFS_STATS_INC(mp, xs_ig_attrchg);
1286         return 0;
1287 }
1288 
1289 /*
1290  * If we are changing DAX flags, we have to ensure the file is clean and any
1291  * cached objects in the address space are invalidated and removed. This
1292  * requires us to lock out other IO and page faults similar to a truncate
1293  * operation. The locks need to be held until the transaction has been committed
1294  * so that the cache invalidation is atomic with respect to the DAX flag
1295  * manipulation.
1296  */
1297 static int
1298 xfs_ioctl_setattr_dax_invalidate(
1299         struct xfs_inode        *ip,
1300         struct fsxattr          *fa,
1301         int                     *join_flags)
1302 {
1303         struct inode            *inode = VFS_I(ip);
1304         struct super_block      *sb = inode->i_sb;
1305         int                     error;
1306 
1307         *join_flags = 0;
1308 
1309         /*
1310          * It is only valid to set the DAX flag on regular files and
1311          * directories on filesystems where the block size is equal to the page
1312          * size. On directories it serves as an inherited hint so we don't
1313          * have to check the device for dax support or flush pagecache.
1314          */
1315         if (fa->fsx_xflags & FS_XFLAG_DAX) {
1316                 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))
1317                         return -EINVAL;
1318                 if (!bdev_dax_supported(xfs_find_bdev_for_inode(VFS_I(ip)),
1319                                 sb->s_blocksize))
1320                         return -EINVAL;
1321         }
1322 
1323         /* If the DAX state is not changing, we have nothing to do here. */
1324         if ((fa->fsx_xflags & FS_XFLAG_DAX) && IS_DAX(inode))
1325                 return 0;
1326         if (!(fa->fsx_xflags & FS_XFLAG_DAX) && !IS_DAX(inode))
1327                 return 0;
1328 
1329         if (S_ISDIR(inode->i_mode))
1330                 return 0;
1331 
1332         /* lock, flush and invalidate mapping in preparation for flag change */
1333         xfs_ilock(ip, XFS_MMAPLOCK_EXCL | XFS_IOLOCK_EXCL);
1334         error = filemap_write_and_wait(inode->i_mapping);
1335         if (error)
1336                 goto out_unlock;
1337         error = invalidate_inode_pages2(inode->i_mapping);
1338         if (error)
1339                 goto out_unlock;
1340 
1341         *join_flags = XFS_MMAPLOCK_EXCL | XFS_IOLOCK_EXCL;
1342         return 0;
1343 
1344 out_unlock:
1345         xfs_iunlock(ip, XFS_MMAPLOCK_EXCL | XFS_IOLOCK_EXCL);
1346         return error;
1347 
1348 }
1349 
1350 /*
1351  * Set up the transaction structure for the setattr operation, checking that we
1352  * have permission to do so. On success, return a clean transaction and the
1353  * inode locked exclusively ready for further operation specific checks. On
1354  * failure, return an error without modifying or locking the inode.
1355  *
1356  * The inode might already be IO locked on call. If this is the case, it is
1357  * indicated in @join_flags and we take full responsibility for ensuring they
1358  * are unlocked from now on. Hence if we have an error here, we still have to
1359  * unlock them. Otherwise, once they are joined to the transaction, they will
1360  * be unlocked on commit/cancel.
1361  */
1362 static struct xfs_trans *
1363 xfs_ioctl_setattr_get_trans(
1364         struct xfs_inode        *ip,
1365         int                     join_flags)
1366 {
1367         struct xfs_mount        *mp = ip->i_mount;
1368         struct xfs_trans        *tp;
1369         int                     error = -EROFS;
1370 
1371         if (mp->m_flags & XFS_MOUNT_RDONLY)
1372                 goto out_unlock;
1373         error = -EIO;
1374         if (XFS_FORCED_SHUTDOWN(mp))
1375                 goto out_unlock;
1376 
1377         error = xfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 0, 0, 0, &tp);
1378         if (error)
1379                 goto out_unlock;
1380 
1381         xfs_ilock(ip, XFS_ILOCK_EXCL);
1382         xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL | join_flags);
1383         join_flags = 0;
1384 
1385         /*
1386          * CAP_FOWNER overrides the following restrictions:
1387          *
1388          * The user ID of the calling process must be equal to the file owner
1389          * ID, except in cases where the CAP_FSETID capability is applicable.
1390          */
1391         if (!inode_owner_or_capable(VFS_I(ip))) {
1392                 error = -EPERM;
1393                 goto out_cancel;
1394         }
1395 
1396         if (mp->m_flags & XFS_MOUNT_WSYNC)
1397                 xfs_trans_set_sync(tp);
1398 
1399         return tp;
1400 
1401 out_cancel:
1402         xfs_trans_cancel(tp);
1403 out_unlock:
1404         if (join_flags)
1405                 xfs_iunlock(ip, join_flags);
1406         return ERR_PTR(error);
1407 }
1408 
1409 /*
1410  * extent size hint validation is somewhat cumbersome. Rules are:
1411  *
1412  * 1. extent size hint is only valid for directories and regular files
1413  * 2. FS_XFLAG_EXTSIZE is only valid for regular files
1414  * 3. FS_XFLAG_EXTSZINHERIT is only valid for directories.
1415  * 4. can only be changed on regular files if no extents are allocated
1416  * 5. can be changed on directories at any time
1417  * 6. extsize hint of 0 turns off hints, clears inode flags.
1418  * 7. Extent size must be a multiple of the appropriate block size.
1419  * 8. for non-realtime files, the extent size hint must be limited
1420  *    to half the AG size to avoid alignment extending the extent beyond the
1421  *    limits of the AG.
1422  *
1423  * Please keep this function in sync with xfs_scrub_inode_extsize.
1424  */
1425 static int
1426 xfs_ioctl_setattr_check_extsize(
1427         struct xfs_inode        *ip,
1428         struct fsxattr          *fa)
1429 {
1430         struct xfs_mount        *mp = ip->i_mount;
1431         xfs_extlen_t            size;
1432         xfs_fsblock_t           extsize_fsb;
1433 
1434         if (S_ISREG(VFS_I(ip)->i_mode) && ip->i_d.di_nextents &&
1435             ((ip->i_d.di_extsize << mp->m_sb.sb_blocklog) != fa->fsx_extsize))
1436                 return -EINVAL;
1437 
1438         if (fa->fsx_extsize == 0)
1439                 return 0;
1440 
1441         extsize_fsb = XFS_B_TO_FSB(mp, fa->fsx_extsize);
1442         if (extsize_fsb > MAXEXTLEN)
1443                 return -EINVAL;
1444 
1445         if (XFS_IS_REALTIME_INODE(ip) ||
1446             (fa->fsx_xflags & FS_XFLAG_REALTIME)) {
1447                 size = mp->m_sb.sb_rextsize << mp->m_sb.sb_blocklog;
1448         } else {
1449                 size = mp->m_sb.sb_blocksize;
1450                 if (extsize_fsb > mp->m_sb.sb_agblocks / 2)
1451                         return -EINVAL;
1452         }
1453 
1454         if (fa->fsx_extsize % size)
1455                 return -EINVAL;
1456 
1457         return 0;
1458 }
1459 
1460 /*
1461  * CoW extent size hint validation rules are:
1462  *
1463  * 1. CoW extent size hint can only be set if reflink is enabled on the fs.
1464  *    The inode does not have to have any shared blocks, but it must be a v3.
1465  * 2. FS_XFLAG_COWEXTSIZE is only valid for directories and regular files;
1466  *    for a directory, the hint is propagated to new files.
1467  * 3. Can be changed on files & directories at any time.
1468  * 4. CoW extsize hint of 0 turns off hints, clears inode flags.
1469  * 5. Extent size must be a multiple of the appropriate block size.
1470  * 6. The extent size hint must be limited to half the AG size to avoid
1471  *    alignment extending the extent beyond the limits of the AG.
1472  *
1473  * Please keep this function in sync with xfs_scrub_inode_cowextsize.
1474  */
1475 static int
1476 xfs_ioctl_setattr_check_cowextsize(
1477         struct xfs_inode        *ip,
1478         struct fsxattr          *fa)
1479 {
1480         struct xfs_mount        *mp = ip->i_mount;
1481         xfs_extlen_t            size;
1482         xfs_fsblock_t           cowextsize_fsb;
1483 
1484         if (!(fa->fsx_xflags & FS_XFLAG_COWEXTSIZE))
1485                 return 0;
1486 
1487         if (!xfs_sb_version_hasreflink(&ip->i_mount->m_sb) ||
1488             ip->i_d.di_version != 3)
1489                 return -EINVAL;
1490 
1491         if (fa->fsx_cowextsize == 0)
1492                 return 0;
1493 
1494         cowextsize_fsb = XFS_B_TO_FSB(mp, fa->fsx_cowextsize);
1495         if (cowextsize_fsb > MAXEXTLEN)
1496                 return -EINVAL;
1497 
1498         size = mp->m_sb.sb_blocksize;
1499         if (cowextsize_fsb > mp->m_sb.sb_agblocks / 2)
1500                 return -EINVAL;
1501 
1502         if (fa->fsx_cowextsize % size)
1503                 return -EINVAL;
1504 
1505         return 0;
1506 }
1507 
1508 static int
1509 xfs_ioctl_setattr_check_projid(
1510         struct xfs_inode        *ip,
1511         struct fsxattr          *fa)
1512 {
1513         /* Disallow 32bit project ids if projid32bit feature is not enabled. */
1514         if (fa->fsx_projid > (uint16_t)-1 &&
1515             !xfs_sb_version_hasprojid32bit(&ip->i_mount->m_sb))
1516                 return -EINVAL;
1517         return 0;
1518 }
1519 
1520 STATIC int
1521 xfs_ioctl_setattr(
1522         xfs_inode_t             *ip,
1523         struct fsxattr          *fa)
1524 {
1525         struct fsxattr          old_fa;
1526         struct xfs_mount        *mp = ip->i_mount;
1527         struct xfs_trans        *tp;
1528         struct xfs_dquot        *udqp = NULL;
1529         struct xfs_dquot        *pdqp = NULL;
1530         struct xfs_dquot        *olddquot = NULL;
1531         int                     code;
1532         int                     join_flags = 0;
1533 
1534         trace_xfs_ioctl_setattr(ip);
1535 
1536         code = xfs_ioctl_setattr_check_projid(ip, fa);
1537         if (code)
1538                 return code;
1539 
1540         /*
1541          * If disk quotas is on, we make sure that the dquots do exist on disk,
1542          * before we start any other transactions. Trying to do this later
1543          * is messy. We don't care to take a readlock to look at the ids
1544          * in inode here, because we can't hold it across the trans_reserve.
1545          * If the IDs do change before we take the ilock, we're covered
1546          * because the i_*dquot fields will get updated anyway.
1547          */
1548         if (XFS_IS_QUOTA_ON(mp)) {
1549                 code = xfs_qm_vop_dqalloc(ip, ip->i_d.di_uid,
1550                                          ip->i_d.di_gid, fa->fsx_projid,
1551                                          XFS_QMOPT_PQUOTA, &udqp, NULL, &pdqp);
1552                 if (code)
1553                         return code;
1554         }
1555 
1556         /*
1557          * Changing DAX config may require inode locking for mapping
1558          * invalidation. These need to be held all the way to transaction commit
1559          * or cancel time, so need to be passed through to
1560          * xfs_ioctl_setattr_get_trans() so it can apply them to the join call
1561          * appropriately.
1562          */
1563         code = xfs_ioctl_setattr_dax_invalidate(ip, fa, &join_flags);
1564         if (code)
1565                 goto error_free_dquots;
1566 
1567         tp = xfs_ioctl_setattr_get_trans(ip, join_flags);
1568         if (IS_ERR(tp)) {
1569                 code = PTR_ERR(tp);
1570                 goto error_free_dquots;
1571         }
1572 
1573         if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_PQUOTA_ON(mp) &&
1574             xfs_get_projid(ip) != fa->fsx_projid) {
1575                 code = xfs_qm_vop_chown_reserve(tp, ip, udqp, NULL, pdqp,
1576                                 capable(CAP_FOWNER) ?  XFS_QMOPT_FORCE_RES : 0);
1577                 if (code)       /* out of quota */
1578                         goto error_trans_cancel;
1579         }
1580 
1581         xfs_fill_fsxattr(ip, false, &old_fa);
1582         code = vfs_ioc_fssetxattr_check(VFS_I(ip), &old_fa, fa);
1583         if (code)
1584                 goto error_trans_cancel;
1585 
1586         code = xfs_ioctl_setattr_check_extsize(ip, fa);
1587         if (code)
1588                 goto error_trans_cancel;
1589 
1590         code = xfs_ioctl_setattr_check_cowextsize(ip, fa);
1591         if (code)
1592                 goto error_trans_cancel;
1593 
1594         code = xfs_ioctl_setattr_xflags(tp, ip, fa);
1595         if (code)
1596                 goto error_trans_cancel;
1597 
1598         /*
1599          * Change file ownership.  Must be the owner or privileged.  CAP_FSETID
1600          * overrides the following restrictions:
1601          *
1602          * The set-user-ID and set-group-ID bits of a file will be cleared upon
1603          * successful return from chown()
1604          */
1605 
1606         if ((VFS_I(ip)->i_mode & (S_ISUID|S_ISGID)) &&
1607             !capable_wrt_inode_uidgid(VFS_I(ip), CAP_FSETID))
1608                 VFS_I(ip)->i_mode &= ~(S_ISUID|S_ISGID);
1609 
1610         /* Change the ownerships and register project quota modifications */
1611         if (xfs_get_projid(ip) != fa->fsx_projid) {
1612                 if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_PQUOTA_ON(mp)) {
1613                         olddquot = xfs_qm_vop_chown(tp, ip,
1614                                                 &ip->i_pdquot, pdqp);
1615                 }
1616                 ASSERT(ip->i_d.di_version > 1);
1617                 xfs_set_projid(ip, fa->fsx_projid);
1618         }
1619 
1620         /*
1621          * Only set the extent size hint if we've already determined that the
1622          * extent size hint should be set on the inode. If no extent size flags
1623          * are set on the inode then unconditionally clear the extent size hint.
1624          */
1625         if (ip->i_d.di_flags & (XFS_DIFLAG_EXTSIZE | XFS_DIFLAG_EXTSZINHERIT))
1626                 ip->i_d.di_extsize = fa->fsx_extsize >> mp->m_sb.sb_blocklog;
1627         else
1628                 ip->i_d.di_extsize = 0;
1629         if (ip->i_d.di_version == 3 &&
1630             (ip->i_d.di_flags2 & XFS_DIFLAG2_COWEXTSIZE))
1631                 ip->i_d.di_cowextsize = fa->fsx_cowextsize >>
1632                                 mp->m_sb.sb_blocklog;
1633         else
1634                 ip->i_d.di_cowextsize = 0;
1635 
1636         code = xfs_trans_commit(tp);
1637 
1638         /*
1639          * Release any dquot(s) the inode had kept before chown.
1640          */
1641         xfs_qm_dqrele(olddquot);
1642         xfs_qm_dqrele(udqp);
1643         xfs_qm_dqrele(pdqp);
1644 
1645         return code;
1646 
1647 error_trans_cancel:
1648         xfs_trans_cancel(tp);
1649 error_free_dquots:
1650         xfs_qm_dqrele(udqp);
1651         xfs_qm_dqrele(pdqp);
1652         return code;
1653 }
1654 
1655 STATIC int
1656 xfs_ioc_fssetxattr(
1657         xfs_inode_t             *ip,
1658         struct file             *filp,
1659         void                    __user *arg)
1660 {
1661         struct fsxattr          fa;
1662         int error;
1663 
1664         if (copy_from_user(&fa, arg, sizeof(fa)))
1665                 return -EFAULT;
1666 
1667         error = mnt_want_write_file(filp);
1668         if (error)
1669                 return error;
1670         error = xfs_ioctl_setattr(ip, &fa);
1671         mnt_drop_write_file(filp);
1672         return error;
1673 }
1674 
1675 STATIC int
1676 xfs_ioc_getxflags(
1677         xfs_inode_t             *ip,
1678         void                    __user *arg)
1679 {
1680         unsigned int            flags;
1681 
1682         flags = xfs_di2lxflags(ip->i_d.di_flags);
1683         if (copy_to_user(arg, &flags, sizeof(flags)))
1684                 return -EFAULT;
1685         return 0;
1686 }
1687 
1688 STATIC int
1689 xfs_ioc_setxflags(
1690         struct xfs_inode        *ip,
1691         struct file             *filp,
1692         void                    __user *arg)
1693 {
1694         struct xfs_trans        *tp;
1695         struct fsxattr          fa;
1696         struct fsxattr          old_fa;
1697         unsigned int            flags;
1698         int                     join_flags = 0;
1699         int                     error;
1700 
1701         if (copy_from_user(&flags, arg, sizeof(flags)))
1702                 return -EFAULT;
1703 
1704         if (flags & ~(FS_IMMUTABLE_FL | FS_APPEND_FL | \
1705                       FS_NOATIME_FL | FS_NODUMP_FL | \
1706                       FS_SYNC_FL))
1707                 return -EOPNOTSUPP;
1708 
1709         fa.fsx_xflags = xfs_merge_ioc_xflags(flags, xfs_ip2xflags(ip));
1710 
1711         error = mnt_want_write_file(filp);
1712         if (error)
1713                 return error;
1714 
1715         /*
1716          * Changing DAX config may require inode locking for mapping
1717          * invalidation. These need to be held all the way to transaction commit
1718          * or cancel time, so need to be passed through to
1719          * xfs_ioctl_setattr_get_trans() so it can apply them to the join call
1720          * appropriately.
1721          */
1722         error = xfs_ioctl_setattr_dax_invalidate(ip, &fa, &join_flags);
1723         if (error)
1724                 goto out_drop_write;
1725 
1726         tp = xfs_ioctl_setattr_get_trans(ip, join_flags);
1727         if (IS_ERR(tp)) {
1728                 error = PTR_ERR(tp);
1729                 goto out_drop_write;
1730         }
1731 
1732         xfs_fill_fsxattr(ip, false, &old_fa);
1733         error = vfs_ioc_fssetxattr_check(VFS_I(ip), &old_fa, &fa);
1734         if (error) {
1735                 xfs_trans_cancel(tp);
1736                 goto out_drop_write;
1737         }
1738 
1739         error = xfs_ioctl_setattr_xflags(tp, ip, &fa);
1740         if (error) {
1741                 xfs_trans_cancel(tp);
1742                 goto out_drop_write;
1743         }
1744 
1745         error = xfs_trans_commit(tp);
1746 out_drop_write:
1747         mnt_drop_write_file(filp);
1748         return error;
1749 }
1750 
1751 static bool
1752 xfs_getbmap_format(
1753         struct kgetbmap         *p,
1754         struct getbmapx __user  *u,
1755         size_t                  recsize)
1756 {
1757         if (put_user(p->bmv_offset, &u->bmv_offset) ||
1758             put_user(p->bmv_block, &u->bmv_block) ||
1759             put_user(p->bmv_length, &u->bmv_length) ||
1760             put_user(0, &u->bmv_count) ||
1761             put_user(0, &u->bmv_entries))
1762                 return false;
1763         if (recsize < sizeof(struct getbmapx))
1764                 return true;
1765         if (put_user(0, &u->bmv_iflags) ||
1766             put_user(p->bmv_oflags, &u->bmv_oflags) ||
1767             put_user(0, &u->bmv_unused1) ||
1768             put_user(0, &u->bmv_unused2))
1769                 return false;
1770         return true;
1771 }
1772 
1773 STATIC int
1774 xfs_ioc_getbmap(
1775         struct file             *file,
1776         unsigned int            cmd,
1777         void                    __user *arg)
1778 {
1779         struct getbmapx         bmx = { 0 };
1780         struct kgetbmap         *buf;
1781         size_t                  recsize;
1782         int                     error, i;
1783 
1784         switch (cmd) {
1785         case XFS_IOC_GETBMAPA:
1786                 bmx.bmv_iflags = BMV_IF_ATTRFORK;
1787                 /*FALLTHRU*/
1788         case XFS_IOC_GETBMAP:
1789                 if (file->f_mode & FMODE_NOCMTIME)
1790                         bmx.bmv_iflags |= BMV_IF_NO_DMAPI_READ;
1791                 /* struct getbmap is a strict subset of struct getbmapx. */
1792                 recsize = sizeof(struct getbmap);
1793                 break;
1794         case XFS_IOC_GETBMAPX:
1795                 recsize = sizeof(struct getbmapx);
1796                 break;
1797         default:
1798                 return -EINVAL;
1799         }
1800 
1801         if (copy_from_user(&bmx, arg, recsize))
1802                 return -EFAULT;
1803 
1804         if (bmx.bmv_count < 2)
1805                 return -EINVAL;
1806         if (bmx.bmv_count > ULONG_MAX / recsize)
1807                 return -ENOMEM;
1808 
1809         buf = kmem_zalloc_large(bmx.bmv_count * sizeof(*buf), 0);
1810         if (!buf)
1811                 return -ENOMEM;
1812 
1813         error = xfs_getbmap(XFS_I(file_inode(file)), &bmx, buf);
1814         if (error)
1815                 goto out_free_buf;
1816 
1817         error = -EFAULT;
1818         if (copy_to_user(arg, &bmx, recsize))
1819                 goto out_free_buf;
1820         arg += recsize;
1821 
1822         for (i = 0; i < bmx.bmv_entries; i++) {
1823                 if (!xfs_getbmap_format(buf + i, arg, recsize))
1824                         goto out_free_buf;
1825                 arg += recsize;
1826         }
1827 
1828         error = 0;
1829 out_free_buf:
1830         kmem_free(buf);
1831         return error;
1832 }
1833 
1834 struct getfsmap_info {
1835         struct xfs_mount        *mp;
1836         struct fsmap_head __user *data;
1837         unsigned int            idx;
1838         __u32                   last_flags;
1839 };
1840 
1841 STATIC int
1842 xfs_getfsmap_format(struct xfs_fsmap *xfm, void *priv)
1843 {
1844         struct getfsmap_info    *info = priv;
1845         struct fsmap            fm;
1846 
1847         trace_xfs_getfsmap_mapping(info->mp, xfm);
1848 
1849         info->last_flags = xfm->fmr_flags;
1850         xfs_fsmap_from_internal(&fm, xfm);
1851         if (copy_to_user(&info->data->fmh_recs[info->idx++], &fm,
1852                         sizeof(struct fsmap)))
1853                 return -EFAULT;
1854 
1855         return 0;
1856 }
1857 
1858 STATIC int
1859 xfs_ioc_getfsmap(
1860         struct xfs_inode        *ip,
1861         struct fsmap_head       __user *arg)
1862 {
1863         struct getfsmap_info    info = { NULL };
1864         struct xfs_fsmap_head   xhead = {0};
1865         struct fsmap_head       head;
1866         bool                    aborted = false;
1867         int                     error;
1868 
1869         if (copy_from_user(&head, arg, sizeof(struct fsmap_head)))
1870                 return -EFAULT;
1871         if (memchr_inv(head.fmh_reserved, 0, sizeof(head.fmh_reserved)) ||
1872             memchr_inv(head.fmh_keys[0].fmr_reserved, 0,
1873                        sizeof(head.fmh_keys[0].fmr_reserved)) ||
1874             memchr_inv(head.fmh_keys[1].fmr_reserved, 0,
1875                        sizeof(head.fmh_keys[1].fmr_reserved)))
1876                 return -EINVAL;
1877 
1878         xhead.fmh_iflags = head.fmh_iflags;
1879         xhead.fmh_count = head.fmh_count;
1880         xfs_fsmap_to_internal(&xhead.fmh_keys[0], &head.fmh_keys[0]);
1881         xfs_fsmap_to_internal(&xhead.fmh_keys[1], &head.fmh_keys[1]);
1882 
1883         trace_xfs_getfsmap_low_key(ip->i_mount, &xhead.fmh_keys[0]);
1884         trace_xfs_getfsmap_high_key(ip->i_mount, &xhead.fmh_keys[1]);
1885 
1886         info.mp = ip->i_mount;
1887         info.data = arg;
1888         error = xfs_getfsmap(ip->i_mount, &xhead, xfs_getfsmap_format, &info);
1889         if (error == -ECANCELED) {
1890                 error = 0;
1891                 aborted = true;
1892         } else if (error)
1893                 return error;
1894 
1895         /* If we didn't abort, set the "last" flag in the last fmx */
1896         if (!aborted && info.idx) {
1897                 info.last_flags |= FMR_OF_LAST;
1898                 if (copy_to_user(&info.data->fmh_recs[info.idx - 1].fmr_flags,
1899                                 &info.last_flags, sizeof(info.last_flags)))
1900                         return -EFAULT;
1901         }
1902 
1903         /* copy back header */
1904         head.fmh_entries = xhead.fmh_entries;
1905         head.fmh_oflags = xhead.fmh_oflags;
1906         if (copy_to_user(arg, &head, sizeof(struct fsmap_head)))
1907                 return -EFAULT;
1908 
1909         return 0;
1910 }
1911 
1912 STATIC int
1913 xfs_ioc_scrub_metadata(
1914         struct xfs_inode                *ip,
1915         void                            __user *arg)
1916 {
1917         struct xfs_scrub_metadata       scrub;
1918         int                             error;
1919 
1920         if (!capable(CAP_SYS_ADMIN))
1921                 return -EPERM;
1922 
1923         if (copy_from_user(&scrub, arg, sizeof(scrub)))
1924                 return -EFAULT;
1925 
1926         error = xfs_scrub_metadata(ip, &scrub);
1927         if (error)
1928                 return error;
1929 
1930         if (copy_to_user(arg, &scrub, sizeof(scrub)))
1931                 return -EFAULT;
1932 
1933         return 0;
1934 }
1935 
1936 int
1937 xfs_ioc_swapext(
1938         xfs_swapext_t   *sxp)
1939 {
1940         xfs_inode_t     *ip, *tip;
1941         struct fd       f, tmp;
1942         int             error = 0;
1943 
1944         /* Pull information for the target fd */
1945         f = fdget((int)sxp->sx_fdtarget);
1946         if (!f.file) {
1947                 error = -EINVAL;
1948                 goto out;
1949         }
1950 
1951         if (!(f.file->f_mode & FMODE_WRITE) ||
1952             !(f.file->f_mode & FMODE_READ) ||
1953             (f.file->f_flags & O_APPEND)) {
1954                 error = -EBADF;
1955                 goto out_put_file;
1956         }
1957 
1958         tmp = fdget((int)sxp->sx_fdtmp);
1959         if (!tmp.file) {
1960                 error = -EINVAL;
1961                 goto out_put_file;
1962         }
1963 
1964         if (!(tmp.file->f_mode & FMODE_WRITE) ||
1965             !(tmp.file->f_mode & FMODE_READ) ||
1966             (tmp.file->f_flags & O_APPEND)) {
1967                 error = -EBADF;
1968                 goto out_put_tmp_file;
1969         }
1970 
1971         if (IS_SWAPFILE(file_inode(f.file)) ||
1972             IS_SWAPFILE(file_inode(tmp.file))) {
1973                 error = -EINVAL;
1974                 goto out_put_tmp_file;
1975         }
1976 
1977         /*
1978          * We need to ensure that the fds passed in point to XFS inodes
1979          * before we cast and access them as XFS structures as we have no
1980          * control over what the user passes us here.
1981          */
1982         if (f.file->f_op != &xfs_file_operations ||
1983             tmp.file->f_op != &xfs_file_operations) {
1984                 error = -EINVAL;
1985                 goto out_put_tmp_file;
1986         }
1987 
1988         ip = XFS_I(file_inode(f.file));
1989         tip = XFS_I(file_inode(tmp.file));
1990 
1991         if (ip->i_mount != tip->i_mount) {
1992                 error = -EINVAL;
1993                 goto out_put_tmp_file;
1994         }
1995 
1996         if (ip->i_ino == tip->i_ino) {
1997                 error = -EINVAL;
1998                 goto out_put_tmp_file;
1999         }
2000 
2001         if (XFS_FORCED_SHUTDOWN(ip->i_mount)) {
2002                 error = -EIO;
2003                 goto out_put_tmp_file;
2004         }
2005 
2006         error = xfs_swap_extents(ip, tip, sxp);
2007 
2008  out_put_tmp_file:
2009         fdput(tmp);
2010  out_put_file:
2011         fdput(f);
2012  out:
2013         return error;
2014 }
2015 
2016 static int
2017 xfs_ioc_getlabel(
2018         struct xfs_mount        *mp,
2019         char                    __user *user_label)
2020 {
2021         struct xfs_sb           *sbp = &mp->m_sb;
2022         char                    label[XFSLABEL_MAX + 1];
2023 
2024         /* Paranoia */
2025         BUILD_BUG_ON(sizeof(sbp->sb_fname) > FSLABEL_MAX);
2026 
2027         /* 1 larger than sb_fname, so this ensures a trailing NUL char */
2028         memset(label, 0, sizeof(label));
2029         spin_lock(&mp->m_sb_lock);
2030         strncpy(label, sbp->sb_fname, XFSLABEL_MAX);
2031         spin_unlock(&mp->m_sb_lock);
2032 
2033         if (copy_to_user(user_label, label, sizeof(label)))
2034                 return -EFAULT;
2035         return 0;
2036 }
2037 
2038 static int
2039 xfs_ioc_setlabel(
2040         struct file             *filp,
2041         struct xfs_mount        *mp,
2042         char                    __user *newlabel)
2043 {
2044         struct xfs_sb           *sbp = &mp->m_sb;
2045         char                    label[XFSLABEL_MAX + 1];
2046         size_t                  len;
2047         int                     error;
2048 
2049         if (!capable(CAP_SYS_ADMIN))
2050                 return -EPERM;
2051         /*
2052          * The generic ioctl allows up to FSLABEL_MAX chars, but XFS is much
2053          * smaller, at 12 bytes.  We copy one more to be sure we find the
2054          * (required) NULL character to test the incoming label length.
2055          * NB: The on disk label doesn't need to be null terminated.
2056          */
2057         if (copy_from_user(label, newlabel, XFSLABEL_MAX + 1))
2058                 return -EFAULT;
2059         len = strnlen(label, XFSLABEL_MAX + 1);
2060         if (len > sizeof(sbp->sb_fname))
2061                 return -EINVAL;
2062 
2063         error = mnt_want_write_file(filp);
2064         if (error)
2065                 return error;
2066 
2067         spin_lock(&mp->m_sb_lock);
2068         memset(sbp->sb_fname, 0, sizeof(sbp->sb_fname));
2069         memcpy(sbp->sb_fname, label, len);
2070         spin_unlock(&mp->m_sb_lock);
2071 
2072         /*
2073          * Now we do several things to satisfy userspace.
2074          * In addition to normal logging of the primary superblock, we also
2075          * immediately write these changes to sector zero for the primary, then
2076          * update all backup supers (as xfs_db does for a label change), then
2077          * invalidate the block device page cache.  This is so that any prior
2078          * buffered reads from userspace (i.e. from blkid) are invalidated,
2079          * and userspace will see the newly-written label.
2080          */
2081         error = xfs_sync_sb_buf(mp);
2082         if (error)
2083                 goto out;
2084         /*
2085          * growfs also updates backup supers so lock against that.
2086          */
2087         mutex_lock(&mp->m_growlock);
2088         error = xfs_update_secondary_sbs(mp);
2089         mutex_unlock(&mp->m_growlock);
2090 
2091         invalidate_bdev(mp->m_ddev_targp->bt_bdev);
2092 
2093 out:
2094         mnt_drop_write_file(filp);
2095         return error;
2096 }
2097 
2098 /*
2099  * Note: some of the ioctl's return positive numbers as a
2100  * byte count indicating success, such as readlink_by_handle.
2101  * So we don't "sign flip" like most other routines.  This means
2102  * true errors need to be returned as a negative value.
2103  */
2104 long
2105 xfs_file_ioctl(
2106         struct file             *filp,
2107         unsigned int            cmd,
2108         unsigned long           p)
2109 {
2110         struct inode            *inode = file_inode(filp);
2111         struct xfs_inode        *ip = XFS_I(inode);
2112         struct xfs_mount        *mp = ip->i_mount;
2113         void                    __user *arg = (void __user *)p;
2114         int                     error;
2115 
2116         trace_xfs_file_ioctl(ip);
2117 
2118         switch (cmd) {
2119         case FITRIM:
2120                 return xfs_ioc_trim(mp, arg);
2121         case FS_IOC_GETFSLABEL:
2122                 return xfs_ioc_getlabel(mp, arg);
2123         case FS_IOC_SETFSLABEL:
2124                 return xfs_ioc_setlabel(filp, mp, arg);
2125         case XFS_IOC_ALLOCSP:
2126         case XFS_IOC_FREESP:
2127         case XFS_IOC_RESVSP:
2128         case XFS_IOC_UNRESVSP:
2129         case XFS_IOC_ALLOCSP64:
2130         case XFS_IOC_FREESP64:
2131         case XFS_IOC_RESVSP64:
2132         case XFS_IOC_UNRESVSP64:
2133         case XFS_IOC_ZERO_RANGE: {
2134                 xfs_flock64_t           bf;
2135 
2136                 if (copy_from_user(&bf, arg, sizeof(bf)))
2137                         return -EFAULT;
2138                 return xfs_ioc_space(filp, cmd, &bf);
2139         }
2140         case XFS_IOC_DIOINFO: {
2141                 struct dioattr  da;
2142                 xfs_buftarg_t   *target =
2143                         XFS_IS_REALTIME_INODE(ip) ?
2144                         mp->m_rtdev_targp : mp->m_ddev_targp;
2145 
2146                 da.d_mem =  da.d_miniosz = target->bt_logical_sectorsize;
2147                 da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1);
2148 
2149                 if (copy_to_user(arg, &da, sizeof(da)))
2150                         return -EFAULT;
2151                 return 0;
2152         }
2153 
2154         case XFS_IOC_FSBULKSTAT_SINGLE:
2155         case XFS_IOC_FSBULKSTAT:
2156         case XFS_IOC_FSINUMBERS:
2157                 return xfs_ioc_fsbulkstat(mp, cmd, arg);
2158 
2159         case XFS_IOC_BULKSTAT:
2160                 return xfs_ioc_bulkstat(mp, cmd, arg);
2161         case XFS_IOC_INUMBERS:
2162                 return xfs_ioc_inumbers(mp, cmd, arg);
2163 
2164         case XFS_IOC_FSGEOMETRY_V1:
2165                 return xfs_ioc_fsgeometry(mp, arg, 3);
2166         case XFS_IOC_FSGEOMETRY_V4:
2167                 return xfs_ioc_fsgeometry(mp, arg, 4);
2168         case XFS_IOC_FSGEOMETRY:
2169                 return xfs_ioc_fsgeometry(mp, arg, 5);
2170 
2171         case XFS_IOC_AG_GEOMETRY:
2172                 return xfs_ioc_ag_geometry(mp, arg);
2173 
2174         case XFS_IOC_GETVERSION:
2175                 return put_user(inode->i_generation, (int __user *)arg);
2176 
2177         case XFS_IOC_FSGETXATTR:
2178                 return xfs_ioc_fsgetxattr(ip, 0, arg);
2179         case XFS_IOC_FSGETXATTRA:
2180                 return xfs_ioc_fsgetxattr(ip, 1, arg);
2181         case XFS_IOC_FSSETXATTR:
2182                 return xfs_ioc_fssetxattr(ip, filp, arg);
2183         case XFS_IOC_GETXFLAGS:
2184                 return xfs_ioc_getxflags(ip, arg);
2185         case XFS_IOC_SETXFLAGS:
2186                 return xfs_ioc_setxflags(ip, filp, arg);
2187 
2188         case XFS_IOC_FSSETDM: {
2189                 struct fsdmidata        dmi;
2190 
2191                 if (copy_from_user(&dmi, arg, sizeof(dmi)))
2192                         return -EFAULT;
2193 
2194                 error = mnt_want_write_file(filp);
2195                 if (error)
2196                         return error;
2197 
2198                 error = xfs_set_dmattrs(ip, dmi.fsd_dmevmask,
2199                                 dmi.fsd_dmstate);
2200                 mnt_drop_write_file(filp);
2201                 return error;
2202         }
2203 
2204         case XFS_IOC_GETBMAP:
2205         case XFS_IOC_GETBMAPA:
2206         case XFS_IOC_GETBMAPX:
2207                 return xfs_ioc_getbmap(filp, cmd, arg);
2208 
2209         case FS_IOC_GETFSMAP:
2210                 return xfs_ioc_getfsmap(ip, arg);
2211 
2212         case XFS_IOC_SCRUB_METADATA:
2213                 return xfs_ioc_scrub_metadata(ip, arg);
2214 
2215         case XFS_IOC_FD_TO_HANDLE:
2216         case XFS_IOC_PATH_TO_HANDLE:
2217         case XFS_IOC_PATH_TO_FSHANDLE: {
2218                 xfs_fsop_handlereq_t    hreq;
2219 
2220                 if (copy_from_user(&hreq, arg, sizeof(hreq)))
2221                         return -EFAULT;
2222                 return xfs_find_handle(cmd, &hreq);
2223         }
2224         case XFS_IOC_OPEN_BY_HANDLE: {
2225                 xfs_fsop_handlereq_t    hreq;
2226 
2227                 if (copy_from_user(&hreq, arg, sizeof(xfs_fsop_handlereq_t)))
2228                         return -EFAULT;
2229                 return xfs_open_by_handle(filp, &hreq);
2230         }
2231         case XFS_IOC_FSSETDM_BY_HANDLE:
2232                 return xfs_fssetdm_by_handle(filp, arg);
2233 
2234         case XFS_IOC_READLINK_BY_HANDLE: {
2235                 xfs_fsop_handlereq_t    hreq;
2236 
2237                 if (copy_from_user(&hreq, arg, sizeof(xfs_fsop_handlereq_t)))
2238                         return -EFAULT;
2239                 return xfs_readlink_by_handle(filp, &hreq);
2240         }
2241         case XFS_IOC_ATTRLIST_BY_HANDLE:
2242                 return xfs_attrlist_by_handle(filp, arg);
2243 
2244         case XFS_IOC_ATTRMULTI_BY_HANDLE:
2245                 return xfs_attrmulti_by_handle(filp, arg);
2246 
2247         case XFS_IOC_SWAPEXT: {
2248                 struct xfs_swapext      sxp;
2249 
2250                 if (copy_from_user(&sxp, arg, sizeof(xfs_swapext_t)))
2251                         return -EFAULT;
2252                 error = mnt_want_write_file(filp);
2253                 if (error)
2254                         return error;
2255                 error = xfs_ioc_swapext(&sxp);
2256                 mnt_drop_write_file(filp);
2257                 return error;
2258         }
2259 
2260         case XFS_IOC_FSCOUNTS: {
2261                 xfs_fsop_counts_t out;
2262 
2263                 xfs_fs_counts(mp, &out);
2264 
2265                 if (copy_to_user(arg, &out, sizeof(out)))
2266                         return -EFAULT;
2267                 return 0;
2268         }
2269 
2270         case XFS_IOC_SET_RESBLKS: {
2271                 xfs_fsop_resblks_t inout;
2272                 uint64_t           in;
2273 
2274                 if (!capable(CAP_SYS_ADMIN))
2275                         return -EPERM;
2276 
2277                 if (mp->m_flags & XFS_MOUNT_RDONLY)
2278                         return -EROFS;
2279 
2280                 if (copy_from_user(&inout, arg, sizeof(inout)))
2281                         return -EFAULT;
2282 
2283                 error = mnt_want_write_file(filp);
2284                 if (error)
2285                         return error;
2286 
2287                 /* input parameter is passed in resblks field of structure */
2288                 in = inout.resblks;
2289                 error = xfs_reserve_blocks(mp, &in, &inout);
2290                 mnt_drop_write_file(filp);
2291                 if (error)
2292                         return error;
2293 
2294                 if (copy_to_user(arg, &inout, sizeof(inout)))
2295                         return -EFAULT;
2296                 return 0;
2297         }
2298 
2299         case XFS_IOC_GET_RESBLKS: {
2300                 xfs_fsop_resblks_t out;
2301 
2302                 if (!capable(CAP_SYS_ADMIN))
2303                         return -EPERM;
2304 
2305                 error = xfs_reserve_blocks(mp, NULL, &out);
2306                 if (error)
2307                         return error;
2308 
2309                 if (copy_to_user(arg, &out, sizeof(out)))
2310                         return -EFAULT;
2311 
2312                 return 0;
2313         }
2314 
2315         case XFS_IOC_FSGROWFSDATA: {
2316                 xfs_growfs_data_t in;
2317 
2318                 if (copy_from_user(&in, arg, sizeof(in)))
2319                         return -EFAULT;
2320 
2321                 error = mnt_want_write_file(filp);
2322                 if (error)
2323                         return error;
2324                 error = xfs_growfs_data(mp, &in);
2325                 mnt_drop_write_file(filp);
2326                 return error;
2327         }
2328 
2329         case XFS_IOC_FSGROWFSLOG: {
2330                 xfs_growfs_log_t in;
2331 
2332                 if (copy_from_user(&in, arg, sizeof(in)))
2333                         return -EFAULT;
2334 
2335                 error = mnt_want_write_file(filp);
2336                 if (error)
2337                         return error;
2338                 error = xfs_growfs_log(mp, &in);
2339                 mnt_drop_write_file(filp);
2340                 return error;
2341         }
2342 
2343         case XFS_IOC_FSGROWFSRT: {
2344                 xfs_growfs_rt_t in;
2345 
2346                 if (copy_from_user(&in, arg, sizeof(in)))
2347                         return -EFAULT;
2348 
2349                 error = mnt_want_write_file(filp);
2350                 if (error)
2351                         return error;
2352                 error = xfs_growfs_rt(mp, &in);
2353                 mnt_drop_write_file(filp);
2354                 return error;
2355         }
2356 
2357         case XFS_IOC_GOINGDOWN: {
2358                 uint32_t in;
2359 
2360                 if (!capable(CAP_SYS_ADMIN))
2361                         return -EPERM;
2362 
2363                 if (get_user(in, (uint32_t __user *)arg))
2364                         return -EFAULT;
2365 
2366                 return xfs_fs_goingdown(mp, in);
2367         }
2368 
2369         case XFS_IOC_ERROR_INJECTION: {
2370                 xfs_error_injection_t in;
2371 
2372                 if (!capable(CAP_SYS_ADMIN))
2373                         return -EPERM;
2374 
2375                 if (copy_from_user(&in, arg, sizeof(in)))
2376                         return -EFAULT;
2377 
2378                 return xfs_errortag_add(mp, in.errtag);
2379         }
2380 
2381         case XFS_IOC_ERROR_CLEARALL:
2382                 if (!capable(CAP_SYS_ADMIN))
2383                         return -EPERM;
2384 
2385                 return xfs_errortag_clearall(mp);
2386 
2387         case XFS_IOC_FREE_EOFBLOCKS: {
2388                 struct xfs_fs_eofblocks eofb;
2389                 struct xfs_eofblocks keofb;
2390 
2391                 if (!capable(CAP_SYS_ADMIN))
2392                         return -EPERM;
2393 
2394                 if (mp->m_flags & XFS_MOUNT_RDONLY)
2395                         return -EROFS;
2396 
2397                 if (copy_from_user(&eofb, arg, sizeof(eofb)))
2398                         return -EFAULT;
2399 
2400                 error = xfs_fs_eofblocks_from_user(&eofb, &keofb);
2401                 if (error)
2402                         return error;
2403 
2404                 sb_start_write(mp->m_super);
2405                 error = xfs_icache_free_eofblocks(mp, &keofb);
2406                 sb_end_write(mp->m_super);
2407                 return error;
2408         }
2409 
2410         default:
2411                 return -ENOTTY;
2412         }
2413 }

/* [<][>][^][v][top][bottom][index][help] */