linux/fs/btrfs/super.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/blkdev.h>
  20#include <linux/module.h>
  21#include <linux/buffer_head.h>
  22#include <linux/fs.h>
  23#include <linux/pagemap.h>
  24#include <linux/highmem.h>
  25#include <linux/time.h>
  26#include <linux/init.h>
  27#include <linux/seq_file.h>
  28#include <linux/string.h>
  29#include <linux/backing-dev.h>
  30#include <linux/mount.h>
  31#include <linux/mpage.h>
  32#include <linux/swap.h>
  33#include <linux/writeback.h>
  34#include <linux/statfs.h>
  35#include <linux/compat.h>
  36#include <linux/parser.h>
  37#include <linux/ctype.h>
  38#include <linux/namei.h>
  39#include <linux/miscdevice.h>
  40#include <linux/magic.h>
  41#include "compat.h"
  42#include "ctree.h"
  43#include "disk-io.h"
  44#include "transaction.h"
  45#include "btrfs_inode.h"
  46#include "ioctl.h"
  47#include "print-tree.h"
  48#include "xattr.h"
  49#include "volumes.h"
  50#include "version.h"
  51#include "export.h"
  52#include "compression.h"
  53
  54static const struct super_operations btrfs_super_ops;
  55
  56static void btrfs_put_super(struct super_block *sb)
  57{
  58        struct btrfs_root *root = btrfs_sb(sb);
  59        int ret;
  60
  61        ret = close_ctree(root);
  62        sb->s_fs_info = NULL;
  63}
  64
  65enum {
  66        Opt_degraded, Opt_subvol, Opt_device, Opt_nodatasum, Opt_nodatacow,
  67        Opt_max_extent, Opt_max_inline, Opt_alloc_start, Opt_nobarrier,
  68        Opt_ssd, Opt_nossd, Opt_ssd_spread, Opt_thread_pool, Opt_noacl,
  69        Opt_compress, Opt_notreelog, Opt_ratio, Opt_flushoncommit,
  70        Opt_discard, Opt_err,
  71};
  72
  73static match_table_t tokens = {
  74        {Opt_degraded, "degraded"},
  75        {Opt_subvol, "subvol=%s"},
  76        {Opt_device, "device=%s"},
  77        {Opt_nodatasum, "nodatasum"},
  78        {Opt_nodatacow, "nodatacow"},
  79        {Opt_nobarrier, "nobarrier"},
  80        {Opt_max_extent, "max_extent=%s"},
  81        {Opt_max_inline, "max_inline=%s"},
  82        {Opt_alloc_start, "alloc_start=%s"},
  83        {Opt_thread_pool, "thread_pool=%d"},
  84        {Opt_compress, "compress"},
  85        {Opt_ssd, "ssd"},
  86        {Opt_ssd_spread, "ssd_spread"},
  87        {Opt_nossd, "nossd"},
  88        {Opt_noacl, "noacl"},
  89        {Opt_notreelog, "notreelog"},
  90        {Opt_flushoncommit, "flushoncommit"},
  91        {Opt_ratio, "metadata_ratio=%d"},
  92        {Opt_discard, "discard"},
  93        {Opt_err, NULL},
  94};
  95
  96u64 btrfs_parse_size(char *str)
  97{
  98        u64 res;
  99        int mult = 1;
 100        char *end;
 101        char last;
 102
 103        res = simple_strtoul(str, &end, 10);
 104
 105        last = end[0];
 106        if (isalpha(last)) {
 107                last = tolower(last);
 108                switch (last) {
 109                case 'g':
 110                        mult *= 1024;
 111                case 'm':
 112                        mult *= 1024;
 113                case 'k':
 114                        mult *= 1024;
 115                }
 116                res = res * mult;
 117        }
 118        return res;
 119}
 120
 121/*
 122 * Regular mount options parser.  Everything that is needed only when
 123 * reading in a new superblock is parsed here.
 124 */
 125int btrfs_parse_options(struct btrfs_root *root, char *options)
 126{
 127        struct btrfs_fs_info *info = root->fs_info;
 128        substring_t args[MAX_OPT_ARGS];
 129        char *p, *num;
 130        int intarg;
 131
 132        if (!options)
 133                return 0;
 134
 135        /*
 136         * strsep changes the string, duplicate it because parse_options
 137         * gets called twice
 138         */
 139        options = kstrdup(options, GFP_NOFS);
 140        if (!options)
 141                return -ENOMEM;
 142
 143
 144        while ((p = strsep(&options, ",")) != NULL) {
 145                int token;
 146                if (!*p)
 147                        continue;
 148
 149                token = match_token(p, tokens, args);
 150                switch (token) {
 151                case Opt_degraded:
 152                        printk(KERN_INFO "btrfs: allowing degraded mounts\n");
 153                        btrfs_set_opt(info->mount_opt, DEGRADED);
 154                        break;
 155                case Opt_subvol:
 156                case Opt_device:
 157                        /*
 158                         * These are parsed by btrfs_parse_early_options
 159                         * and can be happily ignored here.
 160                         */
 161                        break;
 162                case Opt_nodatasum:
 163                        printk(KERN_INFO "btrfs: setting nodatasum\n");
 164                        btrfs_set_opt(info->mount_opt, NODATASUM);
 165                        break;
 166                case Opt_nodatacow:
 167                        printk(KERN_INFO "btrfs: setting nodatacow\n");
 168                        btrfs_set_opt(info->mount_opt, NODATACOW);
 169                        btrfs_set_opt(info->mount_opt, NODATASUM);
 170                        break;
 171                case Opt_compress:
 172                        printk(KERN_INFO "btrfs: use compression\n");
 173                        btrfs_set_opt(info->mount_opt, COMPRESS);
 174                        break;
 175                case Opt_ssd:
 176                        printk(KERN_INFO "btrfs: use ssd allocation scheme\n");
 177                        btrfs_set_opt(info->mount_opt, SSD);
 178                        break;
 179                case Opt_ssd_spread:
 180                        printk(KERN_INFO "btrfs: use spread ssd "
 181                               "allocation scheme\n");
 182                        btrfs_set_opt(info->mount_opt, SSD);
 183                        btrfs_set_opt(info->mount_opt, SSD_SPREAD);
 184                        break;
 185                case Opt_nossd:
 186                        printk(KERN_INFO "btrfs: not using ssd allocation "
 187                               "scheme\n");
 188                        btrfs_set_opt(info->mount_opt, NOSSD);
 189                        btrfs_clear_opt(info->mount_opt, SSD);
 190                        btrfs_clear_opt(info->mount_opt, SSD_SPREAD);
 191                        break;
 192                case Opt_nobarrier:
 193                        printk(KERN_INFO "btrfs: turning off barriers\n");
 194                        btrfs_set_opt(info->mount_opt, NOBARRIER);
 195                        break;
 196                case Opt_thread_pool:
 197                        intarg = 0;
 198                        match_int(&args[0], &intarg);
 199                        if (intarg) {
 200                                info->thread_pool_size = intarg;
 201                                printk(KERN_INFO "btrfs: thread pool %d\n",
 202                                       info->thread_pool_size);
 203                        }
 204                        break;
 205                case Opt_max_extent:
 206                        num = match_strdup(&args[0]);
 207                        if (num) {
 208                                info->max_extent = btrfs_parse_size(num);
 209                                kfree(num);
 210
 211                                info->max_extent = max_t(u64,
 212                                        info->max_extent, root->sectorsize);
 213                                printk(KERN_INFO "btrfs: max_extent at %llu\n",
 214                                       (unsigned long long)info->max_extent);
 215                        }
 216                        break;
 217                case Opt_max_inline:
 218                        num = match_strdup(&args[0]);
 219                        if (num) {
 220                                info->max_inline = btrfs_parse_size(num);
 221                                kfree(num);
 222
 223                                if (info->max_inline) {
 224                                        info->max_inline = max_t(u64,
 225                                                info->max_inline,
 226                                                root->sectorsize);
 227                                }
 228                                printk(KERN_INFO "btrfs: max_inline at %llu\n",
 229                                        (unsigned long long)info->max_inline);
 230                        }
 231                        break;
 232                case Opt_alloc_start:
 233                        num = match_strdup(&args[0]);
 234                        if (num) {
 235                                info->alloc_start = btrfs_parse_size(num);
 236                                kfree(num);
 237                                printk(KERN_INFO
 238                                        "btrfs: allocations start at %llu\n",
 239                                        (unsigned long long)info->alloc_start);
 240                        }
 241                        break;
 242                case Opt_noacl:
 243                        root->fs_info->sb->s_flags &= ~MS_POSIXACL;
 244                        break;
 245                case Opt_notreelog:
 246                        printk(KERN_INFO "btrfs: disabling tree log\n");
 247                        btrfs_set_opt(info->mount_opt, NOTREELOG);
 248                        break;
 249                case Opt_flushoncommit:
 250                        printk(KERN_INFO "btrfs: turning on flush-on-commit\n");
 251                        btrfs_set_opt(info->mount_opt, FLUSHONCOMMIT);
 252                        break;
 253                case Opt_ratio:
 254                        intarg = 0;
 255                        match_int(&args[0], &intarg);
 256                        if (intarg) {
 257                                info->metadata_ratio = intarg;
 258                                printk(KERN_INFO "btrfs: metadata ratio %d\n",
 259                                       info->metadata_ratio);
 260                        }
 261                        break;
 262                case Opt_discard:
 263                        btrfs_set_opt(info->mount_opt, DISCARD);
 264                        break;
 265                default:
 266                        break;
 267                }
 268        }
 269        kfree(options);
 270        return 0;
 271}
 272
 273/*
 274 * Parse mount options that are required early in the mount process.
 275 *
 276 * All other options will be parsed on much later in the mount process and
 277 * only when we need to allocate a new super block.
 278 */
 279static int btrfs_parse_early_options(const char *options, fmode_t flags,
 280                void *holder, char **subvol_name,
 281                struct btrfs_fs_devices **fs_devices)
 282{
 283        substring_t args[MAX_OPT_ARGS];
 284        char *opts, *p;
 285        int error = 0;
 286
 287        if (!options)
 288                goto out;
 289
 290        /*
 291         * strsep changes the string, duplicate it because parse_options
 292         * gets called twice
 293         */
 294        opts = kstrdup(options, GFP_KERNEL);
 295        if (!opts)
 296                return -ENOMEM;
 297
 298        while ((p = strsep(&opts, ",")) != NULL) {
 299                int token;
 300                if (!*p)
 301                        continue;
 302
 303                token = match_token(p, tokens, args);
 304                switch (token) {
 305                case Opt_subvol:
 306                        *subvol_name = match_strdup(&args[0]);
 307                        break;
 308                case Opt_device:
 309                        error = btrfs_scan_one_device(match_strdup(&args[0]),
 310                                        flags, holder, fs_devices);
 311                        if (error)
 312                                goto out_free_opts;
 313                        break;
 314                default:
 315                        break;
 316                }
 317        }
 318
 319 out_free_opts:
 320        kfree(opts);
 321 out:
 322        /*
 323         * If no subvolume name is specified we use the default one.  Allocate
 324         * a copy of the string "." here so that code later in the
 325         * mount path doesn't care if it's the default volume or another one.
 326         */
 327        if (!*subvol_name) {
 328                *subvol_name = kstrdup(".", GFP_KERNEL);
 329                if (!*subvol_name)
 330                        return -ENOMEM;
 331        }
 332        return error;
 333}
 334
 335static int btrfs_fill_super(struct super_block *sb,
 336                            struct btrfs_fs_devices *fs_devices,
 337                            void *data, int silent)
 338{
 339        struct inode *inode;
 340        struct dentry *root_dentry;
 341        struct btrfs_super_block *disk_super;
 342        struct btrfs_root *tree_root;
 343        struct btrfs_key key;
 344        int err;
 345
 346        sb->s_maxbytes = MAX_LFS_FILESIZE;
 347        sb->s_magic = BTRFS_SUPER_MAGIC;
 348        sb->s_op = &btrfs_super_ops;
 349        sb->s_export_op = &btrfs_export_ops;
 350        sb->s_xattr = btrfs_xattr_handlers;
 351        sb->s_time_gran = 1;
 352#ifdef CONFIG_BTRFS_FS_POSIX_ACL
 353        sb->s_flags |= MS_POSIXACL;
 354#endif
 355
 356        tree_root = open_ctree(sb, fs_devices, (char *)data);
 357
 358        if (IS_ERR(tree_root)) {
 359                printk("btrfs: open_ctree failed\n");
 360                return PTR_ERR(tree_root);
 361        }
 362        sb->s_fs_info = tree_root;
 363        disk_super = &tree_root->fs_info->super_copy;
 364
 365        key.objectid = BTRFS_FIRST_FREE_OBJECTID;
 366        key.type = BTRFS_INODE_ITEM_KEY;
 367        key.offset = 0;
 368        inode = btrfs_iget(sb, &key, tree_root->fs_info->fs_root);
 369        if (IS_ERR(inode)) {
 370                err = PTR_ERR(inode);
 371                goto fail_close;
 372        }
 373
 374        root_dentry = d_alloc_root(inode);
 375        if (!root_dentry) {
 376                iput(inode);
 377                err = -ENOMEM;
 378                goto fail_close;
 379        }
 380#if 0
 381        /* this does the super kobj at the same time */
 382        err = btrfs_sysfs_add_super(tree_root->fs_info);
 383        if (err)
 384                goto fail_close;
 385#endif
 386
 387        sb->s_root = root_dentry;
 388
 389        save_mount_options(sb, data);
 390        return 0;
 391
 392fail_close:
 393        close_ctree(tree_root);
 394        return err;
 395}
 396
 397int btrfs_sync_fs(struct super_block *sb, int wait)
 398{
 399        struct btrfs_trans_handle *trans;
 400        struct btrfs_root *root = btrfs_sb(sb);
 401        int ret;
 402
 403        if (!wait) {
 404                filemap_flush(root->fs_info->btree_inode->i_mapping);
 405                return 0;
 406        }
 407
 408        btrfs_start_delalloc_inodes(root);
 409        btrfs_wait_ordered_extents(root, 0);
 410
 411        trans = btrfs_start_transaction(root, 1);
 412        ret = btrfs_commit_transaction(trans, root);
 413        return ret;
 414}
 415
 416static int btrfs_show_options(struct seq_file *seq, struct vfsmount *vfs)
 417{
 418        struct btrfs_root *root = btrfs_sb(vfs->mnt_sb);
 419        struct btrfs_fs_info *info = root->fs_info;
 420
 421        if (btrfs_test_opt(root, DEGRADED))
 422                seq_puts(seq, ",degraded");
 423        if (btrfs_test_opt(root, NODATASUM))
 424                seq_puts(seq, ",nodatasum");
 425        if (btrfs_test_opt(root, NODATACOW))
 426                seq_puts(seq, ",nodatacow");
 427        if (btrfs_test_opt(root, NOBARRIER))
 428                seq_puts(seq, ",nobarrier");
 429        if (info->max_extent != (u64)-1)
 430                seq_printf(seq, ",max_extent=%llu",
 431                           (unsigned long long)info->max_extent);
 432        if (info->max_inline != 8192 * 1024)
 433                seq_printf(seq, ",max_inline=%llu",
 434                           (unsigned long long)info->max_inline);
 435        if (info->alloc_start != 0)
 436                seq_printf(seq, ",alloc_start=%llu",
 437                           (unsigned long long)info->alloc_start);
 438        if (info->thread_pool_size !=  min_t(unsigned long,
 439                                             num_online_cpus() + 2, 8))
 440                seq_printf(seq, ",thread_pool=%d", info->thread_pool_size);
 441        if (btrfs_test_opt(root, COMPRESS))
 442                seq_puts(seq, ",compress");
 443        if (btrfs_test_opt(root, NOSSD))
 444                seq_puts(seq, ",nossd");
 445        if (btrfs_test_opt(root, SSD_SPREAD))
 446                seq_puts(seq, ",ssd_spread");
 447        else if (btrfs_test_opt(root, SSD))
 448                seq_puts(seq, ",ssd");
 449        if (btrfs_test_opt(root, NOTREELOG))
 450                seq_puts(seq, ",notreelog");
 451        if (btrfs_test_opt(root, FLUSHONCOMMIT))
 452                seq_puts(seq, ",flushoncommit");
 453        if (!(root->fs_info->sb->s_flags & MS_POSIXACL))
 454                seq_puts(seq, ",noacl");
 455        return 0;
 456}
 457
 458static int btrfs_test_super(struct super_block *s, void *data)
 459{
 460        struct btrfs_fs_devices *test_fs_devices = data;
 461        struct btrfs_root *root = btrfs_sb(s);
 462
 463        return root->fs_info->fs_devices == test_fs_devices;
 464}
 465
 466/*
 467 * Find a superblock for the given device / mount point.
 468 *
 469 * Note:  This is based on get_sb_bdev from fs/super.c with a few additions
 470 *        for multiple device setup.  Make sure to keep it in sync.
 471 */
 472static int btrfs_get_sb(struct file_system_type *fs_type, int flags,
 473                const char *dev_name, void *data, struct vfsmount *mnt)
 474{
 475        char *subvol_name = NULL;
 476        struct block_device *bdev = NULL;
 477        struct super_block *s;
 478        struct dentry *root;
 479        struct btrfs_fs_devices *fs_devices = NULL;
 480        fmode_t mode = FMODE_READ;
 481        int error = 0;
 482
 483        if (!(flags & MS_RDONLY))
 484                mode |= FMODE_WRITE;
 485
 486        error = btrfs_parse_early_options(data, mode, fs_type,
 487                                          &subvol_name, &fs_devices);
 488        if (error)
 489                return error;
 490
 491        error = btrfs_scan_one_device(dev_name, mode, fs_type, &fs_devices);
 492        if (error)
 493                goto error_free_subvol_name;
 494
 495        error = btrfs_open_devices(fs_devices, mode, fs_type);
 496        if (error)
 497                goto error_free_subvol_name;
 498
 499        if (!(flags & MS_RDONLY) && fs_devices->rw_devices == 0) {
 500                error = -EACCES;
 501                goto error_close_devices;
 502        }
 503
 504        bdev = fs_devices->latest_bdev;
 505        s = sget(fs_type, btrfs_test_super, set_anon_super, fs_devices);
 506        if (IS_ERR(s))
 507                goto error_s;
 508
 509        if (s->s_root) {
 510                if ((flags ^ s->s_flags) & MS_RDONLY) {
 511                        deactivate_locked_super(s);
 512                        error = -EBUSY;
 513                        goto error_close_devices;
 514                }
 515
 516                btrfs_close_devices(fs_devices);
 517        } else {
 518                char b[BDEVNAME_SIZE];
 519
 520                s->s_flags = flags;
 521                strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
 522                error = btrfs_fill_super(s, fs_devices, data,
 523                                         flags & MS_SILENT ? 1 : 0);
 524                if (error) {
 525                        deactivate_locked_super(s);
 526                        goto error_free_subvol_name;
 527                }
 528
 529                btrfs_sb(s)->fs_info->bdev_holder = fs_type;
 530                s->s_flags |= MS_ACTIVE;
 531        }
 532
 533        if (!strcmp(subvol_name, "."))
 534                root = dget(s->s_root);
 535        else {
 536                mutex_lock(&s->s_root->d_inode->i_mutex);
 537                root = lookup_one_len(subvol_name, s->s_root,
 538                                      strlen(subvol_name));
 539                mutex_unlock(&s->s_root->d_inode->i_mutex);
 540
 541                if (IS_ERR(root)) {
 542                        deactivate_locked_super(s);
 543                        error = PTR_ERR(root);
 544                        goto error_free_subvol_name;
 545                }
 546                if (!root->d_inode) {
 547                        dput(root);
 548                        deactivate_locked_super(s);
 549                        error = -ENXIO;
 550                        goto error_free_subvol_name;
 551                }
 552        }
 553
 554        mnt->mnt_sb = s;
 555        mnt->mnt_root = root;
 556
 557        kfree(subvol_name);
 558        return 0;
 559
 560error_s:
 561        error = PTR_ERR(s);
 562error_close_devices:
 563        btrfs_close_devices(fs_devices);
 564error_free_subvol_name:
 565        kfree(subvol_name);
 566        return error;
 567}
 568
 569static int btrfs_remount(struct super_block *sb, int *flags, char *data)
 570{
 571        struct btrfs_root *root = btrfs_sb(sb);
 572        int ret;
 573
 574        ret = btrfs_parse_options(root, data);
 575        if (ret)
 576                return -EINVAL;
 577
 578        if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
 579                return 0;
 580
 581        if (*flags & MS_RDONLY) {
 582                sb->s_flags |= MS_RDONLY;
 583
 584                ret =  btrfs_commit_super(root);
 585                WARN_ON(ret);
 586        } else {
 587                if (root->fs_info->fs_devices->rw_devices == 0)
 588                        return -EACCES;
 589
 590                if (btrfs_super_log_root(&root->fs_info->super_copy) != 0)
 591                        return -EINVAL;
 592
 593                /* recover relocation */
 594                ret = btrfs_recover_relocation(root);
 595                WARN_ON(ret);
 596
 597                ret = btrfs_cleanup_fs_roots(root->fs_info);
 598                WARN_ON(ret);
 599
 600                sb->s_flags &= ~MS_RDONLY;
 601        }
 602
 603        return 0;
 604}
 605
 606static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf)
 607{
 608        struct btrfs_root *root = btrfs_sb(dentry->d_sb);
 609        struct btrfs_super_block *disk_super = &root->fs_info->super_copy;
 610        int bits = dentry->d_sb->s_blocksize_bits;
 611        __be32 *fsid = (__be32 *)root->fs_info->fsid;
 612
 613        buf->f_namelen = BTRFS_NAME_LEN;
 614        buf->f_blocks = btrfs_super_total_bytes(disk_super) >> bits;
 615        buf->f_bfree = buf->f_blocks -
 616                (btrfs_super_bytes_used(disk_super) >> bits);
 617        buf->f_bavail = buf->f_bfree;
 618        buf->f_bsize = dentry->d_sb->s_blocksize;
 619        buf->f_type = BTRFS_SUPER_MAGIC;
 620
 621        /* We treat it as constant endianness (it doesn't matter _which_)
 622           because we want the fsid to come out the same whether mounted
 623           on a big-endian or little-endian host */
 624        buf->f_fsid.val[0] = be32_to_cpu(fsid[0]) ^ be32_to_cpu(fsid[2]);
 625        buf->f_fsid.val[1] = be32_to_cpu(fsid[1]) ^ be32_to_cpu(fsid[3]);
 626        /* Mask in the root object ID too, to disambiguate subvols */
 627        buf->f_fsid.val[0] ^= BTRFS_I(dentry->d_inode)->root->objectid >> 32;
 628        buf->f_fsid.val[1] ^= BTRFS_I(dentry->d_inode)->root->objectid;
 629
 630        return 0;
 631}
 632
 633static struct file_system_type btrfs_fs_type = {
 634        .owner          = THIS_MODULE,
 635        .name           = "btrfs",
 636        .get_sb         = btrfs_get_sb,
 637        .kill_sb        = kill_anon_super,
 638        .fs_flags       = FS_REQUIRES_DEV,
 639};
 640
 641/*
 642 * used by btrfsctl to scan devices when no FS is mounted
 643 */
 644static long btrfs_control_ioctl(struct file *file, unsigned int cmd,
 645                                unsigned long arg)
 646{
 647        struct btrfs_ioctl_vol_args *vol;
 648        struct btrfs_fs_devices *fs_devices;
 649        int ret = -ENOTTY;
 650
 651        if (!capable(CAP_SYS_ADMIN))
 652                return -EPERM;
 653
 654        vol = memdup_user((void __user *)arg, sizeof(*vol));
 655        if (IS_ERR(vol))
 656                return PTR_ERR(vol);
 657
 658        switch (cmd) {
 659        case BTRFS_IOC_SCAN_DEV:
 660                ret = btrfs_scan_one_device(vol->name, FMODE_READ,
 661                                            &btrfs_fs_type, &fs_devices);
 662                break;
 663        }
 664
 665        kfree(vol);
 666        return ret;
 667}
 668
 669static int btrfs_freeze(struct super_block *sb)
 670{
 671        struct btrfs_root *root = btrfs_sb(sb);
 672        mutex_lock(&root->fs_info->transaction_kthread_mutex);
 673        mutex_lock(&root->fs_info->cleaner_mutex);
 674        return 0;
 675}
 676
 677static int btrfs_unfreeze(struct super_block *sb)
 678{
 679        struct btrfs_root *root = btrfs_sb(sb);
 680        mutex_unlock(&root->fs_info->cleaner_mutex);
 681        mutex_unlock(&root->fs_info->transaction_kthread_mutex);
 682        return 0;
 683}
 684
 685static const struct super_operations btrfs_super_ops = {
 686        .drop_inode     = btrfs_drop_inode,
 687        .delete_inode   = btrfs_delete_inode,
 688        .put_super      = btrfs_put_super,
 689        .sync_fs        = btrfs_sync_fs,
 690        .show_options   = btrfs_show_options,
 691        .write_inode    = btrfs_write_inode,
 692        .dirty_inode    = btrfs_dirty_inode,
 693        .alloc_inode    = btrfs_alloc_inode,
 694        .destroy_inode  = btrfs_destroy_inode,
 695        .statfs         = btrfs_statfs,
 696        .remount_fs     = btrfs_remount,
 697        .freeze_fs      = btrfs_freeze,
 698        .unfreeze_fs    = btrfs_unfreeze,
 699};
 700
 701static const struct file_operations btrfs_ctl_fops = {
 702        .unlocked_ioctl  = btrfs_control_ioctl,
 703        .compat_ioctl = btrfs_control_ioctl,
 704        .owner   = THIS_MODULE,
 705};
 706
 707static struct miscdevice btrfs_misc = {
 708        .minor          = MISC_DYNAMIC_MINOR,
 709        .name           = "btrfs-control",
 710        .fops           = &btrfs_ctl_fops
 711};
 712
 713static int btrfs_interface_init(void)
 714{
 715        return misc_register(&btrfs_misc);
 716}
 717
 718static void btrfs_interface_exit(void)
 719{
 720        if (misc_deregister(&btrfs_misc) < 0)
 721                printk(KERN_INFO "misc_deregister failed for control device");
 722}
 723
 724static int __init init_btrfs_fs(void)
 725{
 726        int err;
 727
 728        err = btrfs_init_sysfs();
 729        if (err)
 730                return err;
 731
 732        err = btrfs_init_cachep();
 733        if (err)
 734                goto free_sysfs;
 735
 736        err = extent_io_init();
 737        if (err)
 738                goto free_cachep;
 739
 740        err = extent_map_init();
 741        if (err)
 742                goto free_extent_io;
 743
 744        err = btrfs_interface_init();
 745        if (err)
 746                goto free_extent_map;
 747
 748        err = register_filesystem(&btrfs_fs_type);
 749        if (err)
 750                goto unregister_ioctl;
 751
 752        printk(KERN_INFO "%s loaded\n", BTRFS_BUILD_VERSION);
 753        return 0;
 754
 755unregister_ioctl:
 756        btrfs_interface_exit();
 757free_extent_map:
 758        extent_map_exit();
 759free_extent_io:
 760        extent_io_exit();
 761free_cachep:
 762        btrfs_destroy_cachep();
 763free_sysfs:
 764        btrfs_exit_sysfs();
 765        return err;
 766}
 767
 768static void __exit exit_btrfs_fs(void)
 769{
 770        btrfs_destroy_cachep();
 771        extent_map_exit();
 772        extent_io_exit();
 773        btrfs_interface_exit();
 774        unregister_filesystem(&btrfs_fs_type);
 775        btrfs_exit_sysfs();
 776        btrfs_cleanup_fs_uuids();
 777        btrfs_zlib_exit();
 778}
 779
 780module_init(init_btrfs_fs)
 781module_exit(exit_btrfs_fs)
 782
 783MODULE_LICENSE("GPL");
 784