Blame view

fs/btrfs/super.c 29.5 KB
6cbd55707   Chris Mason   Btrfs: add GPLv2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  /*
   * 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.
   */
4b82d6e4a   Yan   Btrfs: Add mount ...
18
  #include <linux/blkdev.h>
2e635a278   Chris Mason   Btrfs: initial mo...
19
  #include <linux/module.h>
e20d96d64   Chris Mason   Mountable btrfs, ...
20
  #include <linux/buffer_head.h>
2e635a278   Chris Mason   Btrfs: initial mo...
21
22
23
24
25
  #include <linux/fs.h>
  #include <linux/pagemap.h>
  #include <linux/highmem.h>
  #include <linux/time.h>
  #include <linux/init.h>
a9572a15a   Eric Paris   Btrfs: introduce ...
26
  #include <linux/seq_file.h>
2e635a278   Chris Mason   Btrfs: initial mo...
27
  #include <linux/string.h>
2e635a278   Chris Mason   Btrfs: initial mo...
28
  #include <linux/backing-dev.h>
4b82d6e4a   Yan   Btrfs: Add mount ...
29
  #include <linux/mount.h>
dee26a9f7   Chris Mason   btrfs_get_block, ...
30
  #include <linux/mpage.h>
75dfe3960   Chris Mason   btrfs_file_write ...
31
32
  #include <linux/swap.h>
  #include <linux/writeback.h>
8fd17795b   Chris Mason   Btrfs: early fsyn...
33
  #include <linux/statfs.h>
08607c1b1   Chris Mason   Btrfs: add compat...
34
  #include <linux/compat.h>
95e052891   Chris Mason   Btrfs: Use mount ...
35
  #include <linux/parser.h>
c59f8951d   Chris Mason   Btrfs: Add mount ...
36
  #include <linux/ctype.h>
6da6abae0   Chris Mason   Btrfs: Back port ...
37
  #include <linux/namei.h>
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
38
  #include <linux/miscdevice.h>
1bcbf3133   Qinghuang Feng   btrfs & squashfs:...
39
  #include <linux/magic.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
40
  #include <linux/slab.h>
4b4e25f2a   Chris Mason   Btrfs: compat cod...
41
  #include "compat.h"
2e635a278   Chris Mason   Btrfs: initial mo...
42
  #include "ctree.h"
e20d96d64   Chris Mason   Mountable btrfs, ...
43
  #include "disk-io.h"
d57197629   Chris Mason   btrfs_create, btr...
44
  #include "transaction.h"
2c90e5d65   Chris Mason   Btrfs: still corr...
45
  #include "btrfs_inode.h"
c5739bba5   Chris Mason   Btrfs: snapshot p...
46
  #include "ioctl.h"
3a6863756   Chris Mason   Btrfs: sparse files!
47
  #include "print-tree.h"
5103e947b   Josef Bacik   xattr support for...
48
  #include "xattr.h"
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
49
  #include "volumes.h"
b3c3da71e   Chris Mason   Btrfs: Add versio...
50
  #include "version.h"
be6e8dc0b   Balaji Rao   NFS support for b...
51
  #include "export.h"
c8b978188   Chris Mason   Btrfs: Add zlib c...
52
  #include "compression.h"
2e635a278   Chris Mason   Btrfs: initial mo...
53

b87221de6   Alexey Dobriyan   const: mark remai...
54
  static const struct super_operations btrfs_super_ops;
75dfe3960   Chris Mason   btrfs_file_write ...
55

