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_vn_setattr_size(file_dentry(filp), &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_cowextsize = ip->i_d.di_cowextsize <<
 907                        ip->i_mount->m_sb.sb_blocklog;
 908        fa.fsx_projid = xfs_get_projid(ip);
 909
 910        if (attr) {
 911                if (ip->i_afp) {
 912                        if (ip->i_afp->if_flags & XFS_IFEXTENTS)
 913                                fa.fsx_nextents = ip->i_afp->if_bytes /
 914                                                        sizeof(xfs_bmbt_rec_t);
 915                        else
 916                                fa.fsx_nextents = ip->i_d.di_anextents;
 917                } else
 918                        fa.fsx_nextents = 0;
 919        } else {
 920                if (ip->i_df.if_flags & XFS_IFEXTENTS)
 921                        fa.fsx_nextents = ip->i_df.if_bytes /
 922                                                sizeof(xfs_bmbt_rec_t);
 923                else
 924                        fa.fsx_nextents = ip->i_d.di_nextents;
 925        }
 926        xfs_iunlock(ip, XFS_ILOCK_SHARED);
 927
 928        if (copy_to_user(arg, &fa, sizeof(fa)))
 929                return -EFAULT;
 930        return 0;
 931}
 932
 933STATIC void
 934xfs_set_diflags(
 935        struct xfs_inode        *ip,
 936        unsigned int            xflags)
 937{
 938        unsigned int            di_flags;
 939        uint64_t                di_flags2;
 940
 941        /* can't set PREALLOC this way, just preserve it */
 942        di_flags = (ip->i_d.di_flags & XFS_DIFLAG_PREALLOC);
 943        if (xflags & FS_XFLAG_IMMUTABLE)
 944                di_flags |= XFS_DIFLAG_IMMUTABLE;
 945        if (xflags & FS_XFLAG_APPEND)
 946                di_flags |= XFS_DIFLAG_APPEND;
 947        if (xflags & FS_XFLAG_SYNC)
 948                di_flags |= XFS_DIFLAG_SYNC;
 949        if (xflags & FS_XFLAG_NOATIME)
 950                di_flags |= XFS_DIFLAG_NOATIME;
 951        if (xflags & FS_XFLAG_NODUMP)
 952                di_flags |= XFS_DIFLAG_NODUMP;
 953        if (xflags & FS_XFLAG_NODEFRAG)
 954                di_flags |= XFS_DIFLAG_NODEFRAG;
 955        if (xflags & FS_XFLAG_FILESTREAM)
 956                di_flags |= XFS_DIFLAG_FILESTREAM;
 957        if (S_ISDIR(VFS_I(ip)->i_mode)) {
 958                if (xflags & FS_XFLAG_RTINHERIT)
 959                        di_flags |= XFS_DIFLAG_RTINHERIT;
 960                if (xflags & FS_XFLAG_NOSYMLINKS)
 961                        di_flags |= XFS_DIFLAG_NOSYMLINKS;
 962                if (xflags & FS_XFLAG_EXTSZINHERIT)
 963                        di_flags |= XFS_DIFLAG_EXTSZINHERIT;
 964                if (xflags & FS_XFLAG_PROJINHERIT)
 965                        di_flags |= XFS_DIFLAG_PROJINHERIT;
 966        } else if (S_ISREG(VFS_I(ip)->i_mode)) {
 967                if (xflags & FS_XFLAG_REALTIME)
 968                        di_flags |= XFS_DIFLAG_REALTIME;
 969                if (xflags & FS_XFLAG_EXTSIZE)
 970                        di_flags |= XFS_DIFLAG_EXTSIZE;
 971        }
 972        ip->i_d.di_flags = di_flags;
 973
 974        /* diflags2 only valid for v3 inodes. */
 975        if (ip->i_d.di_version < 3)
 976                return;
 977
 978        di_flags2 = (ip->i_d.di_flags2 & XFS_DIFLAG2_REFLINK);
 979        if (xflags & FS_XFLAG_DAX)
 980                di_flags2 |= XFS_DIFLAG2_DAX;
 981        if (xflags & FS_XFLAG_COWEXTSIZE)
 982                di_flags2 |= XFS_DIFLAG2_COWEXTSIZE;
 983
 984        ip->i_d.di_flags2 = di_flags2;
 985}
 986
 987STATIC void
 988xfs_diflags_to_linux(
 989        struct xfs_inode        *ip)
 990{
 991        struct inode            *inode = VFS_I(ip);
 992        unsigned int            xflags = xfs_ip2xflags(ip);
 993
 994        if (xflags & FS_XFLAG_IMMUTABLE)
 995                inode->i_flags |= S_IMMUTABLE;
 996        else
 997                inode->i_flags &= ~S_IMMUTABLE;
 998        if (xflags & FS_XFLAG_APPEND)
 999                inode->i_flags |= S_APPEND;
1000        else
1001                inode->i_flags &= ~S_APPEND;
1002        if (xflags & FS_XFLAG_SYNC)
1003                inode->i_flags |= S_SYNC;
1004        else
1005                inode->i_flags &= ~S_SYNC;
1006        if (xflags & FS_XFLAG_NOATIME)
1007                inode->i_flags |= S_NOATIME;
1008        else
1009                inode->i_flags &= ~S_NOATIME;
1010        if (xflags & FS_XFLAG_DAX)
1011                inode->i_flags |= S_DAX;
1012        else
1013                inode->i_flags &= ~S_DAX;
1014
1015}
1016
1017static int
1018xfs_ioctl_setattr_xflags(
1019        struct xfs_trans        *tp,
1020        struct xfs_inode        *ip,
1021        struct fsxattr          *fa)
1022{
1023        struct xfs_mount        *mp = ip->i_mount;
1024
1025        /* Can't change realtime flag if any extents are allocated. */
1026        if ((ip->i_d.di_nextents || ip->i_delayed_blks) &&
1027            XFS_IS_REALTIME_INODE(ip) != (fa->fsx_xflags & FS_XFLAG_REALTIME))
1028                return -EINVAL;
1029
1030        /* If realtime flag is set then must have realtime device */
1031        if (fa->fsx_xflags & FS_XFLAG_REALTIME) {
1032                if (mp->m_sb.sb_rblocks == 0 || mp->m_sb.sb_rextsize == 0 ||
1033                    (ip->i_d.di_extsize % mp->m_sb.sb_rextsize))
1034                        return -EINVAL;
1035        }
1036
1037        /* Clear reflink if we are actually able to set the rt flag. */
1038        if ((fa->fsx_xflags & FS_XFLAG_REALTIME) && xfs_is_reflink_inode(ip))
1039                ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK;
1040
1041        /* Don't allow us to set DAX mode for a reflinked file for now. */
1042        if ((fa->fsx_xflags & FS_XFLAG_DAX) && xfs_is_reflink_inode(ip))
1043                return -EINVAL;
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        error = xfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 0, 0, 0, &tp);
1145        if (error)
1146                return ERR_PTR(error);
1147
1148        xfs_ilock(ip, XFS_ILOCK_EXCL);
1149        xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL | join_flags);
1150        join_flags = 0;
1151
1152        /*
1153         * CAP_FOWNER overrides the following restrictions:
1154         *
1155         * The user ID of the calling process must be equal to the file owner
1156         * ID, except in cases where the CAP_FSETID capability is applicable.
1157         */
1158        if (!inode_owner_or_capable(VFS_I(ip))) {
1159                error = -EPERM;
1160                goto out_cancel;
1161        }
1162
1163        if (mp->m_flags & XFS_MOUNT_WSYNC)
1164                xfs_trans_set_sync(tp);
1165
1166        return tp;
1167
1168out_cancel:
1169        xfs_trans_cancel(tp);
1170out_unlock:
1171        if (join_flags)
1172                xfs_iunlock(ip, join_flags);
1173        return ERR_PTR(error);
1174}
1175
1176/*
1177 * extent size hint validation is somewhat cumbersome. Rules are:
1178 *
1179 * 1. extent size hint is only valid for directories and regular files
1180 * 2. FS_XFLAG_EXTSIZE is only valid for regular files
1181 * 3. FS_XFLAG_EXTSZINHERIT is only valid for directories.
1182 * 4. can only be changed on regular files if no extents are allocated
1183 * 5. can be changed on directories at any time
1184 * 6. extsize hint of 0 turns off hints, clears inode flags.
1185 * 7. Extent size must be a multiple of the appropriate block size.
1186 * 8. for non-realtime files, the extent size hint must be limited
1187 *    to half the AG size to avoid alignment extending the extent beyond the
1188 *    limits of the AG.
1189 */
1190static int
1191xfs_ioctl_setattr_check_extsize(
1192        struct xfs_inode        *ip,
1193        struct fsxattr          *fa)
1194{
1195        struct xfs_mount        *mp = ip->i_mount;
1196
1197        if ((fa->fsx_xflags & FS_XFLAG_EXTSIZE) && !S_ISREG(VFS_I(ip)->i_mode))
1198                return -EINVAL;
1199
1200        if ((fa->fsx_xflags & FS_XFLAG_EXTSZINHERIT) &&
1201            !S_ISDIR(VFS_I(ip)->i_mode))
1202                return -EINVAL;
1203
1204        if (S_ISREG(VFS_I(ip)->i_mode) && ip->i_d.di_nextents &&
1205            ((ip->i_d.di_extsize << mp->m_sb.sb_blocklog) != fa->fsx_extsize))
1206                return -EINVAL;
1207
1208        if (fa->fsx_extsize != 0) {
1209                xfs_extlen_t    size;
1210                xfs_fsblock_t   extsize_fsb;
1211
1212                extsize_fsb = XFS_B_TO_FSB(mp, fa->fsx_extsize);
1213                if (extsize_fsb > MAXEXTLEN)
1214                        return -EINVAL;
1215
1216                if (XFS_IS_REALTIME_INODE(ip) ||
1217                    (fa->fsx_xflags & FS_XFLAG_REALTIME)) {
1218                        size = mp->m_sb.sb_rextsize << mp->m_sb.sb_blocklog;
1219                } else {
1220                        size = mp->m_sb.sb_blocksize;
1221                        if (extsize_fsb > mp->m_sb.sb_agblocks / 2)
1222                                return -EINVAL;
1223                }
1224
1225                if (fa->fsx_extsize % size)
1226                        return -EINVAL;
1227        } else
1228                fa->fsx_xflags &= ~(FS_XFLAG_EXTSIZE | FS_XFLAG_EXTSZINHERIT);
1229
1230        return 0;
1231}
1232
1233/*
1234 * CoW extent size hint validation rules are:
1235 *
1236 * 1. CoW extent size hint can only be set if reflink is enabled on the fs.
1237 *    The inode does not have to have any shared blocks, but it must be a v3.
1238 * 2. FS_XFLAG_COWEXTSIZE is only valid for directories and regular files;
1239 *    for a directory, the hint is propagated to new files.
1240 * 3. Can be changed on files & directories at any time.
1241 * 4. CoW extsize hint of 0 turns off hints, clears inode flags.
1242 * 5. Extent size must be a multiple of the appropriate block size.
1243 * 6. The extent size hint must be limited to half the AG size to avoid
1244 *    alignment extending the extent beyond the limits of the AG.
1245 */
1246static int
1247xfs_ioctl_setattr_check_cowextsize(
1248        struct xfs_inode        *ip,
1249        struct fsxattr          *fa)
1250{
1251        struct xfs_mount        *mp = ip->i_mount;
1252
1253        if (!(fa->fsx_xflags & FS_XFLAG_COWEXTSIZE))
1254                return 0;
1255
1256        if (!xfs_sb_version_hasreflink(&ip->i_mount->m_sb) ||
1257            ip->i_d.di_version != 3)
1258                return -EINVAL;
1259
1260        if (!S_ISREG(VFS_I(ip)->i_mode) && !S_ISDIR(VFS_I(ip)->i_mode))
1261                return -EINVAL;
1262
1263        if (fa->fsx_cowextsize != 0) {
1264                xfs_extlen_t    size;
1265                xfs_fsblock_t   cowextsize_fsb;
1266
1267                cowextsize_fsb = XFS_B_TO_FSB(mp, fa->fsx_cowextsize);
1268                if (cowextsize_fsb > MAXEXTLEN)
1269                        return -EINVAL;
1270
1271                size = mp->m_sb.sb_blocksize;
1272                if (cowextsize_fsb > mp->m_sb.sb_agblocks / 2)
1273                        return -EINVAL;
1274
1275                if (fa->fsx_cowextsize % size)
1276                        return -EINVAL;
1277        } else
1278                fa->fsx_xflags &= ~FS_XFLAG_COWEXTSIZE;
1279
1280        return 0;
1281}
1282
1283static int
1284xfs_ioctl_setattr_check_projid(
1285        struct xfs_inode        *ip,
1286        struct fsxattr          *fa)
1287{
1288        /* Disallow 32bit project ids if projid32bit feature is not enabled. */
1289        if (fa->fsx_projid > (__uint16_t)-1 &&
1290            !xfs_sb_version_hasprojid32bit(&ip->i_mount->m_sb))
1291                return -EINVAL;
1292
1293        /*
1294         * Project Quota ID state is only allowed to change from within the init
1295         * namespace. Enforce that restriction only if we are trying to change
1296         * the quota ID state. Everything else is allowed in user namespaces.
1297         */
1298        if (current_user_ns() == &init_user_ns)
1299                return 0;
1300
1301        if (xfs_get_projid(ip) != fa->fsx_projid)
1302                return -EINVAL;
1303        if ((fa->fsx_xflags & FS_XFLAG_PROJINHERIT) !=
1304            (ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT))
1305                return -EINVAL;
1306
1307        return 0;
1308}
1309
1310STATIC int
1311xfs_ioctl_setattr(
1312        xfs_inode_t             *ip,
1313        struct fsxattr          *fa)
1314{
1315        struct xfs_mount        *mp = ip->i_mount;
1316        struct xfs_trans        *tp;
1317        struct xfs_dquot        *udqp = NULL;
1318        struct xfs_dquot        *pdqp = NULL;
1319        struct xfs_dquot        *olddquot = NULL;
1320        int                     code;
1321        int                     join_flags = 0;
1322
1323        trace_xfs_ioctl_setattr(ip);
1324
1325        code = xfs_ioctl_setattr_check_projid(ip, fa);
1326        if (code)
1327                return code;
1328
1329        /*
1330         * If disk quotas is on, we make sure that the dquots do exist on disk,
1331         * before we start any other transactions. Trying to do this later
1332         * is messy. We don't care to take a readlock to look at the ids
1333         * in inode here, because we can't hold it across the trans_reserve.
1334         * If the IDs do change before we take the ilock, we're covered
1335         * because the i_*dquot fields will get updated anyway.
1336         */
1337        if (XFS_IS_QUOTA_ON(mp)) {
1338                code = xfs_qm_vop_dqalloc(ip, ip->i_d.di_uid,
1339                                         ip->i_d.di_gid, fa->fsx_projid,
1340                                         XFS_QMOPT_PQUOTA, &udqp, NULL, &pdqp);
1341                if (code)
1342                        return code;
1343        }
1344
1345        /*
1346         * Changing DAX config may require inode locking for mapping
1347         * invalidation. These need to be held all the way to transaction commit
1348         * or cancel time, so need to be passed through to
1349         * xfs_ioctl_setattr_get_trans() so it can apply them to the join call
1350         * appropriately.
1351         */
1352        code = xfs_ioctl_setattr_dax_invalidate(ip, fa, &join_flags);
1353        if (code)
1354                goto error_free_dquots;
1355
1356        tp = xfs_ioctl_setattr_get_trans(ip, join_flags);
1357        if (IS_ERR(tp)) {
1358                code = PTR_ERR(tp);
1359                goto error_free_dquots;
1360        }
1361
1362
1363        if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_PQUOTA_ON(mp) &&
1364            xfs_get_projid(ip) != fa->fsx_projid) {
1365                code = xfs_qm_vop_chown_reserve(tp, ip, udqp, NULL, pdqp,
1366                                capable(CAP_FOWNER) ?  XFS_QMOPT_FORCE_RES : 0);
1367                if (code)       /* out of quota */
1368                        goto error_trans_cancel;
1369        }
1370
1371        code = xfs_ioctl_setattr_check_extsize(ip, fa);
1372        if (code)
1373                goto error_trans_cancel;
1374
1375        code = xfs_ioctl_setattr_check_cowextsize(ip, fa);
1376        if (code)
1377                goto error_trans_cancel;
1378
1379        code = xfs_ioctl_setattr_xflags(tp, ip, fa);
1380        if (code)
1381                goto error_trans_cancel;
1382
1383        /*
1384         * Change file ownership.  Must be the owner or privileged.  CAP_FSETID
1385         * overrides the following restrictions:
1386         *
1387         * The set-user-ID and set-group-ID bits of a file will be cleared upon
1388         * successful return from chown()
1389         */
1390
1391        if ((VFS_I(ip)->i_mode & (S_ISUID|S_ISGID)) &&
1392            !capable_wrt_inode_uidgid(VFS_I(ip), CAP_FSETID))
1393                VFS_I(ip)->i_mode &= ~(S_ISUID|S_ISGID);
1394
1395        /* Change the ownerships and register project quota modifications */
1396        if (xfs_get_projid(ip) != fa->fsx_projid) {
1397                if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_PQUOTA_ON(mp)) {
1398                        olddquot = xfs_qm_vop_chown(tp, ip,
1399                                                &ip->i_pdquot, pdqp);
1400                }
1401                ASSERT(ip->i_d.di_version > 1);
1402                xfs_set_projid(ip, fa->fsx_projid);
1403        }
1404
1405        /*
1406         * Only set the extent size hint if we've already determined that the
1407         * extent size hint should be set on the inode. If no extent size flags
1408         * are set on the inode then unconditionally clear the extent size hint.
1409         */
1410        if (ip->i_d.di_flags & (XFS_DIFLAG_EXTSIZE | XFS_DIFLAG_EXTSZINHERIT))
1411                ip->i_d.di_extsize = fa->fsx_extsize >> mp->m_sb.sb_blocklog;
1412        else
1413                ip->i_d.di_extsize = 0;
1414        if (ip->i_d.di_version == 3 &&
1415            (ip->i_d.di_flags2 & XFS_DIFLAG2_COWEXTSIZE))
1416                ip->i_d.di_cowextsize = fa->fsx_cowextsize >>
1417                                mp->m_sb.sb_blocklog;
1418        else
1419                ip->i_d.di_cowextsize = 0;
1420
1421        code = xfs_trans_commit(tp);
1422
1423        /*
1424         * Release any dquot(s) the inode had kept before chown.
1425         */
1426        xfs_qm_dqrele(olddquot);
1427        xfs_qm_dqrele(udqp);
1428        xfs_qm_dqrele(pdqp);
1429
1430        return code;
1431
1432error_trans_cancel:
1433        xfs_trans_cancel(tp);
1434error_free_dquots:
1435        xfs_qm_dqrele(udqp);
1436        xfs_qm_dqrele(pdqp);
1437        return code;
1438}
1439
1440STATIC int
1441xfs_ioc_fssetxattr(
1442        xfs_inode_t             *ip,
1443        struct file             *filp,
1444        void                    __user *arg)
1445{
1446        struct fsxattr          fa;
1447        int error;
1448
1449        if (copy_from_user(&fa, arg, sizeof(fa)))
1450                return -EFAULT;
1451
1452        error = mnt_want_write_file(filp);
1453        if (error)
1454                return error;
1455        error = xfs_ioctl_setattr(ip, &fa);
1456        mnt_drop_write_file(filp);
1457        return error;
1458}
1459
1460STATIC int
1461xfs_ioc_getxflags(
1462        xfs_inode_t             *ip,
1463        void                    __user *arg)
1464{
1465        unsigned int            flags;
1466
1467        flags = xfs_di2lxflags(ip->i_d.di_flags);
1468        if (copy_to_user(arg, &flags, sizeof(flags)))
1469                return -EFAULT;
1470        return 0;
1471}
1472
1473STATIC int
1474xfs_ioc_setxflags(
1475        struct xfs_inode        *ip,
1476        struct file             *filp,
1477        void                    __user *arg)
1478{
1479        struct xfs_trans        *tp;
1480        struct fsxattr          fa;
1481        unsigned int            flags;
1482        int                     join_flags = 0;
1483        int                     error;
1484
1485        if (copy_from_user(&flags, arg, sizeof(flags)))
1486                return -EFAULT;
1487
1488        if (flags & ~(FS_IMMUTABLE_FL | FS_APPEND_FL | \
1489                      FS_NOATIME_FL | FS_NODUMP_FL | \
1490                      FS_SYNC_FL))
1491                return -EOPNOTSUPP;
1492
1493        fa.fsx_xflags = xfs_merge_ioc_xflags(flags, xfs_ip2xflags(ip));
1494
1495        error = mnt_want_write_file(filp);
1496        if (error)
1497                return error;
1498
1499        /*
1500         * Changing DAX config may require inode locking for mapping
1501         * invalidation. These need to be held all the way to transaction commit
1502         * or cancel time, so need to be passed through to
1503         * xfs_ioctl_setattr_get_trans() so it can apply them to the join call
1504         * appropriately.
1505         */
1506        error = xfs_ioctl_setattr_dax_invalidate(ip, &fa, &join_flags);
1507        if (error)
1508                goto out_drop_write;
1509
1510        tp = xfs_ioctl_setattr_get_trans(ip, join_flags);
1511        if (IS_ERR(tp)) {
1512                error = PTR_ERR(tp);
1513                goto out_drop_write;
1514        }
1515
1516        error = xfs_ioctl_setattr_xflags(tp, ip, &fa);
1517        if (error) {
1518                xfs_trans_cancel(tp);
1519                goto out_drop_write;
1520        }
1521
1522        error = xfs_trans_commit(tp);
1523out_drop_write:
1524        mnt_drop_write_file(filp);
1525        return error;
1526}
1527
1528STATIC int
1529xfs_getbmap_format(void **ap, struct getbmapx *bmv, int *full)
1530{
1531        struct getbmap __user   *base = (struct getbmap __user *)*ap;
1532
1533        /* copy only getbmap portion (not getbmapx) */
1534        if (copy_to_user(base, bmv, sizeof(struct getbmap)))
1535                return -EFAULT;
1536
1537        *ap += sizeof(struct getbmap);
1538        return 0;
1539}
1540
1541STATIC int
1542xfs_ioc_getbmap(
1543        struct file             *file,
1544        unsigned int            cmd,
1545        void                    __user *arg)
1546{
1547        struct getbmapx         bmx;
1548        int                     error;
1549
1550        if (copy_from_user(&bmx, arg, sizeof(struct getbmapx)))
1551                return -EFAULT;
1552
1553        if (bmx.bmv_count < 2)
1554                return -EINVAL;
1555
1556        bmx.bmv_iflags = (cmd == XFS_IOC_GETBMAPA ? BMV_IF_ATTRFORK : 0);
1557        if (file->f_mode & FMODE_NOCMTIME)
1558                bmx.bmv_iflags |= BMV_IF_NO_DMAPI_READ;
1559
1560        error = xfs_getbmap(XFS_I(file_inode(file)), &bmx, xfs_getbmap_format,
1561                            (__force struct getbmap *)arg+1);
1562        if (error)
1563                return error;
1564
1565        /* copy back header - only size of getbmap */
1566        if (copy_to_user(arg, &bmx, sizeof(struct getbmap)))
1567                return -EFAULT;
1568        return 0;
1569}
1570
1571STATIC int
1572xfs_getbmapx_format(void **ap, struct getbmapx *bmv, int *full)
1573{
1574        struct getbmapx __user  *base = (struct getbmapx __user *)*ap;
1575
1576        if (copy_to_user(base, bmv, sizeof(struct getbmapx)))
1577                return -EFAULT;
1578
1579        *ap += sizeof(struct getbmapx);
1580        return 0;
1581}
1582
1583STATIC int
1584xfs_ioc_getbmapx(
1585        struct xfs_inode        *ip,
1586        void                    __user *arg)
1587{
1588        struct getbmapx         bmx;
1589        int                     error;
1590
1591        if (copy_from_user(&bmx, arg, sizeof(bmx)))
1592                return -EFAULT;
1593
1594        if (bmx.bmv_count < 2)
1595                return -EINVAL;
1596
1597        if (bmx.bmv_iflags & (~BMV_IF_VALID))
1598                return -EINVAL;
1599
1600        error = xfs_getbmap(ip, &bmx, xfs_getbmapx_format,
1601                            (__force struct getbmapx *)arg+1);
1602        if (error)
1603                return error;
1604
1605        /* copy back header */
1606        if (copy_to_user(arg, &bmx, sizeof(struct getbmapx)))
1607                return -EFAULT;
1608
1609        return 0;
1610}
1611
1612int
1613xfs_ioc_swapext(
1614        xfs_swapext_t   *sxp)
1615{
1616        xfs_inode_t     *ip, *tip;
1617        struct fd       f, tmp;
1618        int             error = 0;
1619
1620        /* Pull information for the target fd */
1621        f = fdget((int)sxp->sx_fdtarget);
1622        if (!f.file) {
1623                error = -EINVAL;
1624                goto out;
1625        }
1626
1627        if (!(f.file->f_mode & FMODE_WRITE) ||
1628            !(f.file->f_mode & FMODE_READ) ||
1629            (f.file->f_flags & O_APPEND)) {
1630                error = -EBADF;
1631                goto out_put_file;
1632        }
1633
1634        tmp = fdget((int)sxp->sx_fdtmp);
1635        if (!tmp.file) {
1636                error = -EINVAL;
1637                goto out_put_file;
1638        }
1639
1640        if (!(tmp.file->f_mode & FMODE_WRITE) ||
1641            !(tmp.file->f_mode & FMODE_READ) ||
1642            (tmp.file->f_flags & O_APPEND)) {
1643                error = -EBADF;
1644                goto out_put_tmp_file;
1645        }
1646
1647        if (IS_SWAPFILE(file_inode(f.file)) ||
1648            IS_SWAPFILE(file_inode(tmp.file))) {
1649                error = -EINVAL;
1650                goto out_put_tmp_file;
1651        }
1652
1653        /*
1654         * We need to ensure that the fds passed in point to XFS inodes
1655         * before we cast and access them as XFS structures as we have no
1656         * control over what the user passes us here.
1657         */
1658        if (f.file->f_op != &xfs_file_operations ||
1659            tmp.file->f_op != &xfs_file_operations) {
1660                error = -EINVAL;
1661                goto out_put_tmp_file;
1662        }
1663
1664        ip = XFS_I(file_inode(f.file));
1665        tip = XFS_I(file_inode(tmp.file));
1666
1667        if (ip->i_mount != tip->i_mount) {
1668                error = -EINVAL;
1669                goto out_put_tmp_file;
1670        }
1671
1672        if (ip->i_ino == tip->i_ino) {
1673                error = -EINVAL;
1674                goto out_put_tmp_file;
1675        }
1676
1677        if (XFS_FORCED_SHUTDOWN(ip->i_mount)) {
1678                error = -EIO;
1679                goto out_put_tmp_file;
1680        }
1681
1682        error = xfs_swap_extents(ip, tip, sxp);
1683
1684 out_put_tmp_file:
1685        fdput(tmp);
1686 out_put_file:
1687        fdput(f);
1688 out:
1689        return error;
1690}
1691
1692/*
1693 * Note: some of the ioctl's return positive numbers as a
1694 * byte count indicating success, such as readlink_by_handle.
1695 * So we don't "sign flip" like most other routines.  This means
1696 * true errors need to be returned as a negative value.
1697 */
1698long
1699xfs_file_ioctl(
1700        struct file             *filp,
1701        unsigned int            cmd,
1702        unsigned long           p)
1703{
1704        struct inode            *inode = file_inode(filp);
1705        struct xfs_inode        *ip = XFS_I(inode);
1706        struct xfs_mount        *mp = ip->i_mount;
1707        void                    __user *arg = (void __user *)p;
1708        int                     error;
1709
1710        trace_xfs_file_ioctl(ip);
1711
1712        switch (cmd) {
1713        case FITRIM:
1714                return xfs_ioc_trim(mp, arg);
1715        case XFS_IOC_ALLOCSP:
1716        case XFS_IOC_FREESP:
1717        case XFS_IOC_RESVSP:
1718        case XFS_IOC_UNRESVSP:
1719        case XFS_IOC_ALLOCSP64:
1720        case XFS_IOC_FREESP64:
1721        case XFS_IOC_RESVSP64:
1722        case XFS_IOC_UNRESVSP64:
1723        case XFS_IOC_ZERO_RANGE: {
1724                xfs_flock64_t           bf;
1725
1726                if (copy_from_user(&bf, arg, sizeof(bf)))
1727                        return -EFAULT;
1728                return xfs_ioc_space(filp, cmd, &bf);
1729        }
1730        case XFS_IOC_DIOINFO: {
1731                struct dioattr  da;
1732                xfs_buftarg_t   *target =
1733                        XFS_IS_REALTIME_INODE(ip) ?
1734                        mp->m_rtdev_targp : mp->m_ddev_targp;
1735
1736                da.d_mem =  da.d_miniosz = target->bt_logical_sectorsize;
1737                da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1);
1738
1739                if (copy_to_user(arg, &da, sizeof(da)))
1740                        return -EFAULT;
1741                return 0;
1742        }
1743
1744        case XFS_IOC_FSBULKSTAT_SINGLE:
1745        case XFS_IOC_FSBULKSTAT:
1746        case XFS_IOC_FSINUMBERS:
1747                return xfs_ioc_bulkstat(mp, cmd, arg);
1748
1749        case XFS_IOC_FSGEOMETRY_V1:
1750                return xfs_ioc_fsgeometry_v1(mp, arg);
1751
1752        case XFS_IOC_FSGEOMETRY:
1753                return xfs_ioc_fsgeometry(mp, arg);
1754
1755        case XFS_IOC_GETVERSION:
1756                return put_user(inode->i_generation, (int __user *)arg);
1757
1758        case XFS_IOC_FSGETXATTR:
1759                return xfs_ioc_fsgetxattr(ip, 0, arg);
1760        case XFS_IOC_FSGETXATTRA:
1761                return xfs_ioc_fsgetxattr(ip, 1, arg);
1762        case XFS_IOC_FSSETXATTR:
1763                return xfs_ioc_fssetxattr(ip, filp, arg);
1764        case XFS_IOC_GETXFLAGS:
1765                return xfs_ioc_getxflags(ip, arg);
1766        case XFS_IOC_SETXFLAGS:
1767                return xfs_ioc_setxflags(ip, filp, arg);
1768
1769        case XFS_IOC_FSSETDM: {
1770                struct fsdmidata        dmi;
1771
1772                if (copy_from_user(&dmi, arg, sizeof(dmi)))
1773                        return -EFAULT;
1774
1775                error = mnt_want_write_file(filp);
1776                if (error)
1777                        return error;
1778
1779                error = xfs_set_dmattrs(ip, dmi.fsd_dmevmask,
1780                                dmi.fsd_dmstate);
1781                mnt_drop_write_file(filp);
1782                return error;
1783        }
1784
1785        case XFS_IOC_GETBMAP:
1786        case XFS_IOC_GETBMAPA:
1787                return xfs_ioc_getbmap(filp, cmd, arg);
1788
1789        case XFS_IOC_GETBMAPX:
1790                return xfs_ioc_getbmapx(ip, arg);
1791
1792        case XFS_IOC_FD_TO_HANDLE:
1793        case XFS_IOC_PATH_TO_HANDLE:
1794        case XFS_IOC_PATH_TO_FSHANDLE: {
1795                xfs_fsop_handlereq_t    hreq;
1796
1797                if (copy_from_user(&hreq, arg, sizeof(hreq)))
1798                        return -EFAULT;
1799                return xfs_find_handle(cmd, &hreq);
1800        }
1801        case XFS_IOC_OPEN_BY_HANDLE: {
1802                xfs_fsop_handlereq_t    hreq;
1803
1804                if (copy_from_user(&hreq, arg, sizeof(xfs_fsop_handlereq_t)))
1805                        return -EFAULT;
1806                return xfs_open_by_handle(filp, &hreq);
1807        }
1808        case XFS_IOC_FSSETDM_BY_HANDLE:
1809                return xfs_fssetdm_by_handle(filp, arg);
1810
1811        case XFS_IOC_READLINK_BY_HANDLE: {
1812                xfs_fsop_handlereq_t    hreq;
1813
1814                if (copy_from_user(&hreq, arg, sizeof(xfs_fsop_handlereq_t)))
1815                        return -EFAULT;
1816                return xfs_readlink_by_handle(filp, &hreq);
1817        }
1818        case XFS_IOC_ATTRLIST_BY_HANDLE:
1819                return xfs_attrlist_by_handle(filp, arg);
1820
1821        case XFS_IOC_ATTRMULTI_BY_HANDLE:
1822                return xfs_attrmulti_by_handle(filp, arg);
1823
1824        case XFS_IOC_SWAPEXT: {
1825                struct xfs_swapext      sxp;
1826
1827                if (copy_from_user(&sxp, arg, sizeof(xfs_swapext_t)))
1828                        return -EFAULT;
1829                error = mnt_want_write_file(filp);
1830                if (error)
1831                        return error;
1832                error = xfs_ioc_swapext(&sxp);
1833                mnt_drop_write_file(filp);
1834                return error;
1835        }
1836
1837        case XFS_IOC_FSCOUNTS: {
1838                xfs_fsop_counts_t out;
1839
1840                error = xfs_fs_counts(mp, &out);
1841                if (error)
1842                        return error;
1843
1844                if (copy_to_user(arg, &out, sizeof(out)))
1845                        return -EFAULT;
1846                return 0;
1847        }
1848
1849        case XFS_IOC_SET_RESBLKS: {
1850                xfs_fsop_resblks_t inout;
1851                __uint64_t         in;
1852
1853                if (!capable(CAP_SYS_ADMIN))
1854                        return -EPERM;
1855
1856                if (mp->m_flags & XFS_MOUNT_RDONLY)
1857                        return -EROFS;
1858
1859                if (copy_from_user(&inout, arg, sizeof(inout)))
1860                        return -EFAULT;
1861
1862                error = mnt_want_write_file(filp);
1863                if (error)
1864                        return error;
1865
1866                /* input parameter is passed in resblks field of structure */
1867                in = inout.resblks;
1868                error = xfs_reserve_blocks(mp, &in, &inout);
1869                mnt_drop_write_file(filp);
1870                if (error)
1871                        return error;
1872
1873                if (copy_to_user(arg, &inout, sizeof(inout)))
1874                        return -EFAULT;
1875                return 0;
1876        }
1877
1878        case XFS_IOC_GET_RESBLKS: {
1879                xfs_fsop_resblks_t out;
1880
1881                if (!capable(CAP_SYS_ADMIN))
1882                        return -EPERM;
1883
1884                error = xfs_reserve_blocks(mp, NULL, &out);
1885                if (error)
1886                        return error;
1887
1888                if (copy_to_user(arg, &out, sizeof(out)))
1889                        return -EFAULT;
1890
1891                return 0;
1892        }
1893
1894        case XFS_IOC_FSGROWFSDATA: {
1895                xfs_growfs_data_t in;
1896
1897                if (copy_from_user(&in, arg, sizeof(in)))
1898                        return -EFAULT;
1899
1900                error = mnt_want_write_file(filp);
1901                if (error)
1902                        return error;
1903                error = xfs_growfs_data(mp, &in);
1904                mnt_drop_write_file(filp);
1905                return error;
1906        }
1907
1908        case XFS_IOC_FSGROWFSLOG: {
1909                xfs_growfs_log_t in;
1910
1911                if (copy_from_user(&in, arg, sizeof(in)))
1912                        return -EFAULT;
1913
1914                error = mnt_want_write_file(filp);
1915                if (error)
1916                        return error;
1917                error = xfs_growfs_log(mp, &in);
1918                mnt_drop_write_file(filp);
1919                return error;
1920        }
1921
1922        case XFS_IOC_FSGROWFSRT: {
1923                xfs_growfs_rt_t in;
1924
1925                if (copy_from_user(&in, arg, sizeof(in)))
1926                        return -EFAULT;
1927
1928                error = mnt_want_write_file(filp);
1929                if (error)
1930                        return error;
1931                error = xfs_growfs_rt(mp, &in);
1932                mnt_drop_write_file(filp);
1933                return error;
1934        }
1935
1936        case XFS_IOC_GOINGDOWN: {
1937                __uint32_t in;
1938
1939                if (!capable(CAP_SYS_ADMIN))
1940                        return -EPERM;
1941
1942                if (get_user(in, (__uint32_t __user *)arg))
1943                        return -EFAULT;
1944
1945                return xfs_fs_goingdown(mp, in);
1946        }
1947
1948        case XFS_IOC_ERROR_INJECTION: {
1949                xfs_error_injection_t in;
1950
1951                if (!capable(CAP_SYS_ADMIN))
1952                        return -EPERM;
1953
1954                if (copy_from_user(&in, arg, sizeof(in)))
1955                        return -EFAULT;
1956
1957                return xfs_errortag_add(in.errtag, mp);
1958        }
1959
1960        case XFS_IOC_ERROR_CLEARALL:
1961                if (!capable(CAP_SYS_ADMIN))
1962                        return -EPERM;
1963
1964                return xfs_errortag_clearall(mp, 1);
1965
1966        case XFS_IOC_FREE_EOFBLOCKS: {
1967                struct xfs_fs_eofblocks eofb;
1968                struct xfs_eofblocks keofb;
1969
1970                if (!capable(CAP_SYS_ADMIN))
1971                        return -EPERM;
1972
1973                if (mp->m_flags & XFS_MOUNT_RDONLY)
1974                        return -EROFS;
1975
1976                if (copy_from_user(&eofb, arg, sizeof(eofb)))
1977                        return -EFAULT;
1978
1979                error = xfs_fs_eofblocks_from_user(&eofb, &keofb);
1980                if (error)
1981                        return error;
1982
1983                return xfs_icache_free_eofblocks(mp, &keofb);
1984        }
1985
1986        default:
1987                return -ENOTTY;
1988        }
1989}
1990