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