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