acce952b0   liubo   Btrfs: forced rea...
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
  static const char *btrfs_decode_error(struct btrfs_fs_info *fs_info, int errno,
  				      char nbuf[16])
  {
  	char *errstr = NULL;
  
  	switch (errno) {
  	case -EIO:
  		errstr = "IO failure";
  		break;
  	case -ENOMEM:
  		errstr = "Out of memory";
  		break;
  	case -EROFS:
  		errstr = "Readonly filesystem";
  		break;
  	default:
  		if (nbuf) {
  			if (snprintf(nbuf, 16, "error %d", -errno) >= 0)
  				errstr = nbuf;
  		}
  		break;
  	}
  
  	return errstr;
  }
  
  static void __save_error_info(struct btrfs_fs_info *fs_info)
  {
  	/*
  	 * today we only save the error info into ram.  Long term we'll
  	 * also send it down to the disk
  	 */
  	fs_info->fs_state = BTRFS_SUPER_FLAG_ERROR;
  }
  
  /* NOTE:
   *	We move write_super stuff at umount in order to avoid deadlock
   *	for umount hold all lock.
   */
  static void save_error_info(struct btrfs_fs_info *fs_info)
  {
  	__save_error_info(fs_info);
  }
  
  /* btrfs handle error by forcing the filesystem readonly */
  static void btrfs_handle_error(struct btrfs_fs_info *fs_info)
  {
  	struct super_block *sb = fs_info->sb;
  
  	if (sb->s_flags & MS_RDONLY)
  		return;
  
  	if (fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) {
  		sb->s_flags |= MS_RDONLY;
  		printk(KERN_INFO "btrfs is forced readonly
  ");
  	}
  }
  
  /*
   * __btrfs_std_error decodes expected errors from the caller and
   * invokes the approciate error response.
   */
  void __btrfs_std_error(struct btrfs_fs_info *fs_info, const char *function,
  		     unsigned int line, int errno)
  {
  	struct super_block *sb = fs_info->sb;
  	char nbuf[16];
  	const char *errstr;
  
  	/*
  	 * Special case: if the error is EROFS, and we're already
  	 * under MS_RDONLY, then it is safe here.
  	 */
  	if (errno == -EROFS && (sb->s_flags & MS_RDONLY))
  		return;
  
  	errstr = btrfs_decode_error(fs_info, errno, nbuf);
  	printk(KERN_CRIT "BTRFS error (device %s) in %s:%d: %s
  ",
  		sb->s_id, function, line, errstr);
  	save_error_info(fs_info);
  
  	btrfs_handle_error(fs_info);
  }
d397712bc   Chris Mason   Btrfs: Fix checkp...
141
  static void btrfs_put_super(struct super_block *sb)
b18c66858   Chris Mason   Btrfs: progress o...
142
  {
39279cc3d   Chris Mason   Btrfs: split up s...
143
  	struct btrfs_root *root = btrfs_sb(sb);
b18c66858   Chris Mason   Btrfs: progress o...
144
  	int ret;
b18c66858   Chris Mason   Btrfs: progress o...
145

39279cc3d   Chris Mason   Btrfs: split up s...
146
  	ret = close_ctree(root);
39279cc3d   Chris Mason   Btrfs: split up s...
147
  	sb->s_fs_info = NULL;
559af8211   Andi Kleen   Btrfs: cleanup wa...
148
149
  
  	(void)ret; /* FIXME: need to fix VFS to return error? */
75dfe3960   Chris Mason   btrfs_file_write ...
150
  }
95e052891   Chris Mason   Btrfs: Use mount ...
151
  enum {
73f73415c   Josef Bacik   Btrfs: change how...
152
  	Opt_degraded, Opt_subvol, Opt_subvolid, Opt_device, Opt_nodatasum,
287a0ab91   Josef Bacik   Btrfs: kill max_e...
153
154
  	Opt_nodatacow, Opt_max_inline, Opt_alloc_start, Opt_nobarrier, Opt_ssd,
  	Opt_nossd, Opt_ssd_spread, Opt_thread_pool, Opt_noacl, Opt_compress,
261507a02   Li Zefan   btrfs: Allow to a...
155
156
157
  	Opt_compress_type, Opt_compress_force, Opt_compress_force_type,
  	Opt_notreelog, Opt_ratio, Opt_flushoncommit, Opt_discard,
  	Opt_space_cache, Opt_clear_cache, Opt_user_subvol_rm_allowed, Opt_err,
95e052891   Chris Mason   Btrfs: Use mount ...
158
159
160
  };
  
  static match_table_t tokens = {
dfe250206   Chris Mason   Btrfs: Add mount ...
161
  	{Opt_degraded, "degraded"},
95e052891   Chris Mason   Btrfs: Use mount ...
162
  	{Opt_subvol, "subvol=%s"},
73f73415c   Josef Bacik   Btrfs: change how...
163
  	{Opt_subvolid, "subvolid=%d"},
43e570b08   Christoph Hellwig   btrfs: allow scan...
164
  	{Opt_device, "device=%s"},
b6cda9bcb   Chris Mason   Btrfs: Add mount ...
165
  	{Opt_nodatasum, "nodatasum"},
be20aa9db   Chris Mason   Btrfs: Add mount ...
166
  	{Opt_nodatacow, "nodatacow"},
21ad10cf3   Chris Mason   Btrfs: Add flush ...
167
  	{Opt_nobarrier, "nobarrier"},
6f568d35a   Chris Mason   Btrfs: mount -o m...
168
  	{Opt_max_inline, "max_inline=%s"},
8f662a76c   Chris Mason   Btrfs: Add readah...
169
  	{Opt_alloc_start, "alloc_start=%s"},
4543df7ec   Chris Mason   Btrfs: Add a moun...
170
  	{Opt_thread_pool, "thread_pool=%d"},
c8b978188   Chris Mason   Btrfs: Add zlib c...
171
  	{Opt_compress, "compress"},
261507a02   Li Zefan   btrfs: Allow to a...
172
  	{Opt_compress_type, "compress=%s"},
a555f810a   Chris Mason   Btrfs: Add mount ...
173
  	{Opt_compress_force, "compress-force"},
261507a02   Li Zefan   btrfs: Allow to a...
174
  	{Opt_compress_force_type, "compress-force=%s"},
e18e4809b   Chris Mason   Btrfs: Add mount ...
175
  	{Opt_ssd, "ssd"},
451d7585a   Chris Mason   Btrfs: add mount ...
176
  	{Opt_ssd_spread, "ssd_spread"},
3b30c22f6   Chris Mason   Btrfs: Add mount ...
177
  	{Opt_nossd, "nossd"},
33268eaf0   Josef Bacik   Btrfs: Add ACL su...
178
  	{Opt_noacl, "noacl"},
3a5e14048   Sage Weil   Btrfs: notreelog ...
179
  	{Opt_notreelog, "notreelog"},
dccae9999   Sage Weil   Btrfs: add flusho...
180
  	{Opt_flushoncommit, "flushoncommit"},
97e728d43   Josef Bacik   Btrfs: try to kee...
181
  	{Opt_ratio, "metadata_ratio=%d"},
e244a0aeb   Christoph Hellwig   Btrfs: add -o dis...
182
  	{Opt_discard, "discard"},
0af3d00ba   Josef Bacik   Btrfs: create spe...
183
  	{Opt_space_cache, "space_cache"},
88c2ba3b0   Josef Bacik   Btrfs: Add a clea...
184
  	{Opt_clear_cache, "clear_cache"},
4260f7c75   Sage Weil   Btrfs: allow subv...
185
  	{Opt_user_subvol_rm_allowed, "user_subvol_rm_allowed"},
33268eaf0   Josef Bacik   Btrfs: Add ACL su...
186
  	{Opt_err, NULL},
95e052891   Chris Mason   Btrfs: Use mount ...
187
  };
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
188
189
190
191
192
  /*
   * 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)
95e052891   Chris Mason   Btrfs: Use mount ...
193
  {
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
194
  	struct btrfs_fs_info *info = root->fs_info;
95e052891   Chris Mason   Btrfs: Use mount ...
195
  	substring_t args[MAX_OPT_ARGS];
da495ecc0   Josef Bacik   Btrfs: kfree corr...
196
  	char *p, *num, *orig;
4543df7ec   Chris Mason   Btrfs: Add a moun...
197
  	int intarg;
a7a3f7cad   Sage Weil   Btrfs: fail mount...
198
  	int ret = 0;
261507a02   Li Zefan   btrfs: Allow to a...
199
200
  	char *compress_type;
  	bool compress_force = false;
b6cda9bcb   Chris Mason   Btrfs: Add mount ...
201

95e052891   Chris Mason   Btrfs: Use mount ...
202
  	if (!options)
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
203
  		return 0;
95e052891   Chris Mason   Btrfs: Use mount ...
204

be20aa9db   Chris Mason   Btrfs: Add mount ...
205
206
207
208
209
210
211
  	/*
  	 * strsep changes the string, duplicate it because parse_options
  	 * gets called twice
  	 */
  	options = kstrdup(options, GFP_NOFS);
  	if (!options)
  		return -ENOMEM;
da495ecc0   Josef Bacik   Btrfs: kfree corr...
212
  	orig = options;
be20aa9db   Chris Mason   Btrfs: Add mount ...
213

edf24abe5   Christoph Hellwig   btrfs: sanity mou...
214
  	while ((p = strsep(&options, ",")) != NULL) {
95e052891   Chris Mason   Btrfs: Use mount ...
215
216
217
218
219
220
  		int token;
  		if (!*p)
  			continue;
  
  		token = match_token(p, tokens, args);
  		switch (token) {
dfe250206   Chris Mason   Btrfs: Add mount ...
221
  		case Opt_degraded:
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
222
223
224
  			printk(KERN_INFO "btrfs: allowing degraded mounts
  ");
  			btrfs_set_opt(info->mount_opt, DEGRADED);
dfe250206   Chris Mason   Btrfs: Add mount ...
225
  			break;
95e052891   Chris Mason   Btrfs: Use mount ...
226
  		case Opt_subvol:
73f73415c   Josef Bacik   Btrfs: change how...
227
  		case Opt_subvolid:
43e570b08   Christoph Hellwig   btrfs: allow scan...
228
  		case Opt_device:
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
229
  			/*
43e570b08   Christoph Hellwig   btrfs: allow scan...
230
  			 * These are parsed by btrfs_parse_early_options
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
231
232
  			 * and can be happily ignored here.
  			 */
b6cda9bcb   Chris Mason   Btrfs: Add mount ...
233
234
  			break;
  		case Opt_nodatasum:
067c28adc   Chris Mason   Btrfs: fix -o nod...
235
236
  			printk(KERN_INFO "btrfs: setting nodatasum
  ");
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
237
  			btrfs_set_opt(info->mount_opt, NODATASUM);
be20aa9db   Chris Mason   Btrfs: Add mount ...
238
239
  			break;
  		case Opt_nodatacow:
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
240
241
242
243
  			printk(KERN_INFO "btrfs: setting nodatacow
  ");
  			btrfs_set_opt(info->mount_opt, NODATACOW);
  			btrfs_set_opt(info->mount_opt, NODATASUM);
95e052891   Chris Mason   Btrfs: Use mount ...
244
  			break;
a555f810a   Chris Mason   Btrfs: Add mount ...
245
  		case Opt_compress_force:
261507a02   Li Zefan   btrfs: Allow to a...
246
247
248
249
250
251
252
253
254
  		case Opt_compress_force_type:
  			compress_force = true;
  		case Opt_compress:
  		case Opt_compress_type:
  			if (token == Opt_compress ||
  			    token == Opt_compress_force ||
  			    strcmp(args[0].from, "zlib") == 0) {
  				compress_type = "zlib";
  				info->compress_type = BTRFS_COMPRESS_ZLIB;
a6fa6fae4   Li Zefan   btrfs: Add lzo co...
255
256
257
  			} else if (strcmp(args[0].from, "lzo") == 0) {
  				compress_type = "lzo";
  				info->compress_type = BTRFS_COMPRESS_LZO;
261507a02   Li Zefan   btrfs: Allow to a...
258
259
260
261
  			} else {
  				ret = -EINVAL;
  				goto out;
  			}
a555f810a   Chris Mason   Btrfs: Add mount ...
262
  			btrfs_set_opt(info->mount_opt, COMPRESS);
261507a02   Li Zefan   btrfs: Allow to a...
263
264
265
266
267
268
269
270
271
  			if (compress_force) {
  				btrfs_set_opt(info->mount_opt, FORCE_COMPRESS);
  				pr_info("btrfs: force %s compression
  ",
  					compress_type);
  			} else
  				pr_info("btrfs: use %s compression
  ",
  					compress_type);
a555f810a   Chris Mason   Btrfs: Add mount ...
272
  			break;
e18e4809b   Chris Mason   Btrfs: Add mount ...
273
  		case Opt_ssd:
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
274
275
276
  			printk(KERN_INFO "btrfs: use ssd allocation scheme
  ");
  			btrfs_set_opt(info->mount_opt, SSD);
e18e4809b   Chris Mason   Btrfs: Add mount ...
277
  			break;
451d7585a   Chris Mason   Btrfs: add mount ...
278
279
280
281
282
283
284
  		case Opt_ssd_spread:
  			printk(KERN_INFO "btrfs: use spread ssd "
  			       "allocation scheme
  ");
  			btrfs_set_opt(info->mount_opt, SSD);
  			btrfs_set_opt(info->mount_opt, SSD_SPREAD);
  			break;
3b30c22f6   Chris Mason   Btrfs: Add mount ...
285
  		case Opt_nossd:
451d7585a   Chris Mason   Btrfs: add mount ...
286
287
288
  			printk(KERN_INFO "btrfs: not using ssd allocation "
  			       "scheme
  ");
c289811cc   Chris Mason   Btrfs: autodetect...
289
  			btrfs_set_opt(info->mount_opt, NOSSD);
3b30c22f6   Chris Mason   Btrfs: Add mount ...
290
  			btrfs_clear_opt(info->mount_opt, SSD);
451d7585a   Chris Mason   Btrfs: add mount ...
291
  			btrfs_clear_opt(info->mount_opt, SSD_SPREAD);
3b30c22f6   Chris Mason   Btrfs: Add mount ...
292
  			break;
21ad10cf3   Chris Mason   Btrfs: Add flush ...
293
  		case Opt_nobarrier:
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
294
295
296
  			printk(KERN_INFO "btrfs: turning off barriers
  ");
  			btrfs_set_opt(info->mount_opt, NOBARRIER);
21ad10cf3   Chris Mason   Btrfs: Add flush ...
297
  			break;
4543df7ec   Chris Mason   Btrfs: Add a moun...
298
299
300
301
302
303
304
305
306
307
  		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
  ",
  				       info->thread_pool_size);
  			}
  			break;
6f568d35a   Chris Mason   Btrfs: mount -o m...
308
  		case Opt_max_inline:
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
309
310
  			num = match_strdup(&args[0]);
  			if (num) {
91748467a   Akinobu Mita   btrfs: use memparse
311
  				info->max_inline = memparse(num, NULL);
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
312
  				kfree(num);
15ada040d   Chris Mason   Btrfs: Fix mount ...
313
314
315
316
317
  				if (info->max_inline) {
  					info->max_inline = max_t(u64,
  						info->max_inline,
  						root->sectorsize);
  				}
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
318
319
  				printk(KERN_INFO "btrfs: max_inline at %llu
  ",
21380931e   Joel Becker   Btrfs: Fix a bunc...
320
  					(unsigned long long)info->max_inline);
6f568d35a   Chris Mason   Btrfs: mount -o m...
321
322
  			}
  			break;
8f662a76c   Chris Mason   Btrfs: Add readah...
323
  		case Opt_alloc_start:
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
324
325
  			num = match_strdup(&args[0]);
  			if (num) {
91748467a   Akinobu Mita   btrfs: use memparse
326
  				info->alloc_start = memparse(num, NULL);
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
327
328
329
330
  				kfree(num);
  				printk(KERN_INFO
  					"btrfs: allocations start at %llu
  ",
21380931e   Joel Becker   Btrfs: Fix a bunc...
331
  					(unsigned long long)info->alloc_start);
8f662a76c   Chris Mason   Btrfs: Add readah...
332
333
  			}
  			break;
33268eaf0   Josef Bacik   Btrfs: Add ACL su...
334
335
336
  		case Opt_noacl:
  			root->fs_info->sb->s_flags &= ~MS_POSIXACL;
  			break;
3a5e14048   Sage Weil   Btrfs: notreelog ...
337
338
339
340
341
  		case Opt_notreelog:
  			printk(KERN_INFO "btrfs: disabling tree log
  ");
  			btrfs_set_opt(info->mount_opt, NOTREELOG);
  			break;
dccae9999   Sage Weil   Btrfs: add flusho...
342
343
344
345
346
  		case Opt_flushoncommit:
  			printk(KERN_INFO "btrfs: turning on flush-on-commit
  ");
  			btrfs_set_opt(info->mount_opt, FLUSHONCOMMIT);
  			break;
97e728d43   Josef Bacik   Btrfs: try to kee...
347
348
349
350
351
352
353
354
355
356
  		case Opt_ratio:
  			intarg = 0;
  			match_int(&args[0], &intarg);
  			if (intarg) {
  				info->metadata_ratio = intarg;
  				printk(KERN_INFO "btrfs: metadata ratio %d
  ",
  				       info->metadata_ratio);
  			}
  			break;
e244a0aeb   Christoph Hellwig   Btrfs: add -o dis...
357
358
359
  		case Opt_discard:
  			btrfs_set_opt(info->mount_opt, DISCARD);
  			break;
0af3d00ba   Josef Bacik   Btrfs: create spe...
360
361
362
363
  		case Opt_space_cache:
  			printk(KERN_INFO "btrfs: enabling disk space caching
  ");
  			btrfs_set_opt(info->mount_opt, SPACE_CACHE);
0de90876c   Josef Bacik   Btrfs: handle the...
364
  			break;
88c2ba3b0   Josef Bacik   Btrfs: Add a clea...
365
366
367
368
  		case Opt_clear_cache:
  			printk(KERN_INFO "btrfs: force clearing of disk cache
  ");
  			btrfs_set_opt(info->mount_opt, CLEAR_CACHE);
0af3d00ba   Josef Bacik   Btrfs: create spe...
369
  			break;
4260f7c75   Sage Weil   Btrfs: allow subv...
370
371
372
  		case Opt_user_subvol_rm_allowed:
  			btrfs_set_opt(info->mount_opt, USER_SUBVOL_RM_ALLOWED);
  			break;
a7a3f7cad   Sage Weil   Btrfs: fail mount...
373
374
375
376
377
378
  		case Opt_err:
  			printk(KERN_INFO "btrfs: unrecognized mount option "
  			       "'%s'
  ", p);
  			ret = -EINVAL;
  			goto out;
95e052891   Chris Mason   Btrfs: Use mount ...
379
  		default:
be20aa9db   Chris Mason   Btrfs: Add mount ...
380
  			break;
95e052891   Chris Mason   Btrfs: Use mount ...
381
382
  		}
  	}
a7a3f7cad   Sage Weil   Btrfs: fail mount...
383
  out:
da495ecc0   Josef Bacik   Btrfs: kfree corr...
384
  	kfree(orig);
a7a3f7cad   Sage Weil   Btrfs: fail mount...
385
  	return ret;
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
386
387
388
389
390
391
392
393
  }
  
  /*
   * 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.
   */
97288f2c7   Christoph Hellwig   Btrfs: corret fmo...
394
  static int btrfs_parse_early_options(const char *options, fmode_t flags,
73f73415c   Josef Bacik   Btrfs: change how...
395
  		void *holder, char **subvol_name, u64 *subvol_objectid,
43e570b08   Christoph Hellwig   btrfs: allow scan...
396
  		struct btrfs_fs_devices **fs_devices)
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
397
398
399
400
  {
  	substring_t args[MAX_OPT_ARGS];
  	char *opts, *p;
  	int error = 0;
73f73415c   Josef Bacik   Btrfs: change how...
401
  	int intarg;
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
  
  	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;
73f73415c   Josef Bacik   Btrfs: change how...
424
425
  		case Opt_subvolid:
  			intarg = 0;
4849f01d1   Josef Bacik   Btrfs: make subvo...
426
427
428
429
430
431
432
433
434
  			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;
  			}
73f73415c   Josef Bacik   Btrfs: change how...
435
  			break;
43e570b08   Christoph Hellwig   btrfs: allow scan...
436
437
438
439
440
441
  		case Opt_device:
  			error = btrfs_scan_one_device(match_strdup(&args[0]),
  					flags, holder, fs_devices);
  			if (error)
  				goto out_free_opts;
  			break;
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
442
443
444
445
  		default:
  			break;
  		}
  	}
43e570b08   Christoph Hellwig   btrfs: allow scan...
446
   out_free_opts:
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
447
448
449
450
  	kfree(opts);
   out:
  	/*
  	 * If no subvolume name is specified we use the default one.  Allocate
3de4586c5   Chris Mason   Btrfs: Allow subv...
451
  	 * a copy of the string "." here so that code later in the
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
452
453
454
  	 * mount path doesn't care if it's the default volume or another one.
  	 */
  	if (!*subvol_name) {
3de4586c5   Chris Mason   Btrfs: Allow subv...
455
  		*subvol_name = kstrdup(".", GFP_KERNEL);
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
456
457
458
459
  		if (!*subvol_name)
  			return -ENOMEM;
  	}
  	return error;
95e052891   Chris Mason   Btrfs: Use mount ...
460
  }
73f73415c   Josef Bacik   Btrfs: change how...
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
  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);
fb4f6f910   Dan Carpenter   Btrfs: handle err...
497
498
  	if (IS_ERR(di))
  		return ERR_CAST(di);
73f73415c   Josef Bacik   Btrfs: change how...
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
  	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))
d0b678cb0   Julia Lawall   Btrfs: Use ERR_CA...
517
  		return ERR_CAST(new_root);
73f73415c   Josef Bacik   Btrfs: change how...
518
519
520
521
522
523
524
525
526
527
528
  
  	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);
4cbd1149f   Dan Carpenter   Btrfs: btrfs_iget...
529
530
  	if (IS_ERR(inode))
  		return ERR_CAST(inode);
73f73415c   Josef Bacik   Btrfs: change how...
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
  
  	/*
  	 * 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;
  }
d397712bc   Chris Mason   Btrfs: Fix checkp...
566
  static int btrfs_fill_super(struct super_block *sb,
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
567
  			    struct btrfs_fs_devices *fs_devices,
d397712bc   Chris Mason   Btrfs: Fix checkp...
568
  			    void *data, int silent)
75dfe3960   Chris Mason   btrfs_file_write ...
569
  {
d397712bc   Chris Mason   Btrfs: Fix checkp...
570
571
  	struct inode *inode;
  	struct dentry *root_dentry;
39279cc3d   Chris Mason   Btrfs: split up s...
572
  	struct btrfs_root *tree_root;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
573
  	struct btrfs_key key;
39279cc3d   Chris Mason   Btrfs: split up s...
574
  	int err;
a429e5137   Chris Mason   Btrfs: working fi...
575

39279cc3d   Chris Mason   Btrfs: split up s...
576
577
578
  	sb->s_maxbytes = MAX_LFS_FILESIZE;
  	sb->s_magic = BTRFS_SUPER_MAGIC;
  	sb->s_op = &btrfs_super_ops;
af53d29ac   Al Viro   switch btrfs, clo...
579
  	sb->s_d_op = &btrfs_dentry_operations;
be6e8dc0b   Balaji Rao   NFS support for b...
580
  	sb->s_export_op = &btrfs_export_ops;
5103e947b   Josef Bacik   xattr support for...
581
  	sb->s_xattr = btrfs_xattr_handlers;
39279cc3d   Chris Mason   Btrfs: split up s...
582
  	sb->s_time_gran = 1;
0eda294df   Chris Mason   Btrfs: fix btrfs ...
583
  #ifdef CONFIG_BTRFS_FS_POSIX_ACL
33268eaf0   Josef Bacik   Btrfs: Add ACL su...
584
  	sb->s_flags |= MS_POSIXACL;
49cf6f452   Chris Ball   Btrfs: Fix settin...
585
  #endif
a429e5137   Chris Mason   Btrfs: working fi...
586

dfe250206   Chris Mason   Btrfs: Add mount ...
587
  	tree_root = open_ctree(sb, fs_devices, (char *)data);
6567e837d   Chris Mason   Btrfs: early work...
588

e58ca0203   Yan   Fix btrfs_fill_su...
589
  	if (IS_ERR(tree_root)) {
39279cc3d   Chris Mason   Btrfs: split up s...
590
591
  		printk("btrfs: open_ctree failed
  ");
e58ca0203   Yan   Fix btrfs_fill_su...
592
  		return PTR_ERR(tree_root);
a429e5137   Chris Mason   Btrfs: working fi...
593
  	}
39279cc3d   Chris Mason   Btrfs: split up s...
594
  	sb->s_fs_info = tree_root;
a429e5137   Chris Mason   Btrfs: working fi...
595

5d4f98a28   Yan Zheng   Btrfs: Mixed back...
596
597
598
  	key.objectid = BTRFS_FIRST_FREE_OBJECTID;
  	key.type = BTRFS_INODE_ITEM_KEY;
  	key.offset = 0;
73f73415c   Josef Bacik   Btrfs: change how...
599
  	inode = btrfs_iget(sb, &key, tree_root->fs_info->fs_root, NULL);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
600
601
  	if (IS_ERR(inode)) {
  		err = PTR_ERR(inode);
39279cc3d   Chris Mason   Btrfs: split up s...
602
  		goto fail_close;
f254e52c1   Chris Mason   Btrfs: verify csu...
603
  	}
f254e52c1   Chris Mason   Btrfs: verify csu...
604

39279cc3d   Chris Mason   Btrfs: split up s...
605
606
607
608
609
  	root_dentry = d_alloc_root(inode);
  	if (!root_dentry) {
  		iput(inode);
  		err = -ENOMEM;
  		goto fail_close;
f254e52c1   Chris Mason   Btrfs: verify csu...
610
  	}
58176a960   Josef Bacik   Btrfs: Add per-ro...
611

39279cc3d   Chris Mason   Btrfs: split up s...
612
  	sb->s_root = root_dentry;
6885f308b   Chris Mason   Btrfs: Misc 2.6.2...
613

6885f308b   Chris Mason   Btrfs: Misc 2.6.2...
614
  	save_mount_options(sb, data);
2619ba1f0   Chris Mason   Btrfs: subvolumes
615
  	return 0;
39279cc3d   Chris Mason   Btrfs: split up s...
616
617
618
619
  
  fail_close:
  	close_ctree(tree_root);
  	return err;
2619ba1f0   Chris Mason   Btrfs: subvolumes
620
  }
6bf13c0cc   Sage Weil   Btrfs: transactio...
621
  int btrfs_sync_fs(struct super_block *sb, int wait)
c5739bba5   Chris Mason   Btrfs: snapshot p...
622
623
  {
  	struct btrfs_trans_handle *trans;
dccae9999   Sage Weil   Btrfs: add flusho...
624
  	struct btrfs_root *root = btrfs_sb(sb);
c5739bba5   Chris Mason   Btrfs: snapshot p...
625
  	int ret;
2619ba1f0   Chris Mason   Btrfs: subvolumes
626

39279cc3d   Chris Mason   Btrfs: split up s...
627
628
629
630
  	if (!wait) {
  		filemap_flush(root->fs_info->btree_inode->i_mapping);
  		return 0;
  	}
771ed689d   Chris Mason   Btrfs: Optimize c...
631

24bbcf044   Yan, Zheng   Btrfs: Add delaye...
632
633
  	btrfs_start_delalloc_inodes(root, 0);
  	btrfs_wait_ordered_extents(root, 0, 0);
771ed689d   Chris Mason   Btrfs: Optimize c...
634

a22285a6a   Yan, Zheng   Btrfs: Integrate ...
635
  	trans = btrfs_start_transaction(root, 0);
c5739bba5   Chris Mason   Btrfs: snapshot p...
636
  	ret = btrfs_commit_transaction(trans, root);
54aa1f4df   Chris Mason   Btrfs: Audit call...
637
  	return ret;
2c90e5d65   Chris Mason   Btrfs: still corr...
638
  }
a9572a15a   Eric Paris   Btrfs: introduce ...
639
640
641
642
643
644
645
646
647
648
649
650
651
  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");
a9572a15a   Eric Paris   Btrfs: introduce ...
652
  	if (info->max_inline != 8192 * 1024)
21380931e   Joel Becker   Btrfs: Fix a bunc...
653
654
  		seq_printf(seq, ",max_inline=%llu",
  			   (unsigned long long)info->max_inline);
a9572a15a   Eric Paris   Btrfs: introduce ...
655
  	if (info->alloc_start != 0)
21380931e   Joel Becker   Btrfs: Fix a bunc...
656
657
  		seq_printf(seq, ",alloc_start=%llu",
  			   (unsigned long long)info->alloc_start);
a9572a15a   Eric Paris   Btrfs: introduce ...
658
659
660
661
662
  	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");
c289811cc   Chris Mason   Btrfs: autodetect...
663
664
  	if (btrfs_test_opt(root, NOSSD))
  		seq_puts(seq, ",nossd");
451d7585a   Chris Mason   Btrfs: add mount ...
665
666
667
  	if (btrfs_test_opt(root, SSD_SPREAD))
  		seq_puts(seq, ",ssd_spread");
  	else if (btrfs_test_opt(root, SSD))
a9572a15a   Eric Paris   Btrfs: introduce ...
668
  		seq_puts(seq, ",ssd");
3a5e14048   Sage Weil   Btrfs: notreelog ...
669
  	if (btrfs_test_opt(root, NOTREELOG))
6b65c5c61   Sage Weil   Btrfs: make show_...
670
  		seq_puts(seq, ",notreelog");
dccae9999   Sage Weil   Btrfs: add flusho...
671
  	if (btrfs_test_opt(root, FLUSHONCOMMIT))
6b65c5c61   Sage Weil   Btrfs: make show_...
672
  		seq_puts(seq, ",flushoncommit");
20a5239a5   Matthew Wilcox   Btrfs: Show disca...
673
674
  	if (btrfs_test_opt(root, DISCARD))
  		seq_puts(seq, ",discard");
a9572a15a   Eric Paris   Btrfs: introduce ...
675
676
677
678
  	if (!(root->fs_info->sb->s_flags & MS_POSIXACL))
  		seq_puts(seq, ",noacl");
  	return 0;
  }
a061fc8da   Chris Mason   Btrfs: Add suppor...
679
  static int btrfs_test_super(struct super_block *s, void *data)
4b82d6e4a   Yan   Btrfs: Add mount ...
680
  {
450ba0ea0   Josef Bacik   Btrfs: setup blan...
681
  	struct btrfs_root *test_root = data;
a061fc8da   Chris Mason   Btrfs: Add suppor...
682
  	struct btrfs_root *root = btrfs_sb(s);
4b82d6e4a   Yan   Btrfs: Add mount ...
683

619c8c763   Ian Kent   Btrfs - fix race ...
684
685
686
687
688
689
  	/*
  	 * If this super block is going away, return false as it
  	 * can't match as an existing super block.
  	 */
  	if (!atomic_read(&s->s_active))
  		return 0;
450ba0ea0   Josef Bacik   Btrfs: setup blan...
690
  	return root->fs_info->fs_devices == test_root->fs_info->fs_devices;
4b82d6e4a   Yan   Btrfs: Add mount ...
691
  }
450ba0ea0   Josef Bacik   Btrfs: setup blan...
692
693
694
695
696
  static int btrfs_set_super(struct super_block *s, void *data)
  {
  	s->s_fs_info = data;
  
  	return set_anon_super(s, data);
4b82d6e4a   Yan   Btrfs: Add mount ...
697
  }
450ba0ea0   Josef Bacik   Btrfs: setup blan...
698

edf24abe5   Christoph Hellwig   btrfs: sanity mou...
699
700
701
702
703
704
  /*
   * 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.
   */
061dbc6b9   Al Viro   convert btrfs
705
706
  static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
  		const char *dev_name, void *data)
4b82d6e4a   Yan   Btrfs: Add mount ...
707
708
709
710
  {
  	struct block_device *bdev = NULL;
  	struct super_block *s;
  	struct dentry *root;
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
711
  	struct btrfs_fs_devices *fs_devices = NULL;
450ba0ea0   Josef Bacik   Btrfs: setup blan...
712
713
  	struct btrfs_root *tree_root = NULL;
  	struct btrfs_fs_info *fs_info = NULL;
97288f2c7   Christoph Hellwig   Btrfs: corret fmo...
714
  	fmode_t mode = FMODE_READ;
73f73415c   Josef Bacik   Btrfs: change how...
715
716
  	char *subvol_name = NULL;
  	u64 subvol_objectid = 0;
4b82d6e4a   Yan   Btrfs: Add mount ...
717
  	int error = 0;
97288f2c7   Christoph Hellwig   Btrfs: corret fmo...
718
719
720
721
  	if (!(flags & MS_RDONLY))
  		mode |= FMODE_WRITE;
  
  	error = btrfs_parse_early_options(data, mode, fs_type,
73f73415c   Josef Bacik   Btrfs: change how...
722
723
  					  &subvol_name, &subvol_objectid,
  					  &fs_devices);
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
724
  	if (error)
061dbc6b9   Al Viro   convert btrfs
725
  		return ERR_PTR(error);
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
726

97288f2c7   Christoph Hellwig   Btrfs: corret fmo...
727
  	error = btrfs_scan_one_device(dev_name, mode, fs_type, &fs_devices);
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
728
  	if (error)
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
729
  		goto error_free_subvol_name;
4b82d6e4a   Yan   Btrfs: Add mount ...
730

97288f2c7   Christoph Hellwig   Btrfs: corret fmo...
731
  	error = btrfs_open_devices(fs_devices, mode, fs_type);
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
732
  	if (error)
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
733
  		goto error_free_subvol_name;
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
734

2b82032c3   Yan Zheng   Btrfs: Seed devic...
735
736
737
738
  	if (!(flags & MS_RDONLY) && fs_devices->rw_devices == 0) {
  		error = -EACCES;
  		goto error_close_devices;
  	}
450ba0ea0   Josef Bacik   Btrfs: setup blan...
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
  	/*
  	 * Setup a dummy root and fs_info for test/set super.  This is because
  	 * we don't actually fill this stuff out until open_ctree, but we need
  	 * it for searching for existing supers, so this lets us do that and
  	 * then open_ctree will properly initialize everything later.
  	 */
  	fs_info = kzalloc(sizeof(struct btrfs_fs_info), GFP_NOFS);
  	tree_root = kzalloc(sizeof(struct btrfs_root), GFP_NOFS);
  	if (!fs_info || !tree_root) {
  		error = -ENOMEM;
  		goto error_close_devices;
  	}
  	fs_info->tree_root = tree_root;
  	fs_info->fs_devices = fs_devices;
  	tree_root->fs_info = fs_info;
dfe250206   Chris Mason   Btrfs: Add mount ...
754
  	bdev = fs_devices->latest_bdev;
450ba0ea0   Josef Bacik   Btrfs: setup blan...
755
  	s = sget(fs_type, btrfs_test_super, btrfs_set_super, tree_root);
4b82d6e4a   Yan   Btrfs: Add mount ...
756
757
758
759
760
  	if (IS_ERR(s))
  		goto error_s;
  
  	if (s->s_root) {
  		if ((flags ^ s->s_flags) & MS_RDONLY) {
6f5bbff9a   Al Viro   Convert obvious p...
761
  			deactivate_locked_super(s);
4b82d6e4a   Yan   Btrfs: Add mount ...
762
  			error = -EBUSY;
c146afad2   Yan Zheng   Btrfs: mount ro a...
763
  			goto error_close_devices;
4b82d6e4a   Yan   Btrfs: Add mount ...
764
  		}
2b82032c3   Yan Zheng   Btrfs: Seed devic...
765
  		btrfs_close_devices(fs_devices);
4b82d6e4a   Yan   Btrfs: Add mount ...
766
767
768
769
770
  	} else {
  		char b[BDEVNAME_SIZE];
  
  		s->s_flags = flags;
  		strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
771
772
  		error = btrfs_fill_super(s, fs_devices, data,
  					 flags & MS_SILENT ? 1 : 0);
4b82d6e4a   Yan   Btrfs: Add mount ...
773
  		if (error) {
6f5bbff9a   Al Viro   Convert obvious p...
774
  			deactivate_locked_super(s);
1f4836608   Shen Feng   Btrfs: fix a memo...
775
  			goto error_free_subvol_name;
4b82d6e4a   Yan   Btrfs: Add mount ...
776
  		}
788f20eb5   Chris Mason   Btrfs: Add new io...
777
  		btrfs_sb(s)->fs_info->bdev_holder = fs_type;
4b82d6e4a   Yan   Btrfs: Add mount ...
778
779
  		s->s_flags |= MS_ACTIVE;
  	}
73f73415c   Josef Bacik   Btrfs: change how...
780
781
782
783
  	root = get_default_root(s, subvol_objectid);
  	if (IS_ERR(root)) {
  		error = PTR_ERR(root);
  		deactivate_locked_super(s);
0e78340f3   Josef Bacik   Btrfs: fix error ...
784
  		goto error_free_subvol_name;
73f73415c   Josef Bacik   Btrfs: change how...
785
786
787
788
789
790
  	}
  	/* 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,
d397712bc   Chris Mason   Btrfs: Fix checkp...
791
  				      strlen(subvol_name));
73f73415c   Josef Bacik   Btrfs: change how...
792
  		mutex_unlock(&root->d_inode->i_mutex);
d397712bc   Chris Mason   Btrfs: Fix checkp...
793

73f73415c   Josef Bacik   Btrfs: change how...
794
  		if (IS_ERR(new_root)) {
f106e82ca   Li Zefan   Btrfs: Fix a cras...
795
  			dput(root);
6f5bbff9a   Al Viro   Convert obvious p...
796
  			deactivate_locked_super(s);
73f73415c   Josef Bacik   Btrfs: change how...
797
  			error = PTR_ERR(new_root);
0e78340f3   Josef Bacik   Btrfs: fix error ...
798
  			goto error_free_subvol_name;
76fcef19c   David Woodhouse   Btrfs: Reinstate ...
799
  		}
73f73415c   Josef Bacik   Btrfs: change how...
800
  		if (!new_root->d_inode) {
76fcef19c   David Woodhouse   Btrfs: Reinstate ...
801
  			dput(root);
73f73415c   Josef Bacik   Btrfs: change how...
802
  			dput(new_root);
6f5bbff9a   Al Viro   Convert obvious p...
803
  			deactivate_locked_super(s);
76fcef19c   David Woodhouse   Btrfs: Reinstate ...
804
  			error = -ENXIO;
0e78340f3   Josef Bacik   Btrfs: fix error ...
805
  			goto error_free_subvol_name;
76fcef19c   David Woodhouse   Btrfs: Reinstate ...
806
  		}
73f73415c   Josef Bacik   Btrfs: change how...
807
808
  		dput(root);
  		root = new_root;
4b82d6e4a   Yan   Btrfs: Add mount ...
809
  	}
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
810
  	kfree(subvol_name);
061dbc6b9   Al Viro   convert btrfs
811
  	return root;
4b82d6e4a   Yan   Btrfs: Add mount ...
812
813
814
  
  error_s:
  	error = PTR_ERR(s);
c146afad2   Yan Zheng   Btrfs: mount ro a...
815
  error_close_devices:
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
816
  	btrfs_close_devices(fs_devices);
450ba0ea0   Josef Bacik   Btrfs: setup blan...
817
818
  	kfree(fs_info);
  	kfree(tree_root);
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
819
820
  error_free_subvol_name:
  	kfree(subvol_name);
061dbc6b9   Al Viro   convert btrfs
821
  	return ERR_PTR(error);
4b82d6e4a   Yan   Btrfs: Add mount ...
822
  }
2e635a278   Chris Mason   Btrfs: initial mo...
823

c146afad2   Yan Zheng   Btrfs: mount ro a...
824
825
826
827
  static int btrfs_remount(struct super_block *sb, int *flags, char *data)
  {
  	struct btrfs_root *root = btrfs_sb(sb);
  	int ret;
b288052e1   Chris Mason   Btrfs: process mo...
828
829
830
  	ret = btrfs_parse_options(root, data);
  	if (ret)
  		return -EINVAL;
c146afad2   Yan Zheng   Btrfs: mount ro a...
831
832
833
834
835
836
837
838
839
  	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 {
2b82032c3   Yan Zheng   Btrfs: Seed devic...
840
841
  		if (root->fs_info->fs_devices->rw_devices == 0)
  			return -EACCES;
c146afad2   Yan Zheng   Btrfs: mount ro a...
842
843
  		if (btrfs_super_log_root(&root->fs_info->super_copy) != 0)
  			return -EINVAL;
d68fc57b7   Yan, Zheng   Btrfs: Metadata r...
844
  		ret = btrfs_cleanup_fs_roots(root->fs_info);
c146afad2   Yan Zheng   Btrfs: mount ro a...
845
  		WARN_ON(ret);
d68fc57b7   Yan, Zheng   Btrfs: Metadata r...
846
847
  		/* recover relocation */
  		ret = btrfs_recover_relocation(root);
c146afad2   Yan Zheng   Btrfs: mount ro a...
848
849
850
851
852
853
854
  		WARN_ON(ret);
  
  		sb->s_flags &= ~MS_RDONLY;
  	}
  
  	return 0;
  }
