Blame view

fs/btrfs/super.c 34.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>
90a887c9a   Dan Magenheimer   btrfs: add cleanc...
41
  #include <linux/cleancache.h>
22c44fe65   Josef Bacik   Btrfs: deal with ...
42
  #include <linux/ratelimit.h>
4b4e25f2a   Chris Mason   Btrfs: compat cod...
43
  #include "compat.h"
16cdcec73   Miao Xie   btrfs: implement ...
44
  #include "delayed-inode.h"
2e635a278   Chris Mason   Btrfs: initial mo...
45
  #include "ctree.h"
e20d96d64   Chris Mason   Mountable btrfs, ...
46
  #include "disk-io.h"
d57197629   Chris Mason   btrfs_create, btr...
47
  #include "transaction.h"
2c90e5d65   Chris Mason   Btrfs: still corr...
48
  #include "btrfs_inode.h"
c5739bba5   Chris Mason   Btrfs: snapshot p...
49
  #include "ioctl.h"
3a6863756   Chris Mason   Btrfs: sparse files!
50
  #include "print-tree.h"
5103e947b   Josef Bacik   xattr support for...
51
  #include "xattr.h"
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
52
  #include "volumes.h"
b3c3da71e   Chris Mason   Btrfs: Add versio...
53
  #include "version.h"
be6e8dc0b   Balaji Rao   NFS support for b...
54
  #include "export.h"
c8b978188   Chris Mason   Btrfs: Add zlib c...
55
  #include "compression.h"
2e635a278   Chris Mason   Btrfs: initial mo...
56

1abe9b8a1   liubo   Btrfs: add initia...
57
58
  #define CREATE_TRACE_POINTS
  #include <trace/events/btrfs.h>
b87221de6   Alexey Dobriyan   const: mark remai...
59
  static const struct super_operations btrfs_super_ops;
830c4adbd   Josef Bacik   Btrfs: fix how we...
60
  static struct file_system_type btrfs_fs_type;
75dfe3960   Chris Mason   btrfs_file_write ...
61

acce952b0   liubo   Btrfs: forced rea...
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
141
142
143
144
145
146
  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...
147
  static void btrfs_put_super(struct super_block *sb)
