super.c 22.5 KB
Newer Older
C
Chris Mason 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
 * Copyright (C) 2007 Oracle.  All rights reserved.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public
 * License v2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public
 * License along with this program; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 021110-1307, USA.
 */

Y
Yan 已提交
19
#include <linux/blkdev.h>
20
#include <linux/module.h>
C
Chris Mason 已提交
21
#include <linux/buffer_head.h>
22 23 24 25 26
#include <linux/fs.h>
#include <linux/pagemap.h>
#include <linux/highmem.h>
#include <linux/time.h>
#include <linux/init.h>
E
Eric Paris 已提交
27
#include <linux/seq_file.h>
28 29
#include <linux/string.h>
#include <linux/backing-dev.h>
Y
Yan 已提交
30
#include <linux/mount.h>
C
Chris Mason 已提交
31
#include <linux/mpage.h>
C
Chris Mason 已提交
32 33
#include <linux/swap.h>
#include <linux/writeback.h>
C
Chris Mason 已提交
34
#include <linux/statfs.h>
C
Chris Mason 已提交
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 <linux/slab.h>
C
Chris Mason 已提交
42
#include "compat.h"
43
#include "ctree.h"
C
Chris Mason 已提交
44
#include "disk-io.h"
45
#include "transaction.h"
C
Chris Mason 已提交
46
#include "btrfs_inode.h"
C
Chris Mason 已提交
47
#include "ioctl.h"
C
Chris Mason 已提交
48
#include "print-tree.h"
J
Josef Bacik 已提交
49
#include "xattr.h"
50
#include "volumes.h"
51
#include "version.h"
B
Balaji Rao 已提交
52
#include "export.h"
C
Chris Mason 已提交
53
#include "compression.h"
54

55
static const struct super_operations btrfs_super_ops;
C
Chris Mason 已提交
56

C
Chris Mason 已提交
57
static void btrfs_put_super(struct super_block *sb)
C
Chris Mason 已提交
58
{
C
Chris Mason 已提交
59
	struct btrfs_root *root = btrfs_sb(sb);
C
Chris Mason 已提交
60 61
	int ret;

C
Chris Mason 已提交
62 63
	ret = close_ctree(root);
	sb->s_fs_info = NULL;
C
Chris Mason 已提交
64 65
}

66
enum {
67
	Opt_degraded, Opt_subvol, Opt_subvolid, Opt_device, Opt_nodatasum,
68 69 70
	Opt_nodatacow, Opt_max_inline, Opt_alloc_start, Opt_nobarrier, Opt_ssd,
	Opt_nossd, Opt_ssd_spread, Opt_thread_pool, Opt_noacl, Opt_compress,
	Opt_compress_force, Opt_notreelog, Opt_ratio, Opt_flushoncommit,
71
	Opt_discard, Opt_space_cache, Opt_clear_cache, Opt_err,
72 73 74
};

static match_table_t tokens = {
75
	{Opt_degraded, "degraded"},
76
	{Opt_subvol, "subvol=%s"},
77
	{Opt_subvolid, "subvolid=%d"},
78
	{Opt_device, "device=%s"},
79
	{Opt_nodatasum, "nodatasum"},
80
	{Opt_nodatacow, "nodatacow"},
81
	{Opt_nobarrier, "nobarrier"},
82
	{Opt_max_inline, "max_inline=%s"},
83
	{Opt_alloc_start, "alloc_start=%s"},
84
	{Opt_thread_pool, "thread_pool=%d"},
C
Chris Mason 已提交
85
	{Opt_compress, "compress"},
C
Chris Mason 已提交
86
	{Opt_compress_force, "compress-force"},
87
	{Opt_ssd, "ssd"},
88
	{Opt_ssd_spread, "ssd_spread"},
C
Chris Mason 已提交
89
	{Opt_nossd, "nossd"},
J
Josef Bacik 已提交
90
	{Opt_noacl, "noacl"},
S
Sage Weil 已提交
91
	{Opt_notreelog, "notreelog"},
92
	{Opt_flushoncommit, "flushoncommit"},
93
	{Opt_ratio, "metadata_ratio=%d"},
C
Christoph Hellwig 已提交
94
	{Opt_discard, "discard"},
95
	{Opt_space_cache, "space_cache"},
96
	{Opt_clear_cache, "clear_cache"},
J
Josef Bacik 已提交
97
	{Opt_err, NULL},
98 99
};

100 101 102 103 104
/*
 * Regular mount options parser.  Everything that is needed only when
 * reading in a new superblock is parsed here.
 */