6d07bcec9   Miao Xie   btrfs: fix wrong ...
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
  /*
   * The helper to calc the free space on the devices that can be used to store
   * file data.
   */
  static int btrfs_calc_avail_data_space(struct btrfs_root *root, u64 *free_bytes)
  {
  	struct btrfs_fs_info *fs_info = root->fs_info;
  	struct btrfs_device_info *devices_info;
  	struct btrfs_fs_devices *fs_devices = fs_info->fs_devices;
  	struct btrfs_device *device;
  	u64 skip_space;
  	u64 type;
  	u64 avail_space;
  	u64 used_space;
  	u64 min_stripe_size;
  	int min_stripes = 1;
  	int i = 0, nr_devices;
  	int ret;
  
  	nr_devices = fs_info->fs_devices->rw_devices;
  	BUG_ON(!nr_devices);
  
  	devices_info = kmalloc(sizeof(*devices_info) * nr_devices,
  			       GFP_NOFS);
  	if (!devices_info)
  		return -ENOMEM;
  
  	/* calc min stripe number for data space alloction */
  	type = btrfs_get_alloc_profile(root, 1);
  	if (type & BTRFS_BLOCK_GROUP_RAID0)
  		min_stripes = 2;
  	else if (type & BTRFS_BLOCK_GROUP_RAID1)
  		min_stripes = 2;
  	else if (type & BTRFS_BLOCK_GROUP_RAID10)
  		min_stripes = 4;
  
  	if (type & BTRFS_BLOCK_GROUP_DUP)
  		min_stripe_size = 2 * BTRFS_STRIPE_LEN;
  	else
  		min_stripe_size = BTRFS_STRIPE_LEN;
  
  	list_for_each_entry(device, &fs_devices->alloc_list, dev_alloc_list) {
  		if (!device->in_fs_metadata)
  			continue;
  
  		avail_space = device->total_bytes - device->bytes_used;
  
  		/* align with stripe_len */
  		do_div(avail_space, BTRFS_STRIPE_LEN);
  		avail_space *= BTRFS_STRIPE_LEN;
  
  		/*
  		 * In order to avoid overwritting the superblock on the drive,
  		 * btrfs starts at an offset of at least 1MB when doing chunk
  		 * allocation.
  		 */
  		skip_space = 1024 * 1024;
  
  		/* user can set the offset in fs_info->alloc_start. */
  		if (fs_info->alloc_start + BTRFS_STRIPE_LEN <=
  		    device->total_bytes)
  			skip_space = max(fs_info->alloc_start, skip_space);
  
  		/*
  		 * btrfs can not use the free space in [0, skip_space - 1],
  		 * we must subtract it from the total. In order to implement
  		 * it, we account the used space in this range first.
  		 */
  		ret = btrfs_account_dev_extents_size(device, 0, skip_space - 1,
  						     &used_space);
  		if (ret) {
  			kfree(devices_info);
  			return ret;
  		}
  
  		/* calc the free space in [0, skip_space - 1] */
  		skip_space -= used_space;
  
  		/*
  		 * we can use the free space in [0, skip_space - 1], subtract
  		 * it from the total.
  		 */
  		if (avail_space && avail_space >= skip_space)
  			avail_space -= skip_space;
  		else
  			avail_space = 0;
  
  		if (avail_space < min_stripe_size)
  			continue;
  
  		devices_info[i].dev = device;
  		devices_info[i].max_avail = avail_space;
  
  		i++;
  	}
  
  	nr_devices = i;
  
  	btrfs_descending_sort_devices(devices_info, nr_devices);
  
  	i = nr_devices - 1;
  	avail_space = 0;
  	while (nr_devices >= min_stripes) {
  		if (devices_info[i].max_avail >= min_stripe_size) {
  			int j;
  			u64 alloc_size;
  
  			avail_space += devices_info[i].max_avail * min_stripes;
  			alloc_size = devices_info[i].max_avail;
  			for (j = i + 1 - min_stripes; j <= i; j++)
  				devices_info[j].max_avail -= alloc_size;
  		}
  		i--;
  		nr_devices--;
  	}
  
  	kfree(devices_info);
  	*free_bytes = avail_space;
  	return 0;
  }
