Blame view
fs/btrfs/super.c
34.5 KB
6cbd55707 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 Btrfs: Add mount ... |
18 |
#include <linux/blkdev.h> |
2e635a278 Btrfs: initial mo... |
19 |
#include <linux/module.h> |
e20d96d64 Mountable btrfs, ... |
20 |
#include <linux/buffer_head.h> |
2e635a278 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 Btrfs: introduce ... |
26 |
#include <linux/seq_file.h> |
2e635a278 Btrfs: initial mo... |
27 |
#include <linux/string.h> |
2e635a278 Btrfs: initial mo... |
28 |
#include <linux/backing-dev.h> |
4b82d6e4a Btrfs: Add mount ... |
29 |
#include <linux/mount.h> |
dee26a9f7 btrfs_get_block, ... |
30 |
#include <linux/mpage.h> |
75dfe3960 btrfs_file_write ... |
31 32 |
#include <linux/swap.h> #include <linux/writeback.h> |
8fd17795b Btrfs: early fsyn... |
33 |
#include <linux/statfs.h> |
08607c1b1 Btrfs: add compat... |
34 |
#include <linux/compat.h> |
95e052891 Btrfs: Use mount ... |
35 |
#include <linux/parser.h> |
c59f8951d Btrfs: Add mount ... |
36 |
#include <linux/ctype.h> |
6da6abae0 Btrfs: Back port ... |
37 |
#include <linux/namei.h> |
a9218f6b0 Add /dev/btrfs-co... |
38 |
#include <linux/miscdevice.h> |
1bcbf3133 btrfs & squashfs:... |
39 |
#include <linux/magic.h> |
5a0e3ad6a include cleanup: ... |
40 |
#include <linux/slab.h> |
90a887c9a btrfs: add cleanc... |
41 |
#include <linux/cleancache.h> |
22c44fe65 Btrfs: deal with ... |
42 |
#include <linux/ratelimit.h> |
4b4e25f2a Btrfs: compat cod... |
43 |
#include "compat.h" |
16cdcec73 btrfs: implement ... |
44 |
#include "delayed-inode.h" |
2e635a278 Btrfs: initial mo... |
45 |
#include "ctree.h" |
e20d96d64 Mountable btrfs, ... |
46 |
#include "disk-io.h" |
d57197629 btrfs_create, btr... |
47 |
#include "transaction.h" |
2c90e5d65 Btrfs: still corr... |
48 |
#include "btrfs_inode.h" |
c5739bba5 Btrfs: snapshot p... |
49 |
#include "ioctl.h" |
3a6863756 Btrfs: sparse files! |
50 |
#include "print-tree.h" |
5103e947b xattr support for... |
51 |
#include "xattr.h" |
8a4b83cc8 Btrfs: Add suppor... |
52 |
#include "volumes.h" |
b3c3da71e Btrfs: Add versio... |
53 |
#include "version.h" |
be6e8dc0b NFS support for b... |
54 |
#include "export.h" |
c8b978188 Btrfs: Add zlib c... |
55 |
#include "compression.h" |
2e635a278 Btrfs: initial mo... |
56 |
|
1abe9b8a1 Btrfs: add initia... |
57 58 |
#define CREATE_TRACE_POINTS #include <trace/events/btrfs.h> |
b87221de6 const: mark remai... |
59 |
static const struct super_operations btrfs_super_ops; |
830c4adbd Btrfs: fix how we... |
60 |
static struct file_system_type btrfs_fs_type; |
75dfe3960 btrfs_file_write ... |
61 |
|
acce952b0 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 Btrfs: Fix checkp... |
147 |
static void btrfs_put_super(struct super_block *sb) |
b18c66858 Btrfs: progress o... |
148 |
{ |
39279cc3d Btrfs: split up s... |
149 |
struct btrfs_root *root = btrfs_sb(sb); |
b18c66858 Btrfs: progress o... |
150 |
int ret; |
b18c66858 Btrfs: progress o... |
151 |
|
39279cc3d Btrfs: split up s... |
152 |
ret = close_ctree(root); |
39279cc3d Btrfs: split up s... |
153 |
sb->s_fs_info = NULL; |
559af8211 Btrfs: cleanup wa... |
154 155 |
(void)ret; /* FIXME: need to fix VFS to return error? */ |
75dfe3960 btrfs_file_write ... |
156 |
} |
95e052891 Btrfs: Use mount ... |
157 |
enum { |
73f73415c Btrfs: change how... |
158 |
Opt_degraded, Opt_subvol, Opt_subvolid, Opt_device, Opt_nodatasum, |
287a0ab91 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 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 Btrfs: put ENOSPC... |
163 |
Opt_space_cache, Opt_clear_cache, Opt_user_subvol_rm_allowed, |
4b9465cb9 Btrfs: add mount ... |
164 |
Opt_enospc_debug, Opt_subvolrootid, Opt_defrag, |
af31f5e5b Btrfs: add a log ... |
165 |
Opt_inode_cache, Opt_no_space_cache, Opt_recovery, Opt_err, |
95e052891 Btrfs: Use mount ... |
166 167 168 |
}; static match_table_t tokens = { |
dfe250206 Btrfs: Add mount ... |
169 |
{Opt_degraded, "degraded"}, |
95e052891 Btrfs: Use mount ... |
170 |
{Opt_subvol, "subvol=%s"}, |
73f73415c Btrfs: change how... |
171 |
{Opt_subvolid, "subvolid=%d"}, |
43e570b08 btrfs: allow scan... |
172 |
{Opt_device, "device=%s"}, |
b6cda9bcb Btrfs: Add mount ... |
173 |
{Opt_nodatasum, "nodatasum"}, |
be20aa9db Btrfs: Add mount ... |
174 |
{Opt_nodatacow, "nodatacow"}, |
21ad10cf3 Btrfs: Add flush ... |
175 |
{Opt_nobarrier, "nobarrier"}, |
6f568d35a Btrfs: mount -o m... |
176 |
{Opt_max_inline, "max_inline=%s"}, |
8f662a76c Btrfs: Add readah... |
177 |
{Opt_alloc_start, "alloc_start=%s"}, |
4543df7ec Btrfs: Add a moun... |
178 |
{Opt_thread_pool, "thread_pool=%d"}, |
c8b978188 Btrfs: Add zlib c... |
179 |
{Opt_compress, "compress"}, |
261507a02 btrfs: Allow to a... |
180 |
{Opt_compress_type, "compress=%s"}, |
a555f810a Btrfs: Add mount ... |
181 |
{Opt_compress_force, "compress-force"}, |
261507a02 btrfs: Allow to a... |
182 |
{Opt_compress_force_type, "compress-force=%s"}, |
e18e4809b Btrfs: Add mount ... |
183 |
{Opt_ssd, "ssd"}, |
451d7585a Btrfs: add mount ... |
184 |
{Opt_ssd_spread, "ssd_spread"}, |
3b30c22f6 Btrfs: Add mount ... |
185 |
{Opt_nossd, "nossd"}, |
33268eaf0 Btrfs: Add ACL su... |
186 |
{Opt_noacl, "noacl"}, |
3a5e14048 Btrfs: notreelog ... |
187 |
{Opt_notreelog, "notreelog"}, |
dccae9999 Btrfs: add flusho... |
188 |
{Opt_flushoncommit, "flushoncommit"}, |
97e728d43 Btrfs: try to kee... |
189 |
{Opt_ratio, "metadata_ratio=%d"}, |
e244a0aeb Btrfs: add -o dis... |
190 |
{Opt_discard, "discard"}, |
0af3d00ba Btrfs: create spe... |
191 |
{Opt_space_cache, "space_cache"}, |
88c2ba3b0 Btrfs: Add a clea... |
192 |
{Opt_clear_cache, "clear_cache"}, |
4260f7c75 Btrfs: allow subv... |
193 |
{Opt_user_subvol_rm_allowed, "user_subvol_rm_allowed"}, |
91435650c Btrfs: put ENOSPC... |
194 |
{Opt_enospc_debug, "enospc_debug"}, |
e15d05424 Btrfs: fix subvol... |
195 |
{Opt_subvolrootid, "subvolrootid=%d"}, |
4cb5300bc Btrfs: add mount ... |
196 |
{Opt_defrag, "autodefrag"}, |
4b9465cb9 Btrfs: add mount ... |
197 |
{Opt_inode_cache, "inode_cache"}, |
8965593e4 btrfs: rename the... |
198 |
{Opt_no_space_cache, "nospace_cache"}, |
af31f5e5b Btrfs: add a log ... |
199 |
{Opt_recovery, "recovery"}, |
33268eaf0 Btrfs: Add ACL su... |
200 |
{Opt_err, NULL}, |
95e052891 Btrfs: Use mount ... |
201 |
}; |
edf24abe5 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 Btrfs: Use mount ... |
207 |
{ |
edf24abe5 btrfs: sanity mou... |
208 |
struct btrfs_fs_info *info = root->fs_info; |
95e052891 Btrfs: Use mount ... |
209 |
substring_t args[MAX_OPT_ARGS]; |
73bc18768 Btrfs: introduce ... |
210 211 |
char *p, *num, *orig = NULL; u64 cache_gen; |
4543df7ec Btrfs: Add a moun... |
212 |
int intarg; |
a7a3f7cad Btrfs: fail mount... |
213 |
int ret = 0; |
261507a02 btrfs: Allow to a... |
214 215 |
char *compress_type; bool compress_force = false; |
b6cda9bcb Btrfs: Add mount ... |
216 |
|
6c41761fc btrfs: separate s... |
217 |
cache_gen = btrfs_super_cache_generation(root->fs_info->super_copy); |
73bc18768 Btrfs: introduce ... |
218 219 |
if (cache_gen) btrfs_set_opt(info->mount_opt, SPACE_CACHE); |
95e052891 Btrfs: Use mount ... |
220 |
if (!options) |
73bc18768 Btrfs: introduce ... |
221 |
goto out; |
95e052891 Btrfs: Use mount ... |
222 |
|
be20aa9db 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 Btrfs: kfree corr... |
230 |
orig = options; |
be20aa9db Btrfs: Add mount ... |
231 |
|
edf24abe5 btrfs: sanity mou... |
232 |
while ((p = strsep(&options, ",")) != NULL) { |
95e052891 Btrfs: Use mount ... |
233 234 235 236 237 238 |
int token; if (!*p) continue; token = match_token(p, tokens, args); switch (token) { |
dfe250206 Btrfs: Add mount ... |
239 |
case Opt_degraded: |
edf24abe5 btrfs: sanity mou... |
240 241 242 |
printk(KERN_INFO "btrfs: allowing degraded mounts "); btrfs_set_opt(info->mount_opt, DEGRADED); |
dfe250206 Btrfs: Add mount ... |
243 |
break; |
95e052891 Btrfs: Use mount ... |
244 |
case Opt_subvol: |
73f73415c Btrfs: change how... |
245 |
case Opt_subvolid: |
e15d05424 Btrfs: fix subvol... |
246 |
case Opt_subvolrootid: |
43e570b08 btrfs: allow scan... |
247 |
case Opt_device: |
edf24abe5 btrfs: sanity mou... |
248 |
/* |
43e570b08 btrfs: allow scan... |
249 |
* These are parsed by btrfs_parse_early_options |
edf24abe5 btrfs: sanity mou... |
250 251 |
* and can be happily ignored here. */ |
b6cda9bcb Btrfs: Add mount ... |
252 253 |
break; case Opt_nodatasum: |
067c28adc Btrfs: fix -o nod... |
254 255 |
printk(KERN_INFO "btrfs: setting nodatasum "); |
edf24abe5 btrfs: sanity mou... |
256 |
btrfs_set_opt(info->mount_opt, NODATASUM); |
be20aa9db Btrfs: Add mount ... |
257 258 |
break; case Opt_nodatacow: |
edf24abe5 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 Btrfs: Use mount ... |
263 |
break; |
a555f810a Btrfs: Add mount ... |
264 |
case Opt_compress_force: |
261507a02 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 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 btrfs: Allow to a... |
277 278 279 280 |
} else { ret = -EINVAL; goto out; } |
a555f810a Btrfs: Add mount ... |
281 |
btrfs_set_opt(info->mount_opt, COMPRESS); |
261507a02 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 Btrfs: Add mount ... |
291 |
break; |
e18e4809b Btrfs: Add mount ... |
292 |
case Opt_ssd: |
edf24abe5 btrfs: sanity mou... |
293 294 295 |
printk(KERN_INFO "btrfs: use ssd allocation scheme "); btrfs_set_opt(info->mount_opt, SSD); |
e18e4809b Btrfs: Add mount ... |
296 |
break; |
451d7585a 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 Btrfs: Add mount ... |
304 |
case Opt_nossd: |
451d7585a Btrfs: add mount ... |
305 306 307 |
printk(KERN_INFO "btrfs: not using ssd allocation " "scheme "); |
c289811cc Btrfs: autodetect... |
308 |
btrfs_set_opt(info->mount_opt, NOSSD); |
3b30c22f6 Btrfs: Add mount ... |
309 |
btrfs_clear_opt(info->mount_opt, SSD); |
451d7585a Btrfs: add mount ... |
310 |
btrfs_clear_opt(info->mount_opt, SSD_SPREAD); |
3b30c22f6 Btrfs: Add mount ... |
311 |
break; |
21ad10cf3 Btrfs: Add flush ... |
312 |
case Opt_nobarrier: |
edf24abe5 btrfs: sanity mou... |
313 314 315 |
printk(KERN_INFO "btrfs: turning off barriers "); btrfs_set_opt(info->mount_opt, NOBARRIER); |
21ad10cf3 Btrfs: Add flush ... |
316 |
break; |
4543df7ec 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 Btrfs: mount -o m... |
327 |
case Opt_max_inline: |
edf24abe5 btrfs: sanity mou... |
328 329 |
num = match_strdup(&args[0]); if (num) { |
91748467a btrfs: use memparse |
330 |
info->max_inline = memparse(num, NULL); |
edf24abe5 btrfs: sanity mou... |
331 |
kfree(num); |
15ada040d Btrfs: Fix mount ... |
332 333 334 335 336 |
if (info->max_inline) { info->max_inline = max_t(u64, info->max_inline, root->sectorsize); } |
edf24abe5 btrfs: sanity mou... |
337 338 |
printk(KERN_INFO "btrfs: max_inline at %llu ", |
21380931e Btrfs: Fix a bunc... |
339 |
(unsigned long long)info->max_inline); |
6f568d35a Btrfs: mount -o m... |
340 341 |
} break; |
8f662a76c Btrfs: Add readah... |
342 |
case Opt_alloc_start: |
edf24abe5 btrfs: sanity mou... |
343 344 |
num = match_strdup(&args[0]); if (num) { |
91748467a btrfs: use memparse |
345 |
info->alloc_start = memparse(num, NULL); |
edf24abe5 btrfs: sanity mou... |
346 347 348 349 |
kfree(num); printk(KERN_INFO "btrfs: allocations start at %llu ", |
21380931e Btrfs: Fix a bunc... |
350 |
(unsigned long long)info->alloc_start); |
8f662a76c Btrfs: Add readah... |
351 352 |
} break; |
33268eaf0 Btrfs: Add ACL su... |
353 354 355 |
case Opt_noacl: root->fs_info->sb->s_flags &= ~MS_POSIXACL; break; |
3a5e14048 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 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 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 Btrfs: add -o dis... |
376 377 378 |
case Opt_discard: btrfs_set_opt(info->mount_opt, DISCARD); break; |
0af3d00ba Btrfs: create spe... |
379 |
case Opt_space_cache: |
0af3d00ba Btrfs: create spe... |
380 |
btrfs_set_opt(info->mount_opt, SPACE_CACHE); |
0de90876c Btrfs: handle the... |
381 |
break; |
73bc18768 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 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 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 Btrfs: create spe... |
396 |
break; |
4260f7c75 Btrfs: allow subv... |
397 398 399 |
case Opt_user_subvol_rm_allowed: btrfs_set_opt(info->mount_opt, USER_SUBVOL_RM_ALLOWED); break; |
91435650c Btrfs: put ENOSPC... |
400 401 402 |
case Opt_enospc_debug: btrfs_set_opt(info->mount_opt, ENOSPC_DEBUG); break; |
4cb5300bc 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 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 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 Btrfs: Use mount ... |
417 |
default: |
be20aa9db Btrfs: Add mount ... |
418 |
break; |
95e052891 Btrfs: Use mount ... |
419 420 |
} } |
a7a3f7cad Btrfs: fail mount... |
421 |
out: |
73bc18768 Btrfs: introduce ... |
422 423 424 |
if (!ret && btrfs_test_opt(root, SPACE_CACHE)) printk(KERN_INFO "btrfs: disk space caching is enabled "); |
da495ecc0 Btrfs: kfree corr... |
425 |
kfree(orig); |
a7a3f7cad Btrfs: fail mount... |
426 |
return ret; |
edf24abe5 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 Btrfs: corret fmo... |
435 |
static int btrfs_parse_early_options(const char *options, fmode_t flags, |
73f73415c Btrfs: change how... |
436 |
void *holder, char **subvol_name, u64 *subvol_objectid, |
e15d05424 Btrfs: fix subvol... |
437 |
u64 *subvol_rootid, struct btrfs_fs_devices **fs_devices) |
edf24abe5 btrfs: sanity mou... |
438 439 |
{ substring_t args[MAX_OPT_ARGS]; |
83c8c9bde btrfs: trivial fi... |
440 |
char *device_name, *opts, *orig, *p; |
edf24abe5 btrfs: sanity mou... |
441 |
int error = 0; |
73f73415c Btrfs: change how... |
442 |
int intarg; |
edf24abe5 btrfs: sanity mou... |
443 444 |
if (!options) |
830c4adbd Btrfs: fix how we... |
445 |
return 0; |
edf24abe5 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 Btrfs: Free corre... |
454 |
orig = opts; |
edf24abe5 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 Btrfs: fix memory... |
464 |
kfree(*subvol_name); |
edf24abe5 btrfs: sanity mou... |
465 466 |
*subvol_name = match_strdup(&args[0]); break; |
73f73415c Btrfs: change how... |
467 468 |
case Opt_subvolid: intarg = 0; |
4849f01d1 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 Btrfs: change how... |
478 |
break; |
e15d05424 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 btrfs: allow scan... |
491 |
case Opt_device: |
83c8c9bde 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 btrfs: allow scan... |
498 |
flags, holder, fs_devices); |
83c8c9bde btrfs: trivial fi... |
499 |
kfree(device_name); |
43e570b08 btrfs: allow scan... |
500 |
if (error) |
830c4adbd Btrfs: fix how we... |
501 |
goto out; |
43e570b08 btrfs: allow scan... |
502 |
break; |
edf24abe5 btrfs: sanity mou... |
503 504 505 506 |
default: break; } } |
830c4adbd Btrfs: fix how we... |
507 |
out: |
3f3d0bc0d Btrfs: Free corre... |
508 |
kfree(orig); |
edf24abe5 btrfs: sanity mou... |
509 |
return error; |
95e052891 Btrfs: Use mount ... |
510 |
} |
73f73415c 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 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 btrfs: separate s... |
544 |
dir_id = btrfs_super_root_dir(root->fs_info->super_copy); |
73f73415c Btrfs: change how... |
545 |
di = btrfs_lookup_dir_item(NULL, root, path, dir_id, "default", 7, 0); |
b08391663 fs/btrfs: Add mis... |
546 547 |
if (IS_ERR(di)) { btrfs_free_path(path); |
fb4f6f910 Btrfs: handle err... |
548 |
return ERR_CAST(di); |
b08391663 fs/btrfs: Add mis... |
549 |
} |
73f73415c 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 Btrfs: Use ERR_CA... |
568 |
return ERR_CAST(new_root); |
73f73415c 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 Btrfs: btrfs_iget... |
580 581 |
if (IS_ERR(inode)) return ERR_CAST(inode); |
73f73415c 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 Btrfs: use d_obta... |
592 |
return d_obtain_alias(inode); |
73f73415c Btrfs: change how... |
593 |
} |
d397712bc Btrfs: Fix checkp... |
594 |
static int btrfs_fill_super(struct super_block *sb, |
8a4b83cc8 Btrfs: Add suppor... |
595 |
struct btrfs_fs_devices *fs_devices, |
d397712bc Btrfs: Fix checkp... |
596 |
void *data, int silent) |
75dfe3960 btrfs_file_write ... |
597 |
{ |
d397712bc Btrfs: Fix checkp... |
598 599 |
struct inode *inode; struct dentry *root_dentry; |
39279cc3d Btrfs: split up s... |
600 |
struct btrfs_root *tree_root; |
5d4f98a28 Btrfs: Mixed back... |
601 |
struct btrfs_key key; |
39279cc3d Btrfs: split up s... |
602 |
int err; |
a429e5137 Btrfs: working fi... |
603 |
|
39279cc3d 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 switch btrfs, clo... |
607 |
sb->s_d_op = &btrfs_dentry_operations; |
be6e8dc0b NFS support for b... |
608 |
sb->s_export_op = &btrfs_export_ops; |
5103e947b xattr support for... |
609 |
sb->s_xattr = btrfs_xattr_handlers; |
39279cc3d Btrfs: split up s... |
610 |
sb->s_time_gran = 1; |
0eda294df Btrfs: fix btrfs ... |
611 |
#ifdef CONFIG_BTRFS_FS_POSIX_ACL |
33268eaf0 Btrfs: Add ACL su... |
612 |
sb->s_flags |= MS_POSIXACL; |
49cf6f452 Btrfs: Fix settin... |
613 |
#endif |
a429e5137 Btrfs: working fi... |
614 |
|
dfe250206 Btrfs: Add mount ... |
615 |
tree_root = open_ctree(sb, fs_devices, (char *)data); |
6567e837d Btrfs: early work... |
616 |
|
e58ca0203 Fix btrfs_fill_su... |
617 |
if (IS_ERR(tree_root)) { |
39279cc3d Btrfs: split up s... |
618 619 |
printk("btrfs: open_ctree failed "); |
e58ca0203 Fix btrfs_fill_su... |
620 |
return PTR_ERR(tree_root); |
a429e5137 Btrfs: working fi... |
621 |
} |
39279cc3d Btrfs: split up s... |
622 |
sb->s_fs_info = tree_root; |
a429e5137 Btrfs: working fi... |
623 |
|
5d4f98a28 Btrfs: Mixed back... |
624 625 626 |
key.objectid = BTRFS_FIRST_FREE_OBJECTID; key.type = BTRFS_INODE_ITEM_KEY; key.offset = 0; |
73f73415c Btrfs: change how... |
627 |
inode = btrfs_iget(sb, &key, tree_root->fs_info->fs_root, NULL); |
5d4f98a28 Btrfs: Mixed back... |
628 629 |
if (IS_ERR(inode)) { err = PTR_ERR(inode); |
39279cc3d Btrfs: split up s... |
630 |
goto fail_close; |
f254e52c1 Btrfs: verify csu... |
631 |
} |
f254e52c1 Btrfs: verify csu... |
632 |
|
39279cc3d 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 Btrfs: verify csu... |
638 |
} |
58176a960 Btrfs: Add per-ro... |
639 |
|
39279cc3d Btrfs: split up s... |
640 |
sb->s_root = root_dentry; |
6885f308b Btrfs: Misc 2.6.2... |
641 |
|
6885f308b Btrfs: Misc 2.6.2... |
642 |
save_mount_options(sb, data); |
90a887c9a btrfs: add cleanc... |
643 |
cleancache_init_fs(sb); |
2619ba1f0 Btrfs: subvolumes |
644 |
return 0; |
39279cc3d Btrfs: split up s... |
645 646 647 648 |
fail_close: close_ctree(tree_root); return err; |
2619ba1f0 Btrfs: subvolumes |
649 |
} |
6bf13c0cc Btrfs: transactio... |
650 |
int btrfs_sync_fs(struct super_block *sb, int wait) |
c5739bba5 Btrfs: snapshot p... |
651 652 |
{ struct btrfs_trans_handle *trans; |
dccae9999 Btrfs: add flusho... |
653 |
struct btrfs_root *root = btrfs_sb(sb); |
c5739bba5 Btrfs: snapshot p... |
654 |
int ret; |
2619ba1f0 Btrfs: subvolumes |
655 |
|
1abe9b8a1 Btrfs: add initia... |
656 |
trace_btrfs_sync_fs(wait); |
39279cc3d Btrfs: split up s... |
657 658 659 660 |
if (!wait) { filemap_flush(root->fs_info->btree_inode->i_mapping); return 0; } |
771ed689d Btrfs: Optimize c... |
661 |
|
24bbcf044 Btrfs: Add delaye... |
662 663 |
btrfs_start_delalloc_inodes(root, 0); btrfs_wait_ordered_extents(root, 0, 0); |
771ed689d Btrfs: Optimize c... |
664 |
|
a22285a6a Btrfs: Integrate ... |
665 |
trans = btrfs_start_transaction(root, 0); |
98d5dc13e btrfs: fix return... |
666 667 |
if (IS_ERR(trans)) return PTR_ERR(trans); |
c5739bba5 Btrfs: snapshot p... |
668 |
ret = btrfs_commit_transaction(trans, root); |
54aa1f4df Btrfs: Audit call... |
669 |
return ret; |
2c90e5d65 Btrfs: still corr... |
670 |
} |
34c80b1d9 vfs: switch ->sho... |
671 |
static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry) |
a9572a15a Btrfs: introduce ... |
672 |
{ |
34c80b1d9 vfs: switch ->sho... |
673 |
struct btrfs_root *root = btrfs_sb(dentry->d_sb); |
a9572a15a Btrfs: introduce ... |
674 |
struct btrfs_fs_info *info = root->fs_info; |
200da64e0 Btrfs: fix /proc/... |
675 |
char *compress_type; |
a9572a15a 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 Btrfs: introduce ... |
685 |
if (info->max_inline != 8192 * 1024) |
21380931e Btrfs: Fix a bunc... |
686 687 |
seq_printf(seq, ",max_inline=%llu", (unsigned long long)info->max_inline); |
a9572a15a Btrfs: introduce ... |
688 |
if (info->alloc_start != 0) |
21380931e Btrfs: Fix a bunc... |
689 690 |
seq_printf(seq, ",alloc_start=%llu", (unsigned long long)info->alloc_start); |
a9572a15a 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 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 Btrfs: autodetect... |
704 705 |
if (btrfs_test_opt(root, NOSSD)) seq_puts(seq, ",nossd"); |
451d7585a 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 Btrfs: introduce ... |
709 |
seq_puts(seq, ",ssd"); |
3a5e14048 Btrfs: notreelog ... |
710 |
if (btrfs_test_opt(root, NOTREELOG)) |
6b65c5c61 Btrfs: make show_... |
711 |
seq_puts(seq, ",notreelog"); |
dccae9999 Btrfs: add flusho... |
712 |
if (btrfs_test_opt(root, FLUSHONCOMMIT)) |
6b65c5c61 Btrfs: make show_... |
713 |
seq_puts(seq, ",flushoncommit"); |
20a5239a5 Btrfs: Show disca... |
714 715 |
if (btrfs_test_opt(root, DISCARD)) seq_puts(seq, ",discard"); |
a9572a15a Btrfs: introduce ... |
716 717 |
if (!(root->fs_info->sb->s_flags & MS_POSIXACL)) seq_puts(seq, ",noacl"); |
200da64e0 Btrfs: fix /proc/... |
718 719 |
if (btrfs_test_opt(root, SPACE_CACHE)) seq_puts(seq, ",space_cache"); |
73bc18768 Btrfs: introduce ... |
720 |
else |
8965593e4 btrfs: rename the... |
721 |
seq_puts(seq, ",nospace_cache"); |
200da64e0 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 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 Btrfs: introduce ... |
732 733 |
return 0; } |
a061fc8da Btrfs: Add suppor... |
734 |
static int btrfs_test_super(struct super_block *s, void *data) |
4b82d6e4a Btrfs: Add mount ... |
735 |
{ |
450ba0ea0 Btrfs: setup blan... |
736 |
struct btrfs_root *test_root = data; |
a061fc8da Btrfs: Add suppor... |
737 |
struct btrfs_root *root = btrfs_sb(s); |
4b82d6e4a Btrfs: Add mount ... |
738 |
|
619c8c763 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 Btrfs: setup blan... |
745 |
return root->fs_info->fs_devices == test_root->fs_info->fs_devices; |
4b82d6e4a Btrfs: Add mount ... |
746 |
} |
450ba0ea0 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 Btrfs: Add mount ... |
752 |
} |
830c4adbd Btrfs: fix how we... |
753 |
/* |
f9d9ef62c 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 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 Btrfs: fix how we... |
832 833 |
struct dentry *root; struct vfsmount *mnt; |
830c4adbd Btrfs: fix how we... |
834 |
char *newargs; |
830c4adbd 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 new helper: mount... |
844 |
root = mount_subtree(mnt, subvol_name); |
830c4adbd Btrfs: fix how we... |
845 |
|
ea441d110 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 btrfs: do not all... |
851 852 853 |
printk(KERN_ERR "btrfs: '%s' is not a valid subvolume ", subvol_name); |
f9d9ef62c btrfs: do not all... |
854 |
} |
830c4adbd Btrfs: fix how we... |
855 856 |
return root; } |
450ba0ea0 Btrfs: setup blan... |
857 |
|
edf24abe5 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 convert btrfs |
864 |
static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags, |
306e16ce1 btrfs: rename var... |
865 |
const char *device_name, void *data) |
4b82d6e4a Btrfs: Add mount ... |
866 867 868 869 |
{ struct block_device *bdev = NULL; struct super_block *s; struct dentry *root; |
8a4b83cc8 Btrfs: Add suppor... |
870 |
struct btrfs_fs_devices *fs_devices = NULL; |
450ba0ea0 Btrfs: setup blan... |
871 |
struct btrfs_fs_info *fs_info = NULL; |
97288f2c7 Btrfs: corret fmo... |
872 |
fmode_t mode = FMODE_READ; |
73f73415c Btrfs: change how... |
873 874 |
char *subvol_name = NULL; u64 subvol_objectid = 0; |
e15d05424 Btrfs: fix subvol... |
875 |
u64 subvol_rootid = 0; |
4b82d6e4a Btrfs: Add mount ... |
876 |
int error = 0; |
97288f2c7 Btrfs: corret fmo... |
877 878 879 880 |
if (!(flags & MS_RDONLY)) mode |= FMODE_WRITE; error = btrfs_parse_early_options(data, mode, fs_type, |
73f73415c Btrfs: change how... |
881 |
&subvol_name, &subvol_objectid, |
e15d05424 Btrfs: fix subvol... |
882 |
&subvol_rootid, &fs_devices); |
f23c8af8c Btrfs: fix subvol... |
883 884 |
if (error) { kfree(subvol_name); |
061dbc6b9 convert btrfs |
885 |
return ERR_PTR(error); |
f23c8af8c Btrfs: fix subvol... |
886 |
} |
edf24abe5 btrfs: sanity mou... |
887 |
|
830c4adbd 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 btrfs: rename var... |
893 |
error = btrfs_scan_one_device(device_name, mode, fs_type, &fs_devices); |
8a4b83cc8 Btrfs: Add suppor... |
894 |
if (error) |
830c4adbd Btrfs: fix how we... |
895 |
return ERR_PTR(error); |
4b82d6e4a Btrfs: Add mount ... |
896 |
|
450ba0ea0 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 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 Btrfs: setup blan... |
909 |
error = -ENOMEM; |
04d21a244 Btrfs: rework err... |
910 |
goto error_fs_info; |
450ba0ea0 Btrfs: setup blan... |
911 |
} |
04d21a244 Btrfs: rework err... |
912 |
fs_info->tree_root->fs_info = fs_info; |
450ba0ea0 Btrfs: setup blan... |
913 |
fs_info->fs_devices = fs_devices; |
450ba0ea0 Btrfs: setup blan... |
914 |
|
6c41761fc 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 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 btrfs: separate s... |
928 929 |
goto error_close_devices; } |
dfe250206 Btrfs: Add mount ... |
930 |
bdev = fs_devices->latest_bdev; |
04d21a244 Btrfs: rework err... |
931 932 |
s = sget(fs_type, btrfs_test_super, btrfs_set_super, fs_info->tree_root); |
830c4adbd Btrfs: fix how we... |
933 934 935 936 |
if (IS_ERR(s)) { error = PTR_ERR(s); goto error_close_devices; } |
4b82d6e4a Btrfs: Add mount ... |
937 938 939 |
if (s->s_root) { if ((flags ^ s->s_flags) & MS_RDONLY) { |
6f5bbff9a Convert obvious p... |
940 |
deactivate_locked_super(s); |
04d21a244 Btrfs: rework err... |
941 942 |
error = -EBUSY; goto error_close_devices; |
4b82d6e4a Btrfs: Add mount ... |
943 |
} |
2b82032c3 Btrfs: Seed devic... |
944 |
btrfs_close_devices(fs_devices); |
6c41761fc btrfs: separate s... |
945 |
free_fs_info(fs_info); |
4b82d6e4a Btrfs: Add mount ... |
946 947 |
} else { char b[BDEVNAME_SIZE]; |
9e1f1de02 more conservative... |
948 |
s->s_flags = flags | MS_NOSEC; |
4b82d6e4a Btrfs: Add mount ... |
949 |
strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id)); |
5f524444c Btrfs: fix a bug ... |
950 |
btrfs_sb(s)->fs_info->bdev_holder = fs_type; |
8a4b83cc8 Btrfs: Add suppor... |
951 952 |
error = btrfs_fill_super(s, fs_devices, data, flags & MS_SILENT ? 1 : 0); |
4b82d6e4a Btrfs: Add mount ... |
953 |
if (error) { |
6f5bbff9a Convert obvious p... |
954 |
deactivate_locked_super(s); |
830c4adbd Btrfs: fix how we... |
955 |
return ERR_PTR(error); |
4b82d6e4a Btrfs: Add mount ... |
956 957 958 959 |
} s->s_flags |= MS_ACTIVE; } |
830c4adbd 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 Btrfs: Add mount ... |
964 |
} |
061dbc6b9 convert btrfs |
965 |
return root; |
4b82d6e4a Btrfs: Add mount ... |
966 |
|
c146afad2 Btrfs: mount ro a... |
967 |
error_close_devices: |
8a4b83cc8 Btrfs: Add suppor... |
968 |
btrfs_close_devices(fs_devices); |
04d21a244 Btrfs: rework err... |
969 |
error_fs_info: |
6c41761fc btrfs: separate s... |
970 |
free_fs_info(fs_info); |
061dbc6b9 convert btrfs |
971 |
return ERR_PTR(error); |
4b82d6e4a Btrfs: Add mount ... |
972 |
} |
2e635a278 Btrfs: initial mo... |
973 |
|
c146afad2 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 Btrfs: process mo... |
978 979 980 |
ret = btrfs_parse_options(root, data); if (ret) return -EINVAL; |
c146afad2 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 Btrfs: Seed devic... |
990 991 |
if (root->fs_info->fs_devices->rw_devices == 0) return -EACCES; |
6c41761fc btrfs: separate s... |
992 |
if (btrfs_super_log_root(root->fs_info->super_copy) != 0) |
c146afad2 Btrfs: mount ro a... |
993 |
return -EINVAL; |
d68fc57b7 Btrfs: Metadata r... |
994 |
ret = btrfs_cleanup_fs_roots(root->fs_info); |
c146afad2 Btrfs: mount ro a... |
995 |
WARN_ON(ret); |
d68fc57b7 Btrfs: Metadata r... |
996 997 |
/* recover relocation */ ret = btrfs_recover_relocation(root); |
c146afad2 Btrfs: mount ro a... |
998 999 1000 1001 1002 1003 1004 |
WARN_ON(ret); sb->s_flags &= ~MS_RDONLY; } return 0; } |
bcd53741c 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 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 Btrfs: fix inaccu... |
1045 |
int min_stripes = 1, num_stripes = 1; |
6d07bcec9 btrfs: fix wrong ... |
1046 1047 |
int i = 0, nr_devices; int ret; |
b772a86ea Btrfs: fix oops w... |
1048 |
nr_devices = fs_info->fs_devices->open_devices; |
6d07bcec9 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 Btrfs: fix inaccu... |
1058 |
if (type & BTRFS_BLOCK_GROUP_RAID0) { |
6d07bcec9 btrfs: fix wrong ... |
1059 |
min_stripes = 2; |
39fb26c39 Btrfs: fix inaccu... |
1060 1061 |
num_stripes = nr_devices; } else if (type & BTRFS_BLOCK_GROUP_RAID1) { |
6d07bcec9 btrfs: fix wrong ... |
1062 |
min_stripes = 2; |
39fb26c39 Btrfs: fix inaccu... |
1063 1064 |
num_stripes = 2; } else if (type & BTRFS_BLOCK_GROUP_RAID10) { |
6d07bcec9 btrfs: fix wrong ... |
1065 |
min_stripes = 4; |
39fb26c39 Btrfs: fix inaccu... |
1066 1067 |
num_stripes = 4; } |
6d07bcec9 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 Btrfs: fix oops w... |
1073 1074 |
list_for_each_entry(device, &fs_devices->devices, dev_list) { if (!device->in_fs_metadata || !device->bdev) |
6d07bcec9 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 Btrfs: fix inaccu... |
1135 1136 |
if (num_stripes > nr_devices) num_stripes = nr_devices; |
6d07bcec9 btrfs: fix wrong ... |
1137 1138 1139 |
if (devices_info[i].max_avail >= min_stripe_size) { int j; u64 alloc_size; |
39fb26c39 Btrfs: fix inaccu... |
1140 |
avail_space += devices_info[i].max_avail * num_stripes; |
6d07bcec9 btrfs: fix wrong ... |
1141 |
alloc_size = devices_info[i].max_avail; |
39fb26c39 Btrfs: fix inaccu... |
1142 |
for (j = i + 1 - num_stripes; j <= i; j++) |
6d07bcec9 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 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 btrfs: separate s... |
1156 |
struct btrfs_super_block *disk_super = root->fs_info->super_copy; |
bd4d10888 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 btrfs: fix wrong ... |
1160 |
u64 total_free_data = 0; |
db94535db Btrfs: Allow tree... |
1161 |
int bits = dentry->d_sb->s_blocksize_bits; |
9d03632e2 Fill f_fsid field... |
1162 |
__be32 *fsid = (__be32 *)root->fs_info->fsid; |
6d07bcec9 btrfs: fix wrong ... |
1163 |
int ret; |
8fd17795b Btrfs: early fsyn... |
1164 |
|
6d07bcec9 btrfs: fix wrong ... |
1165 1166 |
/* holding chunk_muext to avoid allocating new chunks */ mutex_lock(&root->fs_info->chunk_mutex); |
bd4d10888 Btrfs: make df be... |
1167 |
rcu_read_lock(); |
89a55897a Btrfs: fix df reg... |
1168 |
list_for_each_entry_rcu(found, head, list) { |
6d07bcec9 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 Btrfs: Link block... |
1174 |
total_used += found->disk_used; |
89a55897a Btrfs: fix df reg... |
1175 |
} |
bd4d10888 Btrfs: make df be... |
1176 |
rcu_read_unlock(); |
8fd17795b Btrfs: early fsyn... |
1177 |
buf->f_namelen = BTRFS_NAME_LEN; |
db94535db Btrfs: Allow tree... |
1178 |
buf->f_blocks = btrfs_super_total_bytes(disk_super) >> bits; |
bd4d10888 Btrfs: make df be... |
1179 |
buf->f_bfree = buf->f_blocks - (total_used >> bits); |
8fd17795b Btrfs: early fsyn... |
1180 1181 |
buf->f_bsize = dentry->d_sb->s_blocksize; buf->f_type = BTRFS_SUPER_MAGIC; |
6d07bcec9 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 Btrfs: Fix checkp... |
1191 |
|
9d03632e2 Fill f_fsid field... |
1192 |
/* We treat it as constant endianness (it doesn't matter _which_) |
d397712bc Btrfs: Fix checkp... |
1193 |
because we want the fsid to come out the same whether mounted |
9d03632e2 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 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 Btrfs: early fsyn... |
1200 1201 |
return 0; } |
b51338628 Btrfs: add dirty_... |
1202 |
|
2e635a278 Btrfs: initial mo... |
1203 1204 1205 |
static struct file_system_type btrfs_fs_type = { .owner = THIS_MODULE, .name = "btrfs", |
061dbc6b9 convert btrfs |
1206 |
.mount = btrfs_mount, |
a061fc8da Btrfs: Add suppor... |
1207 |
.kill_sb = kill_anon_super, |
2e635a278 Btrfs: initial mo... |
1208 1209 |
.fs_flags = FS_REQUIRES_DEV, }; |
a9218f6b0 Add /dev/btrfs-co... |
1210 |
|
d352ac681 Btrfs: add and im... |
1211 1212 1213 |
/* * used by btrfsctl to scan devices when no FS is mounted */ |
8a4b83cc8 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 Btrfs: fix ioctl ... |
1219 |
int ret = -ENOTTY; |
8a4b83cc8 Btrfs: Add suppor... |
1220 |
|
e441d54de Btrfs: add permis... |
1221 1222 |
if (!capable(CAP_SYS_ADMIN)) return -EPERM; |
dae7b665c btrfs: use memdup... |
1223 1224 1225 |
vol = memdup_user((void __user *)arg, sizeof(*vol)); if (IS_ERR(vol)) return PTR_ERR(vol); |
c071fcfdb Btrfs: fix ioctl ... |
1226 |
|
8a4b83cc8 Btrfs: Add suppor... |
1227 1228 |
switch (cmd) { case BTRFS_IOC_SCAN_DEV: |
97288f2c7 Btrfs: corret fmo... |
1229 |
ret = btrfs_scan_one_device(vol->name, FMODE_READ, |
8a4b83cc8 Btrfs: Add suppor... |
1230 1231 1232 |
&btrfs_fs_type, &fs_devices); break; } |
dae7b665c btrfs: use memdup... |
1233 |
|
8a4b83cc8 Btrfs: Add suppor... |
1234 |
kfree(vol); |
f819d837e btrfsctl -A error... |
1235 |
return ret; |
8a4b83cc8 Btrfs: Add suppor... |
1236 |
} |
0176260fc btrfs: fix for wr... |
1237 |
static int btrfs_freeze(struct super_block *sb) |
ed0dab6b8 Btrfs: Add basic ... |
1238 1239 |
{ struct btrfs_root *root = btrfs_sb(sb); |
a74a4b97b Btrfs: Replace th... |
1240 1241 |
mutex_lock(&root->fs_info->transaction_kthread_mutex); mutex_lock(&root->fs_info->cleaner_mutex); |
0176260fc btrfs: fix for wr... |
1242 |
return 0; |
ed0dab6b8 Btrfs: Add basic ... |
1243 |
} |
0176260fc btrfs: fix for wr... |
1244 |
static int btrfs_unfreeze(struct super_block *sb) |
ed0dab6b8 Btrfs: Add basic ... |
1245 1246 |
{ struct btrfs_root *root = btrfs_sb(sb); |
a74a4b97b Btrfs: Replace th... |
1247 1248 |
mutex_unlock(&root->fs_info->cleaner_mutex); mutex_unlock(&root->fs_info->transaction_kthread_mutex); |
0176260fc btrfs: fix for wr... |
1249 |
return 0; |
ed0dab6b8 Btrfs: Add basic ... |
1250 |
} |
2e635a278 Btrfs: initial mo... |
1251 |
|
22c44fe65 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 const: mark remai... |
1262 |
static const struct super_operations btrfs_super_ops = { |
76dda93c6 Btrfs: add snapsh... |
1263 |
.drop_inode = btrfs_drop_inode, |
bd5559752 convert btrfs to ... |
1264 |
.evict_inode = btrfs_evict_inode, |
e20d96d64 Mountable btrfs, ... |
1265 |
.put_super = btrfs_put_super, |
d57197629 btrfs_create, btr... |
1266 |
.sync_fs = btrfs_sync_fs, |
a9572a15a Btrfs: introduce ... |
1267 |
.show_options = btrfs_show_options, |
4730a4bc5 btrfs_dirty_inode |
1268 |
.write_inode = btrfs_write_inode, |
22c44fe65 Btrfs: deal with ... |
1269 |
.dirty_inode = btrfs_fs_dirty_inode, |
2c90e5d65 Btrfs: still corr... |
1270 1271 |
.alloc_inode = btrfs_alloc_inode, .destroy_inode = btrfs_destroy_inode, |
8fd17795b Btrfs: early fsyn... |
1272 |
.statfs = btrfs_statfs, |
c146afad2 Btrfs: mount ro a... |
1273 |
.remount_fs = btrfs_remount, |
0176260fc btrfs: fix for wr... |
1274 1275 |
.freeze_fs = btrfs_freeze, .unfreeze_fs = btrfs_unfreeze, |
e20d96d64 Mountable btrfs, ... |
1276 |
}; |
a9218f6b0 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 llseek: automatic... |
1282 |
.llseek = noop_llseek, |
a9218f6b0 Add /dev/btrfs-co... |
1283 1284 1285 |
}; static struct miscdevice btrfs_misc = { |
578454ff7 driver core: add ... |
1286 |
.minor = BTRFS_MINOR, |
a9218f6b0 Add /dev/btrfs-co... |
1287 1288 1289 |
.name = "btrfs-control", .fops = &btrfs_ctl_fops }; |
578454ff7 driver core: add ... |
1290 1291 |
MODULE_ALIAS_MISCDEV(BTRFS_MINOR); MODULE_ALIAS("devname:btrfs-control"); |
a9218f6b0 Add /dev/btrfs-co... |
1292 1293 1294 1295 |
static int btrfs_interface_init(void) { return misc_register(&btrfs_misc); } |
b2950863c Btrfs: make thing... |
1296 |
static void btrfs_interface_exit(void) |
a9218f6b0 Add /dev/btrfs-co... |
1297 1298 |
{ if (misc_deregister(&btrfs_misc) < 0) |
d397712bc Btrfs: Fix checkp... |
1299 |
printk(KERN_INFO "misc_deregister failed for control device"); |
a9218f6b0 Add /dev/btrfs-co... |
1300 |
} |
2e635a278 Btrfs: initial mo... |
1301 1302 |
static int __init init_btrfs_fs(void) { |
2c90e5d65 Btrfs: still corr... |
1303 |
int err; |
58176a960 Btrfs: Add per-ro... |
1304 1305 1306 1307 |
err = btrfs_init_sysfs(); if (err) return err; |
261507a02 btrfs: Allow to a... |
1308 |
err = btrfs_init_compress(); |
2c90e5d65 Btrfs: still corr... |
1309 |
if (err) |
a74a4b97b Btrfs: Replace th... |
1310 |
goto free_sysfs; |
d1310b2e0 Btrfs: Split the ... |
1311 |
|
261507a02 btrfs: Allow to a... |
1312 1313 1314 |
err = btrfs_init_cachep(); if (err) goto free_compress; |
d1310b2e0 Btrfs: Split the ... |
1315 |
err = extent_io_init(); |
2f4cbe644 Btrfs: Return val... |
1316 1317 |
if (err) goto free_cachep; |
d1310b2e0 Btrfs: Split the ... |
1318 1319 1320 |
err = extent_map_init(); if (err) goto free_extent_io; |
16cdcec73 btrfs: implement ... |
1321 |
err = btrfs_delayed_inode_init(); |
2f4cbe644 Btrfs: Return val... |
1322 1323 |
if (err) goto free_extent_map; |
c8b978188 Btrfs: Add zlib c... |
1324 |
|
16cdcec73 btrfs: implement ... |
1325 1326 1327 |
err = btrfs_interface_init(); if (err) goto free_delayed_inode; |
a9218f6b0 Add /dev/btrfs-co... |
1328 1329 1330 |
err = register_filesystem(&btrfs_fs_type); if (err) goto unregister_ioctl; |
b3c3da71e Btrfs: Add versio... |
1331 1332 1333 |
printk(KERN_INFO "%s loaded ", BTRFS_BUILD_VERSION); |
2f4cbe644 Btrfs: Return val... |
1334 |
return 0; |
a9218f6b0 Add /dev/btrfs-co... |
1335 1336 |
unregister_ioctl: btrfs_interface_exit(); |
16cdcec73 btrfs: implement ... |
1337 1338 |
free_delayed_inode: btrfs_delayed_inode_exit(); |
2f4cbe644 Btrfs: Return val... |
1339 1340 |
free_extent_map: extent_map_exit(); |
d1310b2e0 Btrfs: Split the ... |
1341 1342 |
free_extent_io: extent_io_exit(); |
2f4cbe644 Btrfs: Return val... |
1343 1344 |
free_cachep: btrfs_destroy_cachep(); |
261507a02 btrfs: Allow to a... |
1345 1346 |
free_compress: btrfs_exit_compress(); |
a74a4b97b Btrfs: Replace th... |
1347 |
free_sysfs: |
2f4cbe644 Btrfs: Return val... |
1348 1349 |
btrfs_exit_sysfs(); return err; |
2e635a278 Btrfs: initial mo... |
1350 1351 1352 1353 |
} static void __exit exit_btrfs_fs(void) { |
39279cc3d Btrfs: split up s... |
1354 |
btrfs_destroy_cachep(); |
16cdcec73 btrfs: implement ... |
1355 |
btrfs_delayed_inode_exit(); |
a52d9a803 Btrfs: Extent bas... |
1356 |
extent_map_exit(); |
d1310b2e0 Btrfs: Split the ... |
1357 |
extent_io_exit(); |
a9218f6b0 Add /dev/btrfs-co... |
1358 |
btrfs_interface_exit(); |
2e635a278 Btrfs: initial mo... |
1359 |
unregister_filesystem(&btrfs_fs_type); |
58176a960 Btrfs: Add per-ro... |
1360 |
btrfs_exit_sysfs(); |
8a4b83cc8 Btrfs: Add suppor... |
1361 |
btrfs_cleanup_fs_uuids(); |
261507a02 btrfs: Allow to a... |
1362 |
btrfs_exit_compress(); |
2e635a278 Btrfs: initial mo... |
1363 1364 1365 1366 1367 1368 |
} module_init(init_btrfs_fs) module_exit(exit_btrfs_fs) MODULE_LICENSE("GPL"); |