int btrfs_parse_options(struct btrfs_root *root, char *options)
105
{
106
	struct btrfs_fs_info *info = root->fs_info;
107
	substring_t args[MAX_OPT_ARGS];
108
	char *p, *num, *orig;
109
	int intarg;
S
Sage Weil 已提交
110
	int ret = 0;
111

112
	if (!options)
113
		return 0;
114

115 116 117 118 119 120 121 122
	/*
	 * strsep changes the string, duplicate it because parse_options
	 * gets called twice
	 */
	options = kstrdup(options, GFP_NOFS);
	if (!options)
		return -ENOMEM;

123
	orig = options;
124

125
	while ((p = strsep(&options, ",")) != NULL) {
126 127 128 129 130 131
		int token;
		if (!*p)
			continue;

		token = match_token(p, tokens, args);
		switch (token) {
132
		case Opt_degraded:
133 134
			printk(KERN_INFO "btrfs: allowing degraded mounts\n");
			btrfs_set_opt(info->mount_opt, DEGRADED);
135
			break;
136
		case Opt_subvol:
137
		case Opt_subvolid:
138
		case Opt_device:
139
			/*
140
			 * These are parsed by btrfs_parse_early_options
141 142
			 * and can be happily ignored here.
			 */
143 144
			break;
		case Opt_nodatasum:
145
			printk(KERN_INFO "btrfs: setting nodatasum\n");
146
			btrfs_set_opt(info->mount_opt, NODATASUM);
147 148
			break;
		case Opt_nodatacow:
149 150 151
			printk(KERN_INFO "btrfs: setting nodatacow\n");
			btrfs_set_opt(info->mount_opt, NODATACOW);
			btrfs_set_opt(info->mount_opt, NODATASUM);
152
			break;
C
Chris Mason 已提交
153 154 155 156
		case Opt_compress:
			printk(KERN_INFO "btrfs: use compression\n");
			btrfs_set_opt(info->mount_opt, COMPRESS);
			break;
C
Chris Mason 已提交
157 158 159 160 161
		case Opt_compress_force:
			printk(KERN_INFO "btrfs: forcing compression\n");
			btrfs_set_opt(info->mount_opt, FORCE_COMPRESS);
			btrfs_set_opt(info->mount_opt, COMPRESS);
			break;
162
		case Opt_ssd:
163 164
			printk(KERN_INFO "btrfs: use ssd allocation scheme\n");
			btrfs_set_opt(info->mount_opt, SSD);
165
			break;
166 167 168 169 170 171
		case Opt_ssd_spread:
			printk(KERN_INFO "btrfs: use spread ssd "
			       "allocation scheme\n");
			btrfs_set_opt(info->mount_opt, SSD);
			btrfs_set_opt(info->mount_opt, SSD_SPREAD);
			break;
C
Chris Mason 已提交
172
		case Opt_nossd:
173 174
			printk(KERN_INFO "btrfs: not using ssd allocation "
			       "scheme\n");
C
Chris Mason 已提交
175
			btrfs_set_opt(info->mount_opt, NOSSD);
C
Chris Mason 已提交
176
			btrfs_clear_opt(info->mount_opt, SSD);
177
			btrfs_clear_opt(info->mount_opt, SSD_SPREAD);
C
Chris Mason 已提交
178
			break;
179
		case Opt_nobarrier:
180 181
			printk(KERN_INFO "btrfs: turning off barriers\n");
			btrfs_set_opt(info->mount_opt, NOBARRIER);
182
			break;
183 184 185 186 187 188 189 190 191
		case Opt_thread_pool:
			intarg = 0;
			match_int(&args[0], &intarg);
			if (intarg) {
				info->thread_pool_size = intarg;
				printk(KERN_INFO "btrfs: thread pool %d\n",
				       info->thread_pool_size);
			}
			break;
192
		case Opt_max_inline:
193 194
			num = match_strdup(&args[0]);
			if (num) {
A
Akinobu Mita 已提交
195
				info->max_inline = memparse(num, NULL);
196 197
				kfree(num);

C
Chris Mason 已提交
198 199 200 201 202
				if (info->max_inline) {
					info->max_inline = max_t(u64,
						info->max_inline,
						root->sectorsize);
				}
203
				printk(KERN_INFO "btrfs: max_inline at %llu\n",
204
					(unsigned long long)info->max_inline);
205 206
			}
			break;
207
		case Opt_alloc_start:
208 209
			num = match_strdup(&args[0]);
			if (num) {
A
Akinobu Mita 已提交
210
				info->alloc_start = memparse(num, NULL);
211 212 213
				kfree(num);
				printk(KERN_INFO
					"btrfs: allocations start at %llu\n",
214
					(unsigned long long)info->alloc_start);
215 216
			}
			break;
J
Josef Bacik 已提交
217 218 219
		case Opt_noacl:
			root->fs_info->sb->s_flags &= ~MS_POSIXACL;
			break;
S
Sage Weil 已提交
220 221 222 223
		case Opt_notreelog:
			printk(KERN_INFO "btrfs: disabling tree log\n");
			btrfs_set_opt(info->mount_opt, NOTREELOG);
			break;
224 225 226 227
		case Opt_flushoncommit:
			printk(KERN_INFO "btrfs: turning on flush-on-commit\n");
			btrfs_set_opt(info->mount_opt, FLUSHONCOMMIT);
			break;
228 229 230 231 232 233 234 235 236
		case Opt_ratio:
			intarg = 0;
			match_int(&args[0], &intarg);
			if (intarg) {
				info->metadata_ratio = intarg;
				printk(KERN_INFO "btrfs: metadata ratio %d\n",
				       info->metadata_ratio);
			}
			break;
C
Christoph Hellwig 已提交
237 238 239
		case Opt_discard:
			btrfs_set_opt(info->mount_opt, DISCARD);
			break;
240 241 242
		case Opt_space_cache:
			printk(KERN_INFO "btrfs: enabling disk space caching\n");
			btrfs_set_opt(info->mount_opt, SPACE_CACHE);
243 244 245
		case Opt_clear_cache:
			printk(KERN_INFO "btrfs: force clearing of disk cache\n");
			btrfs_set_opt(info->mount_opt, CLEAR_CACHE);
246
			break;
S
Sage Weil 已提交
247 248 249 250 251
		case Opt_err:
			printk(KERN_INFO "btrfs: unrecognized mount option "
			       "'%s'\n", p);
			ret = -EINVAL;
			goto out;
252
		default:
253
			break;
254 255
		}
	}
S
Sage Weil 已提交
256
out:
257
	kfree(orig);
S
Sage Weil 已提交
258
	return ret;
259 260 261 262 263 264 265 266
}