8fd17795b   Chris Mason   Btrfs: early fsyn...
975
976
977
  static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf)
  {
  	struct btrfs_root *root = btrfs_sb(dentry->d_sb);
4b52dff6d   Chris Mason   Btrfs: Fix super ...
978
  	struct btrfs_super_block *disk_super = &root->fs_info->super_copy;
bd4d10888   Josef Bacik   Btrfs: make df be...
979
980
981
  	struct list_head *head = &root->fs_info->space_info;
  	struct btrfs_space_info *found;
  	u64 total_used = 0;
6d07bcec9   Miao Xie   btrfs: fix wrong ...
982
  	u64 total_free_data = 0;
db94535db   Chris Mason   Btrfs: Allow tree...
983
  	int bits = dentry->d_sb->s_blocksize_bits;
9d03632e2   David Woodhouse   Fill f_fsid field...
984
  	__be32 *fsid = (__be32 *)root->fs_info->fsid;
6d07bcec9   Miao Xie   btrfs: fix wrong ...
985
  	int ret;
8fd17795b   Chris Mason   Btrfs: early fsyn...
986

6d07bcec9   Miao Xie   btrfs: fix wrong ...
987
988
  	/* holding chunk_muext to avoid allocating new chunks */
  	mutex_lock(&root->fs_info->chunk_mutex);
bd4d10888   Josef Bacik   Btrfs: make df be...
989
  	rcu_read_lock();
89a55897a   Josef Bacik   Btrfs: fix df reg...
990
  	list_for_each_entry_rcu(found, head, list) {
6d07bcec9   Miao Xie   btrfs: fix wrong ...
991
992
993
994
995
  		if (found->flags & BTRFS_BLOCK_GROUP_DATA) {
  			total_free_data += found->disk_total - found->disk_used;
  			total_free_data -=
  				btrfs_account_ro_block_groups_free_space(found);
  		}
b742bb82f   Yan, Zheng   Btrfs: Link block...
996
  		total_used += found->disk_used;
89a55897a   Josef Bacik   Btrfs: fix df reg...
997
  	}
bd4d10888   Josef Bacik   Btrfs: make df be...
998
  	rcu_read_unlock();
8fd17795b   Chris Mason   Btrfs: early fsyn...
999
  	buf->f_namelen = BTRFS_NAME_LEN;
db94535db   Chris Mason   Btrfs: Allow tree...
1000
  	buf->f_blocks = btrfs_super_total_bytes(disk_super) >> bits;
bd4d10888   Josef Bacik   Btrfs: make df be...
1001
  	buf->f_bfree = buf->f_blocks - (total_used >> bits);
8fd17795b   Chris Mason   Btrfs: early fsyn...
1002
1003
  	buf->f_bsize = dentry->d_sb->s_blocksize;
  	buf->f_type = BTRFS_SUPER_MAGIC;
6d07bcec9   Miao Xie   btrfs: fix wrong ...
1004
1005
1006
1007
1008
1009
1010
1011
1012
  	buf->f_bavail = total_free_data;
  	ret = btrfs_calc_avail_data_space(root, &total_free_data);
  	if (ret) {
  		mutex_unlock(&root->fs_info->chunk_mutex);
  		return ret;
  	}
  	buf->f_bavail += total_free_data;
  	buf->f_bavail = buf->f_bavail >> bits;
  	mutex_unlock(&root->fs_info->chunk_mutex);
d397712bc   Chris Mason   Btrfs: Fix checkp...
1013

9d03632e2   David Woodhouse   Fill f_fsid field...
1014
  	/* We treat it as constant endianness (it doesn't matter _which_)
d397712bc   Chris Mason   Btrfs: Fix checkp...
1015
  	   because we want the fsid to come out the same whether mounted
9d03632e2   David Woodhouse   Fill f_fsid field...
1016
1017
1018
  	   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]);
32d48fa1a   David Woodhouse   Mask root object ...
1019
1020
1021
  	/* 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;
8fd17795b   Chris Mason   Btrfs: early fsyn...
1022
1023
  	return 0;
  }
b51338628   Chris Mason   Btrfs: add dirty_...
1024

2e635a278   Chris Mason   Btrfs: initial mo...
1025
1026
1027
  static struct file_system_type btrfs_fs_type = {
  	.owner		= THIS_MODULE,
  	.name		= "btrfs",
061dbc6b9   Al Viro   convert btrfs
1028
  	.mount		= btrfs_mount,
a061fc8da   Chris Mason   Btrfs: Add suppor...
1029
  	.kill_sb	= kill_anon_super,
2e635a278   Chris Mason   Btrfs: initial mo...
1030
1031
  	.fs_flags	= FS_REQUIRES_DEV,
  };
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1032

d352ac681   Chris Mason   Btrfs: add and im...
1033
1034
1035
  /*
   * used by btrfsctl to scan devices when no FS is mounted
   */
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
1036
1037
1038
1039
1040
  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;
c071fcfdb   Chris Mason   Btrfs: fix ioctl ...
1041
  	int ret = -ENOTTY;
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
1042

e441d54de   Chris Mason   Btrfs: add permis...
1043
1044
  	if (!capable(CAP_SYS_ADMIN))
  		return -EPERM;
dae7b665c   Li Zefan   btrfs: use memdup...
1045
1046
1047
  	vol = memdup_user((void __user *)arg, sizeof(*vol));
  	if (IS_ERR(vol))
  		return PTR_ERR(vol);
c071fcfdb   Chris Mason   Btrfs: fix ioctl ...
1048

8a4b83cc8   Chris Mason   Btrfs: Add suppor...
1049
1050
  	switch (cmd) {
  	case BTRFS_IOC_SCAN_DEV:
97288f2c7   Christoph Hellwig   Btrfs: corret fmo...
1051
  		ret = btrfs_scan_one_device(vol->name, FMODE_READ,
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
1052
1053
1054
  					    &btrfs_fs_type, &fs_devices);
  		break;
  	}
dae7b665c   Li Zefan   btrfs: use memdup...
1055

8a4b83cc8   Chris Mason   Btrfs: Add suppor...
1056
  	kfree(vol);
f819d837e   Linda Knippers   btrfsctl -A error...
1057
  	return ret;
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
1058
  }
