blob: 8c6e61d6eed5b754945930fbaaaaf21d6f98d028 [file] [log] [blame]
Chris Mason6cbd5572007-06-12 09:07:21 -04001/*
2 * Copyright (C) 2007 Oracle. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public
6 * License v2 as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public
14 * License along with this program; if not, write to the
15 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16 * Boston, MA 021110-1307, USA.
17 */
18
Yan4b82d6e2007-08-29 09:11:44 -040019#include <linux/blkdev.h>
Chris Mason2e635a22007-03-21 11:12:56 -040020#include <linux/module.h>
Chris Masone20d96d2007-03-22 12:13:20 -040021#include <linux/buffer_head.h>
Chris Mason2e635a22007-03-21 11:12:56 -040022#include <linux/fs.h>
23#include <linux/pagemap.h>
24#include <linux/highmem.h>
25#include <linux/time.h>
26#include <linux/init.h>
Eric Parisa9572a12009-04-02 16:46:06 -040027#include <linux/seq_file.h>
Chris Mason2e635a22007-03-21 11:12:56 -040028#include <linux/string.h>
Chris Mason2e635a22007-03-21 11:12:56 -040029#include <linux/backing-dev.h>
Yan4b82d6e2007-08-29 09:11:44 -040030#include <linux/mount.h>
Chris Masondee26a92007-03-26 16:00:06 -040031#include <linux/mpage.h>
Chris Mason75dfe392007-03-29 11:56:46 -040032#include <linux/swap.h>
33#include <linux/writeback.h>
Chris Mason8fd17792007-04-19 21:01:03 -040034#include <linux/statfs.h>
Chris Mason08607c12007-06-08 15:33:54 -040035#include <linux/compat.h>
Chris Mason95e05282007-08-29 09:11:44 -040036#include <linux/parser.h>
Chris Masonc59f8952007-12-17 20:14:04 -050037#include <linux/ctype.h>
Chris Mason6da6aba2007-12-18 16:15:09 -050038#include <linux/namei.h>
Chris Masona9218f62008-03-24 15:02:04 -040039#include <linux/miscdevice.h>
Qinghuang Feng1bcbf312009-01-15 13:51:03 -080040#include <linux/magic.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090041#include <linux/slab.h>
Dan Magenheimer90a887c2011-05-26 10:01:56 -060042#include <linux/cleancache.h>
Josef Bacik22c44fe2011-11-30 10:45:38 -050043#include <linux/ratelimit.h>
Chris Mason4b4e25f2008-11-20 10:22:27 -050044#include "compat.h"
Miao Xie16cdcec2011-04-22 18:12:22 +080045#include "delayed-inode.h"
Chris Mason2e635a22007-03-21 11:12:56 -040046#include "ctree.h"
Chris Masone20d96d2007-03-22 12:13:20 -040047#include "disk-io.h"
Chris Masond5719762007-03-23 10:01:08 -040048#include "transaction.h"
Chris Mason2c90e5d2007-04-02 10:50:19 -040049#include "btrfs_inode.h"
Chris Masonc5739bb2007-04-10 09:27:04 -040050#include "ioctl.h"
Chris Mason3a686372007-05-24 13:35:57 -040051#include "print-tree.h"
Josef Bacik5103e942007-11-16 11:45:54 -050052#include "xattr.h"
Chris Mason8a4b83c2008-03-24 15:02:07 -040053#include "volumes.h"
Chris Masonb3c3da72008-07-23 12:12:13 -040054#include "version.h"
Balaji Raobe6e8dc2008-07-21 02:01:56 +053055#include "export.h"
Chris Masonc8b97812008-10-29 14:49:59 -040056#include "compression.h"
Josef Bacik9c5085c2012-06-05 14:13:12 -040057#include "rcu-string.h"
Chris Mason2e635a22007-03-21 11:12:56 -040058
liubo1abe9b82011-03-24 11:18:59 +000059#define CREATE_TRACE_POINTS
60#include <trace/events/btrfs.h>
61
Alexey Dobriyanb87221d2009-09-21 17:01:09 -070062static const struct super_operations btrfs_super_ops;
Josef Bacik830c4ad2011-07-25 15:55:42 -040063static struct file_system_type btrfs_fs_type;
Chris Masone20d96d2007-03-22 12:13:20 -040064
liuboacce9522011-01-06 19:30:25 +080065static const char *btrfs_decode_error(struct btrfs_fs_info *fs_info, int errno,
66 char nbuf[16])
67{
68 char *errstr = NULL;
69
70 switch (errno) {
71 case -EIO:
72 errstr = "IO failure";
73 break;
74 case -ENOMEM:
75 errstr = "Out of memory";
76 break;
77 case -EROFS:
78 errstr = "Readonly filesystem";
79 break;
Jeff Mahoney8c342932011-10-03 23:22:31 -040080 case -EEXIST:
81 errstr = "Object already exists";
82 break;
liuboacce9522011-01-06 19:30:25 +080083 default:
84 if (nbuf) {
85 if (snprintf(nbuf, 16, "error %d", -errno) >= 0)
86 errstr = nbuf;
87 }
88 break;
89 }
90
91 return errstr;
92}
93
94static void __save_error_info(struct btrfs_fs_info *fs_info)
95{
96 /*
97 * today we only save the error info into ram. Long term we'll
98 * also send it down to the disk
99 */
100 fs_info->fs_state = BTRFS_SUPER_FLAG_ERROR;
101}
102
103/* NOTE:
104 * We move write_super stuff at umount in order to avoid deadlock
105 * for umount hold all lock.
106 */
107static void save_error_info(struct btrfs_fs_info *fs_info)
108{
109 __save_error_info(fs_info);
110}
111
112/* btrfs handle error by forcing the filesystem readonly */
113static void btrfs_handle_error(struct btrfs_fs_info *fs_info)
114{
115 struct super_block *sb = fs_info->sb;
116
117 if (sb->s_flags & MS_RDONLY)
118 return;
119
120 if (fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) {
121 sb->s_flags |= MS_RDONLY;
122 printk(KERN_INFO "btrfs is forced readonly\n");
Jeff Mahoney49b25e02012-03-01 17:24:58 +0100123 __btrfs_scrub_cancel(fs_info);
124// WARN_ON(1);
liuboacce9522011-01-06 19:30:25 +0800125 }
126}
127
Joe Perches533574c2012-07-30 14:40:13 -0700128#ifdef CONFIG_PRINTK
liuboacce9522011-01-06 19:30:25 +0800129/*
130 * __btrfs_std_error decodes expected errors from the caller and
131 * invokes the approciate error response.
132 */
133void __btrfs_std_error(struct btrfs_fs_info *fs_info, const char *function,
Jeff Mahoney4da35112012-03-01 14:57:30 +0100134 unsigned int line, int errno, const char *fmt, ...)
liuboacce9522011-01-06 19:30:25 +0800135{
136 struct super_block *sb = fs_info->sb;
137 char nbuf[16];
138 const char *errstr;
Jeff Mahoney4da35112012-03-01 14:57:30 +0100139 va_list args;
140 va_start(args, fmt);
liuboacce9522011-01-06 19:30:25 +0800141
142 /*
143 * Special case: if the error is EROFS, and we're already
144 * under MS_RDONLY, then it is safe here.
145 */
146 if (errno == -EROFS && (sb->s_flags & MS_RDONLY))
Jeff Mahoney4da35112012-03-01 14:57:30 +0100147 return;
liuboacce9522011-01-06 19:30:25 +0800148
Jeff Mahoney4da35112012-03-01 14:57:30 +0100149 errstr = btrfs_decode_error(fs_info, errno, nbuf);
150 if (fmt) {
151 struct va_format vaf = {
152 .fmt = fmt,
153 .va = &args,
154 };
liuboacce9522011-01-06 19:30:25 +0800155
Jeff Mahoney4da35112012-03-01 14:57:30 +0100156 printk(KERN_CRIT "BTRFS error (device %s) in %s:%d: %s (%pV)\n",
157 sb->s_id, function, line, errstr, &vaf);
158 } else {
159 printk(KERN_CRIT "BTRFS error (device %s) in %s:%d: %s\n",
160 sb->s_id, function, line, errstr);
161 }
162
163 /* Don't go through full error handling during mount */
164 if (sb->s_flags & MS_BORN) {
165 save_error_info(fs_info);
166 btrfs_handle_error(fs_info);
167 }
168 va_end(args);
169}
170
Joe Perches533574c2012-07-30 14:40:13 -0700171static const char * const logtypes[] = {
Jeff Mahoney4da35112012-03-01 14:57:30 +0100172 "emergency",
173 "alert",
174 "critical",
175 "error",
176 "warning",
177 "notice",
178 "info",
179 "debug",
180};
181
182void btrfs_printk(struct btrfs_fs_info *fs_info, const char *fmt, ...)
183{
184 struct super_block *sb = fs_info->sb;
185 char lvl[4];
186 struct va_format vaf;
187 va_list args;
188 const char *type = logtypes[4];
Joe Perches533574c2012-07-30 14:40:13 -0700189 int kern_level;
Jeff Mahoney4da35112012-03-01 14:57:30 +0100190
191 va_start(args, fmt);
192
Joe Perches533574c2012-07-30 14:40:13 -0700193 kern_level = printk_get_level(fmt);
194 if (kern_level) {
195 size_t size = printk_skip_level(fmt) - fmt;
196 memcpy(lvl, fmt, size);
197 lvl[size] = '\0';
198 fmt += size;
199 type = logtypes[kern_level - '0'];
Jeff Mahoney4da35112012-03-01 14:57:30 +0100200 } else
201 *lvl = '\0';
202
203 vaf.fmt = fmt;
204 vaf.va = &args;
Joe Perches533574c2012-07-30 14:40:13 -0700205
Jeff Mahoney4da35112012-03-01 14:57:30 +0100206 printk("%sBTRFS %s (device %s): %pV", lvl, type, sb->s_id, &vaf);
Joe Perches533574c2012-07-30 14:40:13 -0700207
208 va_end(args);
liuboacce9522011-01-06 19:30:25 +0800209}
210
Joe Perches533574c2012-07-30 14:40:13 -0700211#else
212
213void __btrfs_std_error(struct btrfs_fs_info *fs_info, const char *function,
214 unsigned int line, int errno, const char *fmt, ...)
215{
216 struct super_block *sb = fs_info->sb;
217
218 /*
219 * Special case: if the error is EROFS, and we're already
220 * under MS_RDONLY, then it is safe here.
221 */
222 if (errno == -EROFS && (sb->s_flags & MS_RDONLY))
223 return;
224
225 /* Don't go through full error handling during mount */
226 if (sb->s_flags & MS_BORN) {
227 save_error_info(fs_info);
228 btrfs_handle_error(fs_info);
229 }
230}
231#endif
232
Jeff Mahoney8c342932011-10-03 23:22:31 -0400233/*
Jeff Mahoney49b25e02012-03-01 17:24:58 +0100234 * We only mark the transaction aborted and then set the file system read-only.
235 * This will prevent new transactions from starting or trying to join this
236 * one.
237 *
238 * This means that error recovery at the call site is limited to freeing
239 * any local memory allocations and passing the error code up without
240 * further cleanup. The transaction should complete as it normally would
241 * in the call path but will return -EIO.
242 *
243 * We'll complete the cleanup in btrfs_end_transaction and
244 * btrfs_commit_transaction.
245 */
246void __btrfs_abort_transaction(struct btrfs_trans_handle *trans,
247 struct btrfs_root *root, const char *function,
248 unsigned int line, int errno)
249{
Jeff Mahoney79787ea2012-03-12 16:03:00 +0100250 WARN_ONCE(1, KERN_DEBUG "btrfs: Transaction aborted");
Jeff Mahoney49b25e02012-03-01 17:24:58 +0100251 trans->aborted = errno;
252 /* Nothing used. The other threads that have joined this
253 * transaction may be able to continue. */
254 if (!trans->blocks_used) {
255 btrfs_printk(root->fs_info, "Aborting unused transaction.\n");
Chris Masone20d96d2007-03-22 12:13:20 -0400256 return;
Jeff Mahoney49b25e02012-03-01 17:24:58 +0100257 }
258 trans->transaction->aborted = errno;
259 __btrfs_std_error(root->fs_info, function, line, errno, NULL);
260}
261/*
Jeff Mahoney8c342932011-10-03 23:22:31 -0400262 * __btrfs_panic decodes unexpected, fatal errors from the caller,
263 * issues an alert, and either panics or BUGs, depending on mount options.
264 */
265void __btrfs_panic(struct btrfs_fs_info *fs_info, const char *function,
266 unsigned int line, int errno, const char *fmt, ...)
267{
268 char nbuf[16];
269 char *s_id = "<unknown>";
270 const char *errstr;
271 struct va_format vaf = { .fmt = fmt };
272 va_list args;
273
274 if (fs_info)
275 s_id = fs_info->sb->s_id;
276
277 va_start(args, fmt);
278 vaf.va = &args;
Chris Masone20d96d2007-03-22 12:13:20 -0400279
280 errstr = btrfs_decode_error(fs_info, errno, nbuf);
Jeff Mahoney8c342932011-10-03 23:22:31 -0400281 if (fs_info->mount_opt & BTRFS_MOUNT_PANIC_ON_FATAL_ERROR)
282 panic(KERN_CRIT "BTRFS panic (device %s) in %s:%d: %pV (%s)\n",
283 s_id, function, line, &vaf, errstr);
Chris Masone20d96d2007-03-22 12:13:20 -0400284
Jeff Mahoney8c342932011-10-03 23:22:31 -0400285 printk(KERN_CRIT "BTRFS panic (device %s) in %s:%d: %pV (%s)\n",
286 s_id, function, line, &vaf, errstr);
287 va_end(args);
288 /* Caller calls BUG() */
Chris Masone20d96d2007-03-22 12:13:20 -0400289}
290
Chris Masond3977122009-01-05 21:25:51 -0500291static void btrfs_put_super(struct super_block *sb)
Chris Masone20d96d2007-03-22 12:13:20 -0400292{
Al Viro815745c2011-11-17 15:40:49 -0500293 (void)close_ctree(btrfs_sb(sb)->tree_root);
Al Viroaea52e12011-11-17 01:22:46 -0500294 /* FIXME: need to fix VFS to return error? */
295 /* AV: return it _where_? ->put_super() can be triggered by any number
296 * of async events, up to and including delivery of SIGKILL to the
297 * last process that kept it busy. Or segfault in the aforementioned
298 * process... Whom would you report that to?
299 */
Chris Masone20d96d2007-03-22 12:13:20 -0400300}
Chris Mason2e635a22007-03-21 11:12:56 -0400301
Chris Mason95e05282007-08-29 09:11:44 -0400302enum {
Josef Bacik73f73412009-12-04 17:38:27 +0000303 Opt_degraded, Opt_subvol, Opt_subvolid, Opt_device, Opt_nodatasum,
Josef Bacik287a0ab2010-03-19 18:07:23 +0000304 Opt_nodatacow, Opt_max_inline, Opt_alloc_start, Opt_nobarrier, Opt_ssd,
305 Opt_nossd, Opt_ssd_spread, Opt_thread_pool, Opt_noacl, Opt_compress,
Li Zefan261507a02010-12-17 14:21:50 +0800306 Opt_compress_type, Opt_compress_force, Opt_compress_force_type,
307 Opt_notreelog, Opt_ratio, Opt_flushoncommit, Opt_discard,
Chris Mason91435652011-02-16 13:10:41 -0500308 Opt_space_cache, Opt_clear_cache, Opt_user_subvol_rm_allowed,
Ilya Dryomov9555c6c2012-01-16 22:04:48 +0200309 Opt_enospc_debug, Opt_subvolrootid, Opt_defrag, Opt_inode_cache,
310 Opt_no_space_cache, Opt_recovery, Opt_skip_balance,
Stefan Behrens21adbd52011-11-09 13:44:05 +0100311 Opt_check_integrity, Opt_check_integrity_including_extent_data,
Jeff Mahoney8c342932011-10-03 23:22:31 -0400312 Opt_check_integrity_print_mask, Opt_fatal_errors,
Ilya Dryomov9555c6c2012-01-16 22:04:48 +0200313 Opt_err,
Chris Mason95e05282007-08-29 09:11:44 -0400314};
315
316static match_table_t tokens = {
Chris Masondfe25022008-05-13 13:46:40 -0400317 {Opt_degraded, "degraded"},
Chris Mason95e05282007-08-29 09:11:44 -0400318 {Opt_subvol, "subvol=%s"},
Josef Bacik73f73412009-12-04 17:38:27 +0000319 {Opt_subvolid, "subvolid=%d"},
Christoph Hellwig43e570b2008-06-10 10:40:46 -0400320 {Opt_device, "device=%s"},
Chris Masonb6cda9b2007-12-14 15:30:32 -0500321 {Opt_nodatasum, "nodatasum"},
Chris Masonbe20aa92007-12-17 20:14:01 -0500322 {Opt_nodatacow, "nodatacow"},
Chris Mason21ad10c2008-01-09 09:23:21 -0500323 {Opt_nobarrier, "nobarrier"},
Chris Mason6f568d32008-01-29 16:03:38 -0500324 {Opt_max_inline, "max_inline=%s"},
Chris Mason8f662a72008-01-02 10:01:11 -0500325 {Opt_alloc_start, "alloc_start=%s"},
Chris Mason4543df72008-06-11 21:47:56 -0400326 {Opt_thread_pool, "thread_pool=%d"},
Chris Masonc8b97812008-10-29 14:49:59 -0400327 {Opt_compress, "compress"},
Li Zefan261507a02010-12-17 14:21:50 +0800328 {Opt_compress_type, "compress=%s"},
Chris Masona555f812010-01-28 16:18:15 -0500329 {Opt_compress_force, "compress-force"},
Li Zefan261507a02010-12-17 14:21:50 +0800330 {Opt_compress_force_type, "compress-force=%s"},
Chris Masone18e4802008-01-18 10:54:22 -0500331 {Opt_ssd, "ssd"},
Chris Mason451d7582009-06-09 20:28:34 -0400332 {Opt_ssd_spread, "ssd_spread"},
Chris Mason3b30c222009-06-09 16:42:22 -0400333 {Opt_nossd, "nossd"},
Josef Bacik33268ea2008-07-24 12:16:36 -0400334 {Opt_noacl, "noacl"},
Sage Weil3a5e1402009-04-02 16:49:40 -0400335 {Opt_notreelog, "notreelog"},
Sage Weildccae992009-04-02 16:59:01 -0400336 {Opt_flushoncommit, "flushoncommit"},
Josef Bacik97e728d2009-04-21 17:40:57 -0400337 {Opt_ratio, "metadata_ratio=%d"},
Christoph Hellwige244a0a2009-10-14 09:24:59 -0400338 {Opt_discard, "discard"},
Josef Bacik0af3d002010-06-21 14:48:16 -0400339 {Opt_space_cache, "space_cache"},
Josef Bacik88c2ba32010-09-21 14:21:34 -0400340 {Opt_clear_cache, "clear_cache"},
Sage Weil4260f7c2010-10-29 15:46:43 -0400341 {Opt_user_subvol_rm_allowed, "user_subvol_rm_allowed"},
Chris Mason91435652011-02-16 13:10:41 -0500342 {Opt_enospc_debug, "enospc_debug"},
Xin Zhonge15d0542011-04-06 07:33:51 +0000343 {Opt_subvolrootid, "subvolrootid=%d"},
Chris Mason4cb53002011-05-24 15:35:30 -0400344 {Opt_defrag, "autodefrag"},
Chris Mason4b9465c2011-06-03 09:36:29 -0400345 {Opt_inode_cache, "inode_cache"},
David Sterba89655932011-11-11 10:14:57 -0500346 {Opt_no_space_cache, "nospace_cache"},
Chris Masonaf31f5e2011-11-03 15:17:42 -0400347 {Opt_recovery, "recovery"},
Ilya Dryomov9555c6c2012-01-16 22:04:48 +0200348 {Opt_skip_balance, "skip_balance"},
Stefan Behrens21adbd52011-11-09 13:44:05 +0100349 {Opt_check_integrity, "check_int"},
350 {Opt_check_integrity_including_extent_data, "check_int_data"},
351 {Opt_check_integrity_print_mask, "check_int_print_mask=%d"},
Jeff Mahoney8c342932011-10-03 23:22:31 -0400352 {Opt_fatal_errors, "fatal_errors=%s"},
Josef Bacik33268ea2008-07-24 12:16:36 -0400353 {Opt_err, NULL},
Chris Mason95e05282007-08-29 09:11:44 -0400354};
355
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400356/*
357 * Regular mount options parser. Everything that is needed only when
358 * reading in a new superblock is parsed here.
Jeff Mahoney49b25e02012-03-01 17:24:58 +0100359 * XXX JDM: This needs to be cleaned up for remount.
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400360 */
361int btrfs_parse_options(struct btrfs_root *root, char *options)
Chris Mason95e05282007-08-29 09:11:44 -0400362{
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400363 struct btrfs_fs_info *info = root->fs_info;
Chris Mason95e05282007-08-29 09:11:44 -0400364 substring_t args[MAX_OPT_ARGS];
Josef Bacik73bc1872011-10-03 14:07:49 -0400365 char *p, *num, *orig = NULL;
366 u64 cache_gen;
Chris Mason4543df72008-06-11 21:47:56 -0400367 int intarg;
Sage Weila7a3f7c2009-11-07 06:19:16 +0000368 int ret = 0;
Li Zefan261507a02010-12-17 14:21:50 +0800369 char *compress_type;
370 bool compress_force = false;
Chris Masonb6cda9b2007-12-14 15:30:32 -0500371
David Sterba6c417612011-04-13 15:41:04 +0200372 cache_gen = btrfs_super_cache_generation(root->fs_info->super_copy);
Josef Bacik73bc1872011-10-03 14:07:49 -0400373 if (cache_gen)
374 btrfs_set_opt(info->mount_opt, SPACE_CACHE);
375
Chris Mason95e05282007-08-29 09:11:44 -0400376 if (!options)
Josef Bacik73bc1872011-10-03 14:07:49 -0400377 goto out;
Chris Mason95e05282007-08-29 09:11:44 -0400378
Chris Masonbe20aa92007-12-17 20:14:01 -0500379 /*
380 * strsep changes the string, duplicate it because parse_options
381 * gets called twice
382 */
383 options = kstrdup(options, GFP_NOFS);
384 if (!options)
385 return -ENOMEM;
386
Josef Bacikda495ec2010-02-25 20:38:35 +0000387 orig = options;
Chris Masonbe20aa92007-12-17 20:14:01 -0500388
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400389 while ((p = strsep(&options, ",")) != NULL) {
Chris Mason95e05282007-08-29 09:11:44 -0400390 int token;
391 if (!*p)
392 continue;
393
394 token = match_token(p, tokens, args);
395 switch (token) {
Chris Masondfe25022008-05-13 13:46:40 -0400396 case Opt_degraded:
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400397 printk(KERN_INFO "btrfs: allowing degraded mounts\n");
398 btrfs_set_opt(info->mount_opt, DEGRADED);
Chris Masondfe25022008-05-13 13:46:40 -0400399 break;
Chris Mason95e05282007-08-29 09:11:44 -0400400 case Opt_subvol:
Josef Bacik73f73412009-12-04 17:38:27 +0000401 case Opt_subvolid:
Xin Zhonge15d0542011-04-06 07:33:51 +0000402 case Opt_subvolrootid:
Christoph Hellwig43e570b2008-06-10 10:40:46 -0400403 case Opt_device:
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400404 /*
Christoph Hellwig43e570b2008-06-10 10:40:46 -0400405 * These are parsed by btrfs_parse_early_options
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400406 * and can be happily ignored here.
407 */
Chris Masonb6cda9b2007-12-14 15:30:32 -0500408 break;
409 case Opt_nodatasum:
Chris Mason067c28a2009-06-11 09:30:13 -0400410 printk(KERN_INFO "btrfs: setting nodatasum\n");
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400411 btrfs_set_opt(info->mount_opt, NODATASUM);
Chris Masonbe20aa92007-12-17 20:14:01 -0500412 break;
413 case Opt_nodatacow:
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400414 printk(KERN_INFO "btrfs: setting nodatacow\n");
415 btrfs_set_opt(info->mount_opt, NODATACOW);
416 btrfs_set_opt(info->mount_opt, NODATASUM);
Chris Mason95e05282007-08-29 09:11:44 -0400417 break;
Chris Masona555f812010-01-28 16:18:15 -0500418 case Opt_compress_force:
Li Zefan261507a02010-12-17 14:21:50 +0800419 case Opt_compress_force_type:
420 compress_force = true;
421 case Opt_compress:
422 case Opt_compress_type:
423 if (token == Opt_compress ||
424 token == Opt_compress_force ||
425 strcmp(args[0].from, "zlib") == 0) {
426 compress_type = "zlib";
427 info->compress_type = BTRFS_COMPRESS_ZLIB;
Arnd Hannemann063849e2012-04-16 15:27:51 +0200428 btrfs_set_opt(info->mount_opt, COMPRESS);
Li Zefana6fa6fa2010-10-25 15:12:26 +0800429 } else if (strcmp(args[0].from, "lzo") == 0) {
430 compress_type = "lzo";
431 info->compress_type = BTRFS_COMPRESS_LZO;
Arnd Hannemann063849e2012-04-16 15:27:51 +0200432 btrfs_set_opt(info->mount_opt, COMPRESS);
Mitch Harder2b0ce2c2012-07-24 11:58:43 -0600433 btrfs_set_fs_incompat(info, COMPRESS_LZO);
Arnd Hannemann063849e2012-04-16 15:27:51 +0200434 } else if (strncmp(args[0].from, "no", 2) == 0) {
435 compress_type = "no";
436 info->compress_type = BTRFS_COMPRESS_NONE;
437 btrfs_clear_opt(info->mount_opt, COMPRESS);
438 btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
439 compress_force = false;
Li Zefan261507a02010-12-17 14:21:50 +0800440 } else {
441 ret = -EINVAL;
442 goto out;
443 }
444
Li Zefan261507a02010-12-17 14:21:50 +0800445 if (compress_force) {
446 btrfs_set_opt(info->mount_opt, FORCE_COMPRESS);
447 pr_info("btrfs: force %s compression\n",
448 compress_type);
449 } else
450 pr_info("btrfs: use %s compression\n",
451 compress_type);
Chris Masona555f812010-01-28 16:18:15 -0500452 break;
Chris Masone18e4802008-01-18 10:54:22 -0500453 case Opt_ssd:
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400454 printk(KERN_INFO "btrfs: use ssd allocation scheme\n");
455 btrfs_set_opt(info->mount_opt, SSD);
Chris Masone18e4802008-01-18 10:54:22 -0500456 break;
Chris Mason451d7582009-06-09 20:28:34 -0400457 case Opt_ssd_spread:
458 printk(KERN_INFO "btrfs: use spread ssd "
459 "allocation scheme\n");
460 btrfs_set_opt(info->mount_opt, SSD);
461 btrfs_set_opt(info->mount_opt, SSD_SPREAD);
462 break;
Chris Mason3b30c222009-06-09 16:42:22 -0400463 case Opt_nossd:
Chris Mason451d7582009-06-09 20:28:34 -0400464 printk(KERN_INFO "btrfs: not using ssd allocation "
465 "scheme\n");
Chris Masonc2898112009-06-10 09:51:32 -0400466 btrfs_set_opt(info->mount_opt, NOSSD);
Chris Mason3b30c222009-06-09 16:42:22 -0400467 btrfs_clear_opt(info->mount_opt, SSD);
Chris Mason451d7582009-06-09 20:28:34 -0400468 btrfs_clear_opt(info->mount_opt, SSD_SPREAD);
Chris Mason3b30c222009-06-09 16:42:22 -0400469 break;
Chris Mason21ad10c2008-01-09 09:23:21 -0500470 case Opt_nobarrier:
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400471 printk(KERN_INFO "btrfs: turning off barriers\n");
472 btrfs_set_opt(info->mount_opt, NOBARRIER);
Chris Mason21ad10c2008-01-09 09:23:21 -0500473 break;
Chris Mason4543df72008-06-11 21:47:56 -0400474 case Opt_thread_pool:
475 intarg = 0;
476 match_int(&args[0], &intarg);
Sergei Trofimovich0d2450a2012-04-24 22:59:16 +0300477 if (intarg)
Chris Mason4543df72008-06-11 21:47:56 -0400478 info->thread_pool_size = intarg;
Chris Mason4543df72008-06-11 21:47:56 -0400479 break;
Chris Mason6f568d32008-01-29 16:03:38 -0500480 case Opt_max_inline:
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400481 num = match_strdup(&args[0]);
482 if (num) {
Akinobu Mita91748462010-02-28 10:59:11 +0000483 info->max_inline = memparse(num, NULL);
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400484 kfree(num);
Chris Mason6f568d32008-01-29 16:03:38 -0500485
Chris Mason15ada042008-06-11 16:51:38 -0400486 if (info->max_inline) {
487 info->max_inline = max_t(u64,
488 info->max_inline,
489 root->sectorsize);
490 }
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400491 printk(KERN_INFO "btrfs: max_inline at %llu\n",
Joel Becker21380932009-04-21 12:38:29 -0700492 (unsigned long long)info->max_inline);
Chris Mason6f568d32008-01-29 16:03:38 -0500493 }
494 break;
Chris Mason8f662a72008-01-02 10:01:11 -0500495 case Opt_alloc_start:
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400496 num = match_strdup(&args[0]);
497 if (num) {
Akinobu Mita91748462010-02-28 10:59:11 +0000498 info->alloc_start = memparse(num, NULL);
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400499 kfree(num);
500 printk(KERN_INFO
501 "btrfs: allocations start at %llu\n",
Joel Becker21380932009-04-21 12:38:29 -0700502 (unsigned long long)info->alloc_start);
Chris Mason8f662a72008-01-02 10:01:11 -0500503 }
504 break;
Josef Bacik33268ea2008-07-24 12:16:36 -0400505 case Opt_noacl:
506 root->fs_info->sb->s_flags &= ~MS_POSIXACL;
507 break;
Sage Weil3a5e1402009-04-02 16:49:40 -0400508 case Opt_notreelog:
509 printk(KERN_INFO "btrfs: disabling tree log\n");
510 btrfs_set_opt(info->mount_opt, NOTREELOG);
511 break;
Sage Weildccae992009-04-02 16:59:01 -0400512 case Opt_flushoncommit:
513 printk(KERN_INFO "btrfs: turning on flush-on-commit\n");
514 btrfs_set_opt(info->mount_opt, FLUSHONCOMMIT);
515 break;
Josef Bacik97e728d2009-04-21 17:40:57 -0400516 case Opt_ratio:
517 intarg = 0;
518 match_int(&args[0], &intarg);
519 if (intarg) {
520 info->metadata_ratio = intarg;
521 printk(KERN_INFO "btrfs: metadata ratio %d\n",
522 info->metadata_ratio);
523 }
524 break;
Christoph Hellwige244a0a2009-10-14 09:24:59 -0400525 case Opt_discard:
526 btrfs_set_opt(info->mount_opt, DISCARD);
527 break;
Josef Bacik0af3d002010-06-21 14:48:16 -0400528 case Opt_space_cache:
Josef Bacik0af3d002010-06-21 14:48:16 -0400529 btrfs_set_opt(info->mount_opt, SPACE_CACHE);
Josef Bacik0de90872010-11-19 13:40:41 +0000530 break;
Josef Bacik73bc1872011-10-03 14:07:49 -0400531 case Opt_no_space_cache:
532 printk(KERN_INFO "btrfs: disabling disk space caching\n");
533 btrfs_clear_opt(info->mount_opt, SPACE_CACHE);
534 break;
Chris Mason4b9465c2011-06-03 09:36:29 -0400535 case Opt_inode_cache:
536 printk(KERN_INFO "btrfs: enabling inode map caching\n");
537 btrfs_set_opt(info->mount_opt, INODE_MAP_CACHE);
538 break;
Josef Bacik88c2ba32010-09-21 14:21:34 -0400539 case Opt_clear_cache:
540 printk(KERN_INFO "btrfs: force clearing of disk cache\n");
541 btrfs_set_opt(info->mount_opt, CLEAR_CACHE);
Josef Bacik0af3d002010-06-21 14:48:16 -0400542 break;
Sage Weil4260f7c2010-10-29 15:46:43 -0400543 case Opt_user_subvol_rm_allowed:
544 btrfs_set_opt(info->mount_opt, USER_SUBVOL_RM_ALLOWED);
545 break;
Chris Mason91435652011-02-16 13:10:41 -0500546 case Opt_enospc_debug:
547 btrfs_set_opt(info->mount_opt, ENOSPC_DEBUG);
548 break;
Chris Mason4cb53002011-05-24 15:35:30 -0400549 case Opt_defrag:
550 printk(KERN_INFO "btrfs: enabling auto defrag");
551 btrfs_set_opt(info->mount_opt, AUTO_DEFRAG);
552 break;
Chris Masonaf31f5e2011-11-03 15:17:42 -0400553 case Opt_recovery:
554 printk(KERN_INFO "btrfs: enabling auto recovery");
555 btrfs_set_opt(info->mount_opt, RECOVERY);
556 break;
Ilya Dryomov9555c6c2012-01-16 22:04:48 +0200557 case Opt_skip_balance:
558 btrfs_set_opt(info->mount_opt, SKIP_BALANCE);
559 break;
Stefan Behrens21adbd52011-11-09 13:44:05 +0100560#ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY
561 case Opt_check_integrity_including_extent_data:
562 printk(KERN_INFO "btrfs: enabling check integrity"
563 " including extent data\n");
564 btrfs_set_opt(info->mount_opt,
565 CHECK_INTEGRITY_INCLUDING_EXTENT_DATA);
566 btrfs_set_opt(info->mount_opt, CHECK_INTEGRITY);
567 break;
568 case Opt_check_integrity:
569 printk(KERN_INFO "btrfs: enabling check integrity\n");
570 btrfs_set_opt(info->mount_opt, CHECK_INTEGRITY);
571 break;
572 case Opt_check_integrity_print_mask:
573 intarg = 0;
574 match_int(&args[0], &intarg);
575 if (intarg) {
576 info->check_integrity_print_mask = intarg;
577 printk(KERN_INFO "btrfs:"
578 " check_integrity_print_mask 0x%x\n",
579 info->check_integrity_print_mask);
580 }
581 break;
582#else
583 case Opt_check_integrity_including_extent_data:
584 case Opt_check_integrity:
585 case Opt_check_integrity_print_mask:
586 printk(KERN_ERR "btrfs: support for check_integrity*"
587 " not compiled in!\n");
588 ret = -EINVAL;
589 goto out;
590#endif
Jeff Mahoney8c342932011-10-03 23:22:31 -0400591 case Opt_fatal_errors:
592 if (strcmp(args[0].from, "panic") == 0)
593 btrfs_set_opt(info->mount_opt,
594 PANIC_ON_FATAL_ERROR);
595 else if (strcmp(args[0].from, "bug") == 0)
596 btrfs_clear_opt(info->mount_opt,
597 PANIC_ON_FATAL_ERROR);
598 else {
599 ret = -EINVAL;
600 goto out;
601 }
602 break;
Sage Weila7a3f7c2009-11-07 06:19:16 +0000603 case Opt_err:
604 printk(KERN_INFO "btrfs: unrecognized mount option "
605 "'%s'\n", p);
606 ret = -EINVAL;
607 goto out;
Chris Mason95e05282007-08-29 09:11:44 -0400608 default:
Chris Masonbe20aa92007-12-17 20:14:01 -0500609 break;
Chris Mason95e05282007-08-29 09:11:44 -0400610 }
611 }
Sage Weila7a3f7c2009-11-07 06:19:16 +0000612out:
Josef Bacik73bc1872011-10-03 14:07:49 -0400613 if (!ret && btrfs_test_opt(root, SPACE_CACHE))
614 printk(KERN_INFO "btrfs: disk space caching is enabled\n");
Josef Bacikda495ec2010-02-25 20:38:35 +0000615 kfree(orig);
Sage Weila7a3f7c2009-11-07 06:19:16 +0000616 return ret;
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400617}
618
619/*
620 * Parse mount options that are required early in the mount process.
621 *
622 * All other options will be parsed on much later in the mount process and
623 * only when we need to allocate a new super block.
624 */
Christoph Hellwig97288f22008-12-02 06:36:09 -0500625static int btrfs_parse_early_options(const char *options, fmode_t flags,
Josef Bacik73f73412009-12-04 17:38:27 +0000626 void *holder, char **subvol_name, u64 *subvol_objectid,
Xin Zhonge15d0542011-04-06 07:33:51 +0000627 u64 *subvol_rootid, struct btrfs_fs_devices **fs_devices)
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400628{
629 substring_t args[MAX_OPT_ARGS];
Jeff Liu83c8c9b2011-09-14 14:11:21 +0800630 char *device_name, *opts, *orig, *p;
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400631 int error = 0;
Josef Bacik73f73412009-12-04 17:38:27 +0000632 int intarg;
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400633
634 if (!options)
Josef Bacik830c4ad2011-07-25 15:55:42 -0400635 return 0;
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400636
637 /*
638 * strsep changes the string, duplicate it because parse_options
639 * gets called twice
640 */
641 opts = kstrdup(options, GFP_KERNEL);
642 if (!opts)
643 return -ENOMEM;
Tero Roponen3f3d0bc2010-12-27 16:43:13 +0800644 orig = opts;
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400645
646 while ((p = strsep(&opts, ",")) != NULL) {
647 int token;
648 if (!*p)
649 continue;
650
651 token = match_token(p, tokens, args);
652 switch (token) {
653 case Opt_subvol:
Ilya Dryomova90e8b62011-11-08 16:47:55 +0200654 kfree(*subvol_name);
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400655 *subvol_name = match_strdup(&args[0]);
656 break;
Josef Bacik73f73412009-12-04 17:38:27 +0000657 case Opt_subvolid:
658 intarg = 0;
Josef Bacik4849f01d2009-12-14 19:18:38 +0000659 error = match_int(&args[0], &intarg);
660 if (!error) {
661 /* we want the original fs_tree */
662 if (!intarg)
663 *subvol_objectid =
664 BTRFS_FS_TREE_OBJECTID;
665 else
666 *subvol_objectid = intarg;
667 }
Josef Bacik73f73412009-12-04 17:38:27 +0000668 break;
Xin Zhonge15d0542011-04-06 07:33:51 +0000669 case Opt_subvolrootid:
670 intarg = 0;
671 error = match_int(&args[0], &intarg);
672 if (!error) {
673 /* we want the original fs_tree */
674 if (!intarg)
675 *subvol_rootid =
676 BTRFS_FS_TREE_OBJECTID;
677 else
678 *subvol_rootid = intarg;
679 }
680 break;
Christoph Hellwig43e570b2008-06-10 10:40:46 -0400681 case Opt_device:
Jeff Liu83c8c9b2011-09-14 14:11:21 +0800682 device_name = match_strdup(&args[0]);
683 if (!device_name) {
684 error = -ENOMEM;
685 goto out;
686 }
687 error = btrfs_scan_one_device(device_name,
Christoph Hellwig43e570b2008-06-10 10:40:46 -0400688 flags, holder, fs_devices);
Jeff Liu83c8c9b2011-09-14 14:11:21 +0800689 kfree(device_name);
Christoph Hellwig43e570b2008-06-10 10:40:46 -0400690 if (error)
Josef Bacik830c4ad2011-07-25 15:55:42 -0400691 goto out;
Christoph Hellwig43e570b2008-06-10 10:40:46 -0400692 break;
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400693 default:
694 break;
695 }
696 }
697
Josef Bacik830c4ad2011-07-25 15:55:42 -0400698out:
Tero Roponen3f3d0bc2010-12-27 16:43:13 +0800699 kfree(orig);
Christoph Hellwigedf24ab2008-06-10 10:40:29 -0400700 return error;
Chris Mason95e05282007-08-29 09:11:44 -0400701}
702
Josef Bacik73f73412009-12-04 17:38:27 +0000703static struct dentry *get_default_root(struct super_block *sb,
704 u64 subvol_objectid)
705{
Al Viro815745c2011-11-17 15:40:49 -0500706 struct btrfs_fs_info *fs_info = btrfs_sb(sb);
707 struct btrfs_root *root = fs_info->tree_root;
Josef Bacik73f73412009-12-04 17:38:27 +0000708 struct btrfs_root *new_root;
709 struct btrfs_dir_item *di;
710 struct btrfs_path *path;
711 struct btrfs_key location;
712 struct inode *inode;
Josef Bacik73f73412009-12-04 17:38:27 +0000713 u64 dir_id;
714 int new = 0;
715
716 /*
717 * We have a specific subvol we want to mount, just setup location and
718 * go look up the root.
719 */
720 if (subvol_objectid) {
721 location.objectid = subvol_objectid;
722 location.type = BTRFS_ROOT_ITEM_KEY;
723 location.offset = (u64)-1;
724 goto find_root;
725 }
726
727 path = btrfs_alloc_path();
728 if (!path)
729 return ERR_PTR(-ENOMEM);
730 path->leave_spinning = 1;
731
732 /*
733 * Find the "default" dir item which points to the root item that we
734 * will mount by default if we haven't been given a specific subvolume
735 * to mount.
736 */
Al Viro815745c2011-11-17 15:40:49 -0500737 dir_id = btrfs_super_root_dir(fs_info->super_copy);
Josef Bacik73f73412009-12-04 17:38:27 +0000738 di = btrfs_lookup_dir_item(NULL, root, path, dir_id, "default", 7, 0);
Julia Lawallb0839162011-05-14 07:10:51 +0000739 if (IS_ERR(di)) {
740 btrfs_free_path(path);
Dan Carpenterfb4f6f92010-05-29 09:40:57 +0000741 return ERR_CAST(di);
Julia Lawallb0839162011-05-14 07:10:51 +0000742 }
Josef Bacik73f73412009-12-04 17:38:27 +0000743 if (!di) {
744 /*
745 * Ok the default dir item isn't there. This is weird since
746 * it's always been there, but don't freak out, just try and
747 * mount to root most subvolume.
748 */
749 btrfs_free_path(path);
750 dir_id = BTRFS_FIRST_FREE_OBJECTID;
Al Viro815745c2011-11-17 15:40:49 -0500751 new_root = fs_info->fs_root;
Josef Bacik73f73412009-12-04 17:38:27 +0000752 goto setup_root;
753 }
754
755 btrfs_dir_item_key_to_cpu(path->nodes[0], di, &location);
756 btrfs_free_path(path);
757
758find_root:
Al Viro815745c2011-11-17 15:40:49 -0500759 new_root = btrfs_read_fs_root_no_name(fs_info, &location);
Josef Bacik73f73412009-12-04 17:38:27 +0000760 if (IS_ERR(new_root))
Julia Lawalld0b678c2010-10-29 15:14:23 -0400761 return ERR_CAST(new_root);
Josef Bacik73f73412009-12-04 17:38:27 +0000762
763 if (btrfs_root_refs(&new_root->root_item) == 0)
764 return ERR_PTR(-ENOENT);
765
766 dir_id = btrfs_root_dirid(&new_root->root_item);
767setup_root:
768 location.objectid = dir_id;
769 location.type = BTRFS_INODE_ITEM_KEY;
770 location.offset = 0;
771
772 inode = btrfs_iget(sb, &location, new_root, &new);
Dan Carpenter4cbd1142010-05-29 09:42:19 +0000773 if (IS_ERR(inode))
774 return ERR_CAST(inode);
Josef Bacik73f73412009-12-04 17:38:27 +0000775
776 /*
777 * If we're just mounting the root most subvol put the inode and return
778 * a reference to the dentry. We will have already gotten a reference
779 * to the inode in btrfs_fill_super so we're good to go.
780 */
781 if (!new && sb->s_root->d_inode == inode) {
782 iput(inode);
783 return dget(sb->s_root);
784 }
785
Josef Bacikba5b8952011-07-25 15:40:35 -0400786 return d_obtain_alias(inode);
Josef Bacik73f73412009-12-04 17:38:27 +0000787}
788
Chris Masond3977122009-01-05 21:25:51 -0500789static int btrfs_fill_super(struct super_block *sb,
Chris Mason8a4b83c2008-03-24 15:02:07 -0400790 struct btrfs_fs_devices *fs_devices,
Chris Masond3977122009-01-05 21:25:51 -0500791 void *data, int silent)
Chris Mason2e635a22007-03-21 11:12:56 -0400792{
Chris Masond3977122009-01-05 21:25:51 -0500793 struct inode *inode;
Al Viro815745c2011-11-17 15:40:49 -0500794 struct btrfs_fs_info *fs_info = btrfs_sb(sb);
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400795 struct btrfs_key key;
Chris Mason39279cc2007-06-12 06:35:45 -0400796 int err;
Chris Mason2e635a22007-03-21 11:12:56 -0400797
798 sb->s_maxbytes = MAX_LFS_FILESIZE;
Chris Mason2e635a22007-03-21 11:12:56 -0400799 sb->s_magic = BTRFS_SUPER_MAGIC;
Chris Masone20d96d2007-03-22 12:13:20 -0400800 sb->s_op = &btrfs_super_ops;
Al Viroaf53d292010-12-20 10:56:06 -0500801 sb->s_d_op = &btrfs_dentry_operations;
Balaji Raobe6e8dc2008-07-21 02:01:56 +0530802 sb->s_export_op = &btrfs_export_ops;
Josef Bacik5103e942007-11-16 11:45:54 -0500803 sb->s_xattr = btrfs_xattr_handlers;
Chris Mason2e635a22007-03-21 11:12:56 -0400804 sb->s_time_gran = 1;
Chris Mason0eda2942009-10-13 13:50:18 -0400805#ifdef CONFIG_BTRFS_FS_POSIX_ACL
Josef Bacik33268ea2008-07-24 12:16:36 -0400806 sb->s_flags |= MS_POSIXACL;
Chris Ball49cf6f42009-09-29 13:51:04 -0400807#endif
Josef Bacik0c4d2d92012-04-05 15:03:02 -0400808 sb->s_flags |= MS_I_VERSION;
Al Viroad2b2c82011-11-17 01:10:02 -0500809 err = open_ctree(sb, fs_devices, (char *)data);
810 if (err) {
Chris Masone20d96d2007-03-22 12:13:20 -0400811 printk("btrfs: open_ctree failed\n");
Al Viroad2b2c82011-11-17 01:10:02 -0500812 return err;
Chris Masone20d96d2007-03-22 12:13:20 -0400813 }
Chris Masonb888db22007-08-27 16:49:44 -0400814
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400815 key.objectid = BTRFS_FIRST_FREE_OBJECTID;
816 key.type = BTRFS_INODE_ITEM_KEY;
817 key.offset = 0;
Al Viro98c70892011-11-17 01:00:31 -0500818 inode = btrfs_iget(sb, &key, fs_info->fs_root, NULL);
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400819 if (IS_ERR(inode)) {
820 err = PTR_ERR(inode);
Chris Mason39279cc2007-06-12 06:35:45 -0400821 goto fail_close;
822 }
Chris Mason2e635a22007-03-21 11:12:56 -0400823
Al Viro48fde702012-01-08 22:15:13 -0500824 sb->s_root = d_make_root(inode);
825 if (!sb->s_root) {
Chris Mason39279cc2007-06-12 06:35:45 -0400826 err = -ENOMEM;
827 goto fail_close;
Chris Mason2e635a22007-03-21 11:12:56 -0400828 }
Josef Bacik58176a92007-08-29 15:47:34 -0400829
Chris Mason6885f302008-02-20 16:11:05 -0500830 save_mount_options(sb, data);
Dan Magenheimer90a887c2011-05-26 10:01:56 -0600831 cleancache_init_fs(sb);
Al Viro59553ed2011-11-17 01:56:28 -0500832 sb->s_flags |= MS_ACTIVE;
Chris Mason2e635a22007-03-21 11:12:56 -0400833 return 0;
Chris Mason2e635a22007-03-21 11:12:56 -0400834
Chris Mason39279cc2007-06-12 06:35:45 -0400835fail_close:
Al Viro815745c2011-11-17 15:40:49 -0500836 close_ctree(fs_info->tree_root);
Chris Masond5719762007-03-23 10:01:08 -0400837 return err;
838}
839
Sage Weil6bf13c02008-06-10 10:07:39 -0400840int btrfs_sync_fs(struct super_block *sb, int wait)
Chris Masond5719762007-03-23 10:01:08 -0400841{
842 struct btrfs_trans_handle *trans;
Al Viro815745c2011-11-17 15:40:49 -0500843 struct btrfs_fs_info *fs_info = btrfs_sb(sb);
844 struct btrfs_root *root = fs_info->tree_root;
Chris Masond5719762007-03-23 10:01:08 -0400845 int ret;
Chris Masondf2ce342007-03-23 11:00:45 -0400846
liubo1abe9b82011-03-24 11:18:59 +0000847 trace_btrfs_sync_fs(wait);
848
Chris Masond561c022007-03-23 19:47:49 -0400849 if (!wait) {
Al Viro815745c2011-11-17 15:40:49 -0500850 filemap_flush(fs_info->btree_inode->i_mapping);
Chris Masond561c022007-03-23 19:47:49 -0400851 return 0;
852 }
Chris Mason771ed682008-11-06 22:02:51 -0500853
Yan, Zheng24bbcf02009-11-12 09:36:34 +0000854 btrfs_wait_ordered_extents(root, 0, 0);
Chris Mason771ed682008-11-06 22:02:51 -0500855
Yan, Zhenga22285a2010-05-16 10:48:46 -0400856 trans = btrfs_start_transaction(root, 0);
Tsutomu Itoh98d5dc12011-01-20 06:19:37 +0000857 if (IS_ERR(trans))
858 return PTR_ERR(trans);
Chris Masond5719762007-03-23 10:01:08 -0400859 ret = btrfs_commit_transaction(trans, root);
Chris Mason54aa1f42007-06-22 14:16:25 -0400860 return ret;
Chris Masond5719762007-03-23 10:01:08 -0400861}
862
Al Viro34c80b12011-12-08 21:32:45 -0500863static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry)
Eric Parisa9572a12009-04-02 16:46:06 -0400864{
Al Viro815745c2011-11-17 15:40:49 -0500865 struct btrfs_fs_info *info = btrfs_sb(dentry->d_sb);
866 struct btrfs_root *root = info->tree_root;
Tsutomu Itoh200da642011-03-31 00:44:29 +0000867 char *compress_type;
Eric Parisa9572a12009-04-02 16:46:06 -0400868
869 if (btrfs_test_opt(root, DEGRADED))
870 seq_puts(seq, ",degraded");
871 if (btrfs_test_opt(root, NODATASUM))
872 seq_puts(seq, ",nodatasum");
873 if (btrfs_test_opt(root, NODATACOW))
874 seq_puts(seq, ",nodatacow");
875 if (btrfs_test_opt(root, NOBARRIER))
876 seq_puts(seq, ",nobarrier");
Eric Parisa9572a12009-04-02 16:46:06 -0400877 if (info->max_inline != 8192 * 1024)
Joel Becker21380932009-04-21 12:38:29 -0700878 seq_printf(seq, ",max_inline=%llu",
879 (unsigned long long)info->max_inline);
Eric Parisa9572a12009-04-02 16:46:06 -0400880 if (info->alloc_start != 0)
Joel Becker21380932009-04-21 12:38:29 -0700881 seq_printf(seq, ",alloc_start=%llu",
882 (unsigned long long)info->alloc_start);
Eric Parisa9572a12009-04-02 16:46:06 -0400883 if (info->thread_pool_size != min_t(unsigned long,
884 num_online_cpus() + 2, 8))
885 seq_printf(seq, ",thread_pool=%d", info->thread_pool_size);
Tsutomu Itoh200da642011-03-31 00:44:29 +0000886 if (btrfs_test_opt(root, COMPRESS)) {
887 if (info->compress_type == BTRFS_COMPRESS_ZLIB)
888 compress_type = "zlib";
889 else
890 compress_type = "lzo";
891 if (btrfs_test_opt(root, FORCE_COMPRESS))
892 seq_printf(seq, ",compress-force=%s", compress_type);
893 else
894 seq_printf(seq, ",compress=%s", compress_type);
895 }
Chris Masonc2898112009-06-10 09:51:32 -0400896 if (btrfs_test_opt(root, NOSSD))
897 seq_puts(seq, ",nossd");
Chris Mason451d7582009-06-09 20:28:34 -0400898 if (btrfs_test_opt(root, SSD_SPREAD))
899 seq_puts(seq, ",ssd_spread");
900 else if (btrfs_test_opt(root, SSD))
Eric Parisa9572a12009-04-02 16:46:06 -0400901 seq_puts(seq, ",ssd");
Sage Weil3a5e1402009-04-02 16:49:40 -0400902 if (btrfs_test_opt(root, NOTREELOG))
Sage Weil6b65c5c2009-05-14 13:52:21 -0400903 seq_puts(seq, ",notreelog");
Sage Weildccae992009-04-02 16:59:01 -0400904 if (btrfs_test_opt(root, FLUSHONCOMMIT))
Sage Weil6b65c5c2009-05-14 13:52:21 -0400905 seq_puts(seq, ",flushoncommit");
Matthew Wilcox20a52392009-12-14 22:01:12 +0000906 if (btrfs_test_opt(root, DISCARD))
907 seq_puts(seq, ",discard");
Eric Parisa9572a12009-04-02 16:46:06 -0400908 if (!(root->fs_info->sb->s_flags & MS_POSIXACL))
909 seq_puts(seq, ",noacl");
Tsutomu Itoh200da642011-03-31 00:44:29 +0000910 if (btrfs_test_opt(root, SPACE_CACHE))
911 seq_puts(seq, ",space_cache");
Josef Bacik73bc1872011-10-03 14:07:49 -0400912 else
David Sterba89655932011-11-11 10:14:57 -0500913 seq_puts(seq, ",nospace_cache");
Tsutomu Itoh200da642011-03-31 00:44:29 +0000914 if (btrfs_test_opt(root, CLEAR_CACHE))
915 seq_puts(seq, ",clear_cache");
916 if (btrfs_test_opt(root, USER_SUBVOL_RM_ALLOWED))
917 seq_puts(seq, ",user_subvol_rm_allowed");
David Sterba0942caa2011-06-28 15:10:37 +0000918 if (btrfs_test_opt(root, ENOSPC_DEBUG))
919 seq_puts(seq, ",enospc_debug");
920 if (btrfs_test_opt(root, AUTO_DEFRAG))
921 seq_puts(seq, ",autodefrag");
922 if (btrfs_test_opt(root, INODE_MAP_CACHE))
923 seq_puts(seq, ",inode_cache");
Ilya Dryomov9555c6c2012-01-16 22:04:48 +0200924 if (btrfs_test_opt(root, SKIP_BALANCE))
925 seq_puts(seq, ",skip_balance");
Jeff Mahoney8c342932011-10-03 23:22:31 -0400926 if (btrfs_test_opt(root, PANIC_ON_FATAL_ERROR))
927 seq_puts(seq, ",fatal_errors=panic");
Eric Parisa9572a12009-04-02 16:46:06 -0400928 return 0;
929}
930
Chris Masona061fc82008-05-07 11:43:44 -0400931static int btrfs_test_super(struct super_block *s, void *data)
Chris Mason2e635a22007-03-21 11:12:56 -0400932{
Al Viro815745c2011-11-17 15:40:49 -0500933 struct btrfs_fs_info *p = data;
934 struct btrfs_fs_info *fs_info = btrfs_sb(s);
Yan4b82d6e2007-08-29 09:11:44 -0400935
Al Viro815745c2011-11-17 15:40:49 -0500936 return fs_info->fs_devices == p->fs_devices;
Yan4b82d6e2007-08-29 09:11:44 -0400937}
938
Josef Bacik450ba0e2010-11-19 14:59:15 -0500939static int btrfs_set_super(struct super_block *s, void *data)
940{
Al Viro6de1d092011-11-17 01:29:09 -0500941 int err = set_anon_super(s, data);
942 if (!err)
943 s->s_fs_info = data;
944 return err;
Josef Bacik450ba0e2010-11-19 14:59:15 -0500945}
946
Josef Bacik830c4ad2011-07-25 15:55:42 -0400947/*
David Sterbaf9d9ef62011-09-29 13:11:33 +0200948 * subvolumes are identified by ino 256
949 */
950static inline int is_subvolume_inode(struct inode *inode)
951{
952 if (inode && inode->i_ino == BTRFS_FIRST_FREE_OBJECTID)
953 return 1;
954 return 0;
955}
956
957/*
Josef Bacik830c4ad2011-07-25 15:55:42 -0400958 * This will strip out the subvol=%s argument for an argument string and add
959 * subvolid=0 to make sure we get the actual tree root for path walking to the
960 * subvol we want.
961 */
962static char *setup_root_args(char *args)
963{
Jim Meyeringf60d16a2012-04-25 21:24:17 +0200964 unsigned len = strlen(args) + 2 + 1;
965 char *src, *dst, *buf;
Josef Bacik830c4ad2011-07-25 15:55:42 -0400966
967 /*
Jim Meyeringf60d16a2012-04-25 21:24:17 +0200968 * We need the same args as before, but with this substitution:
969 * s!subvol=[^,]+!subvolid=0!
Josef Bacik830c4ad2011-07-25 15:55:42 -0400970 *
Jim Meyeringf60d16a2012-04-25 21:24:17 +0200971 * Since the replacement string is up to 2 bytes longer than the
972 * original, allocate strlen(args) + 2 + 1 bytes.
Josef Bacik830c4ad2011-07-25 15:55:42 -0400973 */
Josef Bacik830c4ad2011-07-25 15:55:42 -0400974
Jim Meyeringf60d16a2012-04-25 21:24:17 +0200975 src = strstr(args, "subvol=");
Josef Bacik830c4ad2011-07-25 15:55:42 -0400976 /* This shouldn't happen, but just in case.. */
Jim Meyeringf60d16a2012-04-25 21:24:17 +0200977 if (!src)
Josef Bacik830c4ad2011-07-25 15:55:42 -0400978 return NULL;
Jim Meyeringf60d16a2012-04-25 21:24:17 +0200979
980 buf = dst = kmalloc(len, GFP_NOFS);
981 if (!buf)
982 return NULL;
Josef Bacik830c4ad2011-07-25 15:55:42 -0400983
984 /*
Jim Meyeringf60d16a2012-04-25 21:24:17 +0200985 * If the subvol= arg is not at the start of the string,
986 * copy whatever precedes it into buf.
Josef Bacik830c4ad2011-07-25 15:55:42 -0400987 */
Jim Meyeringf60d16a2012-04-25 21:24:17 +0200988 if (src != args) {
989 *src++ = '\0';
990 strcpy(buf, args);
991 dst += strlen(args);
Josef Bacik830c4ad2011-07-25 15:55:42 -0400992 }
993
Jim Meyeringf60d16a2012-04-25 21:24:17 +0200994 strcpy(dst, "subvolid=0");
995 dst += strlen("subvolid=0");
Josef Bacik830c4ad2011-07-25 15:55:42 -0400996
997 /*
Jim Meyeringf60d16a2012-04-25 21:24:17 +0200998 * If there is a "," after the original subvol=... string,
999 * copy that suffix into our buffer. Otherwise, we're done.
Josef Bacik830c4ad2011-07-25 15:55:42 -04001000 */
Jim Meyeringf60d16a2012-04-25 21:24:17 +02001001 src = strchr(src, ',');
1002 if (src)
1003 strcpy(dst, src);
Josef Bacik830c4ad2011-07-25 15:55:42 -04001004
Jim Meyeringf60d16a2012-04-25 21:24:17 +02001005 return buf;
Josef Bacik830c4ad2011-07-25 15:55:42 -04001006}
1007
1008static struct dentry *mount_subvol(const char *subvol_name, int flags,
1009 const char *device_name, char *data)
1010{
Josef Bacik830c4ad2011-07-25 15:55:42 -04001011 struct dentry *root;
1012 struct vfsmount *mnt;
Josef Bacik830c4ad2011-07-25 15:55:42 -04001013 char *newargs;
Josef Bacik830c4ad2011-07-25 15:55:42 -04001014
1015 newargs = setup_root_args(data);
1016 if (!newargs)
1017 return ERR_PTR(-ENOMEM);
1018 mnt = vfs_kern_mount(&btrfs_fs_type, flags, device_name,
1019 newargs);
1020 kfree(newargs);
1021 if (IS_ERR(mnt))
1022 return ERR_CAST(mnt);
1023
Al Viroea441d12011-11-16 21:43:59 -05001024 root = mount_subtree(mnt, subvol_name);
Josef Bacik830c4ad2011-07-25 15:55:42 -04001025
Al Viroea441d12011-11-16 21:43:59 -05001026 if (!IS_ERR(root) && !is_subvolume_inode(root->d_inode)) {
1027 struct super_block *s = root->d_sb;
1028 dput(root);
1029 root = ERR_PTR(-EINVAL);
1030 deactivate_locked_super(s);
David Sterbaf9d9ef62011-09-29 13:11:33 +02001031 printk(KERN_ERR "btrfs: '%s' is not a valid subvolume\n",
1032 subvol_name);
David Sterbaf9d9ef62011-09-29 13:11:33 +02001033 }
1034
Josef Bacik830c4ad2011-07-25 15:55:42 -04001035 return root;
1036}
Josef Bacik450ba0e2010-11-19 14:59:15 -05001037
Christoph Hellwigedf24ab2008-06-10 10:40:29 -04001038/*
1039 * Find a superblock for the given device / mount point.
1040 *
1041 * Note: This is based on get_sb_bdev from fs/super.c with a few additions
1042 * for multiple device setup. Make sure to keep it in sync.
1043 */
Al Viro061dbc62010-07-26 16:21:33 +04001044static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
David Sterba306e16c2011-04-19 14:29:38 +02001045 const char *device_name, void *data)
Yan4b82d6e2007-08-29 09:11:44 -04001046{
1047 struct block_device *bdev = NULL;
1048 struct super_block *s;
1049 struct dentry *root;
Chris Mason8a4b83c2008-03-24 15:02:07 -04001050 struct btrfs_fs_devices *fs_devices = NULL;
Josef Bacik450ba0e2010-11-19 14:59:15 -05001051 struct btrfs_fs_info *fs_info = NULL;
Christoph Hellwig97288f22008-12-02 06:36:09 -05001052 fmode_t mode = FMODE_READ;
Josef Bacik73f73412009-12-04 17:38:27 +00001053 char *subvol_name = NULL;
1054 u64 subvol_objectid = 0;
Xin Zhonge15d0542011-04-06 07:33:51 +00001055 u64 subvol_rootid = 0;
Yan4b82d6e2007-08-29 09:11:44 -04001056 int error = 0;
1057
Christoph Hellwig97288f22008-12-02 06:36:09 -05001058 if (!(flags & MS_RDONLY))
1059 mode |= FMODE_WRITE;
1060
1061 error = btrfs_parse_early_options(data, mode, fs_type,
Josef Bacik73f73412009-12-04 17:38:27 +00001062 &subvol_name, &subvol_objectid,
Xin Zhonge15d0542011-04-06 07:33:51 +00001063 &subvol_rootid, &fs_devices);
Ilya Dryomovf23c8af2011-11-08 19:15:05 +02001064 if (error) {
1065 kfree(subvol_name);
Al Viro061dbc62010-07-26 16:21:33 +04001066 return ERR_PTR(error);
Ilya Dryomovf23c8af2011-11-08 19:15:05 +02001067 }
Christoph Hellwigedf24ab2008-06-10 10:40:29 -04001068
Josef Bacik830c4ad2011-07-25 15:55:42 -04001069 if (subvol_name) {
1070 root = mount_subvol(subvol_name, flags, device_name, data);
1071 kfree(subvol_name);
1072 return root;
1073 }
1074
David Sterba306e16c2011-04-19 14:29:38 +02001075 error = btrfs_scan_one_device(device_name, mode, fs_type, &fs_devices);
Chris Mason8a4b83c2008-03-24 15:02:07 -04001076 if (error)
Josef Bacik830c4ad2011-07-25 15:55:42 -04001077 return ERR_PTR(error);
Yan4b82d6e2007-08-29 09:11:44 -04001078
Josef Bacik450ba0e2010-11-19 14:59:15 -05001079 /*
1080 * Setup a dummy root and fs_info for test/set super. This is because
1081 * we don't actually fill this stuff out until open_ctree, but we need
1082 * it for searching for existing supers, so this lets us do that and
1083 * then open_ctree will properly initialize everything later.
1084 */
1085 fs_info = kzalloc(sizeof(struct btrfs_fs_info), GFP_NOFS);
Ilya Dryomov04d21a22011-11-09 14:41:22 +02001086 if (!fs_info)
1087 return ERR_PTR(-ENOMEM);
1088
Josef Bacik450ba0e2010-11-19 14:59:15 -05001089 fs_info->fs_devices = fs_devices;
Josef Bacik450ba0e2010-11-19 14:59:15 -05001090
David Sterba6c417612011-04-13 15:41:04 +02001091 fs_info->super_copy = kzalloc(BTRFS_SUPER_INFO_SIZE, GFP_NOFS);
1092 fs_info->super_for_commit = kzalloc(BTRFS_SUPER_INFO_SIZE, GFP_NOFS);
1093 if (!fs_info->super_copy || !fs_info->super_for_commit) {
1094 error = -ENOMEM;
Ilya Dryomov04d21a22011-11-09 14:41:22 +02001095 goto error_fs_info;
1096 }
1097
1098 error = btrfs_open_devices(fs_devices, mode, fs_type);
1099 if (error)
1100 goto error_fs_info;
1101
1102 if (!(flags & MS_RDONLY) && fs_devices->rw_devices == 0) {
1103 error = -EACCES;
David Sterba6c417612011-04-13 15:41:04 +02001104 goto error_close_devices;
1105 }
1106
Chris Masondfe25022008-05-13 13:46:40 -04001107 bdev = fs_devices->latest_bdev;
David Howells9249e172012-06-25 12:55:37 +01001108 s = sget(fs_type, btrfs_test_super, btrfs_set_super, flags | MS_NOSEC,
1109 fs_info);
Josef Bacik830c4ad2011-07-25 15:55:42 -04001110 if (IS_ERR(s)) {
1111 error = PTR_ERR(s);
1112 goto error_close_devices;
1113 }
Yan4b82d6e2007-08-29 09:11:44 -04001114
1115 if (s->s_root) {
Yan Zheng2b820322008-11-17 21:11:30 -05001116 btrfs_close_devices(fs_devices);
David Sterba6c417612011-04-13 15:41:04 +02001117 free_fs_info(fs_info);
Al Viro59553ed2011-11-17 01:56:28 -05001118 if ((flags ^ s->s_flags) & MS_RDONLY)
1119 error = -EBUSY;
Yan4b82d6e2007-08-29 09:11:44 -04001120 } else {
1121 char b[BDEVNAME_SIZE];
1122
Yan4b82d6e2007-08-29 09:11:44 -04001123 strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
Al Viro815745c2011-11-17 15:40:49 -05001124 btrfs_sb(s)->bdev_holder = fs_type;
Chris Mason8a4b83c2008-03-24 15:02:07 -04001125 error = btrfs_fill_super(s, fs_devices, data,
1126 flags & MS_SILENT ? 1 : 0);
Yan4b82d6e2007-08-29 09:11:44 -04001127 }
1128
Al Viro59553ed2011-11-17 01:56:28 -05001129 root = !error ? get_default_root(s, subvol_objectid) : ERR_PTR(error);
1130 if (IS_ERR(root))
Josef Bacik830c4ad2011-07-25 15:55:42 -04001131 deactivate_locked_super(s);
Yan4b82d6e2007-08-29 09:11:44 -04001132
Al Viro061dbc62010-07-26 16:21:33 +04001133 return root;
Yan4b82d6e2007-08-29 09:11:44 -04001134
Yan Zhengc146afa2008-11-12 14:34:12 -05001135error_close_devices:
Chris Mason8a4b83c2008-03-24 15:02:07 -04001136 btrfs_close_devices(fs_devices);
Ilya Dryomov04d21a22011-11-09 14:41:22 +02001137error_fs_info:
David Sterba6c417612011-04-13 15:41:04 +02001138 free_fs_info(fs_info);
Al Viro061dbc62010-07-26 16:21:33 +04001139 return ERR_PTR(error);
Yan4b82d6e2007-08-29 09:11:44 -04001140}
Chris Mason2e635a22007-03-21 11:12:56 -04001141
Sergei Trofimovich0d2450a2012-04-24 22:59:16 +03001142static void btrfs_set_max_workers(struct btrfs_workers *workers, int new_limit)
1143{
1144 spin_lock_irq(&workers->lock);
1145 workers->max_workers = new_limit;
1146 spin_unlock_irq(&workers->lock);
1147}
1148
1149static void btrfs_resize_thread_pool(struct btrfs_fs_info *fs_info,
1150 int new_pool_size, int old_pool_size)
1151{
1152 if (new_pool_size == old_pool_size)
1153 return;
1154
1155 fs_info->thread_pool_size = new_pool_size;
1156
1157 printk(KERN_INFO "btrfs: resize thread pool %d -> %d\n",
1158 old_pool_size, new_pool_size);
1159
1160 btrfs_set_max_workers(&fs_info->generic_worker, new_pool_size);
1161 btrfs_set_max_workers(&fs_info->workers, new_pool_size);
1162 btrfs_set_max_workers(&fs_info->delalloc_workers, new_pool_size);
1163 btrfs_set_max_workers(&fs_info->submit_workers, new_pool_size);
1164 btrfs_set_max_workers(&fs_info->caching_workers, new_pool_size);
1165 btrfs_set_max_workers(&fs_info->fixup_workers, new_pool_size);
1166 btrfs_set_max_workers(&fs_info->endio_workers, new_pool_size);
1167 btrfs_set_max_workers(&fs_info->endio_meta_workers, new_pool_size);
1168 btrfs_set_max_workers(&fs_info->endio_meta_write_workers, new_pool_size);
1169 btrfs_set_max_workers(&fs_info->endio_write_workers, new_pool_size);
1170 btrfs_set_max_workers(&fs_info->endio_freespace_worker, new_pool_size);
1171 btrfs_set_max_workers(&fs_info->delayed_workers, new_pool_size);
1172 btrfs_set_max_workers(&fs_info->readahead_workers, new_pool_size);
1173 btrfs_set_max_workers(&fs_info->scrub_workers, new_pool_size);
1174}
1175
Yan Zhengc146afa2008-11-12 14:34:12 -05001176static int btrfs_remount(struct super_block *sb, int *flags, char *data)
1177{
Al Viro815745c2011-11-17 15:40:49 -05001178 struct btrfs_fs_info *fs_info = btrfs_sb(sb);
1179 struct btrfs_root *root = fs_info->tree_root;
Jeff Mahoney49b25e02012-03-01 17:24:58 +01001180 unsigned old_flags = sb->s_flags;
1181 unsigned long old_opts = fs_info->mount_opt;
1182 unsigned long old_compress_type = fs_info->compress_type;
1183 u64 old_max_inline = fs_info->max_inline;
1184 u64 old_alloc_start = fs_info->alloc_start;
1185 int old_thread_pool_size = fs_info->thread_pool_size;
1186 unsigned int old_metadata_ratio = fs_info->metadata_ratio;
Yan Zhengc146afa2008-11-12 14:34:12 -05001187 int ret;
1188
Chris Masonb2880522009-02-12 09:37:35 -05001189 ret = btrfs_parse_options(root, data);
Jeff Mahoney49b25e02012-03-01 17:24:58 +01001190 if (ret) {
1191 ret = -EINVAL;
1192 goto restore;
1193 }
Chris Masonb2880522009-02-12 09:37:35 -05001194
Sergei Trofimovich0d2450a2012-04-24 22:59:16 +03001195 btrfs_resize_thread_pool(fs_info,
1196 fs_info->thread_pool_size, old_thread_pool_size);
1197
Yan Zhengc146afa2008-11-12 14:34:12 -05001198 if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
1199 return 0;
1200
1201 if (*flags & MS_RDONLY) {
1202 sb->s_flags |= MS_RDONLY;
1203
Jeff Mahoney49b25e02012-03-01 17:24:58 +01001204 ret = btrfs_commit_super(root);
1205 if (ret)
1206 goto restore;
Yan Zhengc146afa2008-11-12 14:34:12 -05001207 } else {
Sergei Trofimovich8a3db182012-04-16 06:44:37 +03001208 if (fs_info->fs_devices->rw_devices == 0) {
Jeff Mahoney49b25e02012-03-01 17:24:58 +01001209 ret = -EACCES;
1210 goto restore;
Sergei Trofimovich8a3db182012-04-16 06:44:37 +03001211 }
Yan Zheng2b820322008-11-17 21:11:30 -05001212
Sergei Trofimovich8a3db182012-04-16 06:44:37 +03001213 if (btrfs_super_log_root(fs_info->super_copy) != 0) {
Jeff Mahoney49b25e02012-03-01 17:24:58 +01001214 ret = -EINVAL;
1215 goto restore;
Sergei Trofimovich8a3db182012-04-16 06:44:37 +03001216 }
Yan Zhengc146afa2008-11-12 14:34:12 -05001217
Al Viro815745c2011-11-17 15:40:49 -05001218 ret = btrfs_cleanup_fs_roots(fs_info);
Jeff Mahoney49b25e02012-03-01 17:24:58 +01001219 if (ret)
1220 goto restore;
Yan Zhengc146afa2008-11-12 14:34:12 -05001221
Yan, Zhengd68fc572010-05-16 10:49:58 -04001222 /* recover relocation */
1223 ret = btrfs_recover_relocation(root);
Jeff Mahoney49b25e02012-03-01 17:24:58 +01001224 if (ret)
1225 goto restore;
Yan Zhengc146afa2008-11-12 14:34:12 -05001226
Ilya Dryomov2b6ba622012-06-22 12:24:13 -06001227 ret = btrfs_resume_balance_async(fs_info);
1228 if (ret)
1229 goto restore;
1230
Yan Zhengc146afa2008-11-12 14:34:12 -05001231 sb->s_flags &= ~MS_RDONLY;
1232 }
1233
1234 return 0;
Jeff Mahoney49b25e02012-03-01 17:24:58 +01001235
1236restore:
1237 /* We've hit an error - don't reset MS_RDONLY */
1238 if (sb->s_flags & MS_RDONLY)
1239 old_flags |= MS_RDONLY;
1240 sb->s_flags = old_flags;
1241 fs_info->mount_opt = old_opts;
1242 fs_info->compress_type = old_compress_type;
1243 fs_info->max_inline = old_max_inline;
1244 fs_info->alloc_start = old_alloc_start;
Sergei Trofimovich0d2450a2012-04-24 22:59:16 +03001245 btrfs_resize_thread_pool(fs_info,
1246 old_thread_pool_size, fs_info->thread_pool_size);
Jeff Mahoney49b25e02012-03-01 17:24:58 +01001247 fs_info->metadata_ratio = old_metadata_ratio;
1248 return ret;
Yan Zhengc146afa2008-11-12 14:34:12 -05001249}
1250
Arne Jansenbcd53742011-04-12 10:43:21 +02001251/* Used to sort the devices by max_avail(descending sort) */
1252static int btrfs_cmp_device_free_bytes(const void *dev_info1,
1253 const void *dev_info2)
1254{
1255 if (((struct btrfs_device_info *)dev_info1)->max_avail >
1256 ((struct btrfs_device_info *)dev_info2)->max_avail)
1257 return -1;
1258 else if (((struct btrfs_device_info *)dev_info1)->max_avail <
1259 ((struct btrfs_device_info *)dev_info2)->max_avail)
1260 return 1;
1261 else
1262 return 0;
1263}
1264
1265/*
1266 * sort the devices by max_avail, in which max free extent size of each device
1267 * is stored.(Descending Sort)
1268 */
1269static inline void btrfs_descending_sort_devices(
1270 struct btrfs_device_info *devices,
1271 size_t nr_devices)
1272{
1273 sort(devices, nr_devices, sizeof(struct btrfs_device_info),
1274 btrfs_cmp_device_free_bytes, NULL);
1275}
1276
Miao Xie6d07bce2011-01-05 10:07:31 +00001277/*
1278 * The helper to calc the free space on the devices that can be used to store
1279 * file data.
1280 */
1281static int btrfs_calc_avail_data_space(struct btrfs_root *root, u64 *free_bytes)
1282{
1283 struct btrfs_fs_info *fs_info = root->fs_info;
1284 struct btrfs_device_info *devices_info;
1285 struct btrfs_fs_devices *fs_devices = fs_info->fs_devices;
1286 struct btrfs_device *device;
1287 u64 skip_space;
1288 u64 type;
1289 u64 avail_space;
1290 u64 used_space;
1291 u64 min_stripe_size;
Miao Xie39fb26c2011-12-14 20:12:02 -05001292 int min_stripes = 1, num_stripes = 1;
Miao Xie6d07bce2011-01-05 10:07:31 +00001293 int i = 0, nr_devices;
1294 int ret;
1295
Li Zefanb772a862011-11-28 16:43:00 +08001296 nr_devices = fs_info->fs_devices->open_devices;
Miao Xie6d07bce2011-01-05 10:07:31 +00001297 BUG_ON(!nr_devices);
1298
1299 devices_info = kmalloc(sizeof(*devices_info) * nr_devices,
1300 GFP_NOFS);
1301 if (!devices_info)
1302 return -ENOMEM;
1303
1304 /* calc min stripe number for data space alloction */
1305 type = btrfs_get_alloc_profile(root, 1);
Miao Xie39fb26c2011-12-14 20:12:02 -05001306 if (type & BTRFS_BLOCK_GROUP_RAID0) {
Miao Xie6d07bce2011-01-05 10:07:31 +00001307 min_stripes = 2;
Miao Xie39fb26c2011-12-14 20:12:02 -05001308 num_stripes = nr_devices;
1309 } else if (type & BTRFS_BLOCK_GROUP_RAID1) {
Miao Xie6d07bce2011-01-05 10:07:31 +00001310 min_stripes = 2;
Miao Xie39fb26c2011-12-14 20:12:02 -05001311 num_stripes = 2;
1312 } else if (type & BTRFS_BLOCK_GROUP_RAID10) {
Miao Xie6d07bce2011-01-05 10:07:31 +00001313 min_stripes = 4;
Miao Xie39fb26c2011-12-14 20:12:02 -05001314 num_stripes = 4;
1315 }
Miao Xie6d07bce2011-01-05 10:07:31 +00001316
1317 if (type & BTRFS_BLOCK_GROUP_DUP)
1318 min_stripe_size = 2 * BTRFS_STRIPE_LEN;
1319 else
1320 min_stripe_size = BTRFS_STRIPE_LEN;
1321
Li Zefanb772a862011-11-28 16:43:00 +08001322 list_for_each_entry(device, &fs_devices->devices, dev_list) {
1323 if (!device->in_fs_metadata || !device->bdev)
Miao Xie6d07bce2011-01-05 10:07:31 +00001324 continue;
1325
1326 avail_space = device->total_bytes - device->bytes_used;
1327
1328 /* align with stripe_len */
1329 do_div(avail_space, BTRFS_STRIPE_LEN);
1330 avail_space *= BTRFS_STRIPE_LEN;
1331
1332 /*
1333 * In order to avoid overwritting the superblock on the drive,
1334 * btrfs starts at an offset of at least 1MB when doing chunk
1335 * allocation.
1336 */
1337 skip_space = 1024 * 1024;
1338
1339 /* user can set the offset in fs_info->alloc_start. */
1340 if (fs_info->alloc_start + BTRFS_STRIPE_LEN <=
1341 device->total_bytes)
1342 skip_space = max(fs_info->alloc_start, skip_space);
1343
1344 /*
1345 * btrfs can not use the free space in [0, skip_space - 1],
1346 * we must subtract it from the total. In order to implement
1347 * it, we account the used space in this range first.
1348 */
1349 ret = btrfs_account_dev_extents_size(device, 0, skip_space - 1,
1350 &used_space);
1351 if (ret) {
1352 kfree(devices_info);
1353 return ret;
1354 }
1355
1356 /* calc the free space in [0, skip_space - 1] */
1357 skip_space -= used_space;
1358
1359 /*
1360 * we can use the free space in [0, skip_space - 1], subtract
1361 * it from the total.
1362 */
1363 if (avail_space && avail_space >= skip_space)
1364 avail_space -= skip_space;
1365 else
1366 avail_space = 0;
1367
1368 if (avail_space < min_stripe_size)
1369 continue;
1370
1371 devices_info[i].dev = device;
1372 devices_info[i].max_avail = avail_space;
1373
1374 i++;
1375 }
1376
1377 nr_devices = i;
1378
1379 btrfs_descending_sort_devices(devices_info, nr_devices);
1380
1381 i = nr_devices - 1;
1382 avail_space = 0;
1383 while (nr_devices >= min_stripes) {
Miao Xie39fb26c2011-12-14 20:12:02 -05001384 if (num_stripes > nr_devices)
1385 num_stripes = nr_devices;
1386
Miao Xie6d07bce2011-01-05 10:07:31 +00001387 if (devices_info[i].max_avail >= min_stripe_size) {
1388 int j;
1389 u64 alloc_size;
1390
Miao Xie39fb26c2011-12-14 20:12:02 -05001391 avail_space += devices_info[i].max_avail * num_stripes;
Miao Xie6d07bce2011-01-05 10:07:31 +00001392 alloc_size = devices_info[i].max_avail;
Miao Xie39fb26c2011-12-14 20:12:02 -05001393 for (j = i + 1 - num_stripes; j <= i; j++)
Miao Xie6d07bce2011-01-05 10:07:31 +00001394 devices_info[j].max_avail -= alloc_size;
1395 }
1396 i--;
1397 nr_devices--;
1398 }
1399
1400 kfree(devices_info);
1401 *free_bytes = avail_space;
1402 return 0;
1403}
1404
Chris Mason8fd17792007-04-19 21:01:03 -04001405static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf)
1406{
Al Viro815745c2011-11-17 15:40:49 -05001407 struct btrfs_fs_info *fs_info = btrfs_sb(dentry->d_sb);
1408 struct btrfs_super_block *disk_super = fs_info->super_copy;
1409 struct list_head *head = &fs_info->space_info;
Josef Bacikbd4d1082010-03-05 21:59:21 +00001410 struct btrfs_space_info *found;
1411 u64 total_used = 0;
Miao Xie6d07bce2011-01-05 10:07:31 +00001412 u64 total_free_data = 0;
Chris Masondb945352007-10-15 16:15:53 -04001413 int bits = dentry->d_sb->s_blocksize_bits;
Al Viro815745c2011-11-17 15:40:49 -05001414 __be32 *fsid = (__be32 *)fs_info->fsid;
Miao Xie6d07bce2011-01-05 10:07:31 +00001415 int ret;
Chris Mason8fd17792007-04-19 21:01:03 -04001416
Miao Xie6d07bce2011-01-05 10:07:31 +00001417 /* holding chunk_muext to avoid allocating new chunks */
Al Viro815745c2011-11-17 15:40:49 -05001418 mutex_lock(&fs_info->chunk_mutex);
Josef Bacikbd4d1082010-03-05 21:59:21 +00001419 rcu_read_lock();
Josef Bacik89a55892010-10-14 14:52:27 -04001420 list_for_each_entry_rcu(found, head, list) {
Miao Xie6d07bce2011-01-05 10:07:31 +00001421 if (found->flags & BTRFS_BLOCK_GROUP_DATA) {
1422 total_free_data += found->disk_total - found->disk_used;
1423 total_free_data -=
1424 btrfs_account_ro_block_groups_free_space(found);
1425 }
1426
Yan, Zhengb742bb822010-05-16 10:46:24 -04001427 total_used += found->disk_used;
Josef Bacik89a55892010-10-14 14:52:27 -04001428 }
Josef Bacikbd4d1082010-03-05 21:59:21 +00001429 rcu_read_unlock();
1430
Chris Mason8fd17792007-04-19 21:01:03 -04001431 buf->f_namelen = BTRFS_NAME_LEN;
Chris Masondb945352007-10-15 16:15:53 -04001432 buf->f_blocks = btrfs_super_total_bytes(disk_super) >> bits;
Josef Bacikbd4d1082010-03-05 21:59:21 +00001433 buf->f_bfree = buf->f_blocks - (total_used >> bits);
Chris Mason8fd17792007-04-19 21:01:03 -04001434 buf->f_bsize = dentry->d_sb->s_blocksize;
1435 buf->f_type = BTRFS_SUPER_MAGIC;
Miao Xie6d07bce2011-01-05 10:07:31 +00001436 buf->f_bavail = total_free_data;
Al Viro815745c2011-11-17 15:40:49 -05001437 ret = btrfs_calc_avail_data_space(fs_info->tree_root, &total_free_data);
Miao Xie6d07bce2011-01-05 10:07:31 +00001438 if (ret) {
Al Viro815745c2011-11-17 15:40:49 -05001439 mutex_unlock(&fs_info->chunk_mutex);
Miao Xie6d07bce2011-01-05 10:07:31 +00001440 return ret;
1441 }
1442 buf->f_bavail += total_free_data;
1443 buf->f_bavail = buf->f_bavail >> bits;
Al Viro815745c2011-11-17 15:40:49 -05001444 mutex_unlock(&fs_info->chunk_mutex);
Chris Masond3977122009-01-05 21:25:51 -05001445
David Woodhouse9d036322008-08-18 12:01:52 +01001446 /* We treat it as constant endianness (it doesn't matter _which_)
Chris Masond3977122009-01-05 21:25:51 -05001447 because we want the fsid to come out the same whether mounted
David Woodhouse9d036322008-08-18 12:01:52 +01001448 on a big-endian or little-endian host */
1449 buf->f_fsid.val[0] = be32_to_cpu(fsid[0]) ^ be32_to_cpu(fsid[2]);
1450 buf->f_fsid.val[1] = be32_to_cpu(fsid[1]) ^ be32_to_cpu(fsid[3]);
David Woodhouse32d48fa2008-08-18 13:10:20 +01001451 /* Mask in the root object ID too, to disambiguate subvols */
1452 buf->f_fsid.val[0] ^= BTRFS_I(dentry->d_inode)->root->objectid >> 32;
1453 buf->f_fsid.val[1] ^= BTRFS_I(dentry->d_inode)->root->objectid;
1454
Chris Mason8fd17792007-04-19 21:01:03 -04001455 return 0;
1456}
Chris Masonb5133862007-04-24 11:52:22 -04001457
Al Viroaea52e12011-11-17 01:22:46 -05001458static void btrfs_kill_super(struct super_block *sb)
1459{
Al Viro815745c2011-11-17 15:40:49 -05001460 struct btrfs_fs_info *fs_info = btrfs_sb(sb);
Al Viroaea52e12011-11-17 01:22:46 -05001461 kill_anon_super(sb);
Al Virod22ca7d2011-11-17 01:46:50 -05001462 free_fs_info(fs_info);
Al Viroaea52e12011-11-17 01:22:46 -05001463}
1464
Chris Mason2e635a22007-03-21 11:12:56 -04001465static struct file_system_type btrfs_fs_type = {
1466 .owner = THIS_MODULE,
1467 .name = "btrfs",
Al Viro061dbc62010-07-26 16:21:33 +04001468 .mount = btrfs_mount,
Al Viroaea52e12011-11-17 01:22:46 -05001469 .kill_sb = btrfs_kill_super,
Chris Mason2e635a22007-03-21 11:12:56 -04001470 .fs_flags = FS_REQUIRES_DEV,
1471};
Chris Masona9218f62008-03-24 15:02:04 -04001472
Chris Masond352ac62008-09-29 15:18:18 -04001473/*
1474 * used by btrfsctl to scan devices when no FS is mounted
1475 */
Chris Mason8a4b83c2008-03-24 15:02:07 -04001476static long btrfs_control_ioctl(struct file *file, unsigned int cmd,
1477 unsigned long arg)
1478{
1479 struct btrfs_ioctl_vol_args *vol;
1480 struct btrfs_fs_devices *fs_devices;
Chris Masonc071fcf2009-01-16 11:59:08 -05001481 int ret = -ENOTTY;
Chris Mason8a4b83c2008-03-24 15:02:07 -04001482
Chris Masone441d542009-01-05 16:57:23 -05001483 if (!capable(CAP_SYS_ADMIN))
1484 return -EPERM;
1485
Li Zefandae7b662009-04-08 15:06:54 +08001486 vol = memdup_user((void __user *)arg, sizeof(*vol));
1487 if (IS_ERR(vol))
1488 return PTR_ERR(vol);
Chris Masonc071fcf2009-01-16 11:59:08 -05001489
Chris Mason8a4b83c2008-03-24 15:02:07 -04001490 switch (cmd) {
1491 case BTRFS_IOC_SCAN_DEV:
Christoph Hellwig97288f22008-12-02 06:36:09 -05001492 ret = btrfs_scan_one_device(vol->name, FMODE_READ,
Chris Mason8a4b83c2008-03-24 15:02:07 -04001493 &btrfs_fs_type, &fs_devices);
1494 break;
Josef Bacik02db0842012-06-21 16:03:58 -04001495 case BTRFS_IOC_DEVICES_READY:
1496 ret = btrfs_scan_one_device(vol->name, FMODE_READ,
1497 &btrfs_fs_type, &fs_devices);
1498 if (ret)
1499 break;
1500 ret = !(fs_devices->num_devices == fs_devices->total_devices);
1501 break;
Chris Mason8a4b83c2008-03-24 15:02:07 -04001502 }
Li Zefandae7b662009-04-08 15:06:54 +08001503
Chris Mason8a4b83c2008-03-24 15:02:07 -04001504 kfree(vol);
Linda Knippersf819d832008-06-09 22:17:11 -04001505 return ret;
Chris Mason8a4b83c2008-03-24 15:02:07 -04001506}
1507
Linus Torvalds01762602009-01-10 06:09:52 -08001508static int btrfs_freeze(struct super_block *sb)
Yaned0dab62008-01-22 12:46:56 -05001509{
Al Viro815745c2011-11-17 15:40:49 -05001510 struct btrfs_fs_info *fs_info = btrfs_sb(sb);
1511 mutex_lock(&fs_info->transaction_kthread_mutex);
1512 mutex_lock(&fs_info->cleaner_mutex);
Linus Torvalds01762602009-01-10 06:09:52 -08001513 return 0;
Yaned0dab62008-01-22 12:46:56 -05001514}
1515
Linus Torvalds01762602009-01-10 06:09:52 -08001516static int btrfs_unfreeze(struct super_block *sb)
Yaned0dab62008-01-22 12:46:56 -05001517{
Al Viro815745c2011-11-17 15:40:49 -05001518 struct btrfs_fs_info *fs_info = btrfs_sb(sb);
1519 mutex_unlock(&fs_info->cleaner_mutex);
1520 mutex_unlock(&fs_info->transaction_kthread_mutex);
Linus Torvalds01762602009-01-10 06:09:52 -08001521 return 0;
Yaned0dab62008-01-22 12:46:56 -05001522}
Chris Mason2e635a22007-03-21 11:12:56 -04001523
Josef Bacik9c5085c2012-06-05 14:13:12 -04001524static int btrfs_show_devname(struct seq_file *m, struct dentry *root)
1525{
1526 struct btrfs_fs_info *fs_info = btrfs_sb(root->d_sb);
1527 struct btrfs_fs_devices *cur_devices;
1528 struct btrfs_device *dev, *first_dev = NULL;
1529 struct list_head *head;
1530 struct rcu_string *name;
1531
1532 mutex_lock(&fs_info->fs_devices->device_list_mutex);
1533 cur_devices = fs_info->fs_devices;
1534 while (cur_devices) {
1535 head = &cur_devices->devices;
1536 list_for_each_entry(dev, head, dev_list) {
1537 if (!first_dev || dev->devid < first_dev->devid)
1538 first_dev = dev;
1539 }
1540 cur_devices = cur_devices->seed;
1541 }
1542
1543 if (first_dev) {
1544 rcu_read_lock();
1545 name = rcu_dereference(first_dev->name);
1546 seq_escape(m, name->str, " \t\n\\");
1547 rcu_read_unlock();
1548 } else {
1549 WARN_ON(1);
1550 }
1551 mutex_unlock(&fs_info->fs_devices->device_list_mutex);
1552 return 0;
1553}
1554
Alexey Dobriyanb87221d2009-09-21 17:01:09 -07001555static const struct super_operations btrfs_super_ops = {
Yan, Zheng76dda932009-09-21 16:00:26 -04001556 .drop_inode = btrfs_drop_inode,
Al Virobd555972010-06-07 11:35:40 -04001557 .evict_inode = btrfs_evict_inode,
Chris Masone20d96d2007-03-22 12:13:20 -04001558 .put_super = btrfs_put_super,
Chris Masond5719762007-03-23 10:01:08 -04001559 .sync_fs = btrfs_sync_fs,
Eric Parisa9572a12009-04-02 16:46:06 -04001560 .show_options = btrfs_show_options,
Josef Bacik9c5085c2012-06-05 14:13:12 -04001561 .show_devname = btrfs_show_devname,
Chris Mason4730a4b2007-03-26 12:00:39 -04001562 .write_inode = btrfs_write_inode,
Chris Mason2c90e5d2007-04-02 10:50:19 -04001563 .alloc_inode = btrfs_alloc_inode,
1564 .destroy_inode = btrfs_destroy_inode,
Chris Mason8fd17792007-04-19 21:01:03 -04001565 .statfs = btrfs_statfs,
Yan Zhengc146afa2008-11-12 14:34:12 -05001566 .remount_fs = btrfs_remount,
Linus Torvalds01762602009-01-10 06:09:52 -08001567 .freeze_fs = btrfs_freeze,
1568 .unfreeze_fs = btrfs_unfreeze,
Chris Masone20d96d2007-03-22 12:13:20 -04001569};
Chris Masona9218f62008-03-24 15:02:04 -04001570
1571static const struct file_operations btrfs_ctl_fops = {
1572 .unlocked_ioctl = btrfs_control_ioctl,
1573 .compat_ioctl = btrfs_control_ioctl,
1574 .owner = THIS_MODULE,
Arnd Bergmann6038f372010-08-15 18:52:59 +02001575 .llseek = noop_llseek,
Chris Masona9218f62008-03-24 15:02:04 -04001576};
1577
1578static struct miscdevice btrfs_misc = {
Kay Sievers578454f2010-05-20 18:07:20 +02001579 .minor = BTRFS_MINOR,
Chris Masona9218f62008-03-24 15:02:04 -04001580 .name = "btrfs-control",
1581 .fops = &btrfs_ctl_fops
1582};
1583
Kay Sievers578454f2010-05-20 18:07:20 +02001584MODULE_ALIAS_MISCDEV(BTRFS_MINOR);
1585MODULE_ALIAS("devname:btrfs-control");
1586
Chris Masona9218f62008-03-24 15:02:04 -04001587static int btrfs_interface_init(void)
1588{
1589 return misc_register(&btrfs_misc);
1590}
1591
Christoph Hellwigb2950862008-12-02 09:54:17 -05001592static void btrfs_interface_exit(void)
Chris Masona9218f62008-03-24 15:02:04 -04001593{
1594 if (misc_deregister(&btrfs_misc) < 0)
Chris Masond3977122009-01-05 21:25:51 -05001595 printk(KERN_INFO "misc_deregister failed for control device");
Chris Masona9218f62008-03-24 15:02:04 -04001596}
1597
Chris Mason2e635a22007-03-21 11:12:56 -04001598static int __init init_btrfs_fs(void)
1599{
Chris Mason2c90e5d2007-04-02 10:50:19 -04001600 int err;
Josef Bacik58176a92007-08-29 15:47:34 -04001601
1602 err = btrfs_init_sysfs();
1603 if (err)
1604 return err;
1605
Jeff Mahoney143bede2012-03-01 14:56:26 +01001606 btrfs_init_compress();
Chris Masond1310b22008-01-24 16:13:08 -05001607
Li Zefan261507a02010-12-17 14:21:50 +08001608 err = btrfs_init_cachep();
1609 if (err)
1610 goto free_compress;
1611
Chris Masond1310b22008-01-24 16:13:08 -05001612 err = extent_io_init();
Wyatt Banks2f4cbe62007-11-19 10:22:33 -05001613 if (err)
1614 goto free_cachep;
1615
Chris Masond1310b22008-01-24 16:13:08 -05001616 err = extent_map_init();
1617 if (err)
1618 goto free_extent_io;
1619
Miao Xie16cdcec2011-04-22 18:12:22 +08001620 err = btrfs_delayed_inode_init();
Wyatt Banks2f4cbe62007-11-19 10:22:33 -05001621 if (err)
1622 goto free_extent_map;
Chris Masonc8b97812008-10-29 14:49:59 -04001623
Miao Xie16cdcec2011-04-22 18:12:22 +08001624 err = btrfs_interface_init();
1625 if (err)
1626 goto free_delayed_inode;
1627
Chris Masona9218f62008-03-24 15:02:04 -04001628 err = register_filesystem(&btrfs_fs_type);
1629 if (err)
1630 goto unregister_ioctl;
Chris Masonb3c3da72008-07-23 12:12:13 -04001631
Jan Schmidte565d4b2012-03-23 17:14:20 +01001632 btrfs_init_lockdep();
1633
Chris Masonb3c3da72008-07-23 12:12:13 -04001634 printk(KERN_INFO "%s loaded\n", BTRFS_BUILD_VERSION);
Wyatt Banks2f4cbe62007-11-19 10:22:33 -05001635 return 0;
1636
Chris Masona9218f62008-03-24 15:02:04 -04001637unregister_ioctl:
1638 btrfs_interface_exit();
Miao Xie16cdcec2011-04-22 18:12:22 +08001639free_delayed_inode:
1640 btrfs_delayed_inode_exit();
Wyatt Banks2f4cbe62007-11-19 10:22:33 -05001641free_extent_map:
1642 extent_map_exit();
Chris Masond1310b22008-01-24 16:13:08 -05001643free_extent_io:
1644 extent_io_exit();
Wyatt Banks2f4cbe62007-11-19 10:22:33 -05001645free_cachep:
1646 btrfs_destroy_cachep();
Li Zefan261507a02010-12-17 14:21:50 +08001647free_compress:
1648 btrfs_exit_compress();
Wyatt Banks2f4cbe62007-11-19 10:22:33 -05001649 btrfs_exit_sysfs();
1650 return err;
Chris Mason2e635a22007-03-21 11:12:56 -04001651}
1652
1653static void __exit exit_btrfs_fs(void)
1654{
Chris Mason39279cc2007-06-12 06:35:45 -04001655 btrfs_destroy_cachep();
Miao Xie16cdcec2011-04-22 18:12:22 +08001656 btrfs_delayed_inode_exit();
Chris Masona52d9a82007-08-27 16:49:44 -04001657 extent_map_exit();
Chris Masond1310b22008-01-24 16:13:08 -05001658 extent_io_exit();
Chris Masona9218f62008-03-24 15:02:04 -04001659 btrfs_interface_exit();
Chris Mason2e635a22007-03-21 11:12:56 -04001660 unregister_filesystem(&btrfs_fs_type);
Josef Bacik58176a92007-08-29 15:47:34 -04001661 btrfs_exit_sysfs();
Chris Mason8a4b83c2008-03-24 15:02:07 -04001662 btrfs_cleanup_fs_uuids();
Li Zefan261507a02010-12-17 14:21:50 +08001663 btrfs_exit_compress();
Chris Mason2e635a22007-03-21 11:12:56 -04001664}
1665
1666module_init(init_btrfs_fs)
1667module_exit(exit_btrfs_fs)
1668
1669MODULE_LICENSE("GPL");