/*
 * Parse mount options that are required early in the mount process.
 *
 * All other options will be parsed on much later in the mount process and
 * only when we need to allocate a new super block.
 */
267
static int btrfs_parse_early_options(const char *options, fmode_t flags,
268
		void *holder, char **subvol_name, u64 *subvol_objectid,
269
		struct btrfs_fs_devices **fs_devices)
270 271 272 273
{
	substring_t args[MAX_OPT_ARGS];
	char *opts, *p;
	int error = 0;
274
	int intarg;
275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296

	if (!options)
		goto out;

	/*
	 * strsep changes the string, duplicate it because parse_options
	 * gets called twice
	 */
	opts = kstrdup(options, GFP_KERNEL);
	if (!opts)
		return -ENOMEM;

	while ((p = strsep(&opts, ",")) != NULL) {
		int token;
		if (!*p)
			continue;

		token = match_token(p, tokens, args);
		switch (token) {
		case Opt_subvol:
			*subvol_name = match_strdup(&args[0]);
			break;
297 298
		case Opt_subvolid:
			intarg = 0;
299 300 301 302 303 304 305 306 307
			error = match_int(&args[0], &intarg);
			if (!error) {
				/* we want the original fs_tree */
				if (!intarg)
					*subvol_objectid =
						BTRFS_FS_TREE_OBJECTID;
				else
					*subvol_objectid = intarg;
			}
308
			break;
309 310 311 312 313 314
		case Opt_device:
			error = btrfs_scan_one_device(match_strdup(&args[0]),
					flags, holder, fs_devices);
			if (error)
				goto out_free_opts;
			break;
315 316 317 318 319
		default:
			break;
		}
	}

320
 out_free_opts:
321 322 323 324
	kfree(opts);
 out:
	/*
	 * If no subvolume name is specified we use the default one.  Allocate
325
	 * a copy of the string "." here so that code later in the
326 327 328
	 * mount path doesn't care if it's the default volume or another one.
	 */
	if (!*subvol_name) {
329
		*subvol_name = kstrdup(".", GFP_KERNEL);
330 331 332 333
		if (!*subvol_name)
			return -ENOMEM;
	}
	return error;
334 335
}

