linux/fs/btrfs/ioctl.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2007 Oracle.  All rights reserved.
   3 *
   4 * This program is free software; you can redistribute it and/or
   5 * modify it under the terms of the GNU General Public
   6 * License v2 as published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope that it will be useful,
   9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11 * General Public License for more details.
  12 *
  13 * You should have received a copy of the GNU General Public
  14 * License along with this program; if not, write to the
  15 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  16 * Boston, MA 021110-1307, USA.
  17 */
  18
  19#include <linux/kernel.h>
  20#include <linux/bio.h>
  21#include <linux/buffer_head.h>
  22#include <linux/file.h>
  23#include <linux/fs.h>
  24#include <linux/fsnotify.h>
  25#include <linux/pagemap.h>
  26#include <linux/highmem.h>
  27#include <linux/time.h>
  28#include <linux/init.h>
  29#include <linux/string.h>
  30#include <linux/backing-dev.h>
  31#include <linux/mount.h>
  32#include <linux/mpage.h>
  33#include <linux/namei.h>
  34#include <linux/swap.h>
  35#include <linux/writeback.h>
  36#include <linux/statfs.h>
  37#include <linux/compat.h>
  38#include <linux/bit_spinlock.h>
  39#include <linux/security.h>
  40#include <linux/xattr.h>
  41#include <linux/vmalloc.h>
  42#include <linux/slab.h>
  43#include "compat.h"
  44#include "ctree.h"
  45#include "disk-io.h"
  46#include "transaction.h"
  47#include "btrfs_inode.h"
  48#include "ioctl.h"
  49#include "print-tree.h"
  50#include "volumes.h"
  51#include "locking.h"
  52
  53/* Mask out flags that are inappropriate for the given type of inode. */
  54static inline __u32 btrfs_mask_flags(umode_t mode, __u32 flags)
  55{
  56        if (S_ISDIR(mode))
  57                return flags;
  58        else if (S_ISREG(mode))
  59                return flags & ~FS_DIRSYNC_FL;
  60        else
  61                return flags & (FS_NODUMP_FL | FS_NOATIME_FL);
  62}
  63
  64/*
  65 * Export inode flags to the format expected by the FS_IOC_GETFLAGS ioctl.
  66 */
  67static unsigned int btrfs_flags_to_ioctl(unsigned int flags)
  68{
  69        unsigned int iflags = 0;
  70
  71        if (flags & BTRFS_INODE_SYNC)
  72                iflags |= FS_SYNC_FL;
  73        if (flags & BTRFS_INODE_IMMUTABLE)
  74                iflags |= FS_IMMUTABLE_FL;
  75        if (flags & BTRFS_INODE_APPEND)
  76                iflags |= FS_APPEND_FL;
  77        if (flags & BTRFS_INODE_NODUMP)
  78                iflags |= FS_NODUMP_FL;
  79        if (flags & BTRFS_INODE_NOATIME)
  80                iflags |= FS_NOATIME_FL;
  81        if (flags & BTRFS_INODE_DIRSYNC)
  82                iflags |= FS_DIRSYNC_FL;
  83
  84        return iflags;
  85}
  86
  87/*
  88 * Update inode->i_flags based on the btrfs internal flags.
  89 */
  90void btrfs_update_iflags(struct inode *inode)
  91{
  92        struct btrfs_inode *ip = BTRFS_I(inode);
  93
  94        inode->i_flags &= ~(S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC);
  95
  96        if (ip->flags & BTRFS_INODE_SYNC)
  97                inode->i_flags |= S_SYNC;
  98        if (ip->flags & BTRFS_INODE_IMMUTABLE)
  99                inode->i_flags |= S_IMMUTABLE;
 100        if (ip->flags & BTRFS_INODE_APPEND)
 101                inode->i_flags |= S_APPEND;
 102        if (ip->flags & BTRFS_INODE_NOATIME)
 103                inode->i_flags |= S_NOATIME;
 104        if (ip->flags & BTRFS_INODE_DIRSYNC)
 105                inode->i_flags |= S_DIRSYNC;
 106}
 107
 108/*
 109 * Inherit flags from the parent inode.
 110 *
 111 * Unlike extN we don't have any flags we don't want to inherit currently.
 112 */
 113void btrfs_inherit_iflags(struct inode *inode, struct inode *dir)
 114{
 115        unsigned int flags;
 116
 117        if (!dir)
 118                return;
 119
 120        flags = BTRFS_I(dir)->flags;
 121
 122        if (S_ISREG(inode->i_mode))
 123                flags &= ~BTRFS_INODE_DIRSYNC;
 124        else if (!S_ISDIR(inode->i_mode))
 125                flags &= (BTRFS_INODE_NODUMP | BTRFS_INODE_NOATIME);
 126
 127        BTRFS_I(inode)->flags = flags;
 128        btrfs_update_iflags(inode);
 129}
 130
 131static int btrfs_ioctl_getflags(struct file *file, void __user *arg)
 132{
 133        struct btrfs_inode *ip = BTRFS_I(file->f_path.dentry->d_inode);
 134        unsigned int flags = btrfs_flags_to_ioctl(ip->flags);
 135
 136        if (copy_to_user(arg, &flags, sizeof(flags)))
 137                return -EFAULT;
 138        return 0;
 139}
 140
 141static int btrfs_ioctl_setflags(struct file *file, void __user *arg)
 142{
 143        struct inode *inode = file->f_path.dentry->d_inode;
 144        struct btrfs_inode *ip = BTRFS_I(inode);
 145        struct btrfs_root *root = ip->root;
 146        struct btrfs_trans_handle *trans;
 147        unsigned int flags, oldflags;
 148        int ret;
 149
 150        if (btrfs_root_readonly(root))
 151                return -EROFS;
 152
 153        if (copy_from_user(&flags, arg, sizeof(flags)))
 154                return -EFAULT;
 155
 156        if (flags & ~(FS_IMMUTABLE_FL | FS_APPEND_FL | \
 157                      FS_NOATIME_FL | FS_NODUMP_FL | \
 158                      FS_SYNC_FL | FS_DIRSYNC_FL))
 159                return -EOPNOTSUPP;
 160
 161        if (!is_owner_or_cap(inode))
 162                return -EACCES;
 163
 164        mutex_lock(&inode->i_mutex);
 165
 166        flags = btrfs_mask_flags(inode->i_mode, flags);
 167        oldflags = btrfs_flags_to_ioctl(ip->flags);
 168        if ((flags ^ oldflags) & (FS_APPEND_FL | FS_IMMUTABLE_FL)) {
 169                if (!capable(CAP_LINUX_IMMUTABLE)) {
 170                        ret = -EPERM;
 171                        goto out_unlock;
 172                }
 173        }
 174
 175        ret = mnt_want_write(file->f_path.mnt);
 176        if (ret)
 177                goto out_unlock;
 178
 179        if (flags & FS_SYNC_FL)
 180                ip->flags |= BTRFS_INODE_SYNC;
 181        else
 182                ip->flags &= ~BTRFS_INODE_SYNC;
 183        if (flags & FS_IMMUTABLE_FL)
 184                ip->flags |= BTRFS_INODE_IMMUTABLE;
 185        else
 186                ip->flags &= ~BTRFS_INODE_IMMUTABLE;
 187        if (flags & FS_APPEND_FL)
 188                ip->flags |= BTRFS_INODE_APPEND;
 189        else
 190                ip->flags &= ~BTRFS_INODE_APPEND;
 191        if (flags & FS_NODUMP_FL)
 192                ip->flags |= BTRFS_INODE_NODUMP;
 193        else
 194                ip->flags &= ~BTRFS_INODE_NODUMP;
 195        if (flags & FS_NOATIME_FL)
 196                ip->flags |= BTRFS_INODE_NOATIME;
 197        else
 198                ip->flags &= ~BTRFS_INODE_NOATIME;
 199        if (flags & FS_DIRSYNC_FL)
 200                ip->flags |= BTRFS_INODE_DIRSYNC;
 201        else
 202                ip->flags &= ~BTRFS_INODE_DIRSYNC;
 203
 204
 205        trans = btrfs_join_transaction(root, 1);
 206        BUG_ON(IS_ERR(trans));
 207
 208        ret = btrfs_update_inode(trans, root, inode);
 209        BUG_ON(ret);
 210
 211        btrfs_update_iflags(inode);
 212        inode->i_ctime = CURRENT_TIME;
 213        btrfs_end_transaction(trans, root);
 214
 215        mnt_drop_write(file->f_path.mnt);
 216 out_unlock:
 217        mutex_unlock(&inode->i_mutex);
 218        return 0;
 219}
 220
 221static int btrfs_ioctl_getversion(struct file *file, int __user *arg)
 222{
 223        struct inode *inode = file->f_path.dentry->d_inode;
 224
 225        return put_user(inode->i_generation, arg);
 226}
 227
 228static noinline int create_subvol(struct btrfs_root *root,
 229                                  struct dentry *dentry,
 230                                  char *name, int namelen,
 231                                  u64 *async_transid)
 232{
 233        struct btrfs_trans_handle *trans;
 234        struct btrfs_key key;
 235        struct btrfs_root_item root_item;
 236        struct btrfs_inode_item *inode_item;
 237        struct extent_buffer *leaf;
 238        struct btrfs_root *new_root;
 239        struct dentry *parent = dget_parent(dentry);
 240        struct inode *dir;
 241        int ret;
 242        int err;
 243        u64 objectid;
 244        u64 new_dirid = BTRFS_FIRST_FREE_OBJECTID;
 245        u64 index = 0;
 246
 247        ret = btrfs_find_free_objectid(NULL, root->fs_info->tree_root,
 248                                       0, &objectid);
 249        if (ret) {
 250                dput(parent);
 251                return ret;
 252        }
 253
 254        dir = parent->d_inode;
 255
 256        /*
 257         * 1 - inode item
 258         * 2 - refs
 259         * 1 - root item
 260         * 2 - dir items
 261         */
 262        trans = btrfs_start_transaction(root, 6);
 263        if (IS_ERR(trans)) {
 264                dput(parent);
 265                return PTR_ERR(trans);
 266        }
 267
 268        leaf = btrfs_alloc_free_block(trans, root, root->leafsize,
 269                                      0, objectid, NULL, 0, 0, 0);
 270        if (IS_ERR(leaf)) {
 271                ret = PTR_ERR(leaf);
 272                goto fail;
 273        }
 274
 275        memset_extent_buffer(leaf, 0, 0, sizeof(struct btrfs_header));
 276        btrfs_set_header_bytenr(leaf, leaf->start);
 277        btrfs_set_header_generation(leaf, trans->transid);
 278        btrfs_set_header_backref_rev(leaf, BTRFS_MIXED_BACKREF_REV);
 279        btrfs_set_header_owner(leaf, objectid);
 280
 281        write_extent_buffer(leaf, root->fs_info->fsid,
 282                            (unsigned long)btrfs_header_fsid(leaf),
 283                            BTRFS_FSID_SIZE);
 284        write_extent_buffer(leaf, root->fs_info->chunk_tree_uuid,
 285                            (unsigned long)btrfs_header_chunk_tree_uuid(leaf),
 286                            BTRFS_UUID_SIZE);
 287        btrfs_mark_buffer_dirty(leaf);
 288
 289        inode_item = &root_item.inode;
 290        memset(inode_item, 0, sizeof(*inode_item));
 291        inode_item->generation = cpu_to_le64(1);
 292        inode_item->size = cpu_to_le64(3);
 293        inode_item->nlink = cpu_to_le32(1);
 294        inode_item->nbytes = cpu_to_le64(root->leafsize);
 295        inode_item->mode = cpu_to_le32(S_IFDIR | 0755);
 296
 297        btrfs_set_root_bytenr(&root_item, leaf->start);
 298        btrfs_set_root_generation(&root_item, trans->transid);
 299        btrfs_set_root_level(&root_item, 0);
 300        btrfs_set_root_refs(&root_item, 1);
 301        btrfs_set_root_used(&root_item, leaf->len);
 302        btrfs_set_root_last_snapshot(&root_item, 0);
 303
 304        memset(&root_item.drop_progress, 0, sizeof(root_item.drop_progress));
 305        root_item.drop_level = 0;
 306
 307        btrfs_tree_unlock(leaf);
 308        free_extent_buffer(leaf);
 309        leaf = NULL;
 310
 311        btrfs_set_root_dirid(&root_item, new_dirid);
 312
 313        key.objectid = objectid;
 314        key.offset = 0;
 315        btrfs_set_key_type(&key, BTRFS_ROOT_ITEM_KEY);
 316        ret = btrfs_insert_root(trans, root->fs_info->tree_root, &key,
 317                                &root_item);
 318        if (ret)
 319                goto fail;
 320
 321        key.offset = (u64)-1;
 322        new_root = btrfs_read_fs_root_no_name(root->fs_info, &key);
 323        BUG_ON(IS_ERR(new_root));
 324
 325        btrfs_record_root_in_trans(trans, new_root);
 326
 327        ret = btrfs_create_subvol_root(trans, new_root, new_dirid,
 328                                       BTRFS_I(dir)->block_group);
 329        /*
 330         * insert the directory item
 331         */
 332        ret = btrfs_set_inode_index(dir, &index);
 333        BUG_ON(ret);
 334
 335        ret = btrfs_insert_dir_item(trans, root,
 336                                    name, namelen, dir->i_ino, &key,
 337                                    BTRFS_FT_DIR, index);
 338        if (ret)
 339                goto fail;
 340
 341        btrfs_i_size_write(dir, dir->i_size + namelen * 2);
 342        ret = btrfs_update_inode(trans, root, dir);
 343        BUG_ON(ret);
 344
 345        ret = btrfs_add_root_ref(trans, root->fs_info->tree_root,
 346                                 objectid, root->root_key.objectid,
 347                                 dir->i_ino, index, name, namelen);
 348
 349        BUG_ON(ret);
 350
 351        d_instantiate(dentry, btrfs_lookup_dentry(dir, dentry));
 352fail:
 353        dput(parent);
 354        if (async_transid) {
 355                *async_transid = trans->transid;
 356                err = btrfs_commit_transaction_async(trans, root, 1);
 357        } else {
 358                err = btrfs_commit_transaction(trans, root);
 359        }
 360        if (err && !ret)
 361                ret = err;
 362        return ret;
 363}
 364
 365static int create_snapshot(struct btrfs_root *root, struct dentry *dentry,
 366                           char *name, int namelen, u64 *async_transid,
 367                           bool readonly)
 368{
 369        struct inode *inode;
 370        struct dentry *parent;
 371        struct btrfs_pending_snapshot *pending_snapshot;
 372        struct btrfs_trans_handle *trans;
 373        int ret;
 374
 375        if (!root->ref_cows)
 376                return -EINVAL;
 377
 378        pending_snapshot = kzalloc(sizeof(*pending_snapshot), GFP_NOFS);
 379        if (!pending_snapshot)
 380                return -ENOMEM;
 381
 382        btrfs_init_block_rsv(&pending_snapshot->block_rsv);
 383        pending_snapshot->dentry = dentry;
 384        pending_snapshot->root = root;
 385        pending_snapshot->readonly = readonly;
 386
 387        trans = btrfs_start_transaction(root->fs_info->extent_root, 5);
 388        if (IS_ERR(trans)) {
 389                ret = PTR_ERR(trans);
 390                goto fail;
 391        }
 392
 393        ret = btrfs_snap_reserve_metadata(trans, pending_snapshot);
 394        BUG_ON(ret);
 395
 396        list_add(&pending_snapshot->list,
 397                 &trans->transaction->pending_snapshots);
 398        if (async_transid) {
 399                *async_transid = trans->transid;
 400                ret = btrfs_commit_transaction_async(trans,
 401                                     root->fs_info->extent_root, 1);
 402        } else {
 403                ret = btrfs_commit_transaction(trans,
 404                                               root->fs_info->extent_root);
 405        }
 406        BUG_ON(ret);
 407
 408        ret = pending_snapshot->error;
 409        if (ret)
 410                goto fail;
 411
 412        btrfs_orphan_cleanup(pending_snapshot->snap);
 413
 414        parent = dget_parent(dentry);
 415        inode = btrfs_lookup_dentry(parent->d_inode, dentry);
 416        dput(parent);
 417        if (IS_ERR(inode)) {
 418                ret = PTR_ERR(inode);
 419                goto fail;
 420        }
 421        BUG_ON(!inode);
 422        d_instantiate(dentry, inode);
 423        ret = 0;
 424fail:
 425        kfree(pending_snapshot);
 426        return ret;
 427}
 428
 429/*  copy of check_sticky in fs/namei.c()
 430* It's inline, so penalty for filesystems that don't use sticky bit is
 431* minimal.
 432*/
 433static inline int btrfs_check_sticky(struct inode *dir, struct inode *inode)
 434{
 435        uid_t fsuid = current_fsuid();
 436
 437        if (!(dir->i_mode & S_ISVTX))
 438                return 0;
 439        if (inode->i_uid == fsuid)
 440                return 0;
 441        if (dir->i_uid == fsuid)
 442                return 0;
 443        return !capable(CAP_FOWNER);
 444}
 445
 446/*  copy of may_delete in fs/namei.c()
 447 *      Check whether we can remove a link victim from directory dir, check
 448 *  whether the type of victim is right.
 449 *  1. We can't do it if dir is read-only (done in permission())
 450 *  2. We should have write and exec permissions on dir
 451 *  3. We can't remove anything from append-only dir
 452 *  4. We can't do anything with immutable dir (done in permission())
 453 *  5. If the sticky bit on dir is set we should either
 454 *      a. be owner of dir, or
 455 *      b. be owner of victim, or
 456 *      c. have CAP_FOWNER capability
 457 *  6. If the victim is append-only or immutable we can't do antyhing with
 458 *     links pointing to it.
 459 *  7. If we were asked to remove a directory and victim isn't one - ENOTDIR.
 460 *  8. If we were asked to remove a non-directory and victim isn't one - EISDIR.
 461 *  9. We can't remove a root or mountpoint.
 462 * 10. We don't allow removal of NFS sillyrenamed files; it's handled by
 463 *     nfs_async_unlink().
 464 */
 465
 466static int btrfs_may_delete(struct inode *dir,struct dentry *victim,int isdir)
 467{
 468        int error;
 469
 470        if (!victim->d_inode)
 471                return -ENOENT;
 472
 473        BUG_ON(victim->d_parent->d_inode != dir);
 474        audit_inode_child(victim, dir);
 475
 476        error = inode_permission(dir, MAY_WRITE | MAY_EXEC);
 477        if (error)
 478                return error;
 479        if (IS_APPEND(dir))
 480                return -EPERM;
 481        if (btrfs_check_sticky(dir, victim->d_inode)||
 482                IS_APPEND(victim->d_inode)||
 483            IS_IMMUTABLE(victim->d_inode) || IS_SWAPFILE(victim->d_inode))
 484                return -EPERM;
 485        if (isdir) {
 486                if (!S_ISDIR(victim->d_inode->i_mode))
 487                        return -ENOTDIR;
 488                if (IS_ROOT(victim))
 489                        return -EBUSY;
 490        } else if (S_ISDIR(victim->d_inode->i_mode))
 491                return -EISDIR;
 492        if (IS_DEADDIR(dir))
 493                return -ENOENT;
 494        if (victim->d_flags & DCACHE_NFSFS_RENAMED)
 495                return -EBUSY;
 496        return 0;
 497}
 498
 499/* copy of may_create in fs/namei.c() */
 500static inline int btrfs_may_create(struct inode *dir, struct dentry *child)
 501{
 502        if (child->d_inode)
 503                return -EEXIST;
 504        if (IS_DEADDIR(dir))
 505                return -ENOENT;
 506        return inode_permission(dir, MAY_WRITE | MAY_EXEC);
 507}
 508
 509/*
 510 * Create a new subvolume below @parent.  This is largely modeled after
 511 * sys_mkdirat and vfs_mkdir, but we only do a single component lookup
 512 * inside this filesystem so it's quite a bit simpler.
 513 */
 514static noinline int btrfs_mksubvol(struct path *parent,
 515                                   char *name, int namelen,
 516                                   struct btrfs_root *snap_src,
 517                                   u64 *async_transid, bool readonly)
 518{
 519        struct inode *dir  = parent->dentry->d_inode;
 520        struct dentry *dentry;
 521        int error;
 522
 523        mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT);
 524
 525        dentry = lookup_one_len(name, parent->dentry, namelen);
 526        error = PTR_ERR(dentry);
 527        if (IS_ERR(dentry))
 528                goto out_unlock;
 529
 530        error = -EEXIST;
 531        if (dentry->d_inode)
 532                goto out_dput;
 533
 534        error = mnt_want_write(parent->mnt);
 535        if (error)
 536                goto out_dput;
 537
 538        error = btrfs_may_create(dir, dentry);
 539        if (error)
 540                goto out_drop_write;
 541
 542        down_read(&BTRFS_I(dir)->root->fs_info->subvol_sem);
 543
 544        if (btrfs_root_refs(&BTRFS_I(dir)->root->root_item) == 0)
 545                goto out_up_read;
 546
 547        if (snap_src) {
 548                error = create_snapshot(snap_src, dentry,
 549                                        name, namelen, async_transid, readonly);
 550        } else {
 551                error = create_subvol(BTRFS_I(dir)->root, dentry,
 552                                      name, namelen, async_transid);
 553        }
 554        if (!error)
 555                fsnotify_mkdir(dir, dentry);
 556out_up_read:
 557        up_read(&BTRFS_I(dir)->root->fs_info->subvol_sem);
 558out_drop_write:
 559        mnt_drop_write(parent->mnt);
 560out_dput:
 561        dput(dentry);
 562out_unlock:
 563        mutex_unlock(&dir->i_mutex);
 564        return error;
 565}
 566
 567static int should_defrag_range(struct inode *inode, u64 start, u64 len,
 568                               int thresh, u64 *last_len, u64 *skip,
 569                               u64 *defrag_end)
 570{
 571        struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
 572        struct extent_map *em = NULL;
 573        struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
 574        int ret = 1;
 575
 576
 577        if (thresh == 0)
 578                thresh = 256 * 1024;
 579
 580        /*
 581         * make sure that once we start defragging and extent, we keep on
 582         * defragging it
 583         */
 584        if (start < *defrag_end)
 585                return 1;
 586
 587        *skip = 0;
 588
 589        /*
 590         * hopefully we have this extent in the tree already, try without
 591         * the full extent lock
 592         */
 593        read_lock(&em_tree->lock);
 594        em = lookup_extent_mapping(em_tree, start, len);
 595        read_unlock(&em_tree->lock);
 596
 597        if (!em) {
 598                /* get the big lock and read metadata off disk */
 599                lock_extent(io_tree, start, start + len - 1, GFP_NOFS);
 600                em = btrfs_get_extent(inode, NULL, 0, start, len, 0);
 601                unlock_extent(io_tree, start, start + len - 1, GFP_NOFS);
 602
 603                if (IS_ERR(em))
 604                        return 0;
 605        }
 606
 607        /* this will cover holes, and inline extents */
 608        if (em->block_start >= EXTENT_MAP_LAST_BYTE)
 609                ret = 0;
 610
 611        /*
 612         * we hit a real extent, if it is big don't bother defragging it again
 613         */
 614        if ((*last_len == 0 || *last_len >= thresh) && em->len >= thresh)
 615                ret = 0;
 616
 617        /*
 618         * last_len ends up being a counter of how many bytes we've defragged.
 619         * every time we choose not to defrag an extent, we reset *last_len
 620         * so that the next tiny extent will force a defrag.
 621         *
 622         * The end result of this is that tiny extents before a single big
 623         * extent will force at least part of that big extent to be defragged.
 624         */
 625        if (ret) {
 626                *last_len += len;
 627                *defrag_end = extent_map_end(em);
 628        } else {
 629                *last_len = 0;
 630                *skip = extent_map_end(em);
 631                *defrag_end = 0;
 632        }
 633
 634        free_extent_map(em);
 635        return ret;
 636}
 637
 638static int btrfs_defrag_file(struct file *file,
 639                             struct btrfs_ioctl_defrag_range_args *range)
 640{
 641        struct inode *inode = fdentry(file)->d_inode;
 642        struct btrfs_root *root = BTRFS_I(inode)->root;
 643        struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
 644        struct btrfs_ordered_extent *ordered;
 645        struct page *page;
 646        struct btrfs_super_block *disk_super;
 647        unsigned long last_index;
 648        unsigned long ra_pages = root->fs_info->bdi.ra_pages;
 649        unsigned long total_read = 0;
 650        u64 features;
 651        u64 page_start;
 652        u64 page_end;
 653        u64 last_len = 0;
 654        u64 skip = 0;
 655        u64 defrag_end = 0;
 656        unsigned long i;
 657        int ret;
 658        int compress_type = BTRFS_COMPRESS_ZLIB;
 659
 660        if (range->flags & BTRFS_DEFRAG_RANGE_COMPRESS) {
 661                if (range->compress_type > BTRFS_COMPRESS_TYPES)
 662                        return -EINVAL;
 663                if (range->compress_type)
 664                        compress_type = range->compress_type;
 665        }
 666
 667        if (inode->i_size == 0)
 668                return 0;
 669
 670        if (range->start + range->len > range->start) {
 671                last_index = min_t(u64, inode->i_size - 1,
 672                         range->start + range->len - 1) >> PAGE_CACHE_SHIFT;
 673        } else {
 674                last_index = (inode->i_size - 1) >> PAGE_CACHE_SHIFT;
 675        }
 676
 677        i = range->start >> PAGE_CACHE_SHIFT;
 678        while (i <= last_index) {
 679                if (!should_defrag_range(inode, (u64)i << PAGE_CACHE_SHIFT,
 680                                        PAGE_CACHE_SIZE,
 681                                        range->extent_thresh,
 682                                        &last_len, &skip,
 683                                        &defrag_end)) {
 684                        unsigned long next;
 685                        /*
 686                         * the should_defrag function tells us how much to skip
 687                         * bump our counter by the suggested amount
 688                         */
 689                        next = (skip + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
 690                        i = max(i + 1, next);
 691                        continue;
 692                }
 693
 694                if (total_read % ra_pages == 0) {
 695                        btrfs_force_ra(inode->i_mapping, &file->f_ra, file, i,
 696                                       min(last_index, i + ra_pages - 1));
 697                }
 698                total_read++;
 699                mutex_lock(&inode->i_mutex);
 700                if (range->flags & BTRFS_DEFRAG_RANGE_COMPRESS)
 701                        BTRFS_I(inode)->force_compress = compress_type;
 702
 703                ret  = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE);
 704                if (ret)
 705                        goto err_unlock;
 706again:
 707                if (inode->i_size == 0 ||
 708                    i > ((inode->i_size - 1) >> PAGE_CACHE_SHIFT)) {
 709                        ret = 0;
 710                        goto err_reservations;
 711                }
 712
 713                page = grab_cache_page(inode->i_mapping, i);
 714                if (!page) {
 715                        ret = -ENOMEM;
 716                        goto err_reservations;
 717                }
 718
 719                if (!PageUptodate(page)) {
 720                        btrfs_readpage(NULL, page);
 721                        lock_page(page);
 722                        if (!PageUptodate(page)) {
 723                                unlock_page(page);
 724                                page_cache_release(page);
 725                                ret = -EIO;
 726                                goto err_reservations;
 727                        }
 728                }
 729
 730                if (page->mapping != inode->i_mapping) {
 731                        unlock_page(page);
 732                        page_cache_release(page);
 733                        goto again;
 734                }
 735
 736                wait_on_page_writeback(page);
 737
 738                if (PageDirty(page)) {
 739                        btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE);
 740                        goto loop_unlock;
 741                }
 742
 743                page_start = (u64)page->index << PAGE_CACHE_SHIFT;
 744                page_end = page_start + PAGE_CACHE_SIZE - 1;
 745                lock_extent(io_tree, page_start, page_end, GFP_NOFS);
 746
 747                ordered = btrfs_lookup_ordered_extent(inode, page_start);
 748                if (ordered) {
 749                        unlock_extent(io_tree, page_start, page_end, GFP_NOFS);
 750                        unlock_page(page);
 751                        page_cache_release(page);
 752                        btrfs_start_ordered_extent(inode, ordered, 1);
 753                        btrfs_put_ordered_extent(ordered);
 754                        goto again;
 755                }
 756                set_page_extent_mapped(page);
 757
 758                /*
 759                 * this makes sure page_mkwrite is called on the
 760                 * page if it is dirtied again later
 761                 */
 762                clear_page_dirty_for_io(page);
 763                clear_extent_bits(&BTRFS_I(inode)->io_tree, page_start,
 764                                  page_end, EXTENT_DIRTY | EXTENT_DELALLOC |
 765                                  EXTENT_DO_ACCOUNTING, GFP_NOFS);
 766
 767                btrfs_set_extent_delalloc(inode, page_start, page_end, NULL);
 768                ClearPageChecked(page);
 769                set_page_dirty(page);
 770                unlock_extent(io_tree, page_start, page_end, GFP_NOFS);
 771
 772loop_unlock:
 773                unlock_page(page);
 774                page_cache_release(page);
 775                mutex_unlock(&inode->i_mutex);
 776
 777                balance_dirty_pages_ratelimited_nr(inode->i_mapping, 1);
 778                i++;
 779        }
 780
 781        if ((range->flags & BTRFS_DEFRAG_RANGE_START_IO))
 782                filemap_flush(inode->i_mapping);
 783
 784        if ((range->flags & BTRFS_DEFRAG_RANGE_COMPRESS)) {
 785                /* the filemap_flush will queue IO into the worker threads, but
 786                 * we have to make sure the IO is actually started and that
 787                 * ordered extents get created before we return
 788                 */
 789                atomic_inc(&root->fs_info->async_submit_draining);
 790                while (atomic_read(&root->fs_info->nr_async_submits) ||
 791                      atomic_read(&root->fs_info->async_delalloc_pages)) {
 792                        wait_event(root->fs_info->async_submit_wait,
 793                           (atomic_read(&root->fs_info->nr_async_submits) == 0 &&
 794                            atomic_read(&root->fs_info->async_delalloc_pages) == 0));
 795                }
 796                atomic_dec(&root->fs_info->async_submit_draining);
 797
 798                mutex_lock(&inode->i_mutex);
 799                BTRFS_I(inode)->force_compress = BTRFS_COMPRESS_NONE;
 800                mutex_unlock(&inode->i_mutex);
 801        }
 802
 803        disk_super = &root->fs_info->super_copy;
 804        features = btrfs_super_incompat_flags(disk_super);
 805        if (range->compress_type == BTRFS_COMPRESS_LZO) {
 806                features |= BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO;
 807                btrfs_set_super_incompat_flags(disk_super, features);
 808        }
 809
 810        return 0;
 811
 812err_reservations:
 813        btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE);
 814err_unlock:
 815        mutex_unlock(&inode->i_mutex);
 816        return ret;
 817}
 818
 819static noinline int btrfs_ioctl_resize(struct btrfs_root *root,
 820                                        void __user *arg)
 821{
 822        u64 new_size;
 823        u64 old_size;
 824        u64 devid = 1;
 825        struct btrfs_ioctl_vol_args *vol_args;
 826        struct btrfs_trans_handle *trans;
 827        struct btrfs_device *device = NULL;
 828        char *sizestr;
 829        char *devstr = NULL;
 830        int ret = 0;
 831        int mod = 0;
 832
 833        if (root->fs_info->sb->s_flags & MS_RDONLY)
 834                return -EROFS;
 835
 836        if (!capable(CAP_SYS_ADMIN))
 837                return -EPERM;
 838
 839        vol_args = memdup_user(arg, sizeof(*vol_args));
 840        if (IS_ERR(vol_args))
 841                return PTR_ERR(vol_args);
 842
 843        vol_args->name[BTRFS_PATH_NAME_MAX] = '\0';
 844
 845        mutex_lock(&root->fs_info->volume_mutex);
 846        sizestr = vol_args->name;
 847        devstr = strchr(sizestr, ':');
 848        if (devstr) {
 849                char *end;
 850                sizestr = devstr + 1;
 851                *devstr = '\0';
 852                devstr = vol_args->name;
 853                devid = simple_strtoull(devstr, &end, 10);
 854                printk(KERN_INFO "resizing devid %llu\n",
 855                       (unsigned long long)devid);
 856        }
 857        device = btrfs_find_device(root, devid, NULL, NULL);
 858        if (!device) {
 859                printk(KERN_INFO "resizer unable to find device %llu\n",
 860                       (unsigned long long)devid);
 861                ret = -EINVAL;
 862                goto out_unlock;
 863        }
 864        if (!strcmp(sizestr, "max"))
 865                new_size = device->bdev->bd_inode->i_size;
 866        else {
 867                if (sizestr[0] == '-') {
 868                        mod = -1;
 869                        sizestr++;
 870                } else if (sizestr[0] == '+') {
 871                        mod = 1;
 872                        sizestr++;
 873                }
 874                new_size = memparse(sizestr, NULL);
 875                if (new_size == 0) {
 876                        ret = -EINVAL;
 877                        goto out_unlock;
 878                }
 879        }
 880
 881        old_size = device->total_bytes;
 882
 883        if (mod < 0) {
 884                if (new_size > old_size) {
 885                        ret = -EINVAL;
 886                        goto out_unlock;
 887                }
 888                new_size = old_size - new_size;
 889        } else if (mod > 0) {
 890                new_size = old_size + new_size;
 891        }
 892
 893        if (new_size < 256 * 1024 * 1024) {
 894                ret = -EINVAL;
 895                goto out_unlock;
 896        }
 897        if (new_size > device->bdev->bd_inode->i_size) {
 898                ret = -EFBIG;
 899                goto out_unlock;
 900        }
 901
 902        do_div(new_size, root->sectorsize);
 903        new_size *= root->sectorsize;
 904
 905        printk(KERN_INFO "new size for %s is %llu\n",
 906                device->name, (unsigned long long)new_size);
 907
 908        if (new_size > old_size) {
 909                trans = btrfs_start_transaction(root, 0);
 910                if (IS_ERR(trans)) {
 911                        ret = PTR_ERR(trans);
 912                        goto out_unlock;
 913                }
 914                ret = btrfs_grow_device(trans, device, new_size);
 915                btrfs_commit_transaction(trans, root);
 916        } else {
 917                ret = btrfs_shrink_device(device, new_size);
 918        }
 919
 920out_unlock:
 921        mutex_unlock(&root->fs_info->volume_mutex);
 922        kfree(vol_args);
 923        return ret;
 924}
 925
 926static noinline int btrfs_ioctl_snap_create_transid(struct file *file,
 927                                                    char *name,
 928                                                    unsigned long fd,
 929                                                    int subvol,
 930                                                    u64 *transid,
 931                                                    bool readonly)
 932{
 933        struct btrfs_root *root = BTRFS_I(fdentry(file)->d_inode)->root;
 934        struct file *src_file;
 935        int namelen;
 936        int ret = 0;
 937
 938        if (root->fs_info->sb->s_flags & MS_RDONLY)
 939                return -EROFS;
 940
 941        namelen = strlen(name);
 942        if (strchr(name, '/')) {
 943                ret = -EINVAL;
 944                goto out;
 945        }
 946
 947        if (subvol) {
 948                ret = btrfs_mksubvol(&file->f_path, name, namelen,
 949                                     NULL, transid, readonly);
 950        } else {
 951                struct inode *src_inode;
 952                src_file = fget(fd);
 953                if (!src_file) {
 954                        ret = -EINVAL;
 955                        goto out;
 956                }
 957
 958                src_inode = src_file->f_path.dentry->d_inode;
 959                if (src_inode->i_sb != file->f_path.dentry->d_inode->i_sb) {
 960                        printk(KERN_INFO "btrfs: Snapshot src from "
 961                               "another FS\n");
 962                        ret = -EINVAL;
 963                        fput(src_file);
 964                        goto out;
 965                }
 966                ret = btrfs_mksubvol(&file->f_path, name, namelen,
 967                                     BTRFS_I(src_inode)->root,
 968                                     transid, readonly);
 969                fput(src_file);
 970        }
 971out:
 972        return ret;
 973}
 974
 975static noinline int btrfs_ioctl_snap_create(struct file *file,
 976                                            void __user *arg, int subvol)
 977{
 978        struct btrfs_ioctl_vol_args *vol_args;
 979        int ret;
 980
 981        vol_args = memdup_user(arg, sizeof(*vol_args));
 982        if (IS_ERR(vol_args))
 983                return PTR_ERR(vol_args);
 984        vol_args->name[BTRFS_PATH_NAME_MAX] = '\0';
 985
 986        ret = btrfs_ioctl_snap_create_transid(file, vol_args->name,
 987                                              vol_args->fd, subvol,
 988                                              NULL, false);
 989
 990        kfree(vol_args);
 991        return ret;
 992}
 993
 994static noinline int btrfs_ioctl_snap_create_v2(struct file *file,
 995                                               void __user *arg, int subvol)
 996{
 997        struct btrfs_ioctl_vol_args_v2 *vol_args;
 998        int ret;
 999        u64 transid = 0;
1000        u64 *ptr = NULL;
1001        bool readonly = false;
1002
1003        vol_args = memdup_user(arg, sizeof(*vol_args));
1004        if (IS_ERR(vol_args))
1005                return PTR_ERR(vol_args);
1006        vol_args->name[BTRFS_SUBVOL_NAME_MAX] = '\0';
1007
1008        if (vol_args->flags &
1009            ~(BTRFS_SUBVOL_CREATE_ASYNC | BTRFS_SUBVOL_RDONLY)) {
1010                ret = -EOPNOTSUPP;
1011                goto out;
1012        }
1013
1014        if (vol_args->flags & BTRFS_SUBVOL_CREATE_ASYNC)
1015                ptr = &transid;
1016        if (vol_args->flags & BTRFS_SUBVOL_RDONLY)
1017                readonly = true;
1018
1019        ret = btrfs_ioctl_snap_create_transid(file, vol_args->name,
1020                                              vol_args->fd, subvol,
1021                                              ptr, readonly);
1022
1023        if (ret == 0 && ptr &&
1024            copy_to_user(arg +
1025                         offsetof(struct btrfs_ioctl_vol_args_v2,
1026                                  transid), ptr, sizeof(*ptr)))
1027                ret = -EFAULT;
1028out:
1029        kfree(vol_args);
1030        return ret;
1031}
1032
1033static noinline int btrfs_ioctl_subvol_getflags(struct file *file,
1034                                                void __user *arg)
1035{
1036        struct inode *inode = fdentry(file)->d_inode;
1037        struct btrfs_root *root = BTRFS_I(inode)->root;
1038        int ret = 0;
1039        u64 flags = 0;
1040
1041        if (inode->i_ino != BTRFS_FIRST_FREE_OBJECTID)
1042                return -EINVAL;
1043
1044        down_read(&root->fs_info->subvol_sem);
1045        if (btrfs_root_readonly(root))
1046                flags |= BTRFS_SUBVOL_RDONLY;
1047        up_read(&root->fs_info->subvol_sem);
1048
1049        if (copy_to_user(arg, &flags, sizeof(flags)))
1050                ret = -EFAULT;
1051
1052        return ret;
1053}
1054
1055static noinline int btrfs_ioctl_subvol_setflags(struct file *file,
1056                                              void __user *arg)
1057{
1058        struct inode *inode = fdentry(file)->d_inode;
1059        struct btrfs_root *root = BTRFS_I(inode)->root;
1060        struct btrfs_trans_handle *trans;
1061        u64 root_flags;
1062        u64 flags;
1063        int ret = 0;
1064
1065        if (root->fs_info->sb->s_flags & MS_RDONLY)
1066                return -EROFS;
1067
1068        if (inode->i_ino != BTRFS_FIRST_FREE_OBJECTID)
1069                return -EINVAL;
1070
1071        if (copy_from_user(&flags, arg, sizeof(flags)))
1072                return -EFAULT;
1073
1074        if (flags & BTRFS_SUBVOL_CREATE_ASYNC)
1075                return -EINVAL;
1076
1077        if (flags & ~BTRFS_SUBVOL_RDONLY)
1078                return -EOPNOTSUPP;
1079
1080        if (!is_owner_or_cap(inode))
1081                return -EACCES;
1082
1083        down_write(&root->fs_info->subvol_sem);
1084
1085        /* nothing to do */
1086        if (!!(flags & BTRFS_SUBVOL_RDONLY) == btrfs_root_readonly(root))
1087                goto out;
1088
1089        root_flags = btrfs_root_flags(&root->root_item);
1090        if (flags & BTRFS_SUBVOL_RDONLY)
1091                btrfs_set_root_flags(&root->root_item,
1092                                     root_flags | BTRFS_ROOT_SUBVOL_RDONLY);
1093        else
1094                btrfs_set_root_flags(&root->root_item,
1095                                     root_flags & ~BTRFS_ROOT_SUBVOL_RDONLY);
1096
1097        trans = btrfs_start_transaction(root, 1);
1098        if (IS_ERR(trans)) {
1099                ret = PTR_ERR(trans);
1100                goto out_reset;
1101        }
1102
1103        ret = btrfs_update_root(trans, root->fs_info->tree_root,
1104                                &root->root_key, &root->root_item);
1105
1106        btrfs_commit_transaction(trans, root);
1107out_reset:
1108        if (ret)
1109                btrfs_set_root_flags(&root->root_item, root_flags);
1110out:
1111        up_write(&root->fs_info->subvol_sem);
1112        return ret;
1113}
1114
1115/*
1116 * helper to check if the subvolume references other subvolumes
1117 */
1118static noinline int may_destroy_subvol(struct btrfs_root *root)
1119{
1120        struct btrfs_path *path;
1121        struct btrfs_key key;
1122        int ret;
1123
1124        path = btrfs_alloc_path();
1125        if (!path)
1126                return -ENOMEM;
1127
1128        key.objectid = root->root_key.objectid;
1129        key.type = BTRFS_ROOT_REF_KEY;
1130        key.offset = (u64)-1;
1131
1132        ret = btrfs_search_slot(NULL, root->fs_info->tree_root,
1133                                &key, path, 0, 0);
1134        if (ret < 0)
1135                goto out;
1136        BUG_ON(ret == 0);
1137
1138        ret = 0;
1139        if (path->slots[0] > 0) {
1140                path->slots[0]--;
1141                btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
1142                if (key.objectid == root->root_key.objectid &&
1143                    key.type == BTRFS_ROOT_REF_KEY)
1144                        ret = -ENOTEMPTY;
1145        }
1146out:
1147        btrfs_free_path(path);
1148        return ret;
1149}
1150
1151static noinline int key_in_sk(struct btrfs_key *key,
1152                              struct btrfs_ioctl_search_key *sk)
1153{
1154        struct btrfs_key test;
1155        int ret;
1156
1157        test.objectid = sk->min_objectid;
1158        test.type = sk->min_type;
1159        test.offset = sk->min_offset;
1160
1161        ret = btrfs_comp_cpu_keys(key, &test);
1162        if (ret < 0)
1163                return 0;
1164
1165        test.objectid = sk->max_objectid;
1166        test.type = sk->max_type;
1167        test.offset = sk->max_offset;
1168
1169        ret = btrfs_comp_cpu_keys(key, &test);
1170        if (ret > 0)
1171                return 0;
1172        return 1;
1173}
1174
1175static noinline int copy_to_sk(struct btrfs_root *root,
1176                               struct btrfs_path *path,
1177                               struct btrfs_key *key,
1178                               struct btrfs_ioctl_search_key *sk,
1179                               char *buf,
1180                               unsigned long *sk_offset,
1181                               int *num_found)
1182{
1183        u64 found_transid;
1184        struct extent_buffer *leaf;
1185        struct btrfs_ioctl_search_header sh;
1186        unsigned long item_off;
1187        unsigned long item_len;
1188        int nritems;
1189        int i;
1190        int slot;
1191        int found = 0;
1192        int ret = 0;
1193
1194        leaf = path->nodes[0];
1195        slot = path->slots[0];
1196        nritems = btrfs_header_nritems(leaf);
1197
1198        if (btrfs_header_generation(leaf) > sk->max_transid) {
1199                i = nritems;
1200                goto advance_key;
1201        }
1202        found_transid = btrfs_header_generation(leaf);
1203
1204        for (i = slot; i < nritems; i++) {
1205                item_off = btrfs_item_ptr_offset(leaf, i);
1206                item_len = btrfs_item_size_nr(leaf, i);
1207
1208                if (item_len > BTRFS_SEARCH_ARGS_BUFSIZE)
1209                        item_len = 0;
1210
1211                if (sizeof(sh) + item_len + *sk_offset >
1212                    BTRFS_SEARCH_ARGS_BUFSIZE) {
1213                        ret = 1;
1214                        goto overflow;
1215                }
1216
1217                btrfs_item_key_to_cpu(leaf, key, i);
1218                if (!key_in_sk(key, sk))
1219                        continue;
1220
1221                sh.objectid = key->objectid;
1222                sh.offset = key->offset;
1223                sh.type = key->type;
1224                sh.len = item_len;
1225                sh.transid = found_transid;
1226
1227                /* copy search result header */
1228                memcpy(buf + *sk_offset, &sh, sizeof(sh));
1229                *sk_offset += sizeof(sh);
1230
1231                if (item_len) {
1232                        char *p = buf + *sk_offset;
1233                        /* copy the item */
1234                        read_extent_buffer(leaf, p,
1235                                           item_off, item_len);
1236                        *sk_offset += item_len;
1237                }
1238                found++;
1239
1240                if (*num_found >= sk->nr_items)
1241                        break;
1242        }
1243advance_key:
1244        ret = 0;
1245        if (key->offset < (u64)-1 && key->offset < sk->max_offset)
1246                key->offset++;
1247        else if (key->type < (u8)-1 && key->type < sk->max_type) {
1248                key->offset = 0;
1249                key->type++;
1250        } else if (key->objectid < (u64)-1 && key->objectid < sk->max_objectid) {
1251                key->offset = 0;
1252                key->type = 0;
1253                key->objectid++;
1254        } else
1255                ret = 1;
1256overflow:
1257        *num_found += found;
1258        return ret;
1259}
1260
1261static noinline int search_ioctl(struct inode *inode,
1262                                 struct btrfs_ioctl_search_args *args)
1263{
1264        struct btrfs_root *root;
1265        struct btrfs_key key;
1266        struct btrfs_key max_key;
1267        struct btrfs_path *path;
1268        struct btrfs_ioctl_search_key *sk = &args->key;
1269        struct btrfs_fs_info *info = BTRFS_I(inode)->root->fs_info;
1270        int ret;
1271        int num_found = 0;
1272        unsigned long sk_offset = 0;
1273
1274        path = btrfs_alloc_path();
1275        if (!path)
1276                return -ENOMEM;
1277
1278        if (sk->tree_id == 0) {
1279                /* search the root of the inode that was passed */
1280                root = BTRFS_I(inode)->root;
1281        } else {
1282                key.objectid = sk->tree_id;
1283                key.type = BTRFS_ROOT_ITEM_KEY;
1284                key.offset = (u64)-1;
1285                root = btrfs_read_fs_root_no_name(info, &key);
1286                if (IS_ERR(root)) {
1287                        printk(KERN_ERR "could not find root %llu\n",
1288                               sk->tree_id);
1289                        btrfs_free_path(path);
1290                        return -ENOENT;
1291                }
1292        }
1293
1294        key.objectid = sk->min_objectid;
1295        key.type = sk->min_type;
1296        key.offset = sk->min_offset;
1297
1298        max_key.objectid = sk->max_objectid;
1299        max_key.type = sk->max_type;
1300        max_key.offset = sk->max_offset;
1301
1302        path->keep_locks = 1;
1303
1304        while(1) {
1305                ret = btrfs_search_forward(root, &key, &max_key, path, 0,
1306                                           sk->min_transid);
1307                if (ret != 0) {
1308                        if (ret > 0)
1309                                ret = 0;
1310                        goto err;
1311                }
1312                ret = copy_to_sk(root, path, &key, sk, args->buf,
1313                                 &sk_offset, &num_found);
1314                btrfs_release_path(root, path);
1315                if (ret || num_found >= sk->nr_items)
1316                        break;
1317
1318        }
1319        ret = 0;
1320err:
1321        sk->nr_items = num_found;
1322        btrfs_free_path(path);
1323        return ret;
1324}
1325
1326static noinline int btrfs_ioctl_tree_search(struct file *file,
1327                                           void __user *argp)
1328{
1329         struct btrfs_ioctl_search_args *args;
1330         struct inode *inode;
1331         int ret;
1332
1333        if (!capable(CAP_SYS_ADMIN))
1334                return -EPERM;
1335
1336        args = memdup_user(argp, sizeof(*args));
1337        if (IS_ERR(args))
1338                return PTR_ERR(args);
1339
1340        inode = fdentry(file)->d_inode;
1341        ret = search_ioctl(inode, args);
1342        if (ret == 0 && copy_to_user(argp, args, sizeof(*args)))
1343                ret = -EFAULT;
1344        kfree(args);
1345        return ret;
1346}
1347
1348/*
1349 * Search INODE_REFs to identify path name of 'dirid' directory
1350 * in a 'tree_id' tree. and sets path name to 'name'.
1351 */
1352static noinline int btrfs_search_path_in_tree(struct btrfs_fs_info *info,
1353                                u64 tree_id, u64 dirid, char *name)
1354{
1355        struct btrfs_root *root;
1356        struct btrfs_key key;
1357        char *ptr;
1358        int ret = -1;
1359        int slot;
1360        int len;
1361        int total_len = 0;
1362        struct btrfs_inode_ref *iref;
1363        struct extent_buffer *l;
1364        struct btrfs_path *path;
1365
1366        if (dirid == BTRFS_FIRST_FREE_OBJECTID) {
1367                name[0]='\0';
1368                return 0;
1369        }
1370
1371        path = btrfs_alloc_path();
1372        if (!path)
1373                return -ENOMEM;
1374
1375        ptr = &name[BTRFS_INO_LOOKUP_PATH_MAX];
1376
1377        key.objectid = tree_id;
1378        key.type = BTRFS_ROOT_ITEM_KEY;
1379        key.offset = (u64)-1;
1380        root = btrfs_read_fs_root_no_name(info, &key);
1381        if (IS_ERR(root)) {
1382                printk(KERN_ERR "could not find root %llu\n", tree_id);
1383                ret = -ENOENT;
1384                goto out;
1385        }
1386
1387        key.objectid = dirid;
1388        key.type = BTRFS_INODE_REF_KEY;
1389        key.offset = (u64)-1;
1390
1391        while(1) {
1392                ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
1393                if (ret < 0)
1394                        goto out;
1395
1396                l = path->nodes[0];
1397                slot = path->slots[0];
1398                if (ret > 0 && slot > 0)
1399                        slot--;
1400                btrfs_item_key_to_cpu(l, &key, slot);
1401
1402                if (ret > 0 && (key.objectid != dirid ||
1403                                key.type != BTRFS_INODE_REF_KEY)) {
1404                        ret = -ENOENT;
1405                        goto out;
1406                }
1407
1408                iref = btrfs_item_ptr(l, slot, struct btrfs_inode_ref);
1409                len = btrfs_inode_ref_name_len(l, iref);
1410                ptr -= len + 1;
1411                total_len += len + 1;
1412                if (ptr < name)
1413                        goto out;
1414
1415                *(ptr + len) = '/';
1416                read_extent_buffer(l, ptr,(unsigned long)(iref + 1), len);
1417
1418                if (key.offset == BTRFS_FIRST_FREE_OBJECTID)
1419                        break;
1420
1421                btrfs_release_path(root, path);
1422                key.objectid = key.offset;
1423                key.offset = (u64)-1;
1424                dirid = key.objectid;
1425
1426        }
1427        if (ptr < name)
1428                goto out;
1429        memcpy(name, ptr, total_len);
1430        name[total_len]='\0';
1431        ret = 0;
1432out:
1433        btrfs_free_path(path);
1434        return ret;
1435}
1436
1437static noinline int btrfs_ioctl_ino_lookup(struct file *file,
1438                                           void __user *argp)
1439{
1440         struct btrfs_ioctl_ino_lookup_args *args;
1441         struct inode *inode;
1442         int ret;
1443
1444        if (!capable(CAP_SYS_ADMIN))
1445                return -EPERM;
1446
1447        args = memdup_user(argp, sizeof(*args));
1448        if (IS_ERR(args))
1449                return PTR_ERR(args);
1450
1451        inode = fdentry(file)->d_inode;
1452
1453        if (args->treeid == 0)
1454                args->treeid = BTRFS_I(inode)->root->root_key.objectid;
1455
1456        ret = btrfs_search_path_in_tree(BTRFS_I(inode)->root->fs_info,
1457                                        args->treeid, args->objectid,
1458                                        args->name);
1459
1460        if (ret == 0 && copy_to_user(argp, args, sizeof(*args)))
1461                ret = -EFAULT;
1462
1463        kfree(args);
1464        return ret;
1465}
1466
1467static noinline int btrfs_ioctl_snap_destroy(struct file *file,
1468                                             void __user *arg)
1469{
1470        struct dentry *parent = fdentry(file);
1471        struct dentry *dentry;
1472        struct inode *dir = parent->d_inode;
1473        struct inode *inode;
1474        struct btrfs_root *root = BTRFS_I(dir)->root;
1475        struct btrfs_root *dest = NULL;
1476        struct btrfs_ioctl_vol_args *vol_args;
1477        struct btrfs_trans_handle *trans;
1478        int namelen;
1479        int ret;
1480        int err = 0;
1481
1482        vol_args = memdup_user(arg, sizeof(*vol_args));
1483        if (IS_ERR(vol_args))
1484                return PTR_ERR(vol_args);
1485
1486        vol_args->name[BTRFS_PATH_NAME_MAX] = '\0';
1487        namelen = strlen(vol_args->name);
1488        if (strchr(vol_args->name, '/') ||
1489            strncmp(vol_args->name, "..", namelen) == 0) {
1490                err = -EINVAL;
1491                goto out;
1492        }
1493
1494        err = mnt_want_write(file->f_path.mnt);
1495        if (err)
1496                goto out;
1497
1498        mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT);
1499        dentry = lookup_one_len(vol_args->name, parent, namelen);
1500        if (IS_ERR(dentry)) {
1501                err = PTR_ERR(dentry);
1502                goto out_unlock_dir;
1503        }
1504
1505        if (!dentry->d_inode) {
1506                err = -ENOENT;
1507                goto out_dput;
1508        }
1509
1510        inode = dentry->d_inode;
1511        dest = BTRFS_I(inode)->root;
1512        if (!capable(CAP_SYS_ADMIN)){
1513                /*
1514                 * Regular user.  Only allow this with a special mount
1515                 * option, when the user has write+exec access to the
1516                 * subvol root, and when rmdir(2) would have been
1517                 * allowed.
1518                 *
1519                 * Note that this is _not_ check that the subvol is
1520                 * empty or doesn't contain data that we wouldn't
1521                 * otherwise be able to delete.
1522                 *
1523                 * Users who want to delete empty subvols should try
1524                 * rmdir(2).
1525                 */
1526                err = -EPERM;
1527                if (!btrfs_test_opt(root, USER_SUBVOL_RM_ALLOWED))
1528                        goto out_dput;
1529
1530                /*
1531                 * Do not allow deletion if the parent dir is the same
1532                 * as the dir to be deleted.  That means the ioctl
1533                 * must be called on the dentry referencing the root
1534                 * of the subvol, not a random directory contained
1535                 * within it.
1536                 */
1537                err = -EINVAL;
1538                if (root == dest)
1539                        goto out_dput;
1540
1541                err = inode_permission(inode, MAY_WRITE | MAY_EXEC);
1542                if (err)
1543                        goto out_dput;
1544
1545                /* check if subvolume may be deleted by a non-root user */
1546                err = btrfs_may_delete(dir, dentry, 1);
1547                if (err)
1548                        goto out_dput;
1549        }
1550
1551        if (inode->i_ino != BTRFS_FIRST_FREE_OBJECTID) {
1552                err = -EINVAL;
1553                goto out_dput;
1554        }
1555
1556        mutex_lock(&inode->i_mutex);
1557        err = d_invalidate(dentry);
1558        if (err)
1559                goto out_unlock;
1560
1561        down_write(&root->fs_info->subvol_sem);
1562
1563        err = may_destroy_subvol(dest);
1564        if (err)
1565                goto out_up_write;
1566
1567        trans = btrfs_start_transaction(root, 0);
1568        if (IS_ERR(trans)) {
1569                err = PTR_ERR(trans);
1570                goto out_up_write;
1571        }
1572        trans->block_rsv = &root->fs_info->global_block_rsv;
1573
1574        ret = btrfs_unlink_subvol(trans, root, dir,
1575                                dest->root_key.objectid,
1576                                dentry->d_name.name,
1577                                dentry->d_name.len);
1578        BUG_ON(ret);
1579
1580        btrfs_record_root_in_trans(trans, dest);
1581
1582        memset(&dest->root_item.drop_progress, 0,
1583                sizeof(dest->root_item.drop_progress));
1584        dest->root_item.drop_level = 0;
1585        btrfs_set_root_refs(&dest->root_item, 0);
1586
1587        if (!xchg(&dest->orphan_item_inserted, 1)) {
1588                ret = btrfs_insert_orphan_item(trans,
1589                                        root->fs_info->tree_root,
1590                                        dest->root_key.objectid);
1591                BUG_ON(ret);
1592        }
1593
1594        ret = btrfs_end_transaction(trans, root);
1595        BUG_ON(ret);
1596        inode->i_flags |= S_DEAD;
1597out_up_write:
1598        up_write(&root->fs_info->subvol_sem);
1599out_unlock:
1600        mutex_unlock(&inode->i_mutex);
1601        if (!err) {
1602                shrink_dcache_sb(root->fs_info->sb);
1603                btrfs_invalidate_inodes(dest);
1604                d_delete(dentry);
1605        }
1606out_dput:
1607        dput(dentry);
1608out_unlock_dir:
1609        mutex_unlock(&dir->i_mutex);
1610        mnt_drop_write(file->f_path.mnt);
1611out:
1612        kfree(vol_args);
1613        return err;
1614}
1615
1616static int btrfs_ioctl_defrag(struct file *file, void __user *argp)
1617{
1618        struct inode *inode = fdentry(file)->d_inode;
1619        struct btrfs_root *root = BTRFS_I(inode)->root;
1620        struct btrfs_ioctl_defrag_range_args *range;
1621        int ret;
1622
1623        if (btrfs_root_readonly(root))
1624                return -EROFS;
1625
1626        ret = mnt_want_write(file->f_path.mnt);
1627        if (ret)
1628                return ret;
1629
1630        switch (inode->i_mode & S_IFMT) {
1631        case S_IFDIR:
1632                if (!capable(CAP_SYS_ADMIN)) {
1633                        ret = -EPERM;
1634                        goto out;
1635                }
1636                ret = btrfs_defrag_root(root, 0);
1637                if (ret)
1638                        goto out;
1639                ret = btrfs_defrag_root(root->fs_info->extent_root, 0);
1640                break;
1641        case S_IFREG:
1642                if (!(file->f_mode & FMODE_WRITE)) {
1643                        ret = -EINVAL;
1644                        goto out;
1645                }
1646
1647                range = kzalloc(sizeof(*range), GFP_KERNEL);
1648                if (!range) {
1649                        ret = -ENOMEM;
1650                        goto out;
1651                }
1652
1653                if (argp) {
1654                        if (copy_from_user(range, argp,
1655                                           sizeof(*range))) {
1656                                ret = -EFAULT;
1657                                kfree(range);
1658                                goto out;
1659                        }
1660                        /* compression requires us to start the IO */
1661                        if ((range->flags & BTRFS_DEFRAG_RANGE_COMPRESS)) {
1662                                range->flags |= BTRFS_DEFRAG_RANGE_START_IO;
1663                                range->extent_thresh = (u32)-1;
1664                        }
1665                } else {
1666                        /* the rest are all set to zero by kzalloc */
1667                        range->len = (u64)-1;
1668                }
1669                ret = btrfs_defrag_file(file, range);
1670                kfree(range);
1671                break;
1672        default:
1673                ret = -EINVAL;
1674        }
1675out:
1676        mnt_drop_write(file->f_path.mnt);
1677        return ret;
1678}
1679
1680static long btrfs_ioctl_add_dev(struct btrfs_root *root, void __user *arg)
1681{
1682        struct btrfs_ioctl_vol_args *vol_args;
1683        int ret;
1684
1685        if (!capable(CAP_SYS_ADMIN))
1686                return -EPERM;
1687
1688        vol_args = memdup_user(arg, sizeof(*vol_args));
1689        if (IS_ERR(vol_args))
1690                return PTR_ERR(vol_args);
1691
1692        vol_args->name[BTRFS_PATH_NAME_MAX] = '\0';
1693        ret = btrfs_init_new_device(root, vol_args->name);
1694
1695        kfree(vol_args);
1696        return ret;
1697}
1698
1699static long btrfs_ioctl_rm_dev(struct btrfs_root *root, void __user *arg)
1700{
1701        struct btrfs_ioctl_vol_args *vol_args;
1702        int ret;
1703
1704        if (!capable(CAP_SYS_ADMIN))
1705                return -EPERM;
1706
1707        if (root->fs_info->sb->s_flags & MS_RDONLY)
1708                return -EROFS;
1709
1710        vol_args = memdup_user(arg, sizeof(*vol_args));
1711        if (IS_ERR(vol_args))
1712                return PTR_ERR(vol_args);
1713
1714        vol_args->name[BTRFS_PATH_NAME_MAX] = '\0';
1715        ret = btrfs_rm_device(root, vol_args->name);
1716
1717        kfree(vol_args);
1718        return ret;
1719}
1720
1721static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,
1722                                       u64 off, u64 olen, u64 destoff)
1723{
1724        struct inode *inode = fdentry(file)->d_inode;
1725        struct btrfs_root *root = BTRFS_I(inode)->root;
1726        struct file *src_file;
1727        struct inode *src;
1728        struct btrfs_trans_handle *trans;
1729        struct btrfs_path *path;
1730        struct extent_buffer *leaf;
1731        char *buf;
1732        struct btrfs_key key;
1733        u32 nritems;
1734        int slot;
1735        int ret;
1736        u64 len = olen;
1737        u64 bs = root->fs_info->sb->s_blocksize;
1738        u64 hint_byte;
1739
1740        /*
1741         * TODO:
1742         * - split compressed inline extents.  annoying: we need to
1743         *   decompress into destination's address_space (the file offset
1744         *   may change, so source mapping won't do), then recompress (or
1745         *   otherwise reinsert) a subrange.
1746         * - allow ranges within the same file to be cloned (provided
1747         *   they don't overlap)?
1748         */
1749
1750        /* the destination must be opened for writing */
1751        if (!(file->f_mode & FMODE_WRITE) || (file->f_flags & O_APPEND))
1752                return -EINVAL;
1753
1754        if (btrfs_root_readonly(root))
1755                return -EROFS;
1756
1757        ret = mnt_want_write(file->f_path.mnt);
1758        if (ret)
1759                return ret;
1760
1761        src_file = fget(srcfd);
1762        if (!src_file) {
1763                ret = -EBADF;
1764                goto out_drop_write;
1765        }
1766
1767        src = src_file->f_dentry->d_inode;
1768
1769        ret = -EINVAL;
1770        if (src == inode)
1771                goto out_fput;
1772
1773        /* the src must be open for reading */
1774        if (!(src_file->f_mode & FMODE_READ))
1775                goto out_fput;
1776
1777        ret = -EISDIR;
1778        if (S_ISDIR(src->i_mode) || S_ISDIR(inode->i_mode))
1779                goto out_fput;
1780
1781        ret = -EXDEV;
1782        if (src->i_sb != inode->i_sb || BTRFS_I(src)->root != root)
1783                goto out_fput;
1784
1785        ret = -ENOMEM;
1786        buf = vmalloc(btrfs_level_size(root, 0));
1787        if (!buf)
1788                goto out_fput;
1789
1790        path = btrfs_alloc_path();
1791        if (!path) {
1792                vfree(buf);
1793                goto out_fput;
1794        }
1795        path->reada = 2;
1796
1797        if (inode < src) {
1798                mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT);
1799                mutex_lock_nested(&src->i_mutex, I_MUTEX_CHILD);
1800        } else {
1801                mutex_lock_nested(&src->i_mutex, I_MUTEX_PARENT);
1802                mutex_lock_nested(&inode->i_mutex, I_MUTEX_CHILD);
1803        }
1804
1805        /* determine range to clone */
1806        ret = -EINVAL;
1807        if (off + len > src->i_size || off + len < off)
1808                goto out_unlock;
1809        if (len == 0)
1810                olen = len = src->i_size - off;
1811        /* if we extend to eof, continue to block boundary */
1812        if (off + len == src->i_size)
1813                len = ALIGN(src->i_size, bs) - off;
1814
1815        /* verify the end result is block aligned */
1816        if (!IS_ALIGNED(off, bs) || !IS_ALIGNED(off + len, bs) ||
1817            !IS_ALIGNED(destoff, bs))
1818                goto out_unlock;
1819
1820        /* do any pending delalloc/csum calc on src, one way or
1821           another, and lock file content */
1822        while (1) {
1823                struct btrfs_ordered_extent *ordered;
1824                lock_extent(&BTRFS_I(src)->io_tree, off, off+len, GFP_NOFS);
1825                ordered = btrfs_lookup_first_ordered_extent(src, off+len);
1826                if (!ordered &&
1827                    !test_range_bit(&BTRFS_I(src)->io_tree, off, off+len,
1828                                   EXTENT_DELALLOC, 0, NULL))
1829                        break;
1830                unlock_extent(&BTRFS_I(src)->io_tree, off, off+len, GFP_NOFS);
1831                if (ordered)
1832                        btrfs_put_ordered_extent(ordered);
1833                btrfs_wait_ordered_range(src, off, len);
1834        }
1835
1836        /* clone data */
1837        key.objectid = src->i_ino;
1838        key.type = BTRFS_EXTENT_DATA_KEY;
1839        key.offset = 0;
1840
1841        while (1) {
1842                /*
1843                 * note the key will change type as we walk through the
1844                 * tree.
1845                 */
1846                ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
1847                if (ret < 0)
1848                        goto out;
1849
1850                nritems = btrfs_header_nritems(path->nodes[0]);
1851                if (path->slots[0] >= nritems) {
1852                        ret = btrfs_next_leaf(root, path);
1853                        if (ret < 0)
1854                                goto out;
1855                        if (ret > 0)
1856                                break;
1857                        nritems = btrfs_header_nritems(path->nodes[0]);
1858                }
1859                leaf = path->nodes[0];
1860                slot = path->slots[0];
1861
1862                btrfs_item_key_to_cpu(leaf, &key, slot);
1863                if (btrfs_key_type(&key) > BTRFS_EXTENT_DATA_KEY ||
1864                    key.objectid != src->i_ino)
1865                        break;
1866
1867                if (btrfs_key_type(&key) == BTRFS_EXTENT_DATA_KEY) {
1868                        struct btrfs_file_extent_item *extent;
1869                        int type;
1870                        u32 size;
1871                        struct btrfs_key new_key;
1872                        u64 disko = 0, diskl = 0;
1873                        u64 datao = 0, datal = 0;
1874                        u8 comp;
1875                        u64 endoff;
1876
1877                        size = btrfs_item_size_nr(leaf, slot);
1878                        read_extent_buffer(leaf, buf,
1879                                           btrfs_item_ptr_offset(leaf, slot),
1880                                           size);
1881
1882                        extent = btrfs_item_ptr(leaf, slot,
1883                                                struct btrfs_file_extent_item);
1884                        comp = btrfs_file_extent_compression(leaf, extent);
1885                        type = btrfs_file_extent_type(leaf, extent);
1886                        if (type == BTRFS_FILE_EXTENT_REG ||
1887                            type == BTRFS_FILE_EXTENT_PREALLOC) {
1888                                disko = btrfs_file_extent_disk_bytenr(leaf,
1889                                                                      extent);
1890                                diskl = btrfs_file_extent_disk_num_bytes(leaf,
1891                                                                 extent);
1892                                datao = btrfs_file_extent_offset(leaf, extent);
1893                                datal = btrfs_file_extent_num_bytes(leaf,
1894                                                                    extent);
1895                        } else if (type == BTRFS_FILE_EXTENT_INLINE) {
1896                                /* take upper bound, may be compressed */
1897                                datal = btrfs_file_extent_ram_bytes(leaf,
1898                                                                    extent);
1899                        }
1900                        btrfs_release_path(root, path);
1901
1902                        if (key.offset + datal <= off ||
1903                            key.offset >= off+len)
1904                                goto next;
1905
1906                        memcpy(&new_key, &key, sizeof(new_key));
1907                        new_key.objectid = inode->i_ino;
1908                        if (off <= key.offset)
1909                                new_key.offset = key.offset + destoff - off;
1910                        else
1911                                new_key.offset = destoff;
1912
1913                        trans = btrfs_start_transaction(root, 1);
1914                        if (IS_ERR(trans)) {
1915                                ret = PTR_ERR(trans);
1916                                goto out;
1917                        }
1918
1919                        if (type == BTRFS_FILE_EXTENT_REG ||
1920                            type == BTRFS_FILE_EXTENT_PREALLOC) {
1921                                if (off > key.offset) {
1922                                        datao += off - key.offset;
1923                                        datal -= off - key.offset;
1924                                }
1925
1926                                if (key.offset + datal > off + len)
1927                                        datal = off + len - key.offset;
1928
1929                                ret = btrfs_drop_extents(trans, inode,
1930                                                         new_key.offset,
1931                                                         new_key.offset + datal,
1932                                                         &hint_byte, 1);
1933                                BUG_ON(ret);
1934
1935                                ret = btrfs_insert_empty_item(trans, root, path,
1936                                                              &new_key, size);
1937                                BUG_ON(ret);
1938
1939                                leaf = path->nodes[0];
1940                                slot = path->slots[0];
1941                                write_extent_buffer(leaf, buf,
1942                                            btrfs_item_ptr_offset(leaf, slot),
1943                                            size);
1944
1945                                extent = btrfs_item_ptr(leaf, slot,
1946                                                struct btrfs_file_extent_item);
1947
1948                                /* disko == 0 means it's a hole */
1949                                if (!disko)
1950                                        datao = 0;
1951
1952                                btrfs_set_file_extent_offset(leaf, extent,
1953                                                             datao);
1954                                btrfs_set_file_extent_num_bytes(leaf, extent,
1955                                                                datal);
1956                                if (disko) {
1957                                        inode_add_bytes(inode, datal);
1958                                        ret = btrfs_inc_extent_ref(trans, root,
1959                                                        disko, diskl, 0,
1960                                                        root->root_key.objectid,
1961                                                        inode->i_ino,
1962                                                        new_key.offset - datao);
1963                                        BUG_ON(ret);
1964                                }
1965                        } else if (type == BTRFS_FILE_EXTENT_INLINE) {
1966                                u64 skip = 0;
1967                                u64 trim = 0;
1968                                if (off > key.offset) {
1969                                        skip = off - key.offset;
1970                                        new_key.offset += skip;
1971                                }
1972
1973                                if (key.offset + datal > off+len)
1974                                        trim = key.offset + datal - (off+len);
1975
1976                                if (comp && (skip || trim)) {
1977                                        ret = -EINVAL;
1978                                        btrfs_end_transaction(trans, root);
1979                                        goto out;
1980                                }
1981                                size -= skip + trim;
1982                                datal -= skip + trim;
1983
1984                                ret = btrfs_drop_extents(trans, inode,
1985                                                         new_key.offset,
1986                                                         new_key.offset + datal,
1987                                                         &hint_byte, 1);
1988                                BUG_ON(ret);
1989
1990                                ret = btrfs_insert_empty_item(trans, root, path,
1991                                                              &new_key, size);
1992                                BUG_ON(ret);
1993
1994                                if (skip) {
1995                                        u32 start =
1996                                          btrfs_file_extent_calc_inline_size(0);
1997                                        memmove(buf+start, buf+start+skip,
1998                                                datal);
1999                                }
2000
2001                                leaf = path->nodes[0];
2002                                slot = path->slots[0];
2003                                write_extent_buffer(leaf, buf,
2004                                            btrfs_item_ptr_offset(leaf, slot),
2005                                            size);
2006                                inode_add_bytes(inode, datal);
2007                        }
2008
2009                        btrfs_mark_buffer_dirty(leaf);
2010                        btrfs_release_path(root, path);
2011
2012                        inode->i_mtime = inode->i_ctime = CURRENT_TIME;
2013
2014                        /*
2015                         * we round up to the block size at eof when
2016                         * determining which extents to clone above,
2017                         * but shouldn't round up the file size
2018                         */
2019                        endoff = new_key.offset + datal;
2020                        if (endoff > destoff+olen)
2021                                endoff = destoff+olen;
2022                        if (endoff > inode->i_size)
2023                                btrfs_i_size_write(inode, endoff);
2024
2025                        BTRFS_I(inode)->flags = BTRFS_I(src)->flags;
2026                        ret = btrfs_update_inode(trans, root, inode);
2027                        BUG_ON(ret);
2028                        btrfs_end_transaction(trans, root);
2029                }
2030next:
2031                btrfs_release_path(root, path);
2032                key.offset++;
2033        }
2034        ret = 0;
2035out:
2036        btrfs_release_path(root, path);
2037        unlock_extent(&BTRFS_I(src)->io_tree, off, off+len, GFP_NOFS);
2038out_unlock:
2039        mutex_unlock(&src->i_mutex);
2040        mutex_unlock(&inode->i_mutex);
2041        vfree(buf);
2042        btrfs_free_path(path);
2043out_fput:
2044        fput(src_file);
2045out_drop_write:
2046        mnt_drop_write(file->f_path.mnt);
2047        return ret;
2048}
2049
2050static long btrfs_ioctl_clone_range(struct file *file, void __user *argp)
2051{
2052        struct btrfs_ioctl_clone_range_args args;
2053
2054        if (copy_from_user(&args, argp, sizeof(args)))
2055                return -EFAULT;
2056        return btrfs_ioctl_clone(file, args.src_fd, args.src_offset,
2057                                 args.src_length, args.dest_offset);
2058}
2059
2060/*
2061 * there are many ways the trans_start and trans_end ioctls can lead
2062 * to deadlocks.  They should only be used by applications that
2063 * basically own the machine, and have a very in depth understanding
2064 * of all the possible deadlocks and enospc problems.
2065 */
2066static long btrfs_ioctl_trans_start(struct file *file)
2067{
2068        struct inode *inode = fdentry(file)->d_inode;
2069        struct btrfs_root *root = BTRFS_I(inode)->root;
2070        struct btrfs_trans_handle *trans;
2071        int ret;
2072
2073        ret = -EPERM;
2074        if (!capable(CAP_SYS_ADMIN))
2075                goto out;
2076
2077        ret = -EINPROGRESS;
2078        if (file->private_data)
2079                goto out;
2080
2081        ret = -EROFS;
2082        if (btrfs_root_readonly(root))
2083                goto out;
2084
2085        ret = mnt_want_write(file->f_path.mnt);
2086        if (ret)
2087                goto out;
2088
2089        mutex_lock(&root->fs_info->trans_mutex);
2090        root->fs_info->open_ioctl_trans++;
2091        mutex_unlock(&root->fs_info->trans_mutex);
2092
2093        ret = -ENOMEM;
2094        trans = btrfs_start_ioctl_transaction(root, 0);
2095        if (IS_ERR(trans))
2096                goto out_drop;
2097
2098        file->private_data = trans;
2099        return 0;
2100
2101out_drop:
2102        mutex_lock(&root->fs_info->trans_mutex);
2103        root->fs_info->open_ioctl_trans--;
2104        mutex_unlock(&root->fs_info->trans_mutex);
2105        mnt_drop_write(file->f_path.mnt);
2106out:
2107        return ret;
2108}
2109
2110static long btrfs_ioctl_default_subvol(struct file *file, void __user *argp)
2111{
2112        struct inode *inode = fdentry(file)->d_inode;
2113        struct btrfs_root *root = BTRFS_I(inode)->root;
2114        struct btrfs_root *new_root;
2115        struct btrfs_dir_item *di;
2116        struct btrfs_trans_handle *trans;
2117        struct btrfs_path *path;
2118        struct btrfs_key location;
2119        struct btrfs_disk_key disk_key;
2120        struct btrfs_super_block *disk_super;
2121        u64 features;
2122        u64 objectid = 0;
2123        u64 dir_id;
2124
2125        if (!capable(CAP_SYS_ADMIN))
2126                return -EPERM;
2127
2128        if (copy_from_user(&objectid, argp, sizeof(objectid)))
2129                return -EFAULT;
2130
2131        if (!objectid)
2132                objectid = root->root_key.objectid;
2133
2134        location.objectid = objectid;
2135        location.type = BTRFS_ROOT_ITEM_KEY;
2136        location.offset = (u64)-1;
2137
2138        new_root = btrfs_read_fs_root_no_name(root->fs_info, &location);
2139        if (IS_ERR(new_root))
2140                return PTR_ERR(new_root);
2141
2142        if (btrfs_root_refs(&new_root->root_item) == 0)
2143                return -ENOENT;
2144
2145        path = btrfs_alloc_path();
2146        if (!path)
2147                return -ENOMEM;
2148        path->leave_spinning = 1;
2149
2150        trans = btrfs_start_transaction(root, 1);
2151        if (IS_ERR(trans)) {
2152                btrfs_free_path(path);
2153                return PTR_ERR(trans);
2154        }
2155
2156        dir_id = btrfs_super_root_dir(&root->fs_info->super_copy);
2157        di = btrfs_lookup_dir_item(trans, root->fs_info->tree_root, path,
2158                                   dir_id, "default", 7, 1);
2159        if (IS_ERR_OR_NULL(di)) {
2160                btrfs_free_path(path);
2161                btrfs_end_transaction(trans, root);
2162                printk(KERN_ERR "Umm, you don't have the default dir item, "
2163                       "this isn't going to work\n");
2164                return -ENOENT;
2165        }
2166
2167        btrfs_cpu_key_to_disk(&disk_key, &new_root->root_key);
2168        btrfs_set_dir_item_key(path->nodes[0], di, &disk_key);
2169        btrfs_mark_buffer_dirty(path->nodes[0]);
2170        btrfs_free_path(path);
2171
2172        disk_super = &root->fs_info->super_copy;
2173        features = btrfs_super_incompat_flags(disk_super);
2174        if (!(features & BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL)) {
2175                features |= BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL;
2176                btrfs_set_super_incompat_flags(disk_super, features);
2177        }
2178        btrfs_end_transaction(trans, root);
2179
2180        return 0;
2181}
2182
2183static void get_block_group_info(struct list_head *groups_list,
2184                                 struct btrfs_ioctl_space_info *space)
2185{
2186        struct btrfs_block_group_cache *block_group;
2187
2188        space->total_bytes = 0;
2189        space->used_bytes = 0;
2190        space->flags = 0;
2191        list_for_each_entry(block_group, groups_list, list) {
2192                space->flags = block_group->flags;
2193                space->total_bytes += block_group->key.offset;
2194                space->used_bytes +=
2195                        btrfs_block_group_used(&block_group->item);
2196        }
2197}
2198
2199long btrfs_ioctl_space_info(struct btrfs_root *root, void __user *arg)
2200{
2201        struct btrfs_ioctl_space_args space_args;
2202        struct btrfs_ioctl_space_info space;
2203        struct btrfs_ioctl_space_info *dest;
2204        struct btrfs_ioctl_space_info *dest_orig;
2205        struct btrfs_ioctl_space_info *user_dest;
2206        struct btrfs_space_info *info;
2207        u64 types[] = {BTRFS_BLOCK_GROUP_DATA,
2208                       BTRFS_BLOCK_GROUP_SYSTEM,
2209                       BTRFS_BLOCK_GROUP_METADATA,
2210                       BTRFS_BLOCK_GROUP_DATA | BTRFS_BLOCK_GROUP_METADATA};
2211        int num_types = 4;
2212        int alloc_size;
2213        int ret = 0;
2214        u64 slot_count = 0;
2215        int i, c;
2216
2217        if (copy_from_user(&space_args,
2218                           (struct btrfs_ioctl_space_args __user *)arg,
2219                           sizeof(space_args)))
2220                return -EFAULT;
2221
2222        for (i = 0; i < num_types; i++) {
2223                struct btrfs_space_info *tmp;
2224
2225                info = NULL;
2226                rcu_read_lock();
2227                list_for_each_entry_rcu(tmp, &root->fs_info->space_info,
2228                                        list) {
2229                        if (tmp->flags == types[i]) {
2230                                info = tmp;
2231                                break;
2232                        }
2233                }
2234                rcu_read_unlock();
2235
2236                if (!info)
2237                        continue;
2238
2239                down_read(&info->groups_sem);
2240                for (c = 0; c < BTRFS_NR_RAID_TYPES; c++) {
2241                        if (!list_empty(&info->block_groups[c]))
2242                                slot_count++;
2243                }
2244                up_read(&info->groups_sem);
2245        }
2246
2247        /* space_slots == 0 means they are asking for a count */
2248        if (space_args.space_slots == 0) {
2249                space_args.total_spaces = slot_count;
2250                goto out;
2251        }
2252
2253        slot_count = min_t(u64, space_args.space_slots, slot_count);
2254
2255        alloc_size = sizeof(*dest) * slot_count;
2256
2257        /* we generally have at most 6 or so space infos, one for each raid
2258         * level.  So, a whole page should be more than enough for everyone
2259         */
2260        if (alloc_size > PAGE_CACHE_SIZE)
2261                return -ENOMEM;
2262
2263        space_args.total_spaces = 0;
2264        dest = kmalloc(alloc_size, GFP_NOFS);
2265        if (!dest)
2266                return -ENOMEM;
2267        dest_orig = dest;
2268
2269        /* now we have a buffer to copy into */
2270        for (i = 0; i < num_types; i++) {
2271                struct btrfs_space_info *tmp;
2272
2273                if (!slot_count)
2274                        break;
2275
2276                info = NULL;
2277                rcu_read_lock();
2278                list_for_each_entry_rcu(tmp, &root->fs_info->space_info,
2279                                        list) {
2280                        if (tmp->flags == types[i]) {
2281                                info = tmp;
2282                                break;
2283                        }
2284                }
2285                rcu_read_unlock();
2286
2287                if (!info)
2288                        continue;
2289                down_read(&info->groups_sem);
2290                for (c = 0; c < BTRFS_NR_RAID_TYPES; c++) {
2291                        if (!list_empty(&info->block_groups[c])) {
2292                                get_block_group_info(&info->block_groups[c],
2293                                                     &space);
2294                                memcpy(dest, &space, sizeof(space));
2295                                dest++;
2296                                space_args.total_spaces++;
2297                                slot_count--;
2298                        }
2299                        if (!slot_count)
2300                                break;
2301                }
2302                up_read(&info->groups_sem);
2303        }
2304
2305        user_dest = (struct btrfs_ioctl_space_info *)
2306                (arg + sizeof(struct btrfs_ioctl_space_args));
2307
2308        if (copy_to_user(user_dest, dest_orig, alloc_size))
2309                ret = -EFAULT;
2310
2311        kfree(dest_orig);
2312out:
2313        if (ret == 0 && copy_to_user(arg, &space_args, sizeof(space_args)))
2314                ret = -EFAULT;
2315
2316        return ret;
2317}
2318
2319/*
2320 * there are many ways the trans_start and trans_end ioctls can lead
2321 * to deadlocks.  They should only be used by applications that
2322 * basically own the machine, and have a very in depth understanding
2323 * of all the possible deadlocks and enospc problems.
2324 */
2325long btrfs_ioctl_trans_end(struct file *file)
2326{
2327        struct inode *inode = fdentry(file)->d_inode;
2328        struct btrfs_root *root = BTRFS_I(inode)->root;
2329        struct btrfs_trans_handle *trans;
2330
2331        trans = file->private_data;
2332        if (!trans)
2333                return -EINVAL;
2334        file->private_data = NULL;
2335
2336        btrfs_end_transaction(trans, root);
2337
2338        mutex_lock(&root->fs_info->trans_mutex);
2339        root->fs_info->open_ioctl_trans--;
2340        mutex_unlock(&root->fs_info->trans_mutex);
2341
2342        mnt_drop_write(file->f_path.mnt);
2343        return 0;
2344}
2345
2346static noinline long btrfs_ioctl_start_sync(struct file *file, void __user *argp)
2347{
2348        struct btrfs_root *root = BTRFS_I(file->f_dentry->d_inode)->root;
2349        struct btrfs_trans_handle *trans;
2350        u64 transid;
2351
2352        trans = btrfs_start_transaction(root, 0);
2353        if (IS_ERR(trans))
2354                return PTR_ERR(trans);
2355        transid = trans->transid;
2356        btrfs_commit_transaction_async(trans, root, 0);
2357
2358        if (argp)
2359                if (copy_to_user(argp, &transid, sizeof(transid)))
2360                        return -EFAULT;
2361        return 0;
2362}
2363
2364static noinline long btrfs_ioctl_wait_sync(struct file *file, void __user *argp)
2365{
2366        struct btrfs_root *root = BTRFS_I(file->f_dentry->d_inode)->root;
2367        u64 transid;
2368
2369        if (argp) {
2370                if (copy_from_user(&transid, argp, sizeof(transid)))
2371                        return -EFAULT;
2372        } else {
2373                transid = 0;  /* current trans */
2374        }
2375        return btrfs_wait_for_commit(root, transid);
2376}
2377
2378long btrfs_ioctl(struct file *file, unsigned int
2379                cmd, unsigned long arg)
2380{
2381        struct btrfs_root *root = BTRFS_I(fdentry(file)->d_inode)->root;
2382        void __user *argp = (void __user *)arg;
2383
2384        switch (cmd) {
2385        case FS_IOC_GETFLAGS:
2386                return btrfs_ioctl_getflags(file, argp);
2387        case FS_IOC_SETFLAGS:
2388                return btrfs_ioctl_setflags(file, argp);
2389        case FS_IOC_GETVERSION:
2390                return btrfs_ioctl_getversion(file, argp);
2391        case BTRFS_IOC_SNAP_CREATE:
2392                return btrfs_ioctl_snap_create(file, argp, 0);
2393        case BTRFS_IOC_SNAP_CREATE_V2:
2394                return btrfs_ioctl_snap_create_v2(file, argp, 0);
2395        case BTRFS_IOC_SUBVOL_CREATE:
2396                return btrfs_ioctl_snap_create(file, argp, 1);
2397        case BTRFS_IOC_SNAP_DESTROY:
2398                return btrfs_ioctl_snap_destroy(file, argp);
2399        case BTRFS_IOC_SUBVOL_GETFLAGS:
2400                return btrfs_ioctl_subvol_getflags(file, argp);
2401        case BTRFS_IOC_SUBVOL_SETFLAGS:
2402                return btrfs_ioctl_subvol_setflags(file, argp);
2403        case BTRFS_IOC_DEFAULT_SUBVOL:
2404                return btrfs_ioctl_default_subvol(file, argp);
2405        case BTRFS_IOC_DEFRAG:
2406                return btrfs_ioctl_defrag(file, NULL);
2407        case BTRFS_IOC_DEFRAG_RANGE:
2408                return btrfs_ioctl_defrag(file, argp);
2409        case BTRFS_IOC_RESIZE:
2410                return btrfs_ioctl_resize(root, argp);
2411        case BTRFS_IOC_ADD_DEV:
2412                return btrfs_ioctl_add_dev(root, argp);
2413        case BTRFS_IOC_RM_DEV:
2414                return btrfs_ioctl_rm_dev(root, argp);
2415        case BTRFS_IOC_BALANCE:
2416                return btrfs_balance(root->fs_info->dev_root);
2417        case BTRFS_IOC_CLONE:
2418                return btrfs_ioctl_clone(file, arg, 0, 0, 0);
2419        case BTRFS_IOC_CLONE_RANGE:
2420                return btrfs_ioctl_clone_range(file, argp);
2421        case BTRFS_IOC_TRANS_START:
2422                return btrfs_ioctl_trans_start(file);
2423        case BTRFS_IOC_TRANS_END:
2424                return btrfs_ioctl_trans_end(file);
2425        case BTRFS_IOC_TREE_SEARCH:
2426                return btrfs_ioctl_tree_search(file, argp);
2427        case BTRFS_IOC_INO_LOOKUP:
2428                return btrfs_ioctl_ino_lookup(file, argp);
2429        case BTRFS_IOC_SPACE_INFO:
2430                return btrfs_ioctl_space_info(root, argp);
2431        case BTRFS_IOC_SYNC:
2432                btrfs_sync_fs(file->f_dentry->d_sb, 1);
2433                return 0;
2434        case BTRFS_IOC_START_SYNC:
2435                return btrfs_ioctl_start_sync(file, argp);
2436        case BTRFS_IOC_WAIT_SYNC:
2437                return btrfs_ioctl_wait_sync(file, argp);
2438        }
2439
2440        return -ENOTTY;
2441}
2442