linux/fs/xfs/xfs_ioctl.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
   3 * All Rights Reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it would be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write the Free Software Foundation,
  16 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  17 */
  18#include "xfs.h"
  19#include "xfs_fs.h"
  20#include "xfs_shared.h"
  21#include "xfs_format.h"
  22#include "xfs_log_format.h"
  23#include "xfs_trans_resv.h"
  24#include "xfs_mount.h"
  25#include "xfs_inode.h"
  26#include "xfs_ioctl.h"
  27#include "xfs_alloc.h"
  28#include "xfs_rtalloc.h"
  29#include "xfs_itable.h"
  30#include "xfs_error.h"
  31#include "xfs_attr.h"
  32#include "xfs_bmap.h"
  33#include "xfs_bmap_util.h"
  34#include "xfs_fsops.h"
  35#include "xfs_discard.h"
  36#include "xfs_quota.h"
  37#include "xfs_export.h"
  38#include "xfs_trace.h"
  39#include "xfs_icache.h"
  40#include "xfs_symlink.h"
  41#include "xfs_trans.h"
  42#include "xfs_pnfs.h"
  43#include "xfs_acl.h"
  44
  45#include <linux/capability.h>
  46#include <linux/dcache.h>
  47#include <linux/mount.h>
  48#include <linux/namei.h>
  49#include <linux/pagemap.h>
  50#include <linux/slab.h>
  51#include <linux/exportfs.h>
  52
  53/*
  54 * xfs_find_handle maps from userspace xfs_fsop_handlereq structure to
  55 * a file or fs handle.
  56 *
  57 * XFS_IOC_PATH_TO_FSHANDLE
  58 *    returns fs handle for a mount point or path within that mount point
  59 * XFS_IOC_FD_TO_HANDLE
  60 *    returns full handle for a FD opened in user space
  61 * XFS_IOC_PATH_TO_HANDLE
  62 *    returns full handle for a path
  63 */
  64int
  65xfs_find_handle(
  66        unsigned int            cmd,
  67        xfs_fsop_handlereq_t    *hreq)
  68{
  69        int                     hsize;
  70        xfs_handle_t            handle;
  71        struct inode            *inode;
  72        struct fd               f = {NULL};
  73        struct path             path;
  74        int                     error;
  75        struct xfs_inode        *ip;
  76
  77        if (cmd == XFS_IOC_FD_TO_HANDLE) {
  78                f = fdget(hreq->fd);
  79                if (!f.file)
  80                        return -EBADF;
  81                inode = file_inode(f.file);
  82        } else {
  83                error = user_lpath((const char __user *)hreq->path, &path);
  84                if (error)
  85                        return error;
  86                inode = d_inode(path.dentry);
  87        }
  88        ip = XFS_I(inode);
  89
  90        /*
  91         * We can only generate handles for inodes residing on a XFS filesystem,
  92         * and only for regular files, directories or symbolic links.
  93         */
  94        error = -EINVAL;
  95        if (inode->i_sb->s_magic != XFS_SB_MAGIC)
  96                goto out_put;
  97
  98        error = -EBADF;
  99        if (!S_ISREG(inode->i_mode) &&
 100            !S_ISDIR(inode->i_mode) &&
 101            !S_ISLNK(inode->i_mode))
 102                goto out_put;
 103
 104
 105        memcpy(&handle.ha_fsid, ip->i_mount->m_fixedfsid, sizeof(xfs_fsid_t));
 106
 107        if (cmd == XFS_IOC_PATH_TO_FSHANDLE) {
 108                /*
 109                 * This handle only contains an fsid, zero the rest.
 110                 */
 111                memset(&handle.ha_fid, 0, sizeof(handle.ha_fid));
 112                hsize = sizeof(xfs_fsid_t);
 113        } else {
 114                handle.ha_fid.fid_len = sizeof(xfs_fid_t) -
 115                                        sizeof(handle.ha_fid.fid_len);
 116                handle.ha_fid.fid_pad = 0;
 117                handle.ha_fid.fid_gen = inode->i_generation;
 118                handle.ha_fid.fid_ino = ip->i_ino;
 119
 120                hsize = XFS_HSIZE(handle);
 121        }
 122
 123        error = -EFAULT;
 124        if (copy_to_user(hreq->ohandle, &handle, hsize) ||
 125            copy_to_user(hreq->ohandlen, &hsize, sizeof(__s32)))
 126                goto out_put;
 127
 128        error = 0;
 129
 130 out_put:
 131        if (cmd == XFS_IOC_FD_TO_HANDLE)
 132                fdput(f);
 133        else
 134                path_put(&path);
 135        return error;
 136}
 137
 138/*
 139 * No need to do permission checks on the various pathname components
 140 * as the handle operations are privileged.
 141 */
 142STATIC int
 143xfs_handle_acceptable(
 144        void                    *context,
 145        struct dentry           *dentry)
 146{
 147        return 1;
 148}
 149
 150/*
 151 * Convert userspace handle data into a dentry.
 152 */
 153struct dentry *
 154xfs_handle_to_dentry(
 155        struct file             *parfilp,
 156        void __user             *uhandle,
 157        u32                     hlen)
 158{
 159        xfs_handle_t            handle;
 160        struct xfs_fid64        fid;
 161
 162        /*
 163         * Only allow handle opens under a directory.
 164         */
 165        if (!S_ISDIR(file_inode(parfilp)->i_mode))
 166                return ERR_PTR(-ENOTDIR);
 167
 168        if (hlen != sizeof(xfs_handle_t))
 169                return ERR_PTR(-EINVAL);
 170        if (copy_from_user(&handle, uhandle, hlen))
 171                return ERR_PTR(-EFAULT);
 172        if (handle.ha_fid.fid_len !=
 173            sizeof(handle.ha_fid) - sizeof(handle.ha_fid.fid_len))
 174                return ERR_PTR(-EINVAL);
 175
 176        memset(&fid, 0, sizeof(struct fid));
 177        fid.ino = handle.ha_fid.fid_ino;
 178        fid.gen = handle.ha_fid.fid_gen;
 179
 180        return exportfs_decode_fh(parfilp->f_path.mnt, (struct fid *)&fid, 3,
 181                        FILEID_INO32_GEN | XFS_FILEID_TYPE_64FLAG,
 182                        xfs_handle_acceptable, NULL);
 183}
 184
 185STATIC struct dentry *
 186xfs_handlereq_to_dentry(
 187        struct file             *parfilp,
 188        xfs_fsop_handlereq_t    *hreq)
 189{
 190        return xfs_handle_to_dentry(parfilp, hreq->ihandle, hreq->ihandlen);
 191}
 192
 193int
 194xfs_open_by_handle(
 195        struct file             *parfilp,
 196        xfs_fsop_handlereq_t    *hreq)
 197{
 198        const struct cred       *cred = current_cred();
 199        int                     error;
 200        int                     fd;
 201        int                     permflag;
 202        struct file             *filp;
 203        struct inode            *inode;
 204        struct dentry           *dentry;
 205        fmode_t                 fmode;
 206        struct path             path;
 207
 208        if (!capable(CAP_SYS_ADMIN))
 209                return -EPERM;
 210
 211        dentry = xfs_handlereq_to_dentry(parfilp, hreq);
 212        if (IS_ERR(dentry))
 213                return PTR_ERR(dentry);
 214        inode = d_inode(dentry);
 215
 216        /* Restrict xfs_open_by_handle to directories & regular files. */
 217        if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode))) {
 218                error = -EPERM;
 219                goto out_dput;
 220        }
 221
 222#if BITS_PER_LONG != 32
 223        hreq->oflags |= O_LARGEFILE;
 224#endif
 225
 226        permflag = hreq->oflags;
 227        fmode = OPEN_FMODE(permflag);
 228        if ((!(permflag & O_APPEND) || (permflag & O_TRUNC)) &&
 229            (fmode & FMODE_WRITE) && IS_APPEND(inode)) {
 230                error = -EPERM;
 231                goto out_dput;
 232        }
 233
 234        if ((fmode & FMODE_WRITE) && IS_IMMUTABLE(inode)) {
 235                error = -EACCES;
 236                goto out_dput;
 237        }
 238
 239        /* Can't write directories. */
 240        if (S_ISDIR(inode->i_mode) && (fmode & FMODE_WRITE)) {
 241                error = -EISDIR;
 242                goto out_dput;
 243        }
 244
 245        fd = get_unused_fd_flags(0);
 246        if (fd < 0) {
 247                error = fd;
 248                goto out_dput;
 249        }
 250
 251        path.mnt = parfilp->f_path.mnt;
 252        path.dentry = dentry;
 253        filp = dentry_open(&path, hreq->oflags, cred);
 254        dput(dentry);
 255        if (IS_ERR(filp)) {
 256                put_unused_fd(fd);
 257                return PTR_ERR(filp);
 258        }
 259
 260        if (S_ISREG(inode->i_mode)) {
 261                filp->f_flags |= O_NOATIME;
 262                filp->f_mode |= FMODE_NOCMTIME;
 263        }
 264
 265        fd_install(fd, filp);
 266        return fd;
 267
 268 out_dput:
 269        dput(dentry);
 270        return error;
 271}
 272
 273int
 274xfs_readlink_by_handle(
 275        struct file             *parfilp,
 276        xfs_fsop_handlereq_t    *hreq)
 277{
 278        struct dentry           *dentry;
 279        __u32                   olen;
 280        void                    *link;
 281        int                     error;
 282
 283        if (!capable(CAP_SYS_ADMIN))
 284                return -EPERM;
 285
 286        dentry = xfs_handlereq_to_dentry(parfilp, hreq);
 287        if (IS_ERR(dentry))
 288                return PTR_ERR(dentry);
 289
 290        /* Restrict this handle operation to symlinks only. */
 291        if (!d_is_symlink(dentry)) {
 292                error = -EINVAL;
 293                goto out_dput;
 294        }
 295
 296        if (copy_from_user(&olen, hreq->ohandlen, sizeof(__u32))) {
 297                error = -EFAULT;
 298                goto out_dput;
 299        }
 300
 301        link = kmalloc(MAXPATHLEN+1, GFP_KERNEL);
 302        if (!link) {
 303                error = -ENOMEM;
 304                goto out_dput;
 305        }
 306
 307        error = xfs_readlink(XFS_I(d_inode(dentry)), link);
 308        if (error)
 309                goto out_kfree;
 310        error = readlink_copy(hreq->ohandle, olen, link);
 311        if (error)
 312                goto out_kfree;
 313
 314 out_kfree:
 315        kfree(link);
 316 out_dput:
 317        dput(dentry);
 318        return error;
 319}
 320
 321int
 322xfs_set_dmattrs(
 323        xfs_inode_t     *ip,
 324        u_int           evmask,
 325        u_int16_t       state)
 326{
 327        xfs_mount_t     *mp = ip->i_mount;
 328        xfs_trans_t     *tp;
 329        int             error;
 330
 331        if (!capable(CAP_SYS_ADMIN))
 332                return -EPERM;
 333
 334        if (XFS_FORCED_SHUTDOWN(mp))
 335                return -EIO;
 336
 337        tp = xfs_trans_alloc(mp, XFS_TRANS_SET_DMATTRS);
 338        error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ichange, 0, 0);
 339        if (error) {
 340                xfs_trans_cancel(tp);
 341                return error;
 342        }
 343        xfs_ilock(ip, XFS_ILOCK_EXCL);
 344        xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
 345
 346        ip->i_d.di_dmevmask = evmask;
 347        ip->i_d.di_dmstate  = state;
 348
 349        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
 350        error = xfs_trans_commit(tp);
 351
 352        return error;
 353}
 354
 355STATIC int
 356xfs_fssetdm_by_handle(
 357        struct file             *parfilp,
 358        void                    __user *arg)
 359{
 360        int                     error;
 361        struct fsdmidata        fsd;
 362        xfs_fsop_setdm_handlereq_t dmhreq;
 363        struct dentry           *dentry;
 364
 365        if (!capable(CAP_MKNOD))
 366                return -EPERM;
 367        if (copy_from_user(&dmhreq, arg, sizeof(xfs_fsop_setdm_handlereq_t)))
 368                return -EFAULT;
 369
 370        error = mnt_want_write_file(parfilp);
 371        if (error)
 372                return error;
 373
 374        dentry = xfs_handlereq_to_dentry(parfilp, &dmhreq.hreq);
 375        if (IS_ERR(dentry)) {
 376                mnt_drop_write_file(parfilp);
 377                return PTR_ERR(dentry);
 378        }
 379
 380        if (IS_IMMUTABLE(d_inode(dentry)) || IS_APPEND(d_inode(dentry))) {
 381                error = -EPERM;
 382                goto out;
 383        }
 384
 385        if (copy_from_user(&fsd, dmhreq.data, sizeof(fsd))) {
 386                error = -EFAULT;
 387                goto out;
 388        }
 389
 390        error = xfs_set_dmattrs(XFS_I(d_inode(dentry)), fsd.fsd_dmevmask,
 391                                 fsd.fsd_dmstate);
 392
 393 out:
 394        mnt_drop_write_file(parfilp);
 395        dput(dentry);
 396        return error;
 397}
 398
 399STATIC int
 400xfs_attrlist_by_handle(
 401        struct file             *parfilp,
 402        void                    __user *arg)
 403{
 404        int                     error = -ENOMEM;
 405        attrlist_cursor_kern_t  *cursor;
 406        xfs_fsop_attrlist_handlereq_t al_hreq;
 407        struct dentry           *dentry;
 408        char                    *kbuf;
 409
 410        if (!capable(CAP_SYS_ADMIN))
 411                return -EPERM;
 412        if (copy_from_user(&al_hreq, arg, sizeof(xfs_fsop_attrlist_handlereq_t)))
 413                return -EFAULT;
 414        if (al_hreq.buflen < sizeof(struct attrlist) ||
 415            al_hreq.buflen > XFS_XATTR_LIST_MAX)
 416                return -EINVAL;
 417
 418        /*
 419         * Reject flags, only allow namespaces.
 420         */
 421        if (al_hreq.flags & ~(ATTR_ROOT | ATTR_SECURE))
 422                return -EINVAL;
 423
 424        dentry = xfs_handlereq_to_dentry(parfilp, &al_hreq.hreq);
 425        if (IS_ERR(dentry))
 426                return PTR_ERR(dentry);
 427
 428        kbuf = kmem_zalloc_large(al_hreq.buflen, KM_SLEEP);
 429        if (!kbuf)
 430                goto out_dput;
 431
 432        cursor = (attrlist_cursor_kern_t *)&al_hreq.pos;
 433        error = xfs_attr_list(XFS_I(d_inode(dentry)), kbuf, al_hreq.buflen,
 434                                        al_hreq.flags, cursor);
 435        if (error)
 436                goto out_kfree;
 437
 438        if (copy_to_user(al_hreq.buffer, kbuf, al_hreq.buflen))
 439                error = -EFAULT;
 440
 441out_kfree:
 442        kmem_free(kbuf);
 443out_dput:
 444        dput(dentry);
 445        return error;
 446}
 447
 448int
 449xfs_attrmulti_attr_get(
 450        struct inode            *inode,
 451        unsigned char           *name,
 452        unsigned char           __user *ubuf,
 453        __uint32_t              *len,
 454        __uint32_t              flags)
 455{
 456        unsigned char           *kbuf;
 457        int                     error = -EFAULT;
 458
 459        if (*len > XFS_XATTR_SIZE_MAX)
 460                return -EINVAL;
 461        kbuf = kmem_zalloc_large(*len, KM_SLEEP);
 462        if (!kbuf)
 463                return -ENOMEM;
 464
 465        error = xfs_attr_get(XFS_I(inode), name, kbuf, (int *)len, flags);
 466        if (error)
 467                goto out_kfree;
 468
 469        if (copy_to_user(ubuf, kbuf, *len))
 470                error = -EFAULT;
 471
 472out_kfree:
 473        kmem_free(kbuf);
 474        return error;
 475}
 476
 477int
 478xfs_attrmulti_attr_set(
 479        struct inode            *inode,
 480        unsigned char           *name,
 481        const unsigned char     __user *ubuf,
 482        __uint32_t              len,
 483        __uint32_t              flags)
 484{
 485        unsigned char           *kbuf;
 486        int                     error;
 487
 488        if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
 489                return -EPERM;
 490        if (len > XFS_XATTR_SIZE_MAX)
 491                return -EINVAL;
 492
 493        kbuf = memdup_user(ubuf, len);
 494        if (IS_ERR(kbuf))
 495                return PTR_ERR(kbuf);
 496
 497        error = xfs_attr_set(XFS_I(inode), name, kbuf, len, flags);
 498        if (!error)
 499                xfs_forget_acl(inode, name, flags);
 500        kfree(kbuf);
 501        return error;
 502}
 503
 504int
 505xfs_attrmulti_attr_remove(
 506        struct inode            *inode,
 507        unsigned char           *name,
 508        __uint32_t              flags)
 509{
 510        int                     error;
 511
 512        if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
 513                return -EPERM;
 514        error = xfs_attr_remove(XFS_I(inode), name, flags);
 515        if (!error)
 516                xfs_forget_acl(inode, name, flags);
 517        return error;
 518}
 519
 520STATIC int
 521xfs_attrmulti_by_handle(
 522        struct file             *parfilp,
 523        void                    __user *arg)
 524{
 525        int                     error;
 526        xfs_attr_multiop_t      *ops;
 527        xfs_fsop_attrmulti_handlereq_t am_hreq;
 528        struct dentry           *dentry;
 529        unsigned int            i, size;
 530        unsigned char           *attr_name;
 531
 532        if (!capable(CAP_SYS_ADMIN))
 533                return -EPERM;
 534        if (copy_from_user(&am_hreq, arg, sizeof(xfs_fsop_attrmulti_handlereq_t)))
 535                return -EFAULT;
 536
 537        /* overflow check */
 538        if (am_hreq.opcount >= INT_MAX / sizeof(xfs_attr_multiop_t))
 539                return -E2BIG;
 540
 541        dentry = xfs_handlereq_to_dentry(parfilp, &am_hreq.hreq);
 542        if (IS_ERR(dentry))
 543                return PTR_ERR(dentry);
 544
 545        error = -E2BIG;
 546        size = am_hreq.opcount * sizeof(xfs_attr_multiop_t);
 547        if (!size || size > 16 * PAGE_SIZE)
 548                goto out_dput;
 549
 550        ops = memdup_user(am_hreq.ops, size);
 551        if (IS_ERR(ops)) {
 552                error = PTR_ERR(ops);
 553                goto out_dput;
 554        }
 555
 556        error = -ENOMEM;
 557        attr_name = kmalloc(MAXNAMELEN, GFP_KERNEL);
 558        if (!attr_name)
 559                goto out_kfree_ops;
 560
 561        error = 0;
 562        for (i = 0; i < am_hreq.opcount; i++) {
 563                ops[i].am_error = strncpy_from_user((char *)attr_name,
 564                                ops[i].am_attrname, MAXNAMELEN);
 565                if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN)
 566                        error = -ERANGE;
 567                if (ops[i].am_error < 0)
 568                        break;
 569
 570                switch (ops[i].am_opcode) {
 571                case ATTR_OP_GET:
 572                        ops[i].am_error = xfs_attrmulti_attr_get(
 573                                        d_inode(dentry), attr_name,
 574                                        ops[i].am_attrvalue, &ops[i].am_length,
 575                                        ops[i].am_flags);
 576                        break;
 577                case ATTR_OP_SET:
 578                        ops[i].am_error = mnt_want_write_file(parfilp);
 579                        if (ops[i].am_error)
 580                                break;
 581                        ops[i].am_error = xfs_attrmulti_attr_set(
 582                                        d_inode(dentry), attr_name,
 583                                        ops[i].am_attrvalue, ops[i].am_length,
 584                                        ops[i].am_flags);
 585                        mnt_drop_write_file(parfilp);
 586                        break;
 587                case ATTR_OP_REMOVE:
 588                        ops[i].am_error = mnt_want_write_file(parfilp);
 589                        if (ops[i].am_error)
 590                                break;
 591                        ops[i].am_error = xfs_attrmulti_attr_remove(
 592                                        d_inode(dentry), attr_name,
 593                                        ops[i].am_flags);
 594                        mnt_drop_write_file(parfilp);
 595                        break;
 596                default:
 597                        ops[i].am_error = -EINVAL;
 598                }
 599        }
 600
 601        if (copy_to_user(am_hreq.ops, ops, size))
 602                error = -EFAULT;
 603
 604        kfree(attr_name);
 605 out_kfree_ops:
 606        kfree(ops);
 607 out_dput:
 608        dput(dentry);
 609        return error;
 610}
 611
 612int
 613xfs_ioc_space(
 614        struct xfs_inode        *ip,
 615        struct inode            *inode,
 616        struct file             *filp,
 617        int                     ioflags,
 618        unsigned int            cmd,
 619        xfs_flock64_t           *bf)
 620{
 621        struct iattr            iattr;
 622        enum xfs_prealloc_flags flags = 0;
 623        uint                    iolock = XFS_IOLOCK_EXCL;
 624        int                     error;
 625
 626        /*
 627         * Only allow the sys admin to reserve space unless
 628         * unwritten extents are enabled.
 629         */
 630        if (!xfs_sb_version_hasextflgbit(&ip->i_mount->m_sb) &&
 631            !capable(CAP_SYS_ADMIN))
 632                return -EPERM;
 633
 634        if (inode->i_flags & (S_IMMUTABLE|S_APPEND))
 635                return -EPERM;
 636
 637        if (!(filp->f_mode & FMODE_WRITE))
 638                return -EBADF;
 639
 640        if (!S_ISREG(inode->i_mode))
 641                return -EINVAL;
 642
 643        if (filp->f_flags & O_DSYNC)
 644                flags |= XFS_PREALLOC_SYNC;
 645        if (ioflags & XFS_IO_INVIS)
 646                flags |= XFS_PREALLOC_INVISIBLE;
 647
 648        error = mnt_want_write_file(filp);
 649        if (error)
 650                return error;
 651
 652        xfs_ilock(ip, iolock);
 653        error = xfs_break_layouts(inode, &iolock, false);
 654        if (error)
 655                goto out_unlock;
 656
 657        xfs_ilock(ip, XFS_MMAPLOCK_EXCL);
 658        iolock |= XFS_MMAPLOCK_EXCL;
 659
 660        switch (bf->l_whence) {
 661        case 0: /*SEEK_SET*/
 662                break;
 663        case 1: /*SEEK_CUR*/
 664                bf->l_start += filp->f_pos;
 665                break;
 666        case 2: /*SEEK_END*/
 667                bf->l_start += XFS_ISIZE(ip);
 668                break;
 669        default:
 670                error = -EINVAL;
 671                goto out_unlock;
 672        }
 673
 674        /*
 675         * length of <= 0 for resv/unresv/zero is invalid.  length for
 676         * alloc/free is ignored completely and we have no idea what userspace
 677         * might have set it to, so set it to zero to allow range
 678         * checks to pass.
 679         */
 680        switch (cmd) {
 681        case XFS_IOC_ZERO_RANGE:
 682        case XFS_IOC_RESVSP:
 683        case XFS_IOC_RESVSP64:
 684        case XFS_IOC_UNRESVSP:
 685        case XFS_IOC_UNRESVSP64:
 686                if (bf->l_len <= 0) {
 687                        error = -EINVAL;
 688                        goto out_unlock;
 689                }
 690                break;
 691        default:
 692                bf->l_len = 0;
 693                break;
 694        }
 695
 696        if (bf->l_start < 0 ||
 697            bf->l_start > inode->i_sb->s_maxbytes ||
 698            bf->l_start + bf->l_len < 0 ||
 699            bf->l_start + bf->l_len >= inode->i_sb->s_maxbytes) {
 700                error = -EINVAL;
 701                goto out_unlock;
 702        }
 703
 704        switch (cmd) {
 705        case XFS_IOC_ZERO_RANGE:
 706                flags |= XFS_PREALLOC_SET;
 707                error = xfs_zero_file_space(ip, bf->l_start, bf->l_len);
 708                break;
 709        case XFS_IOC_RESVSP:
 710        case XFS_IOC_RESVSP64:
 711                flags |= XFS_PREALLOC_SET;
 712                error = xfs_alloc_file_space(ip, bf->l_start, bf->l_len,
 713                                                XFS_BMAPI_PREALLOC);
 714                break;
 715        case XFS_IOC_UNRESVSP:
 716        case XFS_IOC_UNRESVSP64:
 717                error = xfs_free_file_space(ip, bf->l_start, bf->l_len);
 718                break;
 719        case XFS_IOC_ALLOCSP:
 720        case XFS_IOC_ALLOCSP64:
 721        case XFS_IOC_FREESP:
 722        case XFS_IOC_FREESP64:
 723                flags |= XFS_PREALLOC_CLEAR;
 724                if (bf->l_start > XFS_ISIZE(ip)) {
 725                        error = xfs_alloc_file_space(ip, XFS_ISIZE(ip),
 726                                        bf->l_start - XFS_ISIZE(ip), 0);
 727                        if (error)
 728                                goto out_unlock;
 729                }
 730
 731                iattr.ia_valid = ATTR_SIZE;
 732                iattr.ia_size = bf->l_start;
 733
 734                error = xfs_setattr_size(ip, &iattr);
 735                break;
 736        default:
 737                ASSERT(0);
 738                error = -EINVAL;
 739        }
 740
 741        if (error)
 742                goto out_unlock;
 743
 744        error = xfs_update_prealloc_flags(ip, flags);
 745
 746out_unlock:
 747        xfs_iunlock(ip, iolock);
 748        mnt_drop_write_file(filp);
 749        return error;
 750}
 751
 752STATIC int
 753xfs_ioc_bulkstat(
 754        xfs_mount_t             *mp,
 755        unsigned int            cmd,
 756        void                    __user *arg)
 757{
 758        xfs_fsop_bulkreq_t      bulkreq;
 759        int                     count;  /* # of records returned */
 760        xfs_ino_t               inlast; /* last inode number */
 761        int                     done;
 762        int                     error;
 763
 764        /* done = 1 if there are more stats to get and if bulkstat */
 765        /* should be called again (unused here, but used in dmapi) */
 766
 767        if (!capable(CAP_SYS_ADMIN))
 768                return -EPERM;
 769
 770        if (XFS_FORCED_SHUTDOWN(mp))
 771                return -EIO;
 772
 773        if (copy_from_user(&bulkreq, arg, sizeof(xfs_fsop_bulkreq_t)))
 774                return -EFAULT;
 775
 776        if (copy_from_user(&inlast, bulkreq.lastip, sizeof(__s64)))
 777                return -EFAULT;
 778
 779        if ((count = bulkreq.icount) <= 0)
 780                return -EINVAL;
 781
 782        if (bulkreq.ubuffer == NULL)
 783                return -EINVAL;
 784
 785        if (cmd == XFS_IOC_FSINUMBERS)
 786                error = xfs_inumbers(mp, &inlast, &count,
 787                                        bulkreq.ubuffer, xfs_inumbers_fmt);
 788        else if (cmd == XFS_IOC_FSBULKSTAT_SINGLE)
 789                error = xfs_bulkstat_one(mp, inlast, bulkreq.ubuffer,
 790                                        sizeof(xfs_bstat_t), NULL, &done);
 791        else    /* XFS_IOC_FSBULKSTAT */
 792                error = xfs_bulkstat(mp, &inlast, &count, xfs_bulkstat_one,
 793                                     sizeof(xfs_bstat_t), bulkreq.ubuffer,
 794                                     &done);
 795
 796        if (error)
 797                return error;
 798
 799        if (bulkreq.ocount != NULL) {
 800                if (copy_to_user(bulkreq.lastip, &inlast,
 801                                                sizeof(xfs_ino_t)))
 802                        return -EFAULT;
 803
 804                if (copy_to_user(bulkreq.ocount, &count, sizeof(count)))
 805                        return -EFAULT;
 806        }
 807
 808        return 0;
 809}
 810
 811STATIC int
 812xfs_ioc_fsgeometry_v1(
 813        xfs_mount_t             *mp,
 814        void                    __user *arg)
 815{
 816        xfs_fsop_geom_t         fsgeo;
 817        int                     error;
 818
 819        error = xfs_fs_geometry(mp, &fsgeo, 3);
 820        if (error)
 821                return error;
 822
 823        /*
 824         * Caller should have passed an argument of type
 825         * xfs_fsop_geom_v1_t.  This is a proper subset of the
 826         * xfs_fsop_geom_t that xfs_fs_geometry() fills in.
 827         */
 828        if (copy_to_user(arg, &fsgeo, sizeof(xfs_fsop_geom_v1_t)))
 829                return -EFAULT;
 830        return 0;
 831}
 832
 833STATIC int
 834xfs_ioc_fsgeometry(
 835        xfs_mount_t             *mp,
 836        void                    __user *arg)
 837{
 838        xfs_fsop_geom_t         fsgeo;
 839        int                     error;
 840
 841        error = xfs_fs_geometry(mp, &fsgeo, 4);
 842        if (error)
 843                return error;
 844
 845        if (copy_to_user(arg, &fsgeo, sizeof(fsgeo)))
 846                return -EFAULT;
 847        return 0;
 848}
 849
 850/*
 851 * Linux extended inode flags interface.
 852 */
 853
 854STATIC unsigned int
 855xfs_merge_ioc_xflags(
 856        unsigned int    flags,
 857        unsigned int    start)
 858{
 859        unsigned int    xflags = start;
 860
 861        if (flags & FS_IMMUTABLE_FL)
 862                xflags |= FS_XFLAG_IMMUTABLE;
 863        else
 864                xflags &= ~FS_XFLAG_IMMUTABLE;
 865        if (flags & FS_APPEND_FL)
 866                xflags |= FS_XFLAG_APPEND;
 867        else
 868                xflags &= ~FS_XFLAG_APPEND;
 869        if (flags & FS_SYNC_FL)
 870                xflags |= FS_XFLAG_SYNC;
 871        else
 872                xflags &= ~FS_XFLAG_SYNC;
 873        if (flags & FS_NOATIME_FL)
 874                xflags |= FS_XFLAG_NOATIME;
 875        else
 876                xflags &= ~FS_XFLAG_NOATIME;
 877        if (flags & FS_NODUMP_FL)
 878                xflags |= FS_XFLAG_NODUMP;
 879        else
 880                xflags &= ~FS_XFLAG_NODUMP;
 881
 882        return xflags;
 883}
 884
 885STATIC unsigned int
 886xfs_di2lxflags(
 887        __uint16_t      di_flags)
 888{
 889        unsigned int    flags = 0;
 890
 891        if (di_flags & XFS_DIFLAG_IMMUTABLE)
 892                flags |= FS_IMMUTABLE_FL;
 893        if (di_flags & XFS_DIFLAG_APPEND)
 894                flags |= FS_APPEND_FL;
 895        if (di_flags & XFS_DIFLAG_SYNC)
 896                flags |= FS_SYNC_FL;
 897        if (di_flags & XFS_DIFLAG_NOATIME)
 898                flags |= FS_NOATIME_FL;
 899        if (di_flags & XFS_DIFLAG_NODUMP)
 900                flags |= FS_NODUMP_FL;
 901        return flags;
 902}
 903
 904STATIC int
 905xfs_ioc_fsgetxattr(
 906        xfs_inode_t             *ip,
 907        int                     attr,
 908        void                    __user *arg)
 909{
 910        struct fsxattr          fa;
 911
 912        memset(&fa, 0, sizeof(struct fsxattr));
 913
 914        xfs_ilock(ip, XFS_ILOCK_SHARED);
 915        fa.fsx_xflags = xfs_ip2xflags(ip);
 916        fa.fsx_extsize = ip->i_d.di_extsize << ip->i_mount->m_sb.sb_blocklog;
 917        fa.fsx_projid = xfs_get_projid(ip);
 918
 919        if (attr) {
 920                if (ip->i_afp) {
 921                        if (ip->i_afp->if_flags & XFS_IFEXTENTS)
 922                                fa.fsx_nextents = ip->i_afp->if_bytes /
 923                                                        sizeof(xfs_bmbt_rec_t);
 924                        else
 925                                fa.fsx_nextents = ip->i_d.di_anextents;
 926                } else
 927                        fa.fsx_nextents = 0;
 928        } else {
 929                if (ip->i_df.if_flags & XFS_IFEXTENTS)
 930                        fa.fsx_nextents = ip->i_df.if_bytes /
 931                                                sizeof(xfs_bmbt_rec_t);
 932                else
 933                        fa.fsx_nextents = ip->i_d.di_nextents;
 934        }
 935        xfs_iunlock(ip, XFS_ILOCK_SHARED);
 936
 937        if (copy_to_user(arg, &fa, sizeof(fa)))
 938                return -EFAULT;
 939        return 0;
 940}
 941
 942STATIC void
 943xfs_set_diflags(
 944        struct xfs_inode        *ip,
 945        unsigned int            xflags)
 946{
 947        unsigned int            di_flags;
 948        uint64_t                di_flags2;
 949
 950        /* can't set PREALLOC this way, just preserve it */
 951        di_flags = (ip->i_d.di_flags & XFS_DIFLAG_PREALLOC);
 952        if (xflags & FS_XFLAG_IMMUTABLE)
 953                di_flags |= XFS_DIFLAG_IMMUTABLE;
 954        if (xflags & FS_XFLAG_APPEND)
 955                di_flags |= XFS_DIFLAG_APPEND;
 956        if (xflags & FS_XFLAG_SYNC)
 957                di_flags |= XFS_DIFLAG_SYNC;
 958        if (xflags & FS_XFLAG_NOATIME)
 959                di_flags |= XFS_DIFLAG_NOATIME;
 960        if (xflags & FS_XFLAG_NODUMP)
 961                di_flags |= XFS_DIFLAG_NODUMP;
 962        if (xflags & FS_XFLAG_NODEFRAG)
 963                di_flags |= XFS_DIFLAG_NODEFRAG;
 964        if (xflags & FS_XFLAG_FILESTREAM)
 965                di_flags |= XFS_DIFLAG_FILESTREAM;
 966        if (S_ISDIR(VFS_I(ip)->i_mode)) {
 967                if (xflags & FS_XFLAG_RTINHERIT)
 968                        di_flags |= XFS_DIFLAG_RTINHERIT;
 969                if (xflags & FS_XFLAG_NOSYMLINKS)
 970                        di_flags |= XFS_DIFLAG_NOSYMLINKS;
 971                if (xflags & FS_XFLAG_EXTSZINHERIT)
 972                        di_flags |= XFS_DIFLAG_EXTSZINHERIT;
 973                if (xflags & FS_XFLAG_PROJINHERIT)
 974                        di_flags |= XFS_DIFLAG_PROJINHERIT;
 975        } else if (S_ISREG(VFS_I(ip)->i_mode)) {
 976                if (xflags & FS_XFLAG_REALTIME)
 977                        di_flags |= XFS_DIFLAG_REALTIME;
 978                if (xflags & FS_XFLAG_EXTSIZE)
 979                        di_flags |= XFS_DIFLAG_EXTSIZE;
 980        }
 981        ip->i_d.di_flags = di_flags;
 982
 983        /* diflags2 only valid for v3 inodes. */
 984        if (ip->i_d.di_version < 3)
 985                return;
 986
 987        di_flags2 = 0;
 988        if (xflags & FS_XFLAG_DAX)
 989                di_flags2 |= XFS_DIFLAG2_DAX;
 990
 991        ip->i_d.di_flags2 = di_flags2;
 992
 993}
 994
 995STATIC void
 996xfs_diflags_to_linux(
 997        struct xfs_inode        *ip)
 998{
 999        struct inode            *inode = VFS_I(ip);
1000        unsigned int            xflags = xfs_ip2xflags(ip);
1001
1002        if (xflags & FS_XFLAG_IMMUTABLE)
1003                inode->i_flags |= S_IMMUTABLE;
1004        else
1005                inode->i_flags &= ~S_IMMUTABLE;
1006        if (xflags & FS_XFLAG_APPEND)
1007                inode->i_flags |= S_APPEND;
1008        else
1009                inode->i_flags &= ~S_APPEND;
1010        if (xflags & FS_XFLAG_SYNC)
1011                inode->i_flags |= S_SYNC;
1012        else
1013                inode->i_flags &= ~S_SYNC;
1014        if (xflags & FS_XFLAG_NOATIME)
1015                inode->i_flags |= S_NOATIME;
1016        else
1017                inode->i_flags &= ~S_NOATIME;
1018        if (xflags & FS_XFLAG_DAX)
1019                inode->i_flags |= S_DAX;
1020        else
1021                inode->i_flags &= ~S_DAX;
1022
1023}
1024
1025static int
1026xfs_ioctl_setattr_xflags(
1027        struct xfs_trans        *tp,
1028        struct xfs_inode        *ip,
1029        struct fsxattr          *fa)
1030{
1031        struct xfs_mount        *mp = ip->i_mount;
1032
1033        /* Can't change realtime flag if any extents are allocated. */
1034        if ((ip->i_d.di_nextents || ip->i_delayed_blks) &&
1035            XFS_IS_REALTIME_INODE(ip) != (fa->fsx_xflags & FS_XFLAG_REALTIME))
1036                return -EINVAL;
1037
1038        /* If realtime flag is set then must have realtime device */
1039        if (fa->fsx_xflags & FS_XFLAG_REALTIME) {
1040                if (mp->m_sb.sb_rblocks == 0 || mp->m_sb.sb_rextsize == 0 ||
1041                    (ip->i_d.di_extsize % mp->m_sb.sb_rextsize))
1042                        return -EINVAL;
1043        }
1044
1045        /*
1046         * Can't modify an immutable/append-only file unless
1047         * we have appropriate permission.
1048         */
1049        if (((ip->i_d.di_flags & (XFS_DIFLAG_IMMUTABLE | XFS_DIFLAG_APPEND)) ||
1050             (fa->fsx_xflags & (FS_XFLAG_IMMUTABLE | FS_XFLAG_APPEND))) &&
1051            !capable(CAP_LINUX_IMMUTABLE))
1052                return -EPERM;
1053
1054        xfs_set_diflags(ip, fa->fsx_xflags);
1055        xfs_diflags_to_linux(ip);
1056        xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG);
1057        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
1058        XFS_STATS_INC(mp, xs_ig_attrchg);
1059        return 0;
1060}
1061
1062/*
1063 * If we are changing DAX flags, we have to ensure the file is clean and any
1064 * cached objects in the address space are invalidated and removed. This
1065 * requires us to lock out other IO and page faults similar to a truncate
1066 * operation. The locks need to be held until the transaction has been committed
1067 * so that the cache invalidation is atomic with respect to the DAX flag
1068 * manipulation.
1069 */
1070static int
1071xfs_ioctl_setattr_dax_invalidate(
1072        struct xfs_inode        *ip,
1073        struct fsxattr          *fa,
1074        int                     *join_flags)
1075{
1076        struct inode            *inode = VFS_I(ip);
1077        int                     error;
1078
1079        *join_flags = 0;
1080
1081        /*
1082         * It is only valid to set the DAX flag on regular files and
1083         * directories on filesystems where the block size is equal to the page
1084         * size. On directories it serves as an inherit hint.
1085         */
1086        if (fa->fsx_xflags & FS_XFLAG_DAX) {
1087                if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))
1088                        return -EINVAL;
1089                if (ip->i_mount->m_sb.sb_blocksize != PAGE_SIZE)
1090                        return -EINVAL;
1091        }
1092
1093        /* If the DAX state is not changing, we have nothing to do here. */
1094        if ((fa->fsx_xflags & FS_XFLAG_DAX) && IS_DAX(inode))
1095                return 0;
1096        if (!(fa->fsx_xflags & FS_XFLAG_DAX) && !IS_DAX(inode))
1097                return 0;
1098
1099        /* lock, flush and invalidate mapping in preparation for flag change */
1100        xfs_ilock(ip, XFS_MMAPLOCK_EXCL | XFS_IOLOCK_EXCL);
1101        error = filemap_write_and_wait(inode->i_mapping);
1102        if (error)
1103                goto out_unlock;
1104        error = invalidate_inode_pages2(inode->i_mapping);
1105        if (error)
1106                goto out_unlock;
1107
1108        *join_flags = XFS_MMAPLOCK_EXCL | XFS_IOLOCK_EXCL;
1109        return 0;
1110
1111out_unlock:
1112        xfs_iunlock(ip, XFS_MMAPLOCK_EXCL | XFS_IOLOCK_EXCL);
1113        return error;
1114
1115}
1116
1117/*
1118 * Set up the transaction structure for the setattr operation, checking that we
1119 * have permission to do so. On success, return a clean transaction and the
1120 * inode locked exclusively ready for further operation specific checks. On
1121 * failure, return an error without modifying or locking the inode.
1122 *
1123 * The inode might already be IO locked on call. If this is the case, it is
1124 * indicated in @join_flags and we take full responsibility for ensuring they
1125 * are unlocked from now on. Hence if we have an error here, we still have to
1126 * unlock them. Otherwise, once they are joined to the transaction, they will
1127 * be unlocked on commit/cancel.
1128 */
1129static struct xfs_trans *
1130xfs_ioctl_setattr_get_trans(
1131        struct xfs_inode        *ip,
1132        int                     join_flags)
1133{
1134        struct xfs_mount        *mp = ip->i_mount;
1135        struct xfs_trans        *tp;
1136        int                     error = -EROFS;
1137
1138        if (mp->m_flags & XFS_MOUNT_RDONLY)
1139                goto out_unlock;
1140        error = -EIO;
1141        if (XFS_FORCED_SHUTDOWN(mp))
1142                goto out_unlock;
1143
1144        tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE);
1145        error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ichange, 0, 0);
1146        if (error)
1147                goto out_cancel;
1148
1149        xfs_ilock(ip, XFS_ILOCK_EXCL);
1150        xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL | join_flags);
1151        join_flags = 0;
1152
1153        /*
1154         * CAP_FOWNER overrides the following restrictions:
1155         *
1156         * The user ID of the calling process must be equal to the file owner
1157         * ID, except in cases where the CAP_FSETID capability is applicable.
1158         */
1159        if (!inode_owner_or_capable(VFS_I(ip))) {
1160                error = -EPERM;
1161                goto out_cancel;
1162        }
1163
1164        if (mp->m_flags & XFS_MOUNT_WSYNC)
1165                xfs_trans_set_sync(tp);
1166
1167        return tp;
1168
1169out_cancel:
1170        xfs_trans_cancel(tp);
1171out_unlock:
1172        if (join_flags)
1173                xfs_iunlock(ip, join_flags);
1174        return ERR_PTR(error);
1175}
1176
1177/*
1178 * extent size hint validation is somewhat cumbersome. Rules are:
1179 *
1180 * 1. extent size hint is only valid for directories and regular files
1181 * 2. FS_XFLAG_EXTSIZE is only valid for regular files
1182 * 3. FS_XFLAG_EXTSZINHERIT is only valid for directories.
1183 * 4. can only be changed on regular files if no extents are allocated
1184 * 5. can be changed on directories at any time
1185 * 6. extsize hint of 0 turns off hints, clears inode flags.
1186 * 7. Extent size must be a multiple of the appropriate block size.
1187 * 8. for non-realtime files, the extent size hint must be limited
1188 *    to half the AG size to avoid alignment extending the extent beyond the
1189 *    limits of the AG.
1190 */
1191static int
1192xfs_ioctl_setattr_check_extsize(
1193        struct xfs_inode        *ip,
1194        struct fsxattr          *fa)
1195{
1196        struct xfs_mount        *mp = ip->i_mount;
1197
1198        if ((fa->fsx_xflags & FS_XFLAG_EXTSIZE) && !S_ISREG(VFS_I(ip)->i_mode))
1199                return -EINVAL;
1200
1201        if ((fa->fsx_xflags & FS_XFLAG_EXTSZINHERIT) &&
1202            !S_ISDIR(VFS_I(ip)->i_mode))
1203                return -EINVAL;
1204
1205        if (S_ISREG(VFS_I(ip)->i_mode) && ip->i_d.di_nextents &&
1206            ((ip->i_d.di_extsize << mp->m_sb.sb_blocklog) != fa->fsx_extsize))
1207                return -EINVAL;
1208
1209        if (fa->fsx_extsize != 0) {
1210                xfs_extlen_t    size;
1211                xfs_fsblock_t   extsize_fsb;
1212
1213                extsize_fsb = XFS_B_TO_FSB(mp, fa->fsx_extsize);
1214                if (extsize_fsb > MAXEXTLEN)
1215                        return -EINVAL;
1216
1217                if (XFS_IS_REALTIME_INODE(ip) ||
1218                    (fa->fsx_xflags & FS_XFLAG_REALTIME)) {
1219                        size = mp->m_sb.sb_rextsize << mp->m_sb.sb_blocklog;
1220                } else {
1221                        size = mp->m_sb.sb_blocksize;
1222                        if (extsize_fsb > mp->m_sb.sb_agblocks / 2)
1223                                return -EINVAL;
1224                }
1225
1226                if (fa->fsx_extsize % size)
1227                        return -EINVAL;
1228        } else
1229                fa->fsx_xflags &= ~(FS_XFLAG_EXTSIZE | FS_XFLAG_EXTSZINHERIT);
1230
1231        return 0;
1232}
1233
1234static int
1235xfs_ioctl_setattr_check_projid(
1236        struct xfs_inode        *ip,
1237        struct fsxattr          *fa)
1238{
1239        /* Disallow 32bit project ids if projid32bit feature is not enabled. */
1240        if (fa->fsx_projid > (__uint16_t)-1 &&
1241            !xfs_sb_version_hasprojid32bit(&ip->i_mount->m_sb))
1242                return -EINVAL;
1243
1244        /*
1245         * Project Quota ID state is only allowed to change from within the init
1246         * namespace. Enforce that restriction only if we are trying to change
1247         * the quota ID state. Everything else is allowed in user namespaces.
1248         */
1249        if (current_user_ns() == &init_user_ns)
1250                return 0;
1251
1252        if (xfs_get_projid(ip) != fa->fsx_projid)
1253                return -EINVAL;
1254        if ((fa->fsx_xflags & FS_XFLAG_PROJINHERIT) !=
1255            (ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT))
1256                return -EINVAL;
1257
1258        return 0;
1259}
1260
1261STATIC int
1262xfs_ioctl_setattr(
1263        xfs_inode_t             *ip,
1264        struct fsxattr          *fa)
1265{
1266        struct xfs_mount        *mp = ip->i_mount;
1267        struct xfs_trans        *tp;
1268        struct xfs_dquot        *udqp = NULL;
1269        struct xfs_dquot        *pdqp = NULL;
1270        struct xfs_dquot        *olddquot = NULL;
1271        int                     code;
1272        int                     join_flags = 0;
1273
1274        trace_xfs_ioctl_setattr(ip);
1275
1276        code = xfs_ioctl_setattr_check_projid(ip, fa);
1277        if (code)
1278                return code;
1279
1280        /*
1281         * If disk quotas is on, we make sure that the dquots do exist on disk,
1282         * before we start any other transactions. Trying to do this later
1283         * is messy. We don't care to take a readlock to look at the ids
1284         * in inode here, because we can't hold it across the trans_reserve.
1285         * If the IDs do change before we take the ilock, we're covered
1286         * because the i_*dquot fields will get updated anyway.
1287         */
1288        if (XFS_IS_QUOTA_ON(mp)) {
1289                code = xfs_qm_vop_dqalloc(ip, ip->i_d.di_uid,
1290                                         ip->i_d.di_gid, fa->fsx_projid,
1291                                         XFS_QMOPT_PQUOTA, &udqp, NULL, &pdqp);
1292                if (code)
1293                        return code;
1294        }
1295
1296        /*
1297         * Changing DAX config may require inode locking for mapping
1298         * invalidation. These need to be held all the way to transaction commit
1299         * or cancel time, so need to be passed through to
1300         * xfs_ioctl_setattr_get_trans() so it can apply them to the join call
1301         * appropriately.
1302         */
1303        code = xfs_ioctl_setattr_dax_invalidate(ip, fa, &join_flags);
1304        if (code)
1305                goto error_free_dquots;
1306
1307        tp = xfs_ioctl_setattr_get_trans(ip, join_flags);
1308        if (IS_ERR(tp)) {
1309                code = PTR_ERR(tp);
1310                goto error_free_dquots;
1311        }
1312
1313
1314        if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_PQUOTA_ON(mp) &&
1315            xfs_get_projid(ip) != fa->fsx_projid) {
1316                code = xfs_qm_vop_chown_reserve(tp, ip, udqp, NULL, pdqp,
1317                                capable(CAP_FOWNER) ?  XFS_QMOPT_FORCE_RES : 0);
1318                if (code)       /* out of quota */
1319                        goto error_trans_cancel;
1320        }
1321
1322        code = xfs_ioctl_setattr_check_extsize(ip, fa);
1323        if (code)
1324                goto error_trans_cancel;
1325
1326        code = xfs_ioctl_setattr_xflags(tp, ip, fa);
1327        if (code)
1328                goto error_trans_cancel;
1329
1330        /*
1331         * Change file ownership.  Must be the owner or privileged.  CAP_FSETID
1332         * overrides the following restrictions:
1333         *
1334         * The set-user-ID and set-group-ID bits of a file will be cleared upon
1335         * successful return from chown()
1336         */
1337
1338        if ((VFS_I(ip)->i_mode & (S_ISUID|S_ISGID)) &&
1339            !capable_wrt_inode_uidgid(VFS_I(ip), CAP_FSETID))
1340                VFS_I(ip)->i_mode &= ~(S_ISUID|S_ISGID);
1341
1342        /* Change the ownerships and register project quota modifications */
1343        if (xfs_get_projid(ip) != fa->fsx_projid) {
1344                if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_PQUOTA_ON(mp)) {
1345                        olddquot = xfs_qm_vop_chown(tp, ip,
1346                                                &ip->i_pdquot, pdqp);
1347                }
1348                ASSERT(ip->i_d.di_version > 1);
1349                xfs_set_projid(ip, fa->fsx_projid);
1350        }
1351
1352        /*
1353         * Only set the extent size hint if we've already determined that the
1354         * extent size hint should be set on the inode. If no extent size flags
1355         * are set on the inode then unconditionally clear the extent size hint.
1356         */
1357        if (ip->i_d.di_flags & (XFS_DIFLAG_EXTSIZE | XFS_DIFLAG_EXTSZINHERIT))
1358                ip->i_d.di_extsize = fa->fsx_extsize >> mp->m_sb.sb_blocklog;
1359        else
1360                ip->i_d.di_extsize = 0;
1361
1362        code = xfs_trans_commit(tp);
1363
1364        /*
1365         * Release any dquot(s) the inode had kept before chown.
1366         */
1367        xfs_qm_dqrele(olddquot);
1368        xfs_qm_dqrele(udqp);
1369        xfs_qm_dqrele(pdqp);
1370
1371        return code;
1372
1373error_trans_cancel:
1374        xfs_trans_cancel(tp);
1375error_free_dquots:
1376        xfs_qm_dqrele(udqp);
1377        xfs_qm_dqrele(pdqp);
1378        return code;
1379}
1380
1381STATIC int
1382xfs_ioc_fssetxattr(
1383        xfs_inode_t             *ip,
1384        struct file             *filp,
1385        void                    __user *arg)
1386{
1387        struct fsxattr          fa;
1388        int error;
1389
1390        if (copy_from_user(&fa, arg, sizeof(fa)))
1391                return -EFAULT;
1392
1393        error = mnt_want_write_file(filp);
1394        if (error)
1395                return error;
1396        error = xfs_ioctl_setattr(ip, &fa);
1397        mnt_drop_write_file(filp);
1398        return error;
1399}
1400
1401STATIC int
1402xfs_ioc_getxflags(
1403        xfs_inode_t             *ip,
1404        void                    __user *arg)
1405{
1406        unsigned int            flags;
1407
1408        flags = xfs_di2lxflags(ip->i_d.di_flags);
1409        if (copy_to_user(arg, &flags, sizeof(flags)))
1410                return -EFAULT;
1411        return 0;
1412}
1413
1414STATIC int
1415xfs_ioc_setxflags(
1416        struct xfs_inode        *ip,
1417        struct file             *filp,
1418        void                    __user *arg)
1419{
1420        struct xfs_trans        *tp;
1421        struct fsxattr          fa;
1422        unsigned int            flags;
1423        int                     join_flags = 0;
1424        int                     error;
1425
1426        if (copy_from_user(&flags, arg, sizeof(flags)))
1427                return -EFAULT;
1428
1429        if (flags & ~(FS_IMMUTABLE_FL | FS_APPEND_FL | \
1430                      FS_NOATIME_FL | FS_NODUMP_FL | \
1431                      FS_SYNC_FL))
1432                return -EOPNOTSUPP;
1433
1434        fa.fsx_xflags = xfs_merge_ioc_xflags(flags, xfs_ip2xflags(ip));
1435
1436        error = mnt_want_write_file(filp);
1437        if (error)
1438                return error;
1439
1440        /*
1441         * Changing DAX config may require inode locking for mapping
1442         * invalidation. These need to be held all the way to transaction commit
1443         * or cancel time, so need to be passed through to
1444         * xfs_ioctl_setattr_get_trans() so it can apply them to the join call
1445         * appropriately.
1446         */
1447        error = xfs_ioctl_setattr_dax_invalidate(ip, &fa, &join_flags);
1448        if (error)
1449                goto out_drop_write;
1450
1451        tp = xfs_ioctl_setattr_get_trans(ip, join_flags);
1452        if (IS_ERR(tp)) {
1453                error = PTR_ERR(tp);
1454                goto out_drop_write;
1455        }
1456
1457        error = xfs_ioctl_setattr_xflags(tp, ip, &fa);
1458        if (error) {
1459                xfs_trans_cancel(tp);
1460                goto out_drop_write;
1461        }
1462
1463        error = xfs_trans_commit(tp);
1464out_drop_write:
1465        mnt_drop_write_file(filp);
1466        return error;
1467}
1468
1469STATIC int
1470xfs_getbmap_format(void **ap, struct getbmapx *bmv, int *full)
1471{
1472        struct getbmap __user   *base = (struct getbmap __user *)*ap;
1473
1474        /* copy only getbmap portion (not getbmapx) */
1475        if (copy_to_user(base, bmv, sizeof(struct getbmap)))
1476                return -EFAULT;
1477
1478        *ap += sizeof(struct getbmap);
1479        return 0;
1480}
1481
1482STATIC int
1483xfs_ioc_getbmap(
1484        struct xfs_inode        *ip,
1485        int                     ioflags,
1486        unsigned int            cmd,
1487        void                    __user *arg)
1488{
1489        struct getbmapx         bmx;
1490        int                     error;
1491
1492        if (copy_from_user(&bmx, arg, sizeof(struct getbmapx)))
1493                return -EFAULT;
1494
1495        if (bmx.bmv_count < 2)
1496                return -EINVAL;
1497
1498        bmx.bmv_iflags = (cmd == XFS_IOC_GETBMAPA ? BMV_IF_ATTRFORK : 0);
1499        if (ioflags & XFS_IO_INVIS)
1500                bmx.bmv_iflags |= BMV_IF_NO_DMAPI_READ;
1501
1502        error = xfs_getbmap(ip, &bmx, xfs_getbmap_format,
1503                            (__force struct getbmap *)arg+1);
1504        if (error)
1505                return error;
1506
1507        /* copy back header - only size of getbmap */
1508        if (copy_to_user(arg, &bmx, sizeof(struct getbmap)))
1509                return -EFAULT;
1510        return 0;
1511}
1512
1513STATIC int
1514xfs_getbmapx_format(void **ap, struct getbmapx *bmv, int *full)
1515{
1516        struct getbmapx __user  *base = (struct getbmapx __user *)*ap;
1517
1518        if (copy_to_user(base, bmv, sizeof(struct getbmapx)))
1519                return -EFAULT;
1520
1521        *ap += sizeof(struct getbmapx);
1522        return 0;
1523}
1524
1525STATIC int
1526xfs_ioc_getbmapx(
1527        struct xfs_inode        *ip,
1528        void                    __user *arg)
1529{
1530        struct getbmapx         bmx;
1531        int                     error;
1532
1533        if (copy_from_user(&bmx, arg, sizeof(bmx)))
1534                return -EFAULT;
1535
1536        if (bmx.bmv_count < 2)
1537                return -EINVAL;
1538
1539        if (bmx.bmv_iflags & (~BMV_IF_VALID))
1540                return -EINVAL;
1541
1542        error = xfs_getbmap(ip, &bmx, xfs_getbmapx_format,
1543                            (__force struct getbmapx *)arg+1);
1544        if (error)
1545                return error;
1546
1547        /* copy back header */
1548        if (copy_to_user(arg, &bmx, sizeof(struct getbmapx)))
1549                return -EFAULT;
1550
1551        return 0;
1552}
1553
1554int
1555xfs_ioc_swapext(
1556        xfs_swapext_t   *sxp)
1557{
1558        xfs_inode_t     *ip, *tip;
1559        struct fd       f, tmp;
1560        int             error = 0;
1561
1562        /* Pull information for the target fd */
1563        f = fdget((int)sxp->sx_fdtarget);
1564        if (!f.file) {
1565                error = -EINVAL;
1566                goto out;
1567        }
1568
1569        if (!(f.file->f_mode & FMODE_WRITE) ||
1570            !(f.file->f_mode & FMODE_READ) ||
1571            (f.file->f_flags & O_APPEND)) {
1572                error = -EBADF;
1573                goto out_put_file;
1574        }
1575
1576        tmp = fdget((int)sxp->sx_fdtmp);
1577        if (!tmp.file) {
1578                error = -EINVAL;
1579                goto out_put_file;
1580        }
1581
1582        if (!(tmp.file->f_mode & FMODE_WRITE) ||
1583            !(tmp.file->f_mode & FMODE_READ) ||
1584            (tmp.file->f_flags & O_APPEND)) {
1585                error = -EBADF;
1586                goto out_put_tmp_file;
1587        }
1588
1589        if (IS_SWAPFILE(file_inode(f.file)) ||
1590            IS_SWAPFILE(file_inode(tmp.file))) {
1591                error = -EINVAL;
1592                goto out_put_tmp_file;
1593        }
1594
1595        ip = XFS_I(file_inode(f.file));
1596        tip = XFS_I(file_inode(tmp.file));
1597
1598        if (ip->i_mount != tip->i_mount) {
1599                error = -EINVAL;
1600                goto out_put_tmp_file;
1601        }
1602
1603        if (ip->i_ino == tip->i_ino) {
1604                error = -EINVAL;
1605                goto out_put_tmp_file;
1606        }
1607
1608        if (XFS_FORCED_SHUTDOWN(ip->i_mount)) {
1609                error = -EIO;
1610                goto out_put_tmp_file;
1611        }
1612
1613        error = xfs_swap_extents(ip, tip, sxp);
1614
1615 out_put_tmp_file:
1616        fdput(tmp);
1617 out_put_file:
1618        fdput(f);
1619 out:
1620        return error;
1621}
1622
1623/*
1624 * Note: some of the ioctl's return positive numbers as a
1625 * byte count indicating success, such as readlink_by_handle.
1626 * So we don't "sign flip" like most other routines.  This means
1627 * true errors need to be returned as a negative value.
1628 */
1629long
1630xfs_file_ioctl(
1631        struct file             *filp,
1632        unsigned int            cmd,
1633        unsigned long           p)
1634{
1635        struct inode            *inode = file_inode(filp);
1636        struct xfs_inode        *ip = XFS_I(inode);
1637        struct xfs_mount        *mp = ip->i_mount;
1638        void                    __user *arg = (void __user *)p;
1639        int                     ioflags = 0;
1640        int                     error;
1641
1642        if (filp->f_mode & FMODE_NOCMTIME)
1643                ioflags |= XFS_IO_INVIS;
1644
1645        trace_xfs_file_ioctl(ip);
1646
1647        switch (cmd) {
1648        case FITRIM:
1649                return xfs_ioc_trim(mp, arg);
1650        case XFS_IOC_ALLOCSP:
1651        case XFS_IOC_FREESP:
1652        case XFS_IOC_RESVSP:
1653        case XFS_IOC_UNRESVSP:
1654        case XFS_IOC_ALLOCSP64:
1655        case XFS_IOC_FREESP64:
1656        case XFS_IOC_RESVSP64:
1657        case XFS_IOC_UNRESVSP64:
1658        case XFS_IOC_ZERO_RANGE: {
1659                xfs_flock64_t           bf;
1660
1661                if (copy_from_user(&bf, arg, sizeof(bf)))
1662                        return -EFAULT;
1663                return xfs_ioc_space(ip, inode, filp, ioflags, cmd, &bf);
1664        }
1665        case XFS_IOC_DIOINFO: {
1666                struct dioattr  da;
1667                xfs_buftarg_t   *target =
1668                        XFS_IS_REALTIME_INODE(ip) ?
1669                        mp->m_rtdev_targp : mp->m_ddev_targp;
1670
1671                da.d_mem =  da.d_miniosz = target->bt_logical_sectorsize;
1672                da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1);
1673
1674                if (copy_to_user(arg, &da, sizeof(da)))
1675                        return -EFAULT;
1676                return 0;
1677        }
1678
1679        case XFS_IOC_FSBULKSTAT_SINGLE:
1680        case XFS_IOC_FSBULKSTAT:
1681        case XFS_IOC_FSINUMBERS:
1682                return xfs_ioc_bulkstat(mp, cmd, arg);
1683
1684        case XFS_IOC_FSGEOMETRY_V1:
1685                return xfs_ioc_fsgeometry_v1(mp, arg);
1686
1687        case XFS_IOC_FSGEOMETRY:
1688                return xfs_ioc_fsgeometry(mp, arg);
1689
1690        case XFS_IOC_GETVERSION:
1691                return put_user(inode->i_generation, (int __user *)arg);
1692
1693        case XFS_IOC_FSGETXATTR:
1694                return xfs_ioc_fsgetxattr(ip, 0, arg);
1695        case XFS_IOC_FSGETXATTRA:
1696                return xfs_ioc_fsgetxattr(ip, 1, arg);
1697        case XFS_IOC_FSSETXATTR:
1698                return xfs_ioc_fssetxattr(ip, filp, arg);
1699        case XFS_IOC_GETXFLAGS:
1700                return xfs_ioc_getxflags(ip, arg);
1701        case XFS_IOC_SETXFLAGS:
1702                return xfs_ioc_setxflags(ip, filp, arg);
1703
1704        case XFS_IOC_FSSETDM: {
1705                struct fsdmidata        dmi;
1706
1707                if (copy_from_user(&dmi, arg, sizeof(dmi)))
1708                        return -EFAULT;
1709
1710                error = mnt_want_write_file(filp);
1711                if (error)
1712                        return error;
1713
1714                error = xfs_set_dmattrs(ip, dmi.fsd_dmevmask,
1715                                dmi.fsd_dmstate);
1716                mnt_drop_write_file(filp);
1717                return error;
1718        }
1719
1720        case XFS_IOC_GETBMAP:
1721        case XFS_IOC_GETBMAPA:
1722                return xfs_ioc_getbmap(ip, ioflags, cmd, arg);
1723
1724        case XFS_IOC_GETBMAPX:
1725                return xfs_ioc_getbmapx(ip, arg);
1726
1727        case XFS_IOC_FD_TO_HANDLE:
1728        case XFS_IOC_PATH_TO_HANDLE:
1729        case XFS_IOC_PATH_TO_FSHANDLE: {
1730                xfs_fsop_handlereq_t    hreq;
1731
1732                if (copy_from_user(&hreq, arg, sizeof(hreq)))
1733                        return -EFAULT;
1734                return xfs_find_handle(cmd, &hreq);
1735        }
1736        case XFS_IOC_OPEN_BY_HANDLE: {
1737                xfs_fsop_handlereq_t    hreq;
1738
1739                if (copy_from_user(&hreq, arg, sizeof(xfs_fsop_handlereq_t)))
1740                        return -EFAULT;
1741                return xfs_open_by_handle(filp, &hreq);
1742        }
1743        case XFS_IOC_FSSETDM_BY_HANDLE:
1744                return xfs_fssetdm_by_handle(filp, arg);
1745
1746        case XFS_IOC_READLINK_BY_HANDLE: {
1747                xfs_fsop_handlereq_t    hreq;
1748
1749                if (copy_from_user(&hreq, arg, sizeof(xfs_fsop_handlereq_t)))
1750                        return -EFAULT;
1751                return xfs_readlink_by_handle(filp, &hreq);
1752        }
1753        case XFS_IOC_ATTRLIST_BY_HANDLE:
1754                return xfs_attrlist_by_handle(filp, arg);
1755
1756        case XFS_IOC_ATTRMULTI_BY_HANDLE:
1757                return xfs_attrmulti_by_handle(filp, arg);
1758
1759        case XFS_IOC_SWAPEXT: {
1760                struct xfs_swapext      sxp;
1761
1762                if (copy_from_user(&sxp, arg, sizeof(xfs_swapext_t)))
1763                        return -EFAULT;
1764                error = mnt_want_write_file(filp);
1765                if (error)
1766                        return error;
1767                error = xfs_ioc_swapext(&sxp);
1768                mnt_drop_write_file(filp);
1769                return error;
1770        }
1771
1772        case XFS_IOC_FSCOUNTS: {
1773                xfs_fsop_counts_t out;
1774
1775                error = xfs_fs_counts(mp, &out);
1776                if (error)
1777                        return error;
1778
1779                if (copy_to_user(arg, &out, sizeof(out)))
1780                        return -EFAULT;
1781                return 0;
1782        }
1783
1784        case XFS_IOC_SET_RESBLKS: {
1785                xfs_fsop_resblks_t inout;
1786                __uint64_t         in;
1787
1788                if (!capable(CAP_SYS_ADMIN))
1789                        return -EPERM;
1790
1791                if (mp->m_flags & XFS_MOUNT_RDONLY)
1792                        return -EROFS;
1793
1794                if (copy_from_user(&inout, arg, sizeof(inout)))
1795                        return -EFAULT;
1796
1797                error = mnt_want_write_file(filp);
1798                if (error)
1799                        return error;
1800
1801                /* input parameter is passed in resblks field of structure */
1802                in = inout.resblks;
1803                error = xfs_reserve_blocks(mp, &in, &inout);
1804                mnt_drop_write_file(filp);
1805                if (error)
1806                        return error;
1807
1808                if (copy_to_user(arg, &inout, sizeof(inout)))
1809                        return -EFAULT;
1810                return 0;
1811        }
1812
1813        case XFS_IOC_GET_RESBLKS: {
1814                xfs_fsop_resblks_t out;
1815
1816                if (!capable(CAP_SYS_ADMIN))
1817                        return -EPERM;
1818
1819                error = xfs_reserve_blocks(mp, NULL, &out);
1820                if (error)
1821                        return error;
1822
1823                if (copy_to_user(arg, &out, sizeof(out)))
1824                        return -EFAULT;
1825
1826                return 0;
1827        }
1828
1829        case XFS_IOC_FSGROWFSDATA: {
1830                xfs_growfs_data_t in;
1831
1832                if (copy_from_user(&in, arg, sizeof(in)))
1833                        return -EFAULT;
1834
1835                error = mnt_want_write_file(filp);
1836                if (error)
1837                        return error;
1838                error = xfs_growfs_data(mp, &in);
1839                mnt_drop_write_file(filp);
1840                return error;
1841        }
1842
1843        case XFS_IOC_FSGROWFSLOG: {
1844                xfs_growfs_log_t in;
1845
1846                if (copy_from_user(&in, arg, sizeof(in)))
1847                        return -EFAULT;
1848
1849                error = mnt_want_write_file(filp);
1850                if (error)
1851                        return error;
1852                error = xfs_growfs_log(mp, &in);
1853                mnt_drop_write_file(filp);
1854                return error;
1855        }
1856
1857        case XFS_IOC_FSGROWFSRT: {
1858                xfs_growfs_rt_t in;
1859
1860                if (copy_from_user(&in, arg, sizeof(in)))
1861                        return -EFAULT;
1862
1863                error = mnt_want_write_file(filp);
1864                if (error)
1865                        return error;
1866                error = xfs_growfs_rt(mp, &in);
1867                mnt_drop_write_file(filp);
1868                return error;
1869        }
1870
1871        case XFS_IOC_GOINGDOWN: {
1872                __uint32_t in;
1873
1874                if (!capable(CAP_SYS_ADMIN))
1875                        return -EPERM;
1876
1877                if (get_user(in, (__uint32_t __user *)arg))
1878                        return -EFAULT;
1879
1880                return xfs_fs_goingdown(mp, in);
1881        }
1882
1883        case XFS_IOC_ERROR_INJECTION: {
1884                xfs_error_injection_t in;
1885
1886                if (!capable(CAP_SYS_ADMIN))
1887                        return -EPERM;
1888
1889                if (copy_from_user(&in, arg, sizeof(in)))
1890                        return -EFAULT;
1891
1892                return xfs_errortag_add(in.errtag, mp);
1893        }
1894
1895        case XFS_IOC_ERROR_CLEARALL:
1896                if (!capable(CAP_SYS_ADMIN))
1897                        return -EPERM;
1898
1899                return xfs_errortag_clearall(mp, 1);
1900
1901        case XFS_IOC_FREE_EOFBLOCKS: {
1902                struct xfs_fs_eofblocks eofb;
1903                struct xfs_eofblocks keofb;
1904
1905                if (!capable(CAP_SYS_ADMIN))
1906                        return -EPERM;
1907
1908                if (mp->m_flags & XFS_MOUNT_RDONLY)
1909                        return -EROFS;
1910
1911                if (copy_from_user(&eofb, arg, sizeof(eofb)))
1912                        return -EFAULT;
1913
1914                error = xfs_fs_eofblocks_from_user(&eofb, &keofb);
1915                if (error)
1916                        return error;
1917
1918                return xfs_icache_free_eofblocks(mp, &keofb);
1919        }
1920
1921        default:
1922                return -ENOTTY;
1923        }
1924}
1925