336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371
static struct dentry *get_default_root(struct super_block *sb,
				       u64 subvol_objectid)
{
	struct btrfs_root *root = sb->s_fs_info;
	struct btrfs_root *new_root;
	struct btrfs_dir_item *di;
	struct btrfs_path *path;
	struct btrfs_key location;
	struct inode *inode;
	struct dentry *dentry;
	u64 dir_id;
	int new = 0;

	/*
	 * We have a specific subvol we want to mount, just setup location and
	 * go look up the root.
	 */
	if (subvol_objectid) {
		location.objectid = subvol_objectid;
		location.type = BTRFS_ROOT_ITEM_KEY;
		location.offset = (u64)-1;
		goto find_root;
	}

	path = btrfs_alloc_path();
	if (!path)
		return ERR_PTR(-ENOMEM);
	path->leave_spinning = 1;

	/*
	 * Find the "default" dir item which points to the root item that we
	 * will mount by default if we haven't been given a specific subvolume
	 * to mount.
	 */
	dir_id = btrfs_super_root_dir(&root->fs_info->super_copy);
	di = btrfs_lookup_dir_item(NULL, root, path, dir_id, "default", 7, 0);
372 373
	if (IS_ERR(di))
		return ERR_CAST(di);
374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391
	if (!di) {
		/*
		 * Ok the default dir item isn't there.  This is weird since
		 * it's always been there, but don't freak out, just try and
		 * mount to root most subvolume.
		 */
		btrfs_free_path(path);
		dir_id = BTRFS_FIRST_FREE_OBJECTID;
		new_root = root->fs_info->fs_root;
		goto setup_root;
	}

	btrfs_dir_item_key_to_cpu(path->nodes[0], di, &location);
	btrfs_free_path(path);

find_root:
	new_root = btrfs_read_fs_root_no_name(root->fs_info, &location);
	if (IS_ERR(new_root))
J
Julia Lawall 已提交
392
		return ERR_CAST(new_root);
393 394 395 396 397 398 399 400 401 402 403

	if (btrfs_root_refs(&new_root->root_item) == 0)
		return ERR_PTR(-ENOENT);

	dir_id = btrfs_root_dirid(&new_root->root_item);
setup_root:
	location.objectid = dir_id;
	location.type = BTRFS_INODE_ITEM_KEY;
	location.offset = 0;

	inode = btrfs_iget(sb, &location, new_root, &new);
404 405
	if (IS_ERR(inode))
		return ERR_CAST(inode);
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441

	/*
	 * If we're just mounting the root most subvol put the inode and return
	 * a reference to the dentry.  We will have already gotten a reference
	 * to the inode in btrfs_fill_super so we're good to go.
	 */
	if (!new && sb->s_root->d_inode == inode) {
		iput(inode);
		return dget(sb->s_root);
	}

	if (new) {
		const struct qstr name = { .name = "/", .len = 1 };

		/*
		 * New inode, we need to make the dentry a sibling of s_root so
		 * everything gets cleaned up properly on unmount.
		 */
		dentry = d_alloc(sb->s_root, &name);
		if (!dentry) {
			iput(inode);
			return ERR_PTR(-ENOMEM);
		}
		d_splice_alias(inode, dentry);
	} else {
		/*
		 * We found the inode in cache, just find a dentry for it and
		 * put the reference to the inode we just got.
		 */
		dentry = d_find_alias(inode);
		iput(inode);
	}

	return dentry;
}

C
Chris Mason 已提交
442
static int btrfs_fill_super(struct super_block *sb,
443
			    struct btrfs_fs_devices *fs_devices,
C
Chris Mason 已提交
444
			    void *data, int silent)
C
Chris Mason 已提交
445
{
C
Chris Mason 已提交
446 447
	struct inode *inode;
	struct dentry *root_dentry;
C
Chris Mason 已提交
448 449
	struct btrfs_super_block *disk_super;
	struct btrfs_root *tree_root;
450
	struct btrfs_key key;
C
Chris Mason 已提交
451
	int err;
452

C
Chris Mason 已提交
453 454 455
	sb->s_maxbytes = MAX_LFS_FILESIZE;
	sb->s_magic = BTRFS_SUPER_MAGIC;
	sb->s_op = &btrfs_super_ops;
B
Balaji Rao 已提交
456
	sb->s_export_op = &btrfs_export_ops;
J
Josef Bacik 已提交
457
	sb->s_xattr = btrfs_xattr_handlers;
C
Chris Mason 已提交
458
	sb->s_time_gran = 1;
C
Chris Mason 已提交
459
#ifdef CONFIG_BTRFS_FS_POSIX_ACL
J
Josef Bacik 已提交
460
	sb->s_flags |= MS_POSIXACL;
461
#endif
462

463
	tree_root = open_ctree(sb, fs_devices, (char *)data);
464

465
	if (IS_ERR(tree_root)) {
C
Chris Mason 已提交
466
		printk("btrfs: open_ctree failed\n");
467
		return PTR_ERR(tree_root);
468
	}
C
Chris Mason 已提交
469
	sb->s_fs_info = tree_root;
470
	disk_super = &tree_root->fs_info->super_copy;
471

472 473 474
	key.objectid = BTRFS_FIRST_FREE_OBJECTID;
	key.type = BTRFS_INODE_ITEM_KEY;
	key.offset = 0;
475
	inode = btrfs_iget(sb, &key, tree_root->fs_info->fs_root, NULL);
476 477
	if (IS_ERR(inode)) {
		err = PTR_ERR(inode);
C
Chris Mason 已提交
478
		goto fail_close;
C
Chris Mason 已提交
479 480
	}

C
Chris Mason 已提交
481 482 483 484 485
	root_dentry = d_alloc_root(inode);
	if (!root_dentry) {
		iput(inode);
		err = -ENOMEM;
		goto fail_close;
C
Chris Mason 已提交
486
	}
487

C
Chris Mason 已提交
488
	sb->s_root = root_dentry;
C
Chris Mason 已提交
489 490

	save_mount_options(sb, data);
C
Chris Mason 已提交
491
	return 0;
C
Chris Mason 已提交
492 493 494 495

fail_close:
	close_ctree(tree_root);
	return err;
C
Chris Mason 已提交
496 497
}

