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                fallthrough;
 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_is_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_is_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_is_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, &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        if (ip->i_diflags & XFS_DIFLAG_EXTSIZE) {
1069                fa->fsx_extsize = XFS_FSB_TO_B(mp, ip->i_extsize);
1070        } else if (ip->i_diflags & XFS_DIFLAG_EXTSZINHERIT) {
1071                /*
1072                 * Don't let a misaligned extent size hint on a directory
1073                 * escape to userspace if it won't pass the setattr checks
1074                 * later.
1075                 */
1076                if ((ip->i_diflags & XFS_DIFLAG_RTINHERIT) &&
1077                    ip->i_extsize % mp->m_sb.sb_rextsize > 0) {
1078                        fa->fsx_xflags &= ~(FS_XFLAG_EXTSIZE |
1079                                            FS_XFLAG_EXTSZINHERIT);
1080                        fa->fsx_extsize = 0;
1081                } else {
1082                        fa->fsx_extsize = XFS_FSB_TO_B(mp, ip->i_extsize);
1083                }
1084        }
1085
1086        if (ip->i_diflags2 & XFS_DIFLAG2_COWEXTSIZE)
1087                fa->fsx_cowextsize = XFS_FSB_TO_B(mp, ip->i_cowextsize);
1088        fa->fsx_projid = ip->i_projid;
1089        if (ifp && !xfs_need_iread_extents(ifp))
1090                fa->fsx_nextents = xfs_iext_count(ifp);
1091        else
1092                fa->fsx_nextents = xfs_ifork_nextents(ifp);
1093}
1094
1095STATIC int
1096xfs_ioc_fsgetxattra(
1097        xfs_inode_t             *ip,
1098        void                    __user *arg)
1099{
1100        struct fileattr         fa;
1101
1102        xfs_ilock(ip, XFS_ILOCK_SHARED);
1103        xfs_fill_fsxattr(ip, XFS_ATTR_FORK, &fa);
1104        xfs_iunlock(ip, XFS_ILOCK_SHARED);
1105
1106        return copy_fsxattr_to_user(&fa, arg);
1107}
1108
1109int
1110xfs_fileattr_get(
1111        struct dentry           *dentry,
1112        struct fileattr         *fa)
1113{
1114        struct xfs_inode        *ip = XFS_I(d_inode(dentry));
1115
1116        if (d_is_special(dentry))
1117                return -ENOTTY;
1118
1119        xfs_ilock(ip, XFS_ILOCK_SHARED);
1120        xfs_fill_fsxattr(ip, XFS_DATA_FORK, fa);
1121        xfs_iunlock(ip, XFS_ILOCK_SHARED);
1122
1123        return 0;
1124}
1125
1126STATIC uint16_t
1127xfs_flags2diflags(
1128        struct xfs_inode        *ip,
1129        unsigned int            xflags)
1130{
1131        /* can't set PREALLOC this way, just preserve it */
1132        uint16_t                di_flags =
1133                (ip->i_diflags & XFS_DIFLAG_PREALLOC);
1134
1135        if (xflags & FS_XFLAG_IMMUTABLE)
1136                di_flags |= XFS_DIFLAG_IMMUTABLE;
1137        if (xflags & FS_XFLAG_APPEND)
1138                di_flags |= XFS_DIFLAG_APPEND;
1139        if (xflags & FS_XFLAG_SYNC)
1140                di_flags |= XFS_DIFLAG_SYNC;
1141        if (xflags & FS_XFLAG_NOATIME)
1142                di_flags |= XFS_DIFLAG_NOATIME;
1143        if (xflags & FS_XFLAG_NODUMP)
1144                di_flags |= XFS_DIFLAG_NODUMP;
1145        if (xflags & FS_XFLAG_NODEFRAG)
1146                di_flags |= XFS_DIFLAG_NODEFRAG;
1147        if (xflags & FS_XFLAG_FILESTREAM)
1148                di_flags |= XFS_DIFLAG_FILESTREAM;
1149        if (S_ISDIR(VFS_I(ip)->i_mode)) {
1150                if (xflags & FS_XFLAG_RTINHERIT)
1151                        di_flags |= XFS_DIFLAG_RTINHERIT;
1152                if (xflags & FS_XFLAG_NOSYMLINKS)
1153                        di_flags |= XFS_DIFLAG_NOSYMLINKS;
1154                if (xflags & FS_XFLAG_EXTSZINHERIT)
1155                        di_flags |= XFS_DIFLAG_EXTSZINHERIT;
1156                if (xflags & FS_XFLAG_PROJINHERIT)
1157                        di_flags |= XFS_DIFLAG_PROJINHERIT;
1158        } else if (S_ISREG(VFS_I(ip)->i_mode)) {
1159                if (xflags & FS_XFLAG_REALTIME)
1160                        di_flags |= XFS_DIFLAG_REALTIME;
1161                if (xflags & FS_XFLAG_EXTSIZE)
1162                        di_flags |= XFS_DIFLAG_EXTSIZE;
1163        }
1164
1165        return di_flags;
1166}
1167
1168STATIC uint64_t
1169xfs_flags2diflags2(
1170        struct xfs_inode        *ip,
1171        unsigned int            xflags)
1172{
1173        uint64_t                di_flags2 =
1174                (ip->i_diflags2 & (XFS_DIFLAG2_REFLINK |
1175                                   XFS_DIFLAG2_BIGTIME));
1176
1177        if (xflags & FS_XFLAG_DAX)
1178                di_flags2 |= XFS_DIFLAG2_DAX;
1179        if (xflags & FS_XFLAG_COWEXTSIZE)
1180                di_flags2 |= XFS_DIFLAG2_COWEXTSIZE;
1181
1182        return di_flags2;
1183}
1184
1185static int
1186xfs_ioctl_setattr_xflags(
1187        struct xfs_trans        *tp,
1188        struct xfs_inode        *ip,
1189        struct fileattr         *fa)
1190{
1191        struct xfs_mount        *mp = ip->i_mount;
1192        uint64_t                i_flags2;
1193
1194        /* Can't change realtime flag if any extents are allocated. */
1195        if ((ip->i_df.if_nextents || ip->i_delayed_blks) &&
1196            XFS_IS_REALTIME_INODE(ip) != (fa->fsx_xflags & FS_XFLAG_REALTIME))
1197                return -EINVAL;
1198
1199        /* If realtime flag is set then must have realtime device */
1200        if (fa->fsx_xflags & FS_XFLAG_REALTIME) {
1201                if (mp->m_sb.sb_rblocks == 0 || mp->m_sb.sb_rextsize == 0 ||
1202                    (ip->i_extsize % mp->m_sb.sb_rextsize))
1203                        return -EINVAL;
1204        }
1205
1206        /* Clear reflink if we are actually able to set the rt flag. */
1207        if ((fa->fsx_xflags & FS_XFLAG_REALTIME) && xfs_is_reflink_inode(ip))
1208                ip->i_diflags2 &= ~XFS_DIFLAG2_REFLINK;
1209
1210        /* Don't allow us to set DAX mode for a reflinked file for now. */
1211        if ((fa->fsx_xflags & FS_XFLAG_DAX) && xfs_is_reflink_inode(ip))
1212                return -EINVAL;
1213
1214        /* diflags2 only valid for v3 inodes. */
1215        i_flags2 = xfs_flags2diflags2(ip, fa->fsx_xflags);
1216        if (i_flags2 && !xfs_has_v3inodes(mp))
1217                return -EINVAL;
1218
1219        ip->i_diflags = xfs_flags2diflags(ip, fa->fsx_xflags);
1220        ip->i_diflags2 = i_flags2;
1221
1222        xfs_diflags_to_iflags(ip, false);
1223        xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG);
1224        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
1225        XFS_STATS_INC(mp, xs_ig_attrchg);
1226        return 0;
1227}
1228
1229static void
1230xfs_ioctl_setattr_prepare_dax(
1231        struct xfs_inode        *ip,
1232        struct fileattr         *fa)
1233{
1234        struct xfs_mount        *mp = ip->i_mount;
1235        struct inode            *inode = VFS_I(ip);
1236
1237        if (S_ISDIR(inode->i_mode))
1238                return;
1239
1240        if (xfs_has_dax_always(mp) || xfs_has_dax_never(mp))
1241                return;
1242
1243        if (((fa->fsx_xflags & FS_XFLAG_DAX) &&
1244            !(ip->i_diflags2 & XFS_DIFLAG2_DAX)) ||
1245            (!(fa->fsx_xflags & FS_XFLAG_DAX) &&
1246             (ip->i_diflags2 & XFS_DIFLAG2_DAX)))
1247                d_mark_dontcache(inode);
1248}
1249
1250/*
1251 * Set up the transaction structure for the setattr operation, checking that we
1252 * have permission to do so. On success, return a clean transaction and the
1253 * inode locked exclusively ready for further operation specific checks. On
1254 * failure, return an error without modifying or locking the inode.
1255 */
1256static struct xfs_trans *
1257xfs_ioctl_setattr_get_trans(
1258        struct xfs_inode        *ip,
1259        struct xfs_dquot        *pdqp)
1260{
1261        struct xfs_mount        *mp = ip->i_mount;
1262        struct xfs_trans        *tp;
1263        int                     error = -EROFS;
1264
1265        if (xfs_is_readonly(mp))
1266                goto out_error;
1267        error = -EIO;
1268        if (xfs_is_shutdown(mp))
1269                goto out_error;
1270
1271        error = xfs_trans_alloc_ichange(ip, NULL, NULL, pdqp,
1272                        capable(CAP_FOWNER), &tp);
1273        if (error)
1274                goto out_error;
1275
1276        if (xfs_has_wsync(mp))
1277                xfs_trans_set_sync(tp);
1278
1279        return tp;
1280
1281out_error:
1282        return ERR_PTR(error);
1283}
1284
1285/*
1286 * Validate a proposed extent size hint.  For regular files, the hint can only
1287 * be changed if no extents are allocated.
1288 */
1289static int
1290xfs_ioctl_setattr_check_extsize(
1291        struct xfs_inode        *ip,
1292        struct fileattr         *fa)
1293{
1294        struct xfs_mount        *mp = ip->i_mount;
1295        xfs_failaddr_t          failaddr;
1296        uint16_t                new_diflags;
1297
1298        if (!fa->fsx_valid)
1299                return 0;
1300
1301        if (S_ISREG(VFS_I(ip)->i_mode) && ip->i_df.if_nextents &&
1302            XFS_FSB_TO_B(mp, ip->i_extsize) != fa->fsx_extsize)
1303                return -EINVAL;
1304
1305        if (fa->fsx_extsize & mp->m_blockmask)
1306                return -EINVAL;
1307
1308        new_diflags = xfs_flags2diflags(ip, fa->fsx_xflags);
1309
1310        /*
1311         * Inode verifiers do not check that the extent size hint is an integer
1312         * multiple of the rt extent size on a directory with both rtinherit
1313         * and extszinherit flags set.  Don't let sysadmins misconfigure
1314         * directories.
1315         */
1316        if ((new_diflags & XFS_DIFLAG_RTINHERIT) &&
1317            (new_diflags & XFS_DIFLAG_EXTSZINHERIT)) {
1318                unsigned int    rtextsize_bytes;
1319
1320                rtextsize_bytes = XFS_FSB_TO_B(mp, mp->m_sb.sb_rextsize);
1321                if (fa->fsx_extsize % rtextsize_bytes)
1322                        return -EINVAL;
1323        }
1324
1325        failaddr = xfs_inode_validate_extsize(ip->i_mount,
1326                        XFS_B_TO_FSB(mp, fa->fsx_extsize),
1327                        VFS_I(ip)->i_mode, new_diflags);
1328        return failaddr != NULL ? -EINVAL : 0;
1329}
1330
1331static int
1332xfs_ioctl_setattr_check_cowextsize(
1333        struct xfs_inode        *ip,
1334        struct fileattr         *fa)
1335{
1336        struct xfs_mount        *mp = ip->i_mount;
1337        xfs_failaddr_t          failaddr;
1338        uint64_t                new_diflags2;
1339        uint16_t                new_diflags;
1340
1341        if (!fa->fsx_valid)
1342                return 0;
1343
1344        if (fa->fsx_cowextsize & mp->m_blockmask)
1345                return -EINVAL;
1346
1347        new_diflags = xfs_flags2diflags(ip, fa->fsx_xflags);
1348        new_diflags2 = xfs_flags2diflags2(ip, fa->fsx_xflags);
1349
1350        failaddr = xfs_inode_validate_cowextsize(ip->i_mount,
1351                        XFS_B_TO_FSB(mp, fa->fsx_cowextsize),
1352                        VFS_I(ip)->i_mode, new_diflags, new_diflags2);
1353        return failaddr != NULL ? -EINVAL : 0;
1354}
1355
1356static int
1357xfs_ioctl_setattr_check_projid(
1358        struct xfs_inode        *ip,
1359        struct fileattr         *fa)
1360{
1361        if (!fa->fsx_valid)
1362                return 0;
1363
1364        /* Disallow 32bit project ids if 32bit IDs are not enabled. */
1365        if (fa->fsx_projid > (uint16_t)-1 &&
1366            !xfs_has_projid32(ip->i_mount))
1367                return -EINVAL;
1368        return 0;
1369}
1370
1371int
1372xfs_fileattr_set(
1373        struct user_namespace   *mnt_userns,
1374        struct dentry           *dentry,
1375        struct fileattr         *fa)
1376{
1377        struct xfs_inode        *ip = XFS_I(d_inode(dentry));
1378        struct xfs_mount        *mp = ip->i_mount;
1379        struct xfs_trans        *tp;
1380        struct xfs_dquot        *pdqp = NULL;
1381        struct xfs_dquot        *olddquot = NULL;
1382        int                     error;
1383
1384        trace_xfs_ioctl_setattr(ip);
1385
1386        if (d_is_special(dentry))
1387                return -ENOTTY;
1388
1389        if (!fa->fsx_valid) {
1390                if (fa->flags & ~(FS_IMMUTABLE_FL | FS_APPEND_FL |
1391                                  FS_NOATIME_FL | FS_NODUMP_FL |
1392                                  FS_SYNC_FL | FS_DAX_FL | FS_PROJINHERIT_FL))
1393                        return -EOPNOTSUPP;
1394        }
1395
1396        error = xfs_ioctl_setattr_check_projid(ip, fa);
1397        if (error)
1398                return error;
1399
1400        /*
1401         * If disk quotas is on, we make sure that the dquots do exist on disk,
1402         * before we start any other transactions. Trying to do this later
1403         * is messy. We don't care to take a readlock to look at the ids
1404         * in inode here, because we can't hold it across the trans_reserve.
1405         * If the IDs do change before we take the ilock, we're covered
1406         * because the i_*dquot fields will get updated anyway.
1407         */
1408        if (fa->fsx_valid && XFS_IS_QUOTA_ON(mp)) {
1409                error = xfs_qm_vop_dqalloc(ip, VFS_I(ip)->i_uid,
1410                                VFS_I(ip)->i_gid, fa->fsx_projid,
1411                                XFS_QMOPT_PQUOTA, NULL, NULL, &pdqp);
1412                if (error)
1413                        return error;
1414        }
1415
1416        xfs_ioctl_setattr_prepare_dax(ip, fa);
1417
1418        tp = xfs_ioctl_setattr_get_trans(ip, pdqp);
1419        if (IS_ERR(tp)) {
1420                error = PTR_ERR(tp);
1421                goto error_free_dquots;
1422        }
1423
1424        error = xfs_ioctl_setattr_check_extsize(ip, fa);
1425        if (error)
1426                goto error_trans_cancel;
1427
1428        error = xfs_ioctl_setattr_check_cowextsize(ip, fa);
1429        if (error)
1430                goto error_trans_cancel;
1431
1432        error = xfs_ioctl_setattr_xflags(tp, ip, fa);
1433        if (error)
1434                goto error_trans_cancel;
1435
1436        if (!fa->fsx_valid)
1437                goto skip_xattr;
1438        /*
1439         * Change file ownership.  Must be the owner or privileged.  CAP_FSETID
1440         * overrides the following restrictions:
1441         *
1442         * The set-user-ID and set-group-ID bits of a file will be cleared upon
1443         * successful return from chown()
1444         */
1445
1446        if ((VFS_I(ip)->i_mode & (S_ISUID|S_ISGID)) &&
1447            !capable_wrt_inode_uidgid(mnt_userns, VFS_I(ip), CAP_FSETID))
1448                VFS_I(ip)->i_mode &= ~(S_ISUID|S_ISGID);
1449
1450        /* Change the ownerships and register project quota modifications */
1451        if (ip->i_projid != fa->fsx_projid) {
1452                if (XFS_IS_PQUOTA_ON(mp)) {
1453                        olddquot = xfs_qm_vop_chown(tp, ip,
1454                                                &ip->i_pdquot, pdqp);
1455                }
1456                ip->i_projid = fa->fsx_projid;
1457        }
1458
1459        /*
1460         * Only set the extent size hint if we've already determined that the
1461         * extent size hint should be set on the inode. If no extent size flags
1462         * are set on the inode then unconditionally clear the extent size hint.
1463         */
1464        if (ip->i_diflags & (XFS_DIFLAG_EXTSIZE | XFS_DIFLAG_EXTSZINHERIT))
1465                ip->i_extsize = XFS_B_TO_FSB(mp, fa->fsx_extsize);
1466        else
1467                ip->i_extsize = 0;
1468
1469        if (xfs_has_v3inodes(mp)) {
1470                if (ip->i_diflags2 & XFS_DIFLAG2_COWEXTSIZE)
1471                        ip->i_cowextsize = XFS_B_TO_FSB(mp, fa->fsx_cowextsize);
1472                else
1473                        ip->i_cowextsize = 0;
1474        }
1475
1476skip_xattr:
1477        error = xfs_trans_commit(tp);
1478
1479        /*
1480         * Release any dquot(s) the inode had kept before chown.
1481         */
1482        xfs_qm_dqrele(olddquot);
1483        xfs_qm_dqrele(pdqp);
1484
1485        return error;
1486
1487error_trans_cancel:
1488        xfs_trans_cancel(tp);
1489error_free_dquots:
1490        xfs_qm_dqrele(pdqp);
1491        return error;
1492}
1493
1494static bool
1495xfs_getbmap_format(
1496        struct kgetbmap         *p,
1497        struct getbmapx __user  *u,
1498        size_t                  recsize)
1499{
1500        if (put_user(p->bmv_offset, &u->bmv_offset) ||
1501            put_user(p->bmv_block, &u->bmv_block) ||
1502            put_user(p->bmv_length, &u->bmv_length) ||
1503            put_user(0, &u->bmv_count) ||
1504            put_user(0, &u->bmv_entries))
1505                return false;
1506        if (recsize < sizeof(struct getbmapx))
1507                return true;
1508        if (put_user(0, &u->bmv_iflags) ||
1509            put_user(p->bmv_oflags, &u->bmv_oflags) ||
1510            put_user(0, &u->bmv_unused1) ||
1511            put_user(0, &u->bmv_unused2))
1512                return false;
1513        return true;
1514}
1515
1516STATIC int
1517xfs_ioc_getbmap(
1518        struct file             *file,
1519        unsigned int            cmd,
1520        void                    __user *arg)
1521{
1522        struct getbmapx         bmx = { 0 };
1523        struct kgetbmap         *buf;
1524        size_t                  recsize;
1525        int                     error, i;
1526
1527        switch (cmd) {
1528        case XFS_IOC_GETBMAPA:
1529                bmx.bmv_iflags = BMV_IF_ATTRFORK;
1530                fallthrough;
1531        case XFS_IOC_GETBMAP:
1532                /* struct getbmap is a strict subset of struct getbmapx. */
1533                recsize = sizeof(struct getbmap);
1534                break;
1535        case XFS_IOC_GETBMAPX:
1536                recsize = sizeof(struct getbmapx);
1537                break;
1538        default:
1539                return -EINVAL;
1540        }
1541
1542        if (copy_from_user(&bmx, arg, recsize))
1543                return -EFAULT;
1544
1545        if (bmx.bmv_count < 2)
1546                return -EINVAL;
1547        if (bmx.bmv_count > ULONG_MAX / recsize)
1548                return -ENOMEM;
1549
1550        buf = kvzalloc(bmx.bmv_count * sizeof(*buf), GFP_KERNEL);
1551        if (!buf)
1552                return -ENOMEM;
1553
1554        error = xfs_getbmap(XFS_I(file_inode(file)), &bmx, buf);
1555        if (error)
1556                goto out_free_buf;
1557
1558        error = -EFAULT;
1559        if (copy_to_user(arg, &bmx, recsize))
1560                goto out_free_buf;
1561        arg += recsize;
1562
1563        for (i = 0; i < bmx.bmv_entries; i++) {
1564                if (!xfs_getbmap_format(buf + i, arg, recsize))
1565                        goto out_free_buf;
1566                arg += recsize;
1567        }
1568
1569        error = 0;
1570out_free_buf:
1571        kmem_free(buf);
1572        return error;
1573}
1574
1575STATIC int
1576xfs_ioc_getfsmap(
1577        struct xfs_inode        *ip,
1578        struct fsmap_head       __user *arg)
1579{
1580        struct xfs_fsmap_head   xhead = {0};
1581        struct fsmap_head       head;
1582        struct fsmap            *recs;
1583        unsigned int            count;
1584        __u32                   last_flags = 0;
1585        bool                    done = false;
1586        int                     error;
1587
1588        if (copy_from_user(&head, arg, sizeof(struct fsmap_head)))
1589                return -EFAULT;
1590        if (memchr_inv(head.fmh_reserved, 0, sizeof(head.fmh_reserved)) ||
1591            memchr_inv(head.fmh_keys[0].fmr_reserved, 0,
1592                       sizeof(head.fmh_keys[0].fmr_reserved)) ||
1593            memchr_inv(head.fmh_keys[1].fmr_reserved, 0,
1594                       sizeof(head.fmh_keys[1].fmr_reserved)))
1595                return -EINVAL;
1596
1597        /*
1598         * Use an internal memory buffer so that we don't have to copy fsmap
1599         * data to userspace while holding locks.  Start by trying to allocate
1600         * up to 128k for the buffer, but fall back to a single page if needed.
1601         */
1602        count = min_t(unsigned int, head.fmh_count,
1603                        131072 / sizeof(struct fsmap));
1604        recs = kvzalloc(count * sizeof(struct fsmap), GFP_KERNEL);
1605        if (!recs) {
1606                count = min_t(unsigned int, head.fmh_count,
1607                                PAGE_SIZE / sizeof(struct fsmap));
1608                recs = kvzalloc(count * sizeof(struct fsmap), GFP_KERNEL);
1609                if (!recs)
1610                        return -ENOMEM;
1611        }
1612
1613        xhead.fmh_iflags = head.fmh_iflags;
1614        xfs_fsmap_to_internal(&xhead.fmh_keys[0], &head.fmh_keys[0]);
1615        xfs_fsmap_to_internal(&xhead.fmh_keys[1], &head.fmh_keys[1]);
1616
1617        trace_xfs_getfsmap_low_key(ip->i_mount, &xhead.fmh_keys[0]);
1618        trace_xfs_getfsmap_high_key(ip->i_mount, &xhead.fmh_keys[1]);
1619
1620        head.fmh_entries = 0;
1621        do {
1622                struct fsmap __user     *user_recs;
1623                struct fsmap            *last_rec;
1624
1625                user_recs = &arg->fmh_recs[head.fmh_entries];
1626                xhead.fmh_entries = 0;
1627                xhead.fmh_count = min_t(unsigned int, count,
1628                                        head.fmh_count - head.fmh_entries);
1629
1630                /* Run query, record how many entries we got. */
1631                error = xfs_getfsmap(ip->i_mount, &xhead, recs);
1632                switch (error) {
1633                case 0:
1634                        /*
1635                         * There are no more records in the result set.  Copy
1636                         * whatever we got to userspace and break out.
1637                         */
1638                        done = true;
1639                        break;
1640                case -ECANCELED:
1641                        /*
1642                         * The internal memory buffer is full.  Copy whatever
1643                         * records we got to userspace and go again if we have
1644                         * not yet filled the userspace buffer.
1645                         */
1646                        error = 0;
1647                        break;
1648                default:
1649                        goto out_free;
1650                }
1651                head.fmh_entries += xhead.fmh_entries;
1652                head.fmh_oflags = xhead.fmh_oflags;
1653
1654                /*
1655                 * If the caller wanted a record count or there aren't any
1656                 * new records to return, we're done.
1657                 */
1658                if (head.fmh_count == 0 || xhead.fmh_entries == 0)
1659                        break;
1660
1661                /* Copy all the records we got out to userspace. */
1662                if (copy_to_user(user_recs, recs,
1663                                 xhead.fmh_entries * sizeof(struct fsmap))) {
1664                        error = -EFAULT;
1665                        goto out_free;
1666                }
1667
1668                /* Remember the last record flags we copied to userspace. */
1669                last_rec = &recs[xhead.fmh_entries - 1];
1670                last_flags = last_rec->fmr_flags;
1671
1672                /* Set up the low key for the next iteration. */
1673                xfs_fsmap_to_internal(&xhead.fmh_keys[0], last_rec);
1674                trace_xfs_getfsmap_low_key(ip->i_mount, &xhead.fmh_keys[0]);
1675        } while (!done && head.fmh_entries < head.fmh_count);
1676
1677        /*
1678         * If there are no more records in the query result set and we're not
1679         * in counting mode, mark the last record returned with the LAST flag.
1680         */
1681        if (done && head.fmh_count > 0 && head.fmh_entries > 0) {
1682                struct fsmap __user     *user_rec;
1683
1684                last_flags |= FMR_OF_LAST;
1685                user_rec = &arg->fmh_recs[head.fmh_entries - 1];
1686
1687                if (copy_to_user(&user_rec->fmr_flags, &last_flags,
1688                                        sizeof(last_flags))) {
1689                        error = -EFAULT;
1690                        goto out_free;
1691                }
1692        }
1693
1694        /* copy back header */
1695        if (copy_to_user(arg, &head, sizeof(struct fsmap_head))) {
1696                error = -EFAULT;
1697                goto out_free;
1698        }
1699
1700out_free:
1701        kmem_free(recs);
1702        return error;
1703}
1704
1705STATIC int
1706xfs_ioc_scrub_metadata(
1707        struct file                     *file,
1708        void                            __user *arg)
1709{
1710        struct xfs_scrub_metadata       scrub;
1711        int                             error;
1712
1713        if (!capable(CAP_SYS_ADMIN))
1714                return -EPERM;
1715
1716        if (copy_from_user(&scrub, arg, sizeof(scrub)))
1717                return -EFAULT;
1718
1719        error = xfs_scrub_metadata(file, &scrub);
1720        if (error)
1721                return error;
1722
1723        if (copy_to_user(arg, &scrub, sizeof(scrub)))
1724                return -EFAULT;
1725
1726        return 0;
1727}
1728
1729int
1730xfs_ioc_swapext(
1731        xfs_swapext_t   *sxp)
1732{
1733        xfs_inode_t     *ip, *tip;
1734        struct fd       f, tmp;
1735        int             error = 0;
1736
1737        /* Pull information for the target fd */
1738        f = fdget((int)sxp->sx_fdtarget);
1739        if (!f.file) {
1740                error = -EINVAL;
1741                goto out;
1742        }
1743
1744        if (!(f.file->f_mode & FMODE_WRITE) ||
1745            !(f.file->f_mode & FMODE_READ) ||
1746            (f.file->f_flags & O_APPEND)) {
1747                error = -EBADF;
1748                goto out_put_file;
1749        }
1750
1751        tmp = fdget((int)sxp->sx_fdtmp);
1752        if (!tmp.file) {
1753                error = -EINVAL;
1754                goto out_put_file;
1755        }
1756
1757        if (!(tmp.file->f_mode & FMODE_WRITE) ||
1758            !(tmp.file->f_mode & FMODE_READ) ||
1759            (tmp.file->f_flags & O_APPEND)) {
1760                error = -EBADF;
1761                goto out_put_tmp_file;
1762        }
1763
1764        if (IS_SWAPFILE(file_inode(f.file)) ||
1765            IS_SWAPFILE(file_inode(tmp.file))) {
1766                error = -EINVAL;
1767                goto out_put_tmp_file;
1768        }
1769
1770        /*
1771         * We need to ensure that the fds passed in point to XFS inodes
1772         * before we cast and access them as XFS structures as we have no
1773         * control over what the user passes us here.
1774         */
1775        if (f.file->f_op != &xfs_file_operations ||
1776            tmp.file->f_op != &xfs_file_operations) {
1777                error = -EINVAL;
1778                goto out_put_tmp_file;
1779        }
1780
1781        ip = XFS_I(file_inode(f.file));
1782        tip = XFS_I(file_inode(tmp.file));
1783
1784        if (ip->i_mount != tip->i_mount) {
1785                error = -EINVAL;
1786                goto out_put_tmp_file;
1787        }
1788
1789        if (ip->i_ino == tip->i_ino) {
1790                error = -EINVAL;
1791                goto out_put_tmp_file;
1792        }
1793
1794        if (xfs_is_shutdown(ip->i_mount)) {
1795                error = -EIO;
1796                goto out_put_tmp_file;
1797        }
1798
1799        error = xfs_swap_extents(ip, tip, sxp);
1800
1801 out_put_tmp_file:
1802        fdput(tmp);
1803 out_put_file:
1804        fdput(f);
1805 out:
1806        return error;
1807}
1808
1809static int
1810xfs_ioc_getlabel(
1811        struct xfs_mount        *mp,
1812        char                    __user *user_label)
1813{
1814        struct xfs_sb           *sbp = &mp->m_sb;
1815        char                    label[XFSLABEL_MAX + 1];
1816
1817        /* Paranoia */
1818        BUILD_BUG_ON(sizeof(sbp->sb_fname) > FSLABEL_MAX);
1819
1820        /* 1 larger than sb_fname, so this ensures a trailing NUL char */
1821        memset(label, 0, sizeof(label));
1822        spin_lock(&mp->m_sb_lock);
1823        strncpy(label, sbp->sb_fname, XFSLABEL_MAX);
1824        spin_unlock(&mp->m_sb_lock);
1825
1826        if (copy_to_user(user_label, label, sizeof(label)))
1827                return -EFAULT;
1828        return 0;
1829}
1830
1831static int
1832xfs_ioc_setlabel(
1833        struct file             *filp,
1834        struct xfs_mount        *mp,
1835        char                    __user *newlabel)
1836{
1837        struct xfs_sb           *sbp = &mp->m_sb;
1838        char                    label[XFSLABEL_MAX + 1];
1839        size_t                  len;
1840        int                     error;
1841
1842        if (!capable(CAP_SYS_ADMIN))
1843                return -EPERM;
1844        /*
1845         * The generic ioctl allows up to FSLABEL_MAX chars, but XFS is much
1846         * smaller, at 12 bytes.  We copy one more to be sure we find the
1847         * (required) NULL character to test the incoming label length.
1848         * NB: The on disk label doesn't need to be null terminated.
1849         */
1850        if (copy_from_user(label, newlabel, XFSLABEL_MAX + 1))
1851                return -EFAULT;
1852        len = strnlen(label, XFSLABEL_MAX + 1);
1853        if (len > sizeof(sbp->sb_fname))
1854                return -EINVAL;
1855
1856        error = mnt_want_write_file(filp);
1857        if (error)
1858                return error;
1859
1860        spin_lock(&mp->m_sb_lock);
1861        memset(sbp->sb_fname, 0, sizeof(sbp->sb_fname));
1862        memcpy(sbp->sb_fname, label, len);
1863        spin_unlock(&mp->m_sb_lock);
1864
1865        /*
1866         * Now we do several things to satisfy userspace.
1867         * In addition to normal logging of the primary superblock, we also
1868         * immediately write these changes to sector zero for the primary, then
1869         * update all backup supers (as xfs_db does for a label change), then
1870         * invalidate the block device page cache.  This is so that any prior
1871         * buffered reads from userspace (i.e. from blkid) are invalidated,
1872         * and userspace will see the newly-written label.
1873         */
1874        error = xfs_sync_sb_buf(mp);
1875        if (error)
1876                goto out;
1877        /*
1878         * growfs also updates backup supers so lock against that.
1879         */
1880        mutex_lock(&mp->m_growlock);
1881        error = xfs_update_secondary_sbs(mp);
1882        mutex_unlock(&mp->m_growlock);
1883
1884        invalidate_bdev(mp->m_ddev_targp->bt_bdev);
1885
1886out:
1887        mnt_drop_write_file(filp);
1888        return error;
1889}
1890
1891static inline int
1892xfs_fs_eofblocks_from_user(
1893        struct xfs_fs_eofblocks         *src,
1894        struct xfs_icwalk               *dst)
1895{
1896        if (src->eof_version != XFS_EOFBLOCKS_VERSION)
1897                return -EINVAL;
1898
1899        if (src->eof_flags & ~XFS_EOF_FLAGS_VALID)
1900                return -EINVAL;
1901
1902        if (memchr_inv(&src->pad32, 0, sizeof(src->pad32)) ||
1903            memchr_inv(src->pad64, 0, sizeof(src->pad64)))
1904                return -EINVAL;
1905
1906        dst->icw_flags = 0;
1907        if (src->eof_flags & XFS_EOF_FLAGS_SYNC)
1908                dst->icw_flags |= XFS_ICWALK_FLAG_SYNC;
1909        if (src->eof_flags & XFS_EOF_FLAGS_UID)
1910                dst->icw_flags |= XFS_ICWALK_FLAG_UID;
1911        if (src->eof_flags & XFS_EOF_FLAGS_GID)
1912                dst->icw_flags |= XFS_ICWALK_FLAG_GID;
1913        if (src->eof_flags & XFS_EOF_FLAGS_PRID)
1914                dst->icw_flags |= XFS_ICWALK_FLAG_PRID;
1915        if (src->eof_flags & XFS_EOF_FLAGS_MINFILESIZE)
1916                dst->icw_flags |= XFS_ICWALK_FLAG_MINFILESIZE;
1917
1918        dst->icw_prid = src->eof_prid;
1919        dst->icw_min_file_size = src->eof_min_file_size;
1920
1921        dst->icw_uid = INVALID_UID;
1922        if (src->eof_flags & XFS_EOF_FLAGS_UID) {
1923                dst->icw_uid = make_kuid(current_user_ns(), src->eof_uid);
1924                if (!uid_valid(dst->icw_uid))
1925                        return -EINVAL;
1926        }
1927
1928        dst->icw_gid = INVALID_GID;
1929        if (src->eof_flags & XFS_EOF_FLAGS_GID) {
1930                dst->icw_gid = make_kgid(current_user_ns(), src->eof_gid);
1931                if (!gid_valid(dst->icw_gid))
1932                        return -EINVAL;
1933        }
1934        return 0;
1935}
1936
1937/*
1938 * Note: some of the ioctl's return positive numbers as a
1939 * byte count indicating success, such as readlink_by_handle.
1940 * So we don't "sign flip" like most other routines.  This means
1941 * true errors need to be returned as a negative value.
1942 */
1943long
1944xfs_file_ioctl(
1945        struct file             *filp,
1946        unsigned int            cmd,
1947        unsigned long           p)
1948{
1949        struct inode            *inode = file_inode(filp);
1950        struct xfs_inode        *ip = XFS_I(inode);
1951        struct xfs_mount        *mp = ip->i_mount;
1952        void                    __user *arg = (void __user *)p;
1953        int                     error;
1954
1955        trace_xfs_file_ioctl(ip);
1956
1957        switch (cmd) {
1958        case FITRIM:
1959                return xfs_ioc_trim(mp, arg);
1960        case FS_IOC_GETFSLABEL:
1961                return xfs_ioc_getlabel(mp, arg);
1962        case FS_IOC_SETFSLABEL:
1963                return xfs_ioc_setlabel(filp, mp, arg);
1964        case XFS_IOC_ALLOCSP:
1965        case XFS_IOC_FREESP:
1966        case XFS_IOC_ALLOCSP64:
1967        case XFS_IOC_FREESP64: {
1968                xfs_flock64_t           bf;
1969
1970                if (copy_from_user(&bf, arg, sizeof(bf)))
1971                        return -EFAULT;
1972                return xfs_ioc_space(filp, &bf);
1973        }
1974        case XFS_IOC_DIOINFO: {
1975                struct xfs_buftarg      *target = xfs_inode_buftarg(ip);
1976                struct dioattr          da;
1977
1978                da.d_mem =  da.d_miniosz = target->bt_logical_sectorsize;
1979                da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1);
1980
1981                if (copy_to_user(arg, &da, sizeof(da)))
1982                        return -EFAULT;
1983                return 0;
1984        }
1985
1986        case XFS_IOC_FSBULKSTAT_SINGLE:
1987        case XFS_IOC_FSBULKSTAT:
1988        case XFS_IOC_FSINUMBERS:
1989                return xfs_ioc_fsbulkstat(filp, cmd, arg);
1990
1991        case XFS_IOC_BULKSTAT:
1992                return xfs_ioc_bulkstat(filp, cmd, arg);
1993        case XFS_IOC_INUMBERS:
1994                return xfs_ioc_inumbers(mp, cmd, arg);
1995
1996        case XFS_IOC_FSGEOMETRY_V1:
1997                return xfs_ioc_fsgeometry(mp, arg, 3);
1998        case XFS_IOC_FSGEOMETRY_V4:
1999                return xfs_ioc_fsgeometry(mp, arg, 4);
2000        case XFS_IOC_FSGEOMETRY:
2001                return xfs_ioc_fsgeometry(mp, arg, 5);
2002
2003        case XFS_IOC_AG_GEOMETRY:
2004                return xfs_ioc_ag_geometry(mp, arg);
2005
2006        case XFS_IOC_GETVERSION:
2007                return put_user(inode->i_generation, (int __user *)arg);
2008
2009        case XFS_IOC_FSGETXATTRA:
2010                return xfs_ioc_fsgetxattra(ip, arg);
2011
2012        case XFS_IOC_GETBMAP:
2013        case XFS_IOC_GETBMAPA:
2014        case XFS_IOC_GETBMAPX:
2015                return xfs_ioc_getbmap(filp, cmd, arg);
2016
2017        case FS_IOC_GETFSMAP:
2018                return xfs_ioc_getfsmap(ip, arg);
2019
2020        case XFS_IOC_SCRUB_METADATA:
2021                return xfs_ioc_scrub_metadata(filp, arg);
2022
2023        case XFS_IOC_FD_TO_HANDLE:
2024        case XFS_IOC_PATH_TO_HANDLE:
2025        case XFS_IOC_PATH_TO_FSHANDLE: {
2026                xfs_fsop_handlereq_t    hreq;
2027
2028                if (copy_from_user(&hreq, arg, sizeof(hreq)))
2029                        return -EFAULT;
2030                return xfs_find_handle(cmd, &hreq);
2031        }
2032        case XFS_IOC_OPEN_BY_HANDLE: {
2033                xfs_fsop_handlereq_t    hreq;
2034
2035                if (copy_from_user(&hreq, arg, sizeof(xfs_fsop_handlereq_t)))
2036                        return -EFAULT;
2037                return xfs_open_by_handle(filp, &hreq);
2038        }
2039
2040        case XFS_IOC_READLINK_BY_HANDLE: {
2041                xfs_fsop_handlereq_t    hreq;
2042
2043                if (copy_from_user(&hreq, arg, sizeof(xfs_fsop_handlereq_t)))
2044                        return -EFAULT;
2045                return xfs_readlink_by_handle(filp, &hreq);
2046        }
2047        case XFS_IOC_ATTRLIST_BY_HANDLE:
2048                return xfs_attrlist_by_handle(filp, arg);
2049
2050        case XFS_IOC_ATTRMULTI_BY_HANDLE:
2051                return xfs_attrmulti_by_handle(filp, arg);
2052
2053        case XFS_IOC_SWAPEXT: {
2054                struct xfs_swapext      sxp;
2055
2056                if (copy_from_user(&sxp, arg, sizeof(xfs_swapext_t)))
2057                        return -EFAULT;
2058                error = mnt_want_write_file(filp);
2059                if (error)
2060                        return error;
2061                error = xfs_ioc_swapext(&sxp);
2062                mnt_drop_write_file(filp);
2063                return error;
2064        }
2065
2066        case XFS_IOC_FSCOUNTS: {
2067                xfs_fsop_counts_t out;
2068
2069                xfs_fs_counts(mp, &out);
2070
2071                if (copy_to_user(arg, &out, sizeof(out)))
2072                        return -EFAULT;
2073                return 0;
2074        }
2075
2076        case XFS_IOC_SET_RESBLKS: {
2077                xfs_fsop_resblks_t inout;
2078                uint64_t           in;
2079
2080                if (!capable(CAP_SYS_ADMIN))
2081                        return -EPERM;
2082
2083                if (xfs_is_readonly(mp))
2084                        return -EROFS;
2085
2086                if (copy_from_user(&inout, arg, sizeof(inout)))
2087                        return -EFAULT;
2088
2089                error = mnt_want_write_file(filp);
2090                if (error)
2091                        return error;
2092
2093                /* input parameter is passed in resblks field of structure */
2094                in = inout.resblks;
2095                error = xfs_reserve_blocks(mp, &in, &inout);
2096                mnt_drop_write_file(filp);
2097                if (error)
2098                        return error;
2099
2100                if (copy_to_user(arg, &inout, sizeof(inout)))
2101                        return -EFAULT;
2102                return 0;
2103        }
2104
2105        case XFS_IOC_GET_RESBLKS: {
2106                xfs_fsop_resblks_t out;
2107
2108                if (!capable(CAP_SYS_ADMIN))
2109                        return -EPERM;
2110
2111                error = xfs_reserve_blocks(mp, NULL, &out);
2112                if (error)
2113                        return error;
2114
2115                if (copy_to_user(arg, &out, sizeof(out)))
2116                        return -EFAULT;
2117
2118                return 0;
2119        }
2120
2121        case XFS_IOC_FSGROWFSDATA: {
2122                struct xfs_growfs_data in;
2123
2124                if (copy_from_user(&in, arg, sizeof(in)))
2125                        return -EFAULT;
2126
2127                error = mnt_want_write_file(filp);
2128                if (error)
2129                        return error;
2130                error = xfs_growfs_data(mp, &in);
2131                mnt_drop_write_file(filp);
2132                return error;
2133        }
2134
2135        case XFS_IOC_FSGROWFSLOG: {
2136                struct xfs_growfs_log in;
2137
2138                if (copy_from_user(&in, arg, sizeof(in)))
2139                        return -EFAULT;
2140
2141                error = mnt_want_write_file(filp);
2142                if (error)
2143                        return error;
2144                error = xfs_growfs_log(mp, &in);
2145                mnt_drop_write_file(filp);
2146                return error;
2147        }
2148
2149        case XFS_IOC_FSGROWFSRT: {
2150                xfs_growfs_rt_t in;
2151
2152                if (copy_from_user(&in, arg, sizeof(in)))
2153                        return -EFAULT;
2154
2155                error = mnt_want_write_file(filp);
2156                if (error)
2157                        return error;
2158                error = xfs_growfs_rt(mp, &in);
2159                mnt_drop_write_file(filp);
2160                return error;
2161        }
2162
2163        case XFS_IOC_GOINGDOWN: {
2164                uint32_t in;
2165
2166                if (!capable(CAP_SYS_ADMIN))
2167                        return -EPERM;
2168
2169                if (get_user(in, (uint32_t __user *)arg))
2170                        return -EFAULT;
2171
2172                return xfs_fs_goingdown(mp, in);
2173        }
2174
2175        case XFS_IOC_ERROR_INJECTION: {
2176                xfs_error_injection_t in;
2177
2178                if (!capable(CAP_SYS_ADMIN))
2179                        return -EPERM;
2180
2181                if (copy_from_user(&in, arg, sizeof(in)))
2182                        return -EFAULT;
2183
2184                return xfs_errortag_add(mp, in.errtag);
2185        }
2186
2187        case XFS_IOC_ERROR_CLEARALL:
2188                if (!capable(CAP_SYS_ADMIN))
2189                        return -EPERM;
2190
2191                return xfs_errortag_clearall(mp);
2192
2193        case XFS_IOC_FREE_EOFBLOCKS: {
2194                struct xfs_fs_eofblocks eofb;
2195                struct xfs_icwalk       icw;
2196
2197                if (!capable(CAP_SYS_ADMIN))
2198                        return -EPERM;
2199
2200                if (xfs_is_readonly(mp))
2201                        return -EROFS;
2202
2203                if (copy_from_user(&eofb, arg, sizeof(eofb)))
2204                        return -EFAULT;
2205
2206                error = xfs_fs_eofblocks_from_user(&eofb, &icw);
2207                if (error)
2208                        return error;
2209
2210                trace_xfs_ioc_free_eofblocks(mp, &icw, _RET_IP_);
2211
2212                sb_start_write(mp->m_super);
2213                error = xfs_blockgc_free_space(mp, &icw);
2214                sb_end_write(mp->m_super);
2215                return error;
2216        }
2217
2218        default:
2219                return -ENOTTY;
2220        }
2221}
2222