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