S
Sage Weil 已提交
498
int btrfs_sync_fs(struct super_block *sb, int wait)
C
Chris Mason 已提交
499 500
{
	struct btrfs_trans_handle *trans;
501
	struct btrfs_root *root = btrfs_sb(sb);
C
Chris Mason 已提交
502
	int ret;
C
Chris Mason 已提交
503

C
Chris Mason 已提交
504 505 506 507
	if (!wait) {
		filemap_flush(root->fs_info->btree_inode->i_mapping);
		return 0;
	}
508

Y
Yan, Zheng 已提交
509 510
	btrfs_start_delalloc_inodes(root, 0);
	btrfs_wait_ordered_extents(root, 0, 0);
511

512
	trans = btrfs_start_transaction(root, 0);
C
Chris Mason 已提交
513
	ret = btrfs_commit_transaction(trans, root);
514
	return ret;
C
Chris Mason 已提交
515 516
}

E
Eric Paris 已提交
517 518 519 520 521 522 523 524 525 526 527 528 529 530
static int btrfs_show_options(struct seq_file *seq, struct vfsmount *vfs)
{
	struct btrfs_root *root = btrfs_sb(vfs->mnt_sb);
	struct btrfs_fs_info *info = root->fs_info;

	if (btrfs_test_opt(root, DEGRADED))
		seq_puts(seq, ",degraded");
	if (btrfs_test_opt(root, NODATASUM))
		seq_puts(seq, ",nodatasum");
	if (btrfs_test_opt(root, NODATACOW))
		seq_puts(seq, ",nodatacow");
	if (btrfs_test_opt(root, NOBARRIER))
		seq_puts(seq, ",nobarrier");
	if (info->max_inline != 8192 * 1024)
531 532
		seq_printf(seq, ",max_inline=%llu",
			   (unsigned long long)info->max_inline);
E
Eric Paris 已提交
533
	if (info->alloc_start != 0)
534 535
		seq_printf(seq, ",alloc_start=%llu",
			   (unsigned long long)info->alloc_start);
E
Eric Paris 已提交
536 537 538 539 540
	if (info->thread_pool_size !=  min_t(unsigned long,
					     num_online_cpus() + 2, 8))
		seq_printf(seq, ",thread_pool=%d", info->thread_pool_size);
	if (btrfs_test_opt(root, COMPRESS))
		seq_puts(seq, ",compress");
C
Chris Mason 已提交
541 542
	if (btrfs_test_opt(root, NOSSD))
		seq_puts(seq, ",nossd");
543 544 545
	if (btrfs_test_opt(root, SSD_SPREAD))
		seq_puts(seq, ",ssd_spread");
	else if (btrfs_test_opt(root, SSD))
E
Eric Paris 已提交
546
		seq_puts(seq, ",ssd");
S
Sage Weil 已提交
547
	if (btrfs_test_opt(root, NOTREELOG))
548
		seq_puts(seq, ",notreelog");
549
	if (btrfs_test_opt(root, FLUSHONCOMMIT))
550
		seq_puts(seq, ",flushoncommit");
551 552
	if (btrfs_test_opt(root, DISCARD))
		seq_puts(seq, ",discard");
E
Eric Paris 已提交
553 554 555 556 557
	if (!(root->fs_info->sb->s_flags & MS_POSIXACL))
		seq_puts(seq, ",noacl");
	return 0;
}

558
static int btrfs_test_super(struct super_block *s, void *data)
Y
Yan 已提交
559
{
560 561
	struct btrfs_fs_devices *test_fs_devices = data;
	struct btrfs_root *root = btrfs_sb(s);
Y
Yan 已提交
562

563
	return root->fs_info->fs_devices == test_fs_devices;
Y
Yan 已提交
564 565
}

566 567 568 569 570 571 572 573
/*
 * Find a superblock for the given device / mount point.
 *
 * Note:  This is based on get_sb_bdev from fs/super.c with a few additions
 *	  for multiple device setup.  Make sure to keep it in sync.
 */
static int btrfs_get_sb(struct file_system_type *fs_type, int flags,
		const char *dev_name, void *data, struct vfsmount *mnt)
