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