b18c66858   Chris Mason   Btrfs: progress o...
148
  {
39279cc3d   Chris Mason   Btrfs: split up s...
149
  	struct btrfs_root *root = btrfs_sb(sb);
b18c66858   Chris Mason   Btrfs: progress o...
150
  	int ret;
b18c66858   Chris Mason   Btrfs: progress o...
151

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

6c41761fc   David Sterba   btrfs: separate s...
217
  	cache_gen = btrfs_super_cache_generation(root->fs_info->super_copy);
73bc18768   Josef Bacik   Btrfs: introduce ...
218
219
  	if (cache_gen)
  		btrfs_set_opt(info->mount_opt, SPACE_CACHE);
95e052891   Chris Mason   Btrfs: Use mount ...
220
  	if (!options)
73bc18768   Josef Bacik   Btrfs: introduce ...
221
  		goto out;
95e052891   Chris Mason   Btrfs: Use mount ...
222

be20aa9db   Chris Mason   Btrfs: Add mount ...
223
224
225
226
227
228
229
  	/*
  	 * 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...
230
  	orig = options;
be20aa9db   Chris Mason   Btrfs: Add mount ...
231

edf24abe5   Christoph Hellwig   btrfs: sanity mou...
232
  	while ((p = strsep(&options, ",")) != NULL) {
95e052891   Chris Mason   Btrfs: Use mount ...
233
234
235
236
237
238
  		int token;
  		if (!*p)
  			continue;
  
  		token = match_token(p, tokens, args);
  		switch (token) {
dfe250206   Chris Mason   Btrfs: Add mount ...
239
  		case Opt_degraded:
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
240
241
242
  			printk(KERN_INFO "btrfs: allowing degraded mounts
  ");
  			btrfs_set_opt(info->mount_opt, DEGRADED);
dfe250206   Chris Mason   Btrfs: Add mount ...
243
  			break;
95e052891   Chris Mason   Btrfs: Use mount ...
244
  		case Opt_subvol:
73f73415c   Josef Bacik   Btrfs: change how...
245
  		case Opt_subvolid:
e15d05424   Xin Zhong   Btrfs: fix subvol...
246
  		case Opt_subvolrootid:
43e570b08   Christoph Hellwig   btrfs: allow scan...
247
  		case Opt_device:
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
248
  			/*
43e570b08   Christoph Hellwig   btrfs: allow scan...
249
  			 * These are parsed by btrfs_parse_early_options
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
250
251
  			 * and can be happily ignored here.
  			 */
b6cda9bcb   Chris Mason   Btrfs: Add mount ...
252
253
  			break;
  		case Opt_nodatasum:
067c28adc   Chris Mason   Btrfs: fix -o nod...
254
255
  			printk(KERN_INFO "btrfs: setting nodatasum
  ");
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
256
  			btrfs_set_opt(info->mount_opt, NODATASUM);
be20aa9db   Chris Mason   Btrfs: Add mount ...
257
258
  			break;
  		case Opt_nodatacow:
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
259
260
261
262
  			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 ...
263
  			break;
a555f810a   Chris Mason   Btrfs: Add mount ...
264
  		case Opt_compress_force:
261507a02   Li Zefan   btrfs: Allow to a...
265
266
267
268
269
270
271
272
273
  		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...
274
275
276
  			} else if (strcmp(args[0].from, "lzo") == 0) {
  				compress_type = "lzo";
  				info->compress_type = BTRFS_COMPRESS_LZO;
261507a02   Li Zefan   btrfs: Allow to a...
277
278
279
280
  			} else {
  				ret = -EINVAL;
  				goto out;
  			}
a555f810a   Chris Mason   Btrfs: Add mount ...
281
  			btrfs_set_opt(info->mount_opt, COMPRESS);
261507a02   Li Zefan   btrfs: Allow to a...
282
283
284
285
286
287
288
289
290
  			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 ...
291
  			break;
e18e4809b   Chris Mason   Btrfs: Add mount ...
292
  		case Opt_ssd:
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
293
294
295
  			printk(KERN_INFO "btrfs: use ssd allocation scheme
  ");
  			btrfs_set_opt(info->mount_opt, SSD);
e18e4809b   Chris Mason   Btrfs: Add mount ...
296
  			break;
451d7585a   Chris Mason   Btrfs: add mount ...
297
298
299
300
301
302
303
  		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 ...
304
  		case Opt_nossd:
451d7585a   Chris Mason   Btrfs: add mount ...
305
306
307
  			printk(KERN_INFO "btrfs: not using ssd allocation "
  			       "scheme
  ");
c289811cc   Chris Mason   Btrfs: autodetect...
308
  			btrfs_set_opt(info->mount_opt, NOSSD);
3b30c22f6   Chris Mason   Btrfs: Add mount ...
309
  			btrfs_clear_opt(info->mount_opt, SSD);
451d7585a   Chris Mason   Btrfs: add mount ...
310
  			btrfs_clear_opt(info->mount_opt, SSD_SPREAD);
3b30c22f6   Chris Mason   Btrfs: Add mount ...
311
  			break;
21ad10cf3   Chris Mason   Btrfs: Add flush ...
312
  		case Opt_nobarrier:
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
313
314
315
  			printk(KERN_INFO "btrfs: turning off barriers
  ");
  			btrfs_set_opt(info->mount_opt, NOBARRIER);
21ad10cf3   Chris Mason   Btrfs: Add flush ...
316
  			break;
4543df7ec   Chris Mason   Btrfs: Add a moun...
317
318
319
320
321
322
323
324
325
326
  		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...
327
  		case Opt_max_inline:
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
328
329
  			num = match_strdup(&args[0]);
  			if (num) {
91748467a   Akinobu Mita   btrfs: use memparse
330
  				info->max_inline = memparse(num, NULL);
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
331
  				kfree(num);
15ada040d   Chris Mason   Btrfs: Fix mount ...
332
333
334
335
336
  				if (info->max_inline) {
  					info->max_inline = max_t(u64,
  						info->max_inline,
  						root->sectorsize);
  				}
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
337
338
  				printk(KERN_INFO "btrfs: max_inline at %llu
  ",
21380931e   Joel Becker   Btrfs: Fix a bunc...
339
  					(unsigned long long)info->max_inline);
6f568d35a   Chris Mason   Btrfs: mount -o m...
340
341
  			}
  			break;
8f662a76c   Chris Mason   Btrfs: Add readah...
342
  		case Opt_alloc_start:
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
343
344
  			num = match_strdup(&args[0]);
  			if (num) {
91748467a   Akinobu Mita   btrfs: use memparse
345
  				info->alloc_start = memparse(num, NULL);
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
346
347
348
349
  				kfree(num);
  				printk(KERN_INFO
  					"btrfs: allocations start at %llu
  ",
21380931e   Joel Becker   Btrfs: Fix a bunc...
350
  					(unsigned long long)info->alloc_start);
8f662a76c   Chris Mason   Btrfs: Add readah...
351
352
  			}
  			break;
33268eaf0   Josef Bacik   Btrfs: Add ACL su...
353
354
355
  		case Opt_noacl:
  			root->fs_info->sb->s_flags &= ~MS_POSIXACL;
  			break;
3a5e14048   Sage Weil   Btrfs: notreelog ...
356
357
358
359
360
  		case Opt_notreelog:
  			printk(KERN_INFO "btrfs: disabling tree log
  ");
  			btrfs_set_opt(info->mount_opt, NOTREELOG);
  			break;
dccae9999   Sage Weil   Btrfs: add flusho...
361
362
363
364
365
  		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...
366
367
368
369
370
371
372
373
374
375
  		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...
376
377
378
  		case Opt_discard:
  			btrfs_set_opt(info->mount_opt, DISCARD);
  			break;
0af3d00ba   Josef Bacik   Btrfs: create spe...
379
  		case Opt_space_cache:
0af3d00ba   Josef Bacik   Btrfs: create spe...
380
  			btrfs_set_opt(info->mount_opt, SPACE_CACHE);
0de90876c   Josef Bacik   Btrfs: handle the...
381
  			break;
73bc18768   Josef Bacik   Btrfs: introduce ...
382
383
384
385
386
  		case Opt_no_space_cache:
  			printk(KERN_INFO "btrfs: disabling disk space caching
  ");
  			btrfs_clear_opt(info->mount_opt, SPACE_CACHE);
  			break;
4b9465cb9   Chris Mason   Btrfs: add mount ...
387
388
389
390
391
  		case Opt_inode_cache:
  			printk(KERN_INFO "btrfs: enabling inode map caching
  ");
  			btrfs_set_opt(info->mount_opt, INODE_MAP_CACHE);
  			break;
88c2ba3b0   Josef Bacik   Btrfs: Add a clea...
392
393
394
395
  		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...
396
  			break;
4260f7c75   Sage Weil   Btrfs: allow subv...
397
398
399
  		case Opt_user_subvol_rm_allowed:
  			btrfs_set_opt(info->mount_opt, USER_SUBVOL_RM_ALLOWED);
  			break;
91435650c   Chris Mason   Btrfs: put ENOSPC...
400
401
402
  		case Opt_enospc_debug:
  			btrfs_set_opt(info->mount_opt, ENOSPC_DEBUG);
  			break;
4cb5300bc   Chris Mason   Btrfs: add mount ...
403
404
405
406
  		case Opt_defrag:
  			printk(KERN_INFO "btrfs: enabling auto defrag");
  			btrfs_set_opt(info->mount_opt, AUTO_DEFRAG);
  			break;
af31f5e5b   Chris Mason   Btrfs: add a log ...
407
408
409
410
  		case Opt_recovery:
  			printk(KERN_INFO "btrfs: enabling auto recovery");
  			btrfs_set_opt(info->mount_opt, RECOVERY);
  			break;
a7a3f7cad   Sage Weil   Btrfs: fail mount...
411
412
413
414
415
416
  		case Opt_err:
  			printk(KERN_INFO "btrfs: unrecognized mount option "
  			       "'%s'
  ", p);
  			ret = -EINVAL;
  			goto out;
95e052891   Chris Mason   Btrfs: Use mount ...
417
  		default:
be20aa9db   Chris Mason   Btrfs: Add mount ...
418
  			break;
95e052891   Chris Mason   Btrfs: Use mount ...
419
420
  		}
  	}
a7a3f7cad   Sage Weil   Btrfs: fail mount...
421
  out:
73bc18768   Josef Bacik   Btrfs: introduce ...
422
423
424
  	if (!ret && btrfs_test_opt(root, SPACE_CACHE))
  		printk(KERN_INFO "btrfs: disk space caching is enabled
  ");
da495ecc0   Josef Bacik   Btrfs: kfree corr...
425
  	kfree(orig);
a7a3f7cad   Sage Weil   Btrfs: fail mount...
426
  	return ret;
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
427
428
429
430
431
432
433
434
  }
  
  /*
   * 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...
435
  static int btrfs_parse_early_options(const char *options, fmode_t flags,
73f73415c   Josef Bacik   Btrfs: change how...
436
  		void *holder, char **subvol_name, u64 *subvol_objectid,
e15d05424   Xin Zhong   Btrfs: fix subvol...
437
  		u64 *subvol_rootid, struct btrfs_fs_devices **fs_devices)
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
438
439
  {
  	substring_t args[MAX_OPT_ARGS];
83c8c9bde   Jeff Liu   btrfs: trivial fi...
440
  	char *device_name, *opts, *orig, *p;
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
441
  	int error = 0;
73f73415c   Josef Bacik   Btrfs: change how...
442
  	int intarg;
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
443
444
  
  	if (!options)
830c4adbd   Josef Bacik   Btrfs: fix how we...
445
  		return 0;
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
446
447
448
449
450
451
452
453
  
  	/*
  	 * strsep changes the string, duplicate it because parse_options
  	 * gets called twice
  	 */
  	opts = kstrdup(options, GFP_KERNEL);
  	if (!opts)
  		return -ENOMEM;
3f3d0bc0d   Tero Roponen   Btrfs: Free corre...
454
  	orig = opts;
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
455
456
457
458
459
460
461
462
463
  
  	while ((p = strsep(&opts, ",")) != NULL) {
  		int token;
  		if (!*p)
  			continue;
  
  		token = match_token(p, tokens, args);
  		switch (token) {
  		case Opt_subvol:
a90e8b6fb   Ilya Dryomov   Btrfs: fix memory...
464
  			kfree(*subvol_name);
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
465
466
  			*subvol_name = match_strdup(&args[0]);
  			break;
73f73415c   Josef Bacik   Btrfs: change how...
467
468
  		case Opt_subvolid:
  			intarg = 0;
4849f01d1   Josef Bacik   Btrfs: make subvo...
469
470
471
472
473
474
475
476
477
  			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...
478
  			break;
e15d05424   Xin Zhong   Btrfs: fix subvol...
479
480
481
482
483
484
485
486
487
488
489
490
  		case Opt_subvolrootid:
  			intarg = 0;
  			error = match_int(&args[0], &intarg);
  			if (!error) {
  				/* we want the original fs_tree */
  				if (!intarg)
  					*subvol_rootid =
  						BTRFS_FS_TREE_OBJECTID;
  				else
  					*subvol_rootid = intarg;
  			}
  			break;
43e570b08   Christoph Hellwig   btrfs: allow scan...
491
  		case Opt_device:
83c8c9bde   Jeff Liu   btrfs: trivial fi...
492
493
494
495
496
497
  			device_name = match_strdup(&args[0]);
  			if (!device_name) {
  				error = -ENOMEM;
  				goto out;
  			}
  			error = btrfs_scan_one_device(device_name,
43e570b08   Christoph Hellwig   btrfs: allow scan...
498
  					flags, holder, fs_devices);
83c8c9bde   Jeff Liu   btrfs: trivial fi...
499
  			kfree(device_name);
43e570b08   Christoph Hellwig   btrfs: allow scan...
500
  			if (error)
830c4adbd   Josef Bacik   Btrfs: fix how we...
501
  				goto out;
43e570b08   Christoph Hellwig   btrfs: allow scan...
502
  			break;
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
503
504
505
506
  		default:
  			break;
  		}
  	}
830c4adbd   Josef Bacik   Btrfs: fix how we...
507
  out:
3f3d0bc0d   Tero Roponen   Btrfs: Free corre...
508
  	kfree(orig);
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
509
  	return error;
95e052891   Chris Mason   Btrfs: Use mount ...
510
  }
73f73415c   Josef Bacik   Btrfs: change how...
511
512
513
514
515
516
517
518
519
  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;
73f73415c   Josef Bacik   Btrfs: change how...
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
  	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.
  	 */
6c41761fc   David Sterba   btrfs: separate s...
544
  	dir_id = btrfs_super_root_dir(root->fs_info->super_copy);
73f73415c   Josef Bacik   Btrfs: change how...
545
  	di = btrfs_lookup_dir_item(NULL, root, path, dir_id, "default", 7, 0);
b08391663   Julia Lawall   fs/btrfs: Add mis...
546
547
  	if (IS_ERR(di)) {
  		btrfs_free_path(path);
fb4f6f910   Dan Carpenter   Btrfs: handle err...
548
  		return ERR_CAST(di);
b08391663   Julia Lawall   fs/btrfs: Add mis...
549
  	}
73f73415c   Josef Bacik   Btrfs: change how...
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
  	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...
568
  		return ERR_CAST(new_root);
73f73415c   Josef Bacik   Btrfs: change how...
569
570
571
572
573
574
575
576
577
578
579
  
  	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...
580
581
  	if (IS_ERR(inode))
  		return ERR_CAST(inode);
73f73415c   Josef Bacik   Btrfs: change how...
582
583
584
585
586
587
588
589
590
591
  
  	/*
  	 * 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);
  	}
ba5b8958d   Josef Bacik   Btrfs: use d_obta...
592
  	return d_obtain_alias(inode);
73f73415c   Josef Bacik   Btrfs: change how...
593
  }
d397712bc   Chris Mason   Btrfs: Fix checkp...
594
  static int btrfs_fill_super(struct super_block *sb,
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
595
  			    struct btrfs_fs_devices *fs_devices,
d397712bc   Chris Mason   Btrfs: Fix checkp...
596
  			    void *data, int silent)
75dfe3960   Chris Mason   btrfs_file_write ...
597
  {
d397712bc   Chris Mason   Btrfs: Fix checkp...
598
599
  	struct inode *inode;
  	struct dentry *root_dentry;
39279cc3d   Chris Mason   Btrfs: split up s...
600
  	struct btrfs_root *tree_root;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
601
  	struct btrfs_key key;
39279cc3d   Chris Mason   Btrfs: split up s...
602
  	int err;
a429e5137   Chris Mason   Btrfs: working fi...
603

39279cc3d   Chris Mason   Btrfs: split up s...
604
605
606
  	sb->s_maxbytes = MAX_LFS_FILESIZE;
  	sb->s_magic = BTRFS_SUPER_MAGIC;
  	sb->s_op = &btrfs_super_ops;
af53d29ac   Al Viro   switch btrfs, clo...
607
  	sb->s_d_op = &btrfs_dentry_operations;
be6e8dc0b   Balaji Rao   NFS support for b...
608
  	sb->s_export_op = &btrfs_export_ops;
5103e947b   Josef Bacik   xattr support for...
609
  	sb->s_xattr = btrfs_xattr_handlers;
39279cc3d   Chris Mason   Btrfs: split up s...
610
  	sb->s_time_gran = 1;
0eda294df   Chris Mason   Btrfs: fix btrfs ...
611
  #ifdef CONFIG_BTRFS_FS_POSIX_ACL
33268eaf0   Josef Bacik   Btrfs: Add ACL su...
612
  	sb->s_flags |= MS_POSIXACL;
49cf6f452   Chris Ball   Btrfs: Fix settin...
613
  #endif
a429e5137   Chris Mason   Btrfs: working fi...
614

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

e58ca0203   Yan   Fix btrfs_fill_su...
617
  	if (IS_ERR(tree_root)) {
39279cc3d   Chris Mason   Btrfs: split up s...
618
619
  		printk("btrfs: open_ctree failed
  ");
e58ca0203   Yan   Fix btrfs_fill_su...
620
  		return PTR_ERR(tree_root);
a429e5137   Chris Mason   Btrfs: working fi...
621
  	}
39279cc3d   Chris Mason   Btrfs: split up s...
622
  	sb->s_fs_info = tree_root;
a429e5137   Chris Mason   Btrfs: working fi...
623

5d4f98a28   Yan Zheng   Btrfs: Mixed back...
624
625
626
  	key.objectid = BTRFS_FIRST_FREE_OBJECTID;
  	key.type = BTRFS_INODE_ITEM_KEY;
  	key.offset = 0;
73f73415c   Josef Bacik   Btrfs: change how...
627
  	inode = btrfs_iget(sb, &key, tree_root->fs_info->fs_root, NULL);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
628
629
  	if (IS_ERR(inode)) {
  		err = PTR_ERR(inode);
39279cc3d   Chris Mason   Btrfs: split up s...
630
  		goto fail_close;
f254e52c1   Chris Mason   Btrfs: verify csu...
631
  	}
f254e52c1   Chris Mason   Btrfs: verify csu...
632

39279cc3d   Chris Mason   Btrfs: split up s...
633
634
635
636
637
  	root_dentry = d_alloc_root(inode);
  	if (!root_dentry) {
  		iput(inode);
  		err = -ENOMEM;
  		goto fail_close;
f254e52c1   Chris Mason   Btrfs: verify csu...
638
  	}
58176a960   Josef Bacik   Btrfs: Add per-ro...
639

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

6885f308b   Chris Mason   Btrfs: Misc 2.6.2...
642
  	save_mount_options(sb, data);
90a887c9a   Dan Magenheimer   btrfs: add cleanc...
643
  	cleancache_init_fs(sb);
2619ba1f0   Chris Mason   Btrfs: subvolumes
644
  	return 0;
39279cc3d   Chris Mason   Btrfs: split up s...
645
646
647
648
  
  fail_close:
  	close_ctree(tree_root);
  	return err;
2619ba1f0   Chris Mason   Btrfs: subvolumes
649
  }
6bf13c0cc   Sage Weil   Btrfs: transactio...
650
  int btrfs_sync_fs(struct super_block *sb, int wait)
c5739bba5   Chris Mason   Btrfs: snapshot p...
651
652
  {
  	struct btrfs_trans_handle *trans;
dccae9999   Sage Weil   Btrfs: add flusho...
653
  	struct btrfs_root *root = btrfs_sb(sb);
c5739bba5   Chris Mason   Btrfs: snapshot p...
654
  	int ret;
2619ba1f0   Chris Mason   Btrfs: subvolumes
655

1abe9b8a1   liubo   Btrfs: add initia...
656
  	trace_btrfs_sync_fs(wait);
39279cc3d   Chris Mason   Btrfs: split up s...
657
658
659
660
  	if (!wait) {
  		filemap_flush(root->fs_info->btree_inode->i_mapping);
  		return 0;
  	}
771ed689d   Chris Mason   Btrfs: Optimize c...
661

24bbcf044   Yan, Zheng   Btrfs: Add delaye...
662
663
  	btrfs_start_delalloc_inodes(root, 0);
  	btrfs_wait_ordered_extents(root, 0, 0);
771ed689d   Chris Mason   Btrfs: Optimize c...
664

a22285a6a   Yan, Zheng   Btrfs: Integrate ...
665
  	trans = btrfs_start_transaction(root, 0);
98d5dc13e   Tsutomu Itoh   btrfs: fix return...
666
667
  	if (IS_ERR(trans))
  		return PTR_ERR(trans);
c5739bba5   Chris Mason   Btrfs: snapshot p...
668
  	ret = btrfs_commit_transaction(trans, root);
54aa1f4df   Chris Mason   Btrfs: Audit call...
669
  	return ret;
2c90e5d65   Chris Mason   Btrfs: still corr...
670
  }
34c80b1d9   Al Viro   vfs: switch ->sho...
671
  static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry)
a9572a15a   Eric Paris   Btrfs: introduce ...
672
  {
34c80b1d9   Al Viro   vfs: switch ->sho...
673
  	struct btrfs_root *root = btrfs_sb(dentry->d_sb);
a9572a15a   Eric Paris   Btrfs: introduce ...
674
  	struct btrfs_fs_info *info = root->fs_info;
200da64e0   Tsutomu Itoh   Btrfs: fix /proc/...
675
  	char *compress_type;
a9572a15a   Eric Paris   Btrfs: introduce ...
676
677
678
679
680
681
682
683
684
  
  	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 ...
685
  	if (info->max_inline != 8192 * 1024)
21380931e   Joel Becker   Btrfs: Fix a bunc...
686
687
  		seq_printf(seq, ",max_inline=%llu",
  			   (unsigned long long)info->max_inline);
a9572a15a   Eric Paris   Btrfs: introduce ...
688
  	if (info->alloc_start != 0)
21380931e   Joel Becker   Btrfs: Fix a bunc...
689
690
  		seq_printf(seq, ",alloc_start=%llu",
  			   (unsigned long long)info->alloc_start);
a9572a15a   Eric Paris   Btrfs: introduce ...
691
692
693
  	if (info->thread_pool_size !=  min_t(unsigned long,
  					     num_online_cpus() + 2, 8))
  		seq_printf(seq, ",thread_pool=%d", info->thread_pool_size);
200da64e0   Tsutomu Itoh   Btrfs: fix /proc/...
694
695
696
697
698
699
700
701
702
703
  	if (btrfs_test_opt(root, COMPRESS)) {
  		if (info->compress_type == BTRFS_COMPRESS_ZLIB)
  			compress_type = "zlib";
  		else
  			compress_type = "lzo";
  		if (btrfs_test_opt(root, FORCE_COMPRESS))
  			seq_printf(seq, ",compress-force=%s", compress_type);
  		else
  			seq_printf(seq, ",compress=%s", compress_type);
  	}
c289811cc   Chris Mason   Btrfs: autodetect...
704
705
  	if (btrfs_test_opt(root, NOSSD))
  		seq_puts(seq, ",nossd");
451d7585a   Chris Mason   Btrfs: add mount ...
706
707
708
  	if (btrfs_test_opt(root, SSD_SPREAD))
  		seq_puts(seq, ",ssd_spread");
  	else if (btrfs_test_opt(root, SSD))
a9572a15a   Eric Paris   Btrfs: introduce ...
709
  		seq_puts(seq, ",ssd");
3a5e14048   Sage Weil   Btrfs: notreelog ...
710
  	if (btrfs_test_opt(root, NOTREELOG))
6b65c5c61   Sage Weil   Btrfs: make show_...
711
  		seq_puts(seq, ",notreelog");
dccae9999   Sage Weil   Btrfs: add flusho...
712
  	if (btrfs_test_opt(root, FLUSHONCOMMIT))
6b65c5c61   Sage Weil   Btrfs: make show_...
713
  		seq_puts(seq, ",flushoncommit");
20a5239a5   Matthew Wilcox   Btrfs: Show disca...
714
715
  	if (btrfs_test_opt(root, DISCARD))
  		seq_puts(seq, ",discard");
a9572a15a   Eric Paris   Btrfs: introduce ...
716
717
  	if (!(root->fs_info->sb->s_flags & MS_POSIXACL))
  		seq_puts(seq, ",noacl");
200da64e0   Tsutomu Itoh   Btrfs: fix /proc/...
718
719
  	if (btrfs_test_opt(root, SPACE_CACHE))
  		seq_puts(seq, ",space_cache");
73bc18768   Josef Bacik   Btrfs: introduce ...
720
  	else
8965593e4   David Sterba   btrfs: rename the...
721
  		seq_puts(seq, ",nospace_cache");
200da64e0   Tsutomu Itoh   Btrfs: fix /proc/...
722
723
724
725
  	if (btrfs_test_opt(root, CLEAR_CACHE))
  		seq_puts(seq, ",clear_cache");
  	if (btrfs_test_opt(root, USER_SUBVOL_RM_ALLOWED))
  		seq_puts(seq, ",user_subvol_rm_allowed");
0942caa37   David Sterba   btrfs: add missin...
726
727
728
729
730
731
  	if (btrfs_test_opt(root, ENOSPC_DEBUG))
  		seq_puts(seq, ",enospc_debug");
  	if (btrfs_test_opt(root, AUTO_DEFRAG))
  		seq_puts(seq, ",autodefrag");
  	if (btrfs_test_opt(root, INODE_MAP_CACHE))
  		seq_puts(seq, ",inode_cache");
a9572a15a   Eric Paris   Btrfs: introduce ...
732
733
  	return 0;
  }
a061fc8da   Chris Mason   Btrfs: Add suppor...
734
  static int btrfs_test_super(struct super_block *s, void *data)
4b82d6e4a   Yan   Btrfs: Add mount ...
735
  {
450ba0ea0   Josef Bacik   Btrfs: setup blan...
736
  	struct btrfs_root *test_root = data;
a061fc8da   Chris Mason   Btrfs: Add suppor...
737
  	struct btrfs_root *root = btrfs_sb(s);
4b82d6e4a   Yan   Btrfs: Add mount ...
738

619c8c763   Ian Kent   Btrfs - fix race ...
739
740
741
742
743
744
  	/*
  	 * 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...
745
  	return root->fs_info->fs_devices == test_root->fs_info->fs_devices;
4b82d6e4a   Yan   Btrfs: Add mount ...
746
  }
450ba0ea0   Josef Bacik   Btrfs: setup blan...
747
748
749
750
751
  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 ...
752
  }
830c4adbd   Josef Bacik   Btrfs: fix how we...
753
  /*
f9d9ef62c   David Sterba   btrfs: do not all...
754
755
756
757
758
759
760
761
762
763
   * subvolumes are identified by ino 256
   */
  static inline int is_subvolume_inode(struct inode *inode)
  {
  	if (inode && inode->i_ino == BTRFS_FIRST_FREE_OBJECTID)
  		return 1;
  	return 0;
  }
  
  /*
830c4adbd   Josef Bacik   Btrfs: fix how we...
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
   * This will strip out the subvol=%s argument for an argument string and add
   * subvolid=0 to make sure we get the actual tree root for path walking to the
   * subvol we want.
   */
  static char *setup_root_args(char *args)
  {
  	unsigned copied = 0;
  	unsigned len = strlen(args) + 2;
  	char *pos;
  	char *ret;
  
  	/*
  	 * We need the same args as before, but minus
  	 *
  	 * subvol=a
  	 *
  	 * and add
  	 *
  	 * subvolid=0
  	 *
  	 * which is a difference of 2 characters, so we allocate strlen(args) +
  	 * 2 characters.
  	 */
  	ret = kzalloc(len * sizeof(char), GFP_NOFS);
  	if (!ret)
  		return NULL;
  	pos = strstr(args, "subvol=");
  
  	/* This shouldn't happen, but just in case.. */
  	if (!pos) {
  		kfree(ret);
  		return NULL;
  	}
  
  	/*
  	 * The subvol=<> arg is not at the front of the string, copy everybody
  	 * up to that into ret.
  	 */
  	if (pos != args) {
  		*pos = '\0';
  		strcpy(ret, args);
  		copied += strlen(args);
  		pos++;
  	}
  
  	strncpy(ret + copied, "subvolid=0", len - copied);
  
  	/* Length of subvolid=0 */
  	copied += 10;
  
  	/*
  	 * If there is no , after the subvol= option then we know there's no
  	 * other options and we can just return.
  	 */
  	pos = strchr(pos, ',');
  	if (!pos)
  		return ret;
  
  	/* Copy the rest of the arguments into our buffer */
  	strncpy(ret + copied, pos, len - copied);
  	copied += strlen(pos);
  
  	return ret;
  }
  
  static struct dentry *mount_subvol(const char *subvol_name, int flags,
  				   const char *device_name, char *data)
  {
830c4adbd   Josef Bacik   Btrfs: fix how we...
832
833
  	struct dentry *root;
  	struct vfsmount *mnt;
830c4adbd   Josef Bacik   Btrfs: fix how we...
834
  	char *newargs;
830c4adbd   Josef Bacik   Btrfs: fix how we...
835
836
837
838
839
840
841
842
843
  
  	newargs = setup_root_args(data);
  	if (!newargs)
  		return ERR_PTR(-ENOMEM);
  	mnt = vfs_kern_mount(&btrfs_fs_type, flags, device_name,
  			     newargs);
  	kfree(newargs);
  	if (IS_ERR(mnt))
  		return ERR_CAST(mnt);
ea441d110   Al Viro   new helper: mount...
844
  	root = mount_subtree(mnt, subvol_name);
830c4adbd   Josef Bacik   Btrfs: fix how we...
845

ea441d110   Al Viro   new helper: mount...
846
847
848
849
850
  	if (!IS_ERR(root) && !is_subvolume_inode(root->d_inode)) {
  		struct super_block *s = root->d_sb;
  		dput(root);
  		root = ERR_PTR(-EINVAL);
  		deactivate_locked_super(s);
f9d9ef62c   David Sterba   btrfs: do not all...
851
852
853
  		printk(KERN_ERR "btrfs: '%s' is not a valid subvolume
  ",
  				subvol_name);
f9d9ef62c   David Sterba   btrfs: do not all...
854
  	}
830c4adbd   Josef Bacik   Btrfs: fix how we...
855
856
  	return root;
  }
450ba0ea0   Josef Bacik   Btrfs: setup blan...
857

edf24abe5   Christoph Hellwig   btrfs: sanity mou...
858
859
860
861
862
863
  /*
   * 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
864
  static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
306e16ce1   David Sterba   btrfs: rename var...
865
  		const char *device_name, void *data)
4b82d6e4a   Yan   Btrfs: Add mount ...
866
867
868
869
  {
  	struct block_device *bdev = NULL;
  	struct super_block *s;
  	struct dentry *root;
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
870
  	struct btrfs_fs_devices *fs_devices = NULL;
450ba0ea0   Josef Bacik   Btrfs: setup blan...
871
  	struct btrfs_fs_info *fs_info = NULL;
97288f2c7   Christoph Hellwig   Btrfs: corret fmo...
872
  	fmode_t mode = FMODE_READ;
73f73415c   Josef Bacik   Btrfs: change how...
873
874
  	char *subvol_name = NULL;
  	u64 subvol_objectid = 0;
e15d05424   Xin Zhong   Btrfs: fix subvol...
875
  	u64 subvol_rootid = 0;
4b82d6e4a   Yan   Btrfs: Add mount ...
876
  	int error = 0;
97288f2c7   Christoph Hellwig   Btrfs: corret fmo...
877
878
879
880
  	if (!(flags & MS_RDONLY))
  		mode |= FMODE_WRITE;
  
  	error = btrfs_parse_early_options(data, mode, fs_type,
73f73415c   Josef Bacik   Btrfs: change how...
881
  					  &subvol_name, &subvol_objectid,
e15d05424   Xin Zhong   Btrfs: fix subvol...
882
  					  &subvol_rootid, &fs_devices);
f23c8af8c   Ilya Dryomov   Btrfs: fix subvol...
883
884
  	if (error) {
  		kfree(subvol_name);
061dbc6b9   Al Viro   convert btrfs
885
  		return ERR_PTR(error);
f23c8af8c   Ilya Dryomov   Btrfs: fix subvol...
886
  	}
edf24abe5   Christoph Hellwig   btrfs: sanity mou...
887

830c4adbd   Josef Bacik   Btrfs: fix how we...
888
889
890
891
892
  	if (subvol_name) {
  		root = mount_subvol(subvol_name, flags, device_name, data);
  		kfree(subvol_name);
  		return root;
  	}
306e16ce1   David Sterba   btrfs: rename var...
893
  	error = btrfs_scan_one_device(device_name, mode, fs_type, &fs_devices);
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
894
  	if (error)
830c4adbd   Josef Bacik   Btrfs: fix how we...
895
  		return ERR_PTR(error);
4b82d6e4a   Yan   Btrfs: Add mount ...
896

450ba0ea0   Josef Bacik   Btrfs: setup blan...
897
898
899
900
901
902
903
  	/*
  	 * 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);
04d21a244   Ilya Dryomov   Btrfs: rework err...
904
905
906
907
908
  	if (!fs_info)
  		return ERR_PTR(-ENOMEM);
  
  	fs_info->tree_root = kzalloc(sizeof(struct btrfs_root), GFP_NOFS);
  	if (!fs_info->tree_root) {
450ba0ea0   Josef Bacik   Btrfs: setup blan...
909
  		error = -ENOMEM;
04d21a244   Ilya Dryomov   Btrfs: rework err...
910
  		goto error_fs_info;
450ba0ea0   Josef Bacik   Btrfs: setup blan...
911
  	}
04d21a244   Ilya Dryomov   Btrfs: rework err...
912
  	fs_info->tree_root->fs_info = fs_info;
450ba0ea0   Josef Bacik   Btrfs: setup blan...
913
  	fs_info->fs_devices = fs_devices;
450ba0ea0   Josef Bacik   Btrfs: setup blan...
914

6c41761fc   David Sterba   btrfs: separate s...
915
916
917
918
  	fs_info->super_copy = kzalloc(BTRFS_SUPER_INFO_SIZE, GFP_NOFS);
  	fs_info->super_for_commit = kzalloc(BTRFS_SUPER_INFO_SIZE, GFP_NOFS);
  	if (!fs_info->super_copy || !fs_info->super_for_commit) {
  		error = -ENOMEM;
04d21a244   Ilya Dryomov   Btrfs: rework err...
919
920
921
922
923
924
925
926
927
  		goto error_fs_info;
  	}
  
  	error = btrfs_open_devices(fs_devices, mode, fs_type);
  	if (error)
  		goto error_fs_info;
  
  	if (!(flags & MS_RDONLY) && fs_devices->rw_devices == 0) {
  		error = -EACCES;
6c41761fc   David Sterba   btrfs: separate s...
928
929
  		goto error_close_devices;
  	}
dfe250206   Chris Mason   Btrfs: Add mount ...
930
  	bdev = fs_devices->latest_bdev;
04d21a244   Ilya Dryomov   Btrfs: rework err...
931
932
  	s = sget(fs_type, btrfs_test_super, btrfs_set_super,
  		 fs_info->tree_root);
830c4adbd   Josef Bacik   Btrfs: fix how we...
933
934
935
936
  	if (IS_ERR(s)) {
  		error = PTR_ERR(s);
  		goto error_close_devices;
  	}
4b82d6e4a   Yan   Btrfs: Add mount ...
937
938
939
  
  	if (s->s_root) {
  		if ((flags ^ s->s_flags) & MS_RDONLY) {
6f5bbff9a   Al Viro   Convert obvious p...
940
  			deactivate_locked_super(s);
04d21a244   Ilya Dryomov   Btrfs: rework err...
941
942
  			error = -EBUSY;
  			goto error_close_devices;
4b82d6e4a   Yan   Btrfs: Add mount ...
943
  		}
2b82032c3   Yan Zheng   Btrfs: Seed devic...
944
  		btrfs_close_devices(fs_devices);
6c41761fc   David Sterba   btrfs: separate s...
945
  		free_fs_info(fs_info);
4b82d6e4a   Yan   Btrfs: Add mount ...
946
947
  	} else {
  		char b[BDEVNAME_SIZE];
9e1f1de02   Al Viro   more conservative...
948
  		s->s_flags = flags | MS_NOSEC;
4b82d6e4a   Yan   Btrfs: Add mount ...
949
  		strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
5f524444c   Ilya Dryomov   Btrfs: fix a bug ...
950
  		btrfs_sb(s)->fs_info->bdev_holder = fs_type;
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
951
952
  		error = btrfs_fill_super(s, fs_devices, data,
  					 flags & MS_SILENT ? 1 : 0);
4b82d6e4a   Yan   Btrfs: Add mount ...
953
  		if (error) {
6f5bbff9a   Al Viro   Convert obvious p...
954
  			deactivate_locked_super(s);
830c4adbd   Josef Bacik   Btrfs: fix how we...
955
  			return ERR_PTR(error);
4b82d6e4a   Yan   Btrfs: Add mount ...
956
957
958
959
  		}
  
  		s->s_flags |= MS_ACTIVE;
  	}
830c4adbd   Josef Bacik   Btrfs: fix how we...
960
961
962
963
  	root = get_default_root(s, subvol_objectid);
  	if (IS_ERR(root)) {
  		deactivate_locked_super(s);
  		return root;
4b82d6e4a   Yan   Btrfs: Add mount ...
964
  	}
061dbc6b9   Al Viro   convert btrfs
965
  	return root;
4b82d6e4a   Yan   Btrfs: Add mount ...
966

c146afad2   Yan Zheng   Btrfs: mount ro a...
967
  error_close_devices:
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
968
  	btrfs_close_devices(fs_devices);
04d21a244   Ilya Dryomov   Btrfs: rework err...
969
  error_fs_info:
6c41761fc   David Sterba   btrfs: separate s...
970
  	free_fs_info(fs_info);
061dbc6b9   Al Viro   convert btrfs
971
  	return ERR_PTR(error);
4b82d6e4a   Yan   Btrfs: Add mount ...
972
  }
2e635a278   Chris Mason   Btrfs: initial mo...
973

c146afad2   Yan Zheng   Btrfs: mount ro a...
974
975
976
977
  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...
978
979
980
  	ret = btrfs_parse_options(root, data);
  	if (ret)
  		return -EINVAL;
c146afad2   Yan Zheng   Btrfs: mount ro a...
981
982
983
984
985
986
987
988
989
  	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...
990
991
  		if (root->fs_info->fs_devices->rw_devices == 0)
  			return -EACCES;
6c41761fc   David Sterba   btrfs: separate s...
992
  		if (btrfs_super_log_root(root->fs_info->super_copy) != 0)
c146afad2   Yan Zheng   Btrfs: mount ro a...
993
  			return -EINVAL;
d68fc57b7   Yan, Zheng   Btrfs: Metadata r...
994
  		ret = btrfs_cleanup_fs_roots(root->fs_info);
c146afad2   Yan Zheng   Btrfs: mount ro a...
995
  		WARN_ON(ret);
d68fc57b7   Yan, Zheng   Btrfs: Metadata r...
996
997
  		/* recover relocation */
  		ret = btrfs_recover_relocation(root);
c146afad2   Yan Zheng   Btrfs: mount ro a...
998
999
1000
1001
1002
1003
1004
  		WARN_ON(ret);
  
  		sb->s_flags &= ~MS_RDONLY;
  	}
  
  	return 0;
  }
bcd53741c   Arne Jansen   btrfs: move btrfs...
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
  /* Used to sort the devices by max_avail(descending sort) */
  static int btrfs_cmp_device_free_bytes(const void *dev_info1,
  				       const void *dev_info2)
  {
  	if (((struct btrfs_device_info *)dev_info1)->max_avail >
  	    ((struct btrfs_device_info *)dev_info2)->max_avail)
  		return -1;
  	else if (((struct btrfs_device_info *)dev_info1)->max_avail <
  		 ((struct btrfs_device_info *)dev_info2)->max_avail)
  		return 1;
  	else
  	return 0;
  }
  
  /*
   * sort the devices by max_avail, in which max free extent size of each device
   * is stored.(Descending Sort)
   */
  static inline void btrfs_descending_sort_devices(
  					struct btrfs_device_info *devices,
  					size_t nr_devices)
  {
  	sort(devices, nr_devices, sizeof(struct btrfs_device_info),
  	     btrfs_cmp_device_free_bytes, NULL);
  }
6d07bcec9   Miao Xie   btrfs: fix wrong ...
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
  /*
   * 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;
39fb26c39   Miao Xie   Btrfs: fix inaccu...
1045
  	int min_stripes = 1, num_stripes = 1;
6d07bcec9   Miao Xie   btrfs: fix wrong ...
1046
1047
  	int i = 0, nr_devices;
  	int ret;
b772a86ea   Li Zefan   Btrfs: fix oops w...
1048
  	nr_devices = fs_info->fs_devices->open_devices;
6d07bcec9   Miao Xie   btrfs: fix wrong ...
1049
1050
1051
1052
1053
1054
1055
1056
1057
  	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);
39fb26c39   Miao Xie   Btrfs: fix inaccu...
1058
  	if (type & BTRFS_BLOCK_GROUP_RAID0) {
6d07bcec9   Miao Xie   btrfs: fix wrong ...
1059
  		min_stripes = 2;
39fb26c39   Miao Xie   Btrfs: fix inaccu...
1060
1061
  		num_stripes = nr_devices;
  	} else if (type & BTRFS_BLOCK_GROUP_RAID1) {
6d07bcec9   Miao Xie   btrfs: fix wrong ...
1062
  		min_stripes = 2;
39fb26c39   Miao Xie   Btrfs: fix inaccu...
1063
1064
  		num_stripes = 2;
  	} else if (type & BTRFS_BLOCK_GROUP_RAID10) {
6d07bcec9   Miao Xie   btrfs: fix wrong ...
1065
  		min_stripes = 4;
39fb26c39   Miao Xie   Btrfs: fix inaccu...
1066
1067
  		num_stripes = 4;
  	}
6d07bcec9   Miao Xie   btrfs: fix wrong ...
1068
1069
1070
1071
1072
  
  	if (type & BTRFS_BLOCK_GROUP_DUP)
  		min_stripe_size = 2 * BTRFS_STRIPE_LEN;
  	else
  		min_stripe_size = BTRFS_STRIPE_LEN;
b772a86ea   Li Zefan   Btrfs: fix oops w...
1073
1074
  	list_for_each_entry(device, &fs_devices->devices, dev_list) {
  		if (!device->in_fs_metadata || !device->bdev)
6d07bcec9   Miao Xie   btrfs: fix wrong ...
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
  			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) {
39fb26c39   Miao Xie   Btrfs: fix inaccu...
1135
1136
  		if (num_stripes > nr_devices)
  			num_stripes = nr_devices;
6d07bcec9   Miao Xie   btrfs: fix wrong ...
1137
1138
1139
  		if (devices_info[i].max_avail >= min_stripe_size) {
  			int j;
  			u64 alloc_size;
39fb26c39   Miao Xie   Btrfs: fix inaccu...
1140
  			avail_space += devices_info[i].max_avail * num_stripes;
6d07bcec9   Miao Xie   btrfs: fix wrong ...
1141
  			alloc_size = devices_info[i].max_avail;
39fb26c39   Miao Xie   Btrfs: fix inaccu...
1142
  			for (j = i + 1 - num_stripes; j <= i; j++)
6d07bcec9   Miao Xie   btrfs: fix wrong ...
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
  				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...
1153
1154
1155
  static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf)
  {
  	struct btrfs_root *root = btrfs_sb(dentry->d_sb);
6c41761fc   David Sterba   btrfs: separate s...
1156
  	struct btrfs_super_block *disk_super = root->fs_info->super_copy;
bd4d10888   Josef Bacik   Btrfs: make df be...
1157
1158
1159
  	struct list_head *head = &root->fs_info->space_info;
  	struct btrfs_space_info *found;
  	u64 total_used = 0;
6d07bcec9   Miao Xie   btrfs: fix wrong ...
1160
  	u64 total_free_data = 0;
db94535db   Chris Mason   Btrfs: Allow tree...
1161
  	int bits = dentry->d_sb->s_blocksize_bits;
9d03632e2   David Woodhouse   Fill f_fsid field...
1162
  	__be32 *fsid = (__be32 *)root->fs_info->fsid;
6d07bcec9   Miao Xie   btrfs: fix wrong ...
1163
  	int ret;
8fd17795b   Chris Mason   Btrfs: early fsyn...
1164

6d07bcec9   Miao Xie   btrfs: fix wrong ...
1165
1166
  	/* holding chunk_muext to avoid allocating new chunks */
  	mutex_lock(&root->fs_info->chunk_mutex);
bd4d10888   Josef Bacik   Btrfs: make df be...
1167
  	rcu_read_lock();
89a55897a   Josef Bacik   Btrfs: fix df reg...
1168
  	list_for_each_entry_rcu(found, head, list) {
6d07bcec9   Miao Xie   btrfs: fix wrong ...
1169
1170
1171
1172
1173
  		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...
1174
  		total_used += found->disk_used;
89a55897a   Josef Bacik   Btrfs: fix df reg...
1175
  	}
bd4d10888   Josef Bacik   Btrfs: make df be...
1176
  	rcu_read_unlock();
8fd17795b   Chris Mason   Btrfs: early fsyn...
1177
  	buf->f_namelen = BTRFS_NAME_LEN;
db94535db   Chris Mason   Btrfs: Allow tree...
1178
  	buf->f_blocks = btrfs_super_total_bytes(disk_super) >> bits;
bd4d10888   Josef Bacik   Btrfs: make df be...
1179
  	buf->f_bfree = buf->f_blocks - (total_used >> bits);
8fd17795b   Chris Mason   Btrfs: early fsyn...
1180
1181
  	buf->f_bsize = dentry->d_sb->s_blocksize;
  	buf->f_type = BTRFS_SUPER_MAGIC;
6d07bcec9   Miao Xie   btrfs: fix wrong ...
1182
1183
1184
1185
1186
1187
1188
1189
1190
  	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...
1191

9d03632e2   David Woodhouse   Fill f_fsid field...
1192
  	/* We treat it as constant endianness (it doesn't matter _which_)
d397712bc   Chris Mason   Btrfs: Fix checkp...
1193
  	   because we want the fsid to come out the same whether mounted
9d03632e2   David Woodhouse   Fill f_fsid field...
1194
1195
1196
  	   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 ...
1197
1198
1199
  	/* 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...
1200
1201
  	return 0;
  }
b51338628   Chris Mason   Btrfs: add dirty_...
1202

2e635a278   Chris Mason   Btrfs: initial mo...
1203
1204
1205
  static struct file_system_type btrfs_fs_type = {
  	.owner		= THIS_MODULE,
  	.name		= "btrfs",
061dbc6b9   Al Viro   convert btrfs
1206
  	.mount		= btrfs_mount,
a061fc8da   Chris Mason   Btrfs: Add suppor...
1207
  	.kill_sb	= kill_anon_super,
2e635a278   Chris Mason   Btrfs: initial mo...
1208
1209
  	.fs_flags	= FS_REQUIRES_DEV,
  };
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1210

d352ac681   Chris Mason   Btrfs: add and im...
1211
1212
1213
  /*
   * used by btrfsctl to scan devices when no FS is mounted
   */
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
1214
1215
1216
1217
1218
  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 ...
1219
  	int ret = -ENOTTY;
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
1220

e441d54de   Chris Mason   Btrfs: add permis...
1221
1222
  	if (!capable(CAP_SYS_ADMIN))
  		return -EPERM;
dae7b665c   Li Zefan   btrfs: use memdup...
1223
1224
1225
  	vol = memdup_user((void __user *)arg, sizeof(*vol));
  	if (IS_ERR(vol))
  		return PTR_ERR(vol);
c071fcfdb   Chris Mason   Btrfs: fix ioctl ...
1226

8a4b83cc8   Chris Mason   Btrfs: Add suppor...
1227
1228
  	switch (cmd) {
  	case BTRFS_IOC_SCAN_DEV:
97288f2c7   Christoph Hellwig   Btrfs: corret fmo...
1229
  		ret = btrfs_scan_one_device(vol->name, FMODE_READ,
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
1230
1231
1232
  					    &btrfs_fs_type, &fs_devices);
  		break;
  	}
dae7b665c   Li Zefan   btrfs: use memdup...
1233

8a4b83cc8   Chris Mason   Btrfs: Add suppor...
1234
  	kfree(vol);
f819d837e   Linda Knippers   btrfsctl -A error...
1235
  	return ret;
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
1236
  }
0176260fc   Linus Torvalds   btrfs: fix for wr...
1237
  static int btrfs_freeze(struct super_block *sb)
ed0dab6b8   Yan   Btrfs: Add basic ...
1238
1239
  {
  	struct btrfs_root *root = btrfs_sb(sb);
a74a4b97b   Chris Mason   Btrfs: Replace th...
1240
1241
  	mutex_lock(&root->fs_info->transaction_kthread_mutex);
  	mutex_lock(&root->fs_info->cleaner_mutex);
0176260fc   Linus Torvalds   btrfs: fix for wr...
1242
  	return 0;
ed0dab6b8   Yan   Btrfs: Add basic ...
1243
  }
0176260fc   Linus Torvalds   btrfs: fix for wr...
1244
  static int btrfs_unfreeze(struct super_block *sb)
ed0dab6b8   Yan   Btrfs: Add basic ...
1245
1246
  {
  	struct btrfs_root *root = btrfs_sb(sb);
a74a4b97b   Chris Mason   Btrfs: Replace th...
1247
1248
  	mutex_unlock(&root->fs_info->cleaner_mutex);
  	mutex_unlock(&root->fs_info->transaction_kthread_mutex);
0176260fc   Linus Torvalds   btrfs: fix for wr...
1249
  	return 0;
ed0dab6b8   Yan   Btrfs: Add basic ...
1250
  }
2e635a278   Chris Mason   Btrfs: initial mo...
1251

22c44fe65   Josef Bacik   Btrfs: deal with ...
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
  static void btrfs_fs_dirty_inode(struct inode *inode, int flags)
  {
  	int ret;
  
  	ret = btrfs_dirty_inode(inode);
  	if (ret)
  		printk_ratelimited(KERN_ERR "btrfs: fail to dirty inode %Lu "
  				   "error %d
  ", btrfs_ino(inode), ret);
  }
b87221de6   Alexey Dobriyan   const: mark remai...
1262
  static const struct super_operations btrfs_super_ops = {
76dda93c6   Yan, Zheng   Btrfs: add snapsh...
1263
  	.drop_inode	= btrfs_drop_inode,
bd5559752   Al Viro   convert btrfs to ...
1264
  	.evict_inode	= btrfs_evict_inode,
e20d96d64   Chris Mason   Mountable btrfs, ...
1265
  	.put_super	= btrfs_put_super,
d57197629   Chris Mason   btrfs_create, btr...
1266
  	.sync_fs	= btrfs_sync_fs,
a9572a15a   Eric Paris   Btrfs: introduce ...
1267
  	.show_options	= btrfs_show_options,
4730a4bc5   Chris Mason   btrfs_dirty_inode
1268
  	.write_inode	= btrfs_write_inode,
22c44fe65   Josef Bacik   Btrfs: deal with ...
1269
  	.dirty_inode	= btrfs_fs_dirty_inode,
2c90e5d65   Chris Mason   Btrfs: still corr...
1270
1271
  	.alloc_inode	= btrfs_alloc_inode,
  	.destroy_inode	= btrfs_destroy_inode,
8fd17795b   Chris Mason   Btrfs: early fsyn...
1272
  	.statfs		= btrfs_statfs,
c146afad2   Yan Zheng   Btrfs: mount ro a...
1273
  	.remount_fs	= btrfs_remount,
0176260fc   Linus Torvalds   btrfs: fix for wr...
1274
1275
  	.freeze_fs	= btrfs_freeze,
  	.unfreeze_fs	= btrfs_unfreeze,
e20d96d64   Chris Mason   Mountable btrfs, ...
1276
  };
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1277
1278
1279
1280
1281
  
  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...
1282
  	.llseek = noop_llseek,
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1283
1284
1285
  };
  
  static struct miscdevice btrfs_misc = {
578454ff7   Kay Sievers   driver core: add ...
1286
  	.minor		= BTRFS_MINOR,
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1287
1288
1289
  	.name		= "btrfs-control",
  	.fops		= &btrfs_ctl_fops
  };
578454ff7   Kay Sievers   driver core: add ...
1290
1291
  MODULE_ALIAS_MISCDEV(BTRFS_MINOR);
  MODULE_ALIAS("devname:btrfs-control");
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1292
1293
1294
1295
  static int btrfs_interface_init(void)
  {
  	return misc_register(&btrfs_misc);
  }
b2950863c   Christoph Hellwig   Btrfs: make thing...
1296
  static void btrfs_interface_exit(void)
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1297
1298
  {
  	if (misc_deregister(&btrfs_misc) < 0)
d397712bc   Chris Mason   Btrfs: Fix checkp...
1299
  		printk(KERN_INFO "misc_deregister failed for control device");
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1300
  }
2e635a278   Chris Mason   Btrfs: initial mo...
1301
1302
  static int __init init_btrfs_fs(void)
  {
2c90e5d65   Chris Mason   Btrfs: still corr...
1303
  	int err;
58176a960   Josef Bacik   Btrfs: Add per-ro...
1304
1305
1306
1307
  
  	err = btrfs_init_sysfs();
  	if (err)
  		return err;
261507a02   Li Zefan   btrfs: Allow to a...
1308
  	err = btrfs_init_compress();
2c90e5d65   Chris Mason   Btrfs: still corr...
1309
  	if (err)
a74a4b97b   Chris Mason   Btrfs: Replace th...
1310
  		goto free_sysfs;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1311

261507a02   Li Zefan   btrfs: Allow to a...
1312
1313
1314
  	err = btrfs_init_cachep();
  	if (err)
  		goto free_compress;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1315
  	err = extent_io_init();
2f4cbe644   Wyatt Banks   Btrfs: Return val...
1316
1317
  	if (err)
  		goto free_cachep;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1318
1319
1320
  	err = extent_map_init();
  	if (err)
  		goto free_extent_io;
16cdcec73   Miao Xie   btrfs: implement ...
1321
  	err = btrfs_delayed_inode_init();
2f4cbe644   Wyatt Banks   Btrfs: Return val...
1322
1323
  	if (err)
  		goto free_extent_map;
c8b978188   Chris Mason   Btrfs: Add zlib c...
1324

16cdcec73   Miao Xie   btrfs: implement ...
1325
1326
1327
  	err = btrfs_interface_init();
  	if (err)
  		goto free_delayed_inode;
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1328
1329
1330
  	err = register_filesystem(&btrfs_fs_type);
  	if (err)
  		goto unregister_ioctl;
b3c3da71e   Chris Mason   Btrfs: Add versio...
1331
1332
1333
  
  	printk(KERN_INFO "%s loaded
  ", BTRFS_BUILD_VERSION);
2f4cbe644   Wyatt Banks   Btrfs: Return val...
1334
  	return 0;
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1335
1336
  unregister_ioctl:
  	btrfs_interface_exit();
16cdcec73   Miao Xie   btrfs: implement ...
1337
1338
  free_delayed_inode:
  	btrfs_delayed_inode_exit();
2f4cbe644   Wyatt Banks   Btrfs: Return val...
1339
1340
  free_extent_map:
  	extent_map_exit();
d1310b2e0   Chris Mason   Btrfs: Split the ...
1341
1342
  free_extent_io:
  	extent_io_exit();
2f4cbe644   Wyatt Banks   Btrfs: Return val...
1343
1344
  free_cachep:
  	btrfs_destroy_cachep();
261507a02   Li Zefan   btrfs: Allow to a...
1345
1346
  free_compress:
  	btrfs_exit_compress();
a74a4b97b   Chris Mason   Btrfs: Replace th...
1347
  free_sysfs:
2f4cbe644   Wyatt Banks   Btrfs: Return val...
1348
1349
  	btrfs_exit_sysfs();
  	return err;
2e635a278   Chris Mason   Btrfs: initial mo...
1350
1351
1352
1353
  }
  
  static void __exit exit_btrfs_fs(void)
  {
39279cc3d   Chris Mason   Btrfs: split up s...
1354
  	btrfs_destroy_cachep();
16cdcec73   Miao Xie   btrfs: implement ...
1355
  	btrfs_delayed_inode_exit();
a52d9a803   Chris Mason   Btrfs: Extent bas...
1356
  	extent_map_exit();
d1310b2e0   Chris Mason   Btrfs: Split the ...
1357
  	extent_io_exit();
a9218f6b0   Chris Mason   Add /dev/btrfs-co...
1358
  	btrfs_interface_exit();
2e635a278   Chris Mason   Btrfs: initial mo...
1359
  	unregister_filesystem(&btrfs_fs_type);
58176a960   Josef Bacik   Btrfs: Add per-ro...
1360
  	btrfs_exit_sysfs();
8a4b83cc8   Chris Mason   Btrfs: Add suppor...
1361
  	btrfs_cleanup_fs_uuids();
261507a02   Li Zefan   btrfs: Allow to a...
1362
  	btrfs_exit_compress();
2e635a278   Chris Mason   Btrfs: initial mo...
1363
1364
1365
1366
1367
1368
  }
  
  module_init(init_btrfs_fs)
  module_exit(exit_btrfs_fs)
  
  MODULE_LICENSE("GPL");