Y
Yan 已提交
574 575 576 577
{
	struct block_device *bdev = NULL;
	struct super_block *s;
	struct dentry *root;
578
	struct btrfs_fs_devices *fs_devices = NULL;
579
	fmode_t mode = FMODE_READ;
580 581
	char *subvol_name = NULL;
	u64 subvol_objectid = 0;
Y
Yan 已提交
582
	int error = 0;
583
	int found = 0;
Y
Yan 已提交
584

585 586 587 588
	if (!(flags & MS_RDONLY))
		mode |= FMODE_WRITE;

	error = btrfs_parse_early_options(data, mode, fs_type,
589 590
					  &subvol_name, &subvol_objectid,
					  &fs_devices);
591
	if (error)
592
		return error;
593

594
	error = btrfs_scan_one_device(dev_name, mode, fs_type, &fs_devices);
595
	if (error)
596
		goto error_free_subvol_name;
Y
Yan 已提交
597

598
	error = btrfs_open_devices(fs_devices, mode, fs_type);
599
	if (error)
600
		goto error_free_subvol_name;
601

Y
Yan Zheng 已提交
602 603 604 605 606
	if (!(flags & MS_RDONLY) && fs_devices->rw_devices == 0) {
		error = -EACCES;
		goto error_close_devices;
	}

607
	bdev = fs_devices->latest_bdev;
608
	s = sget(fs_type, btrfs_test_super, set_anon_super, fs_devices);
Y
Yan 已提交
609 610 611 612 613
	if (IS_ERR(s))
		goto error_s;

	if (s->s_root) {
		if ((flags ^ s->s_flags) & MS_RDONLY) {
614
			deactivate_locked_super(s);
Y
Yan 已提交
615
			error = -EBUSY;
Y
Yan Zheng 已提交
616
			goto error_close_devices;
Y
Yan 已提交
617 618
		}

619
		found = 1;
Y
Yan Zheng 已提交
620
		btrfs_close_devices(fs_devices);
Y
Yan 已提交
621 622 623 624 625
	} else {
		char b[BDEVNAME_SIZE];

		s->s_flags = flags;
		strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
626 627
		error = btrfs_fill_super(s, fs_devices, data,
					 flags & MS_SILENT ? 1 : 0);
Y
Yan 已提交
628
		if (error) {
629
			deactivate_locked_super(s);
630
			goto error_free_subvol_name;
Y
Yan 已提交
631 632
		}

633
		btrfs_sb(s)->fs_info->bdev_holder = fs_type;
Y
Yan 已提交
634 635 636
		s->s_flags |= MS_ACTIVE;
	}

637 638 639 640
	root = get_default_root(s, subvol_objectid);
	if (IS_ERR(root)) {
		error = PTR_ERR(root);
		deactivate_locked_super(s);
641
		goto error_free_subvol_name;
642 643 644 645 646 647
	}
	/* if they gave us a subvolume name bind mount into that */
	if (strcmp(subvol_name, ".")) {
		struct dentry *new_root;
		mutex_lock(&root->d_inode->i_mutex);
		new_root = lookup_one_len(subvol_name, root,
C
Chris Mason 已提交
648
				      strlen(subvol_name));
649
		mutex_unlock(&root->d_inode->i_mutex);
C
Chris Mason 已提交
650

651
		if (IS_ERR(new_root)) {
652
			deactivate_locked_super(s);
653 654
			error = PTR_ERR(new_root);
			dput(root);
655
			goto error_free_subvol_name;
656
		}
657
		if (!new_root->d_inode) {
658
			dput(root);
659
			dput(new_root);
660
			deactivate_locked_super(s);
661
			error = -ENXIO;
662
			goto error_free_subvol_name;
663
		}
664 665
		dput(root);
		root = new_root;
Y
Yan 已提交
666 667 668 669
	}

	mnt->mnt_sb = s;
	mnt->mnt_root = root;
670 671

	kfree(subvol_name);
Y
Yan 已提交
672 673 674 675
	return 0;

error_s:
	error = PTR_ERR(s);
Y
Yan Zheng 已提交
676
error_close_devices:
677
	btrfs_close_devices(fs_devices);
678 679
error_free_subvol_name:
	kfree(subvol_name);
Y
Yan 已提交
680 681
	return error;
}
682