0176260fc   Linus Torvalds   btrfs: fix for wr...
1059
  static int btrfs_freeze(struct super_block *sb)
ed0dab6b8   Yan   Btrfs: Add basic ...
1060
1061
  {
  	struct btrfs_root *root = btrfs_sb(sb);
a74a4b97b   Chris Mason   Btrfs: Replace th...
1062
1063
  	mutex_lock(&root->fs_info->transaction_kthread_mutex);
  	mutex_lock(&root->fs_info->cleaner_mutex);
0176260fc   Linus Torvalds   btrfs: fix for wr...
1064
  	return 0;
ed0dab6b8   Yan   Btrfs: Add basic ...
1065
  }
0176260fc   Linus Torvalds   btrfs: fix for wr...
1066
  static int btrfs_unfreeze(struct super_block *sb)
ed0dab6b8   Yan   Btrfs: Add basic ...
1067
1068
  {
  	struct btrfs_root *root = btrfs_sb(sb);
a74a4b97b   Chris Mason   Btrfs: Replace th...
1069
1070
  	mutex_unlock(&root->fs_info->cleaner_mutex);
  	mutex_unlock(&root->fs_info->transaction_kthread_mutex);
0176260fc   Linus Torvalds   btrfs: fix for wr...
1071
  	return 0;
ed0dab6b8   Yan   Btrfs: Add basic ...
1072
  }