Y
Yan Zheng 已提交
683 684 685 686 687
static int btrfs_remount(struct super_block *sb, int *flags, char *data)
{
	struct btrfs_root *root = btrfs_sb(sb);
	int ret;

688 689 690 691
	ret = btrfs_parse_options(root, data);
	if (ret)
		return -EINVAL;

Y
Yan Zheng 已提交
692 693 694 695 696 697 698 699 700
	if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
		return 0;

	if (*flags & MS_RDONLY) {
		sb->s_flags |= MS_RDONLY;

		ret =  btrfs_commit_super(root);
		WARN_ON(ret);
	} else {
Y
Yan Zheng 已提交
701 702 703
		if (root->fs_info->fs_devices->rw_devices == 0)
			return -EACCES;

Y
Yan Zheng 已提交
704 705 706
		if (btrfs_super_log_root(&root->fs_info->super_copy) != 0)
			return -EINVAL;

707
		ret = btrfs_cleanup_fs_roots(root->fs_info);
Y
Yan Zheng 已提交
708 709
		WARN_ON(ret);

710 711
		/* recover relocation */
		ret = btrfs_recover_relocation(root);
Y
Yan Zheng 已提交
712 713 714 715 716 717 718 719
		WARN_ON(ret);

		sb->s_flags &= ~MS_RDONLY;
	}

	return 0;
}

C
Chris Mason 已提交
720 721 722
static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf)
{
	struct btrfs_root *root = btrfs_sb(dentry->d_sb);
723
	struct btrfs_super_block *disk_super = &root->fs_info->super_copy;
724 725 726
	struct list_head *head = &root->fs_info->space_info;
	struct btrfs_space_info *found;
	u64 total_used = 0;
J
Josef Bacik 已提交
727
	u64 total_used_data = 0;
728
	int bits = dentry->d_sb->s_blocksize_bits;
729
	__be32 *fsid = (__be32 *)root->fs_info->fsid;
C
Chris Mason 已提交
730

731
	rcu_read_lock();
J
Josef Bacik 已提交
732 733 734 735 736 737
	list_for_each_entry_rcu(found, head, list) {
		if (found->flags & (BTRFS_BLOCK_GROUP_METADATA |
				    BTRFS_BLOCK_GROUP_SYSTEM))
			total_used_data += found->disk_total;
		else
			total_used_data += found->disk_used;
738
		total_used += found->disk_used;
J
Josef Bacik 已提交
739
	}
740 741
	rcu_read_unlock();

C
Chris Mason 已提交
742
	buf->f_namelen = BTRFS_NAME_LEN;
743
	buf->f_blocks = btrfs_super_total_bytes(disk_super) >> bits;
744
	buf->f_bfree = buf->f_blocks - (total_used >> bits);
J
Josef Bacik 已提交
745
	buf->f_bavail = buf->f_blocks - (total_used_data >> bits);
C
Chris Mason 已提交
746 747
	buf->f_bsize = dentry->d_sb->s_blocksize;
	buf->f_type = BTRFS_SUPER_MAGIC;
C
Chris Mason 已提交
748

749
	/* We treat it as constant endianness (it doesn't matter _which_)
C
Chris Mason 已提交
750
	   because we want the fsid to come out the same whether mounted
751 752 753
	   on a big-endian or little-endian host */
	buf->f_fsid.val[0] = be32_to_cpu(fsid[0]) ^ be32_to_cpu(fsid[2]);
	buf->f_fsid.val[1] = be32_to_cpu(fsid[1]) ^ be32_to_cpu(fsid[3]);
754 755 756 757
	/* Mask in the root object ID too, to disambiguate subvols */
	buf->f_fsid.val[0] ^= BTRFS_I(dentry->d_inode)->root->objectid >> 32;
	buf->f_fsid.val[1] ^= BTRFS_I(dentry->d_inode)->root->objectid;

C
Chris Mason 已提交
758 759
	return 0;
}
C
Chris Mason 已提交
760

761 762 763 764
static struct file_system_type btrfs_fs_type = {
	.owner		= THIS_MODULE,
	.name		= "btrfs",
	.get_sb		= btrfs_get_sb,
765
	.kill_sb	= kill_anon_super,
766 767
	.fs_flags	= FS_REQUIRES_DEV,
};
768

C
Chris Mason 已提交
769 770 771
/*
 * used by btrfsctl to scan devices when no FS is mounted
 */
772 773 774 775 776
static long btrfs_control_ioctl(struct file *file, unsigned int cmd,
				unsigned long arg)
{
	struct btrfs_ioctl_vol_args *vol;
	struct btrfs_fs_devices *fs_devices;
777
	int ret = -ENOTTY;
778

779 780 781
	if (!capable(CAP_SYS_ADMIN))
		return -EPERM;

L
Li Zefan 已提交
782 783 784
	vol = memdup_user((void __user *)arg, sizeof(*vol));
	if (IS_ERR(vol))
		return PTR_ERR(vol);
785

786 787
	switch (cmd) {
	case BTRFS_IOC_SCAN_DEV:
788
		ret = btrfs_scan_one_device(vol->name, FMODE_READ,
789 790 791
					    &btrfs_fs_type, &fs_devices);
		break;
	}
L
Li Zefan 已提交
792

793
	kfree(vol);
L
Linda Knippers 已提交
794
	return ret;
795 796
}

797
static int btrfs_freeze(struct super_block *sb)
Y
Yan 已提交
798 799
{
	struct btrfs_root *root = btrfs_sb(sb);
800 801
	mutex_lock(&root->fs_info->transaction_kthread_mutex);
	mutex_lock(&root->fs_info->cleaner_mutex);
802
	return 0;
Y
Yan 已提交
803 804
}

805
static int btrfs_unfreeze(struct super_block *sb)
Y
Yan 已提交
806 807
{
	struct btrfs_root *root = btrfs_sb(sb);
808 809
	mutex_unlock(&root->fs_info->cleaner_mutex);
	mutex_unlock(&root->fs_info->transaction_kthread_mutex);
810
	return 0;
Y
Yan 已提交
811
}
812

813
static const struct super_operations btrfs_super_ops = {
814
	.drop_inode	= btrfs_drop_inode,
A
Al Viro 已提交
815
	.evict_inode	= btrfs_evict_inode,
C
Chris Mason 已提交
816
	.put_super	= btrfs_put_super,
817
	.sync_fs	= btrfs_sync_fs,
E
Eric Paris 已提交
818
	.show_options	= btrfs_show_options,
C
Chris Mason 已提交
819
	.write_inode	= btrfs_write_inode,
C
Chris Mason 已提交
820
	.dirty_inode	= btrfs_dirty_inode,
C
Chris Mason 已提交
821 822
	.alloc_inode	= btrfs_alloc_inode,
	.destroy_inode	= btrfs_destroy_inode,
C
Chris Mason 已提交
823
	.statfs		= btrfs_statfs,
Y
Yan Zheng 已提交
824
	.remount_fs	= btrfs_remount,
825 826
	.freeze_fs	= btrfs_freeze,
	.unfreeze_fs	= btrfs_unfreeze,
C
Chris Mason 已提交
827
};
828 829 830 831 832 833 834 835

static const struct file_operations btrfs_ctl_fops = {
	.unlocked_ioctl	 = btrfs_control_ioctl,
	.compat_ioctl = btrfs_control_ioctl,
	.owner	 = THIS_MODULE,
};

static struct miscdevice btrfs_misc = {
836
	.minor		= BTRFS_MINOR,
837 838 839 840
	.name		= "btrfs-control",
	.fops		= &btrfs_ctl_fops
};

841 842 843
MODULE_ALIAS_MISCDEV(BTRFS_MINOR);
MODULE_ALIAS("devname:btrfs-control");

844 845 846 847 848
static int btrfs_interface_init(void)
{
	return misc_register(&btrfs_misc);
}

849
static void btrfs_interface_exit(void)
850 851
{
	if (misc_deregister(&btrfs_misc) < 0)
C
Chris Mason 已提交
852
		printk(KERN_INFO "misc_deregister failed for control device");
853 854
}

855 856
static int __init init_btrfs_fs(void)
{
C
Chris Mason 已提交
857
	int err;
858 859 860 861 862

	err = btrfs_init_sysfs();
	if (err)
		return err;

C
Chris Mason 已提交
863
	err = btrfs_init_cachep();
C
Chris Mason 已提交
864
	if (err)
865
		goto free_sysfs;
866 867

	err = extent_io_init();
868 869 870
	if (err)
		goto free_cachep;

871 872 873 874
	err = extent_map_init();
	if (err)
		goto free_extent_io;

875
	err = btrfs_interface_init();
876 877
	if (err)
		goto free_extent_map;
C
Chris Mason 已提交
878

879 880 881
	err = register_filesystem(&btrfs_fs_type);
	if (err)
		goto unregister_ioctl;
882 883

	printk(KERN_INFO "%s loaded\n", BTRFS_BUILD_VERSION);
884 885
	return 0;

886 887
unregister_ioctl:
	btrfs_interface_exit();
888 889
free_extent_map:
	extent_map_exit();
890 891
free_extent_io:
	extent_io_exit();
892 893
free_cachep:
	btrfs_destroy_cachep();
894
free_sysfs:
895 896
	btrfs_exit_sysfs();
	return err;
897 898 899 900
}

static void __exit exit_btrfs_fs(void)
{
C
Chris Mason 已提交
901
	btrfs_destroy_cachep();
902
	extent_map_exit();
903
	extent_io_exit();
904
	btrfs_interface_exit();
905
	unregister_filesystem(&btrfs_fs_type);
906
	btrfs_exit_sysfs();
907
	btrfs_cleanup_fs_uuids();
C
Chris Mason 已提交
908
	btrfs_zlib_exit();
909 910 911 912 913 914
}

module_init(init_btrfs_fs)
module_exit(exit_btrfs_fs)

MODULE_LICENSE("GPL");