2e635a278   Chris Mason   Btrfs: initial mo...
1073

b87221de6   Alexey Dobriyan   const: mark remai...
1074
  static const struct super_operations btrfs_super_ops = {
76dda93c6   Yan, Zheng   Btrfs: add snapsh...
1075
  	.drop_inode	= btrfs_drop_inode,
bd5559752   Al Viro   convert btrfs to ...
1076
  	.evict_inode	= btrfs_evict_inode,
e20d96d64   Chris Mason   Mountable btrfs, ...
1077
  	.put_super	= btrfs_put_super,
d57197629   Chris Mason   btrfs_create, btr...
1078
  	.sync_fs	= btrfs_sync_fs,
a9572a15a   Eric Paris   Btrfs: introduce ...
1079
  	.show_options	= btrfs_show_options,
4730a4bc5   Chris Mason   btrfs_dirty_inode
1080
  	.write_inode	= btrfs_write_inode,
b51338628   Chris Mason   Btrfs: add dirty_...
1081
  	.dirty_inode	= btrfs_dirty_inode,
2c90e5d65   Chris Mason   Btrfs: still corr...
1082
1083
  	.alloc_inode	= btrfs_alloc_inode,
  	.destroy_inode	= btrfs_destroy_inode,
8fd17795b   Chris Mason   Btrfs: early fsyn...
1084
  	.statfs		= btrfs_statfs,
c146afad2   Yan Zheng   Btrfs: mount ro a...
1085
  	.remount_fs	= btrfs_remount,
0176260fc   Linus Torvalds   btrfs: fix for wr...
1086
1087
  	.freeze_fs	= btrfs_freeze,
  	.unfreeze_fs	= btrfs_unfreeze,
e20d96d64   Chris Mason   Mountable btrfs, ...
1088
  };
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1089
1090
1091
1092
1093
  
  static const struct file_operations btrfs_ctl_fops = {
  	.unlocked_ioctl	 = btrfs_control_ioctl,
  	.compat_ioctl = btrfs_control_ioctl,
  	.owner	 = THIS_MODULE,
6038f373a   Arnd Bergmann   llseek: automatic...
1094
  	.llseek = noop_llseek,
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1095
1096
1097
  };
  
  static struct miscdevice btrfs_misc = {
578454ff7   Kay Sievers   driver core: add ...
1098
  	.minor		= BTRFS_MINOR,
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1099
1100
1101
  	.name		= "btrfs-control",
  	.fops		= &btrfs_ctl_fops
  };
578454ff7   Kay Sievers   driver core: add ...
1102
1103
  MODULE_ALIAS_MISCDEV(BTRFS_MINOR);
  MODULE_ALIAS("devname:btrfs-control");
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1104
1105
1106
1107
  static int btrfs_interface_init(void)
  {
  	return misc_register(&btrfs_misc);
  }
b2950863c   Christoph Hellwig   Btrfs: make thing...
1108
  static void btrfs_interface_exit(void)
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1109
1110
  {
  	if (misc_deregister(&btrfs_misc) < 0)
d397712bc   Chris Mason   Btrfs: Fix checkp...
1111
  		printk(KERN_INFO "misc_deregister failed for control device");
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1112
  }
2e635a278   Chris Mason   Btrfs: initial mo...
1113
1114
  static int __init init_btrfs_fs(void)
  {
2c90e5d65   Chris Mason   Btrfs: still corr...
1115
  	int err;
58176a960   Josef Bacik   Btrfs: Add per-ro...
1116
1117
1118
1119
  
  	err = btrfs_init_sysfs();
  	if (err)
  		return err;
261507a02   Li Zefan   btrfs: Allow to a...
1120
  	err = btrfs_init_compress();
2c90e5d65   Chris Mason   Btrfs: still corr...
1121
  	if (err)
a74a4b97b   Chris Mason   Btrfs: Replace th...
1122
  		goto free_sysfs;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1123

261507a02   Li Zefan   btrfs: Allow to a...
1124
1125
1126
  	err = btrfs_init_cachep();
  	if (err)
  		goto free_compress;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1127
  	err = extent_io_init();
2f4cbe644   Wyatt Banks   Btrfs: Return val...
1128
1129
  	if (err)
  		goto free_cachep;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1130
1131
1132
  	err = extent_map_init();
  	if (err)
  		goto free_extent_io;
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1133
  	err = btrfs_interface_init();
2f4cbe644   Wyatt Banks   Btrfs: Return val...
1134
1135
  	if (err)
  		goto free_extent_map;
c8b978188   Chris Mason   Btrfs: Add zlib c...
1136

a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1137
1138
1139
  	err = register_filesystem(&btrfs_fs_type);
  	if (err)
  		goto unregister_ioctl;
b3c3da71e   Chris Mason   Btrfs: Add versio...
1140
1141
1142
  
  	printk(KERN_INFO "%s loaded
  ", BTRFS_BUILD_VERSION);
2f4cbe644   Wyatt Banks   Btrfs: Return val...
1143
  	return 0;
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1144
1145
  unregister_ioctl:
  	btrfs_interface_exit();
2f4cbe644   Wyatt Banks   Btrfs: Return val...
1146
1147
  free_extent_map:
  	extent_map_exit();
d1310b2e0   Chris Mason   Btrfs: Split the ...
1148
1149
  free_extent_io:
  	extent_io_exit();
2f4cbe644   Wyatt Banks   Btrfs: Return val...
1150
1151
  free_cachep:
  	btrfs_destroy_cachep();
261507a02   Li Zefan   btrfs: Allow to a...
1152
1153
  free_compress:
  	btrfs_exit_compress();
a74a4b97b   Chris Mason   Btrfs: Replace th...
1154
  free_sysfs:
2f4cbe644   Wyatt Banks   Btrfs: Return val...
1155
1156
  	btrfs_exit_sysfs();
  	return err;
2e635a278   Chris Mason   Btrfs: initial mo...
1157
1158
1159
1160
  }
  
  static void __exit exit_btrfs_fs(void)
  {
39279cc3d   Chris Mason   Btrfs: split up s...
1161
  	btrfs_destroy_cachep();
a52d9a803   Chris Mason   Btrfs: Extent bas...
1162
  	extent_map_exit();
d1310b2e0   Chris Mason   Btrfs: Split the ...
1163
  	extent_io_exit();
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1164
  	btrfs_interface_exit();
2e635a278   Chris Mason   Btrfs: initial mo...
1165
  	unregister_filesystem(&btrfs_fs_type);
58176a960   Josef Bacik   Btrfs: Add per-ro...
1166
  	btrfs_exit_sysfs();
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
1167
  	btrfs_cleanup_fs_uuids();
261507a02   Li Zefan   btrfs: Allow to a...
1168
  	btrfs_exit_compress();
2e635a278   Chris Mason   Btrfs: initial mo...
1169
1170
1171
1172
1173
1174
  }
  
  module_init(init_btrfs_fs)
  module_exit(exit_btrfs_fs)
  
  MODULE_LICENSE("GPL");