diff options
author | Chris Mason <clm@fb.com> | 2016-01-19 21:21:30 -0500 |
---|---|---|
committer | Chris Mason <clm@fb.com> | 2016-01-19 21:21:30 -0500 |
commit | 326f784281fbbdcd91bb401b2a3e32132c0f5c72 (patch) | |
tree | ebee8e2cf51dd901d8c31b88e1a93b1655e6abf4 /fs | |
parent | acc308556c812485462b6b43843c3f64530dd843 (diff) | |
parent | 546bed631203344611f42b2af1d224d2eedb4e6b (diff) |
Merge branch 'misc-for-4.5' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux into for-linus-4.5
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/disk-io.c | 27 | ||||
-rw-r--r-- | fs/btrfs/inode-map.c | 9 | ||||
-rw-r--r-- | fs/btrfs/inode-map.h | 1 | ||||
-rw-r--r-- | fs/btrfs/ioctl.c | 4 | ||||
-rw-r--r-- | fs/btrfs/super.c | 29 | ||||
-rw-r--r-- | fs/btrfs/volumes.c | 1 |
6 files changed, 56 insertions, 15 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index c67c129fe99a..64f02c3d0dd0 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -1583,8 +1583,23 @@ int btrfs_init_fs_root(struct btrfs_root *root) | |||
1583 | ret = get_anon_bdev(&root->anon_dev); | 1583 | ret = get_anon_bdev(&root->anon_dev); |
1584 | if (ret) | 1584 | if (ret) |
1585 | goto free_writers; | 1585 | goto free_writers; |
1586 | |||
1587 | mutex_lock(&root->objectid_mutex); | ||
1588 | ret = btrfs_find_highest_objectid(root, | ||
1589 | &root->highest_objectid); | ||
1590 | if (ret) { | ||
1591 | mutex_unlock(&root->objectid_mutex); | ||
1592 | goto free_root_dev; | ||
1593 | } | ||
1594 | |||
1595 | ASSERT(root->highest_objectid <= BTRFS_LAST_FREE_OBJECTID); | ||
1596 | |||
1597 | mutex_unlock(&root->objectid_mutex); | ||
1598 | |||
1586 | return 0; | 1599 | return 0; |
1587 | 1600 | ||
1601 | free_root_dev: | ||
1602 | free_anon_bdev(root->anon_dev); | ||
1588 | free_writers: | 1603 | free_writers: |
1589 | btrfs_free_subvolume_writers(root->subv_writers); | 1604 | btrfs_free_subvolume_writers(root->subv_writers); |
1590 | fail: | 1605 | fail: |
@@ -2915,6 +2930,18 @@ retry_root_backup: | |||
2915 | tree_root->commit_root = btrfs_root_node(tree_root); | 2930 | tree_root->commit_root = btrfs_root_node(tree_root); |
2916 | btrfs_set_root_refs(&tree_root->root_item, 1); | 2931 | btrfs_set_root_refs(&tree_root->root_item, 1); |
2917 | 2932 | ||
2933 | mutex_lock(&tree_root->objectid_mutex); | ||
2934 | ret = btrfs_find_highest_objectid(tree_root, | ||
2935 | &tree_root->highest_objectid); | ||
2936 | if (ret) { | ||
2937 | mutex_unlock(&tree_root->objectid_mutex); | ||
2938 | goto recovery_tree_root; | ||
2939 | } | ||
2940 | |||
2941 | ASSERT(tree_root->highest_objectid <= BTRFS_LAST_FREE_OBJECTID); | ||
2942 | |||
2943 | mutex_unlock(&tree_root->objectid_mutex); | ||
2944 | |||
2918 | ret = btrfs_read_roots(fs_info, tree_root); | 2945 | ret = btrfs_read_roots(fs_info, tree_root); |
2919 | if (ret) | 2946 | if (ret) |
2920 | goto recovery_tree_root; | 2947 | goto recovery_tree_root; |
diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c index 8b57c17b3fb3..e50316c4af15 100644 --- a/fs/btrfs/inode-map.c +++ b/fs/btrfs/inode-map.c | |||
@@ -515,7 +515,7 @@ out: | |||
515 | return ret; | 515 | return ret; |
516 | } | 516 | } |
517 | 517 | ||
518 | static int btrfs_find_highest_objectid(struct btrfs_root *root, u64 *objectid) | 518 | int btrfs_find_highest_objectid(struct btrfs_root *root, u64 *objectid) |
519 | { | 519 | { |
520 | struct btrfs_path *path; | 520 | struct btrfs_path *path; |
521 | int ret; | 521 | int ret; |
@@ -555,13 +555,6 @@ int btrfs_find_free_objectid(struct btrfs_root *root, u64 *objectid) | |||
555 | int ret; | 555 | int ret; |
556 | mutex_lock(&root->objectid_mutex); | 556 | mutex_lock(&root->objectid_mutex); |
557 | 557 | ||
558 | if (unlikely(root->highest_objectid < BTRFS_FIRST_FREE_OBJECTID)) { | ||
559 | ret = btrfs_find_highest_objectid(root, | ||
560 | &root->highest_objectid); | ||
561 | if (ret) | ||
562 | goto out; | ||
563 | } | ||
564 | |||
565 | if (unlikely(root->highest_objectid >= BTRFS_LAST_FREE_OBJECTID)) { | 558 | if (unlikely(root->highest_objectid >= BTRFS_LAST_FREE_OBJECTID)) { |
566 | ret = -ENOSPC; | 559 | ret = -ENOSPC; |
567 | goto out; | 560 | goto out; |
diff --git a/fs/btrfs/inode-map.h b/fs/btrfs/inode-map.h index ddb347bfee23..c8e864b2d530 100644 --- a/fs/btrfs/inode-map.h +++ b/fs/btrfs/inode-map.h | |||
@@ -9,5 +9,6 @@ int btrfs_save_ino_cache(struct btrfs_root *root, | |||
9 | struct btrfs_trans_handle *trans); | 9 | struct btrfs_trans_handle *trans); |
10 | 10 | ||
11 | int btrfs_find_free_objectid(struct btrfs_root *root, u64 *objectid); | 11 | int btrfs_find_free_objectid(struct btrfs_root *root, u64 *objectid); |
12 | int btrfs_find_highest_objectid(struct btrfs_root *root, u64 *objectid); | ||
12 | 13 | ||
13 | #endif | 14 | #endif |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index e392dd67f0ba..83c9ad3f2621 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -568,6 +568,10 @@ static noinline int create_subvol(struct inode *dir, | |||
568 | goto fail; | 568 | goto fail; |
569 | } | 569 | } |
570 | 570 | ||
571 | mutex_lock(&new_root->objectid_mutex); | ||
572 | new_root->highest_objectid = new_dirid; | ||
573 | mutex_unlock(&new_root->objectid_mutex); | ||
574 | |||
571 | /* | 575 | /* |
572 | * insert the directory item | 576 | * insert the directory item |
573 | */ | 577 | */ |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 86f7fdc05633..a8e049ae933d 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -383,6 +383,9 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
383 | int ret = 0; | 383 | int ret = 0; |
384 | char *compress_type; | 384 | char *compress_type; |
385 | bool compress_force = false; | 385 | bool compress_force = false; |
386 | enum btrfs_compression_type saved_compress_type; | ||
387 | bool saved_compress_force; | ||
388 | int no_compress = 0; | ||
386 | 389 | ||
387 | cache_gen = btrfs_super_cache_generation(root->fs_info->super_copy); | 390 | cache_gen = btrfs_super_cache_generation(root->fs_info->super_copy); |
388 | if (btrfs_fs_compat_ro(root->fs_info, FREE_SPACE_TREE)) | 391 | if (btrfs_fs_compat_ro(root->fs_info, FREE_SPACE_TREE)) |
@@ -462,6 +465,10 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
462 | /* Fallthrough */ | 465 | /* Fallthrough */ |
463 | case Opt_compress: | 466 | case Opt_compress: |
464 | case Opt_compress_type: | 467 | case Opt_compress_type: |
468 | saved_compress_type = btrfs_test_opt(root, COMPRESS) ? | ||
469 | info->compress_type : BTRFS_COMPRESS_NONE; | ||
470 | saved_compress_force = | ||
471 | btrfs_test_opt(root, FORCE_COMPRESS); | ||
465 | if (token == Opt_compress || | 472 | if (token == Opt_compress || |
466 | token == Opt_compress_force || | 473 | token == Opt_compress_force || |
467 | strcmp(args[0].from, "zlib") == 0) { | 474 | strcmp(args[0].from, "zlib") == 0) { |
@@ -470,6 +477,7 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
470 | btrfs_set_opt(info->mount_opt, COMPRESS); | 477 | btrfs_set_opt(info->mount_opt, COMPRESS); |
471 | btrfs_clear_opt(info->mount_opt, NODATACOW); | 478 | btrfs_clear_opt(info->mount_opt, NODATACOW); |
472 | btrfs_clear_opt(info->mount_opt, NODATASUM); | 479 | btrfs_clear_opt(info->mount_opt, NODATASUM); |
480 | no_compress = 0; | ||
473 | } else if (strcmp(args[0].from, "lzo") == 0) { | 481 | } else if (strcmp(args[0].from, "lzo") == 0) { |
474 | compress_type = "lzo"; | 482 | compress_type = "lzo"; |
475 | info->compress_type = BTRFS_COMPRESS_LZO; | 483 | info->compress_type = BTRFS_COMPRESS_LZO; |
@@ -477,25 +485,21 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
477 | btrfs_clear_opt(info->mount_opt, NODATACOW); | 485 | btrfs_clear_opt(info->mount_opt, NODATACOW); |
478 | btrfs_clear_opt(info->mount_opt, NODATASUM); | 486 | btrfs_clear_opt(info->mount_opt, NODATASUM); |
479 | btrfs_set_fs_incompat(info, COMPRESS_LZO); | 487 | btrfs_set_fs_incompat(info, COMPRESS_LZO); |
488 | no_compress = 0; | ||
480 | } else if (strncmp(args[0].from, "no", 2) == 0) { | 489 | } else if (strncmp(args[0].from, "no", 2) == 0) { |
481 | compress_type = "no"; | 490 | compress_type = "no"; |
482 | btrfs_clear_opt(info->mount_opt, COMPRESS); | 491 | btrfs_clear_opt(info->mount_opt, COMPRESS); |
483 | btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS); | 492 | btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS); |
484 | compress_force = false; | 493 | compress_force = false; |
494 | no_compress++; | ||
485 | } else { | 495 | } else { |
486 | ret = -EINVAL; | 496 | ret = -EINVAL; |
487 | goto out; | 497 | goto out; |
488 | } | 498 | } |
489 | 499 | ||
490 | if (compress_force) { | 500 | if (compress_force) { |
491 | btrfs_set_and_info(root, FORCE_COMPRESS, | 501 | btrfs_set_opt(info->mount_opt, FORCE_COMPRESS); |
492 | "force %s compression", | ||
493 | compress_type); | ||
494 | } else { | 502 | } else { |
495 | if (!btrfs_test_opt(root, COMPRESS)) | ||
496 | btrfs_info(root->fs_info, | ||
497 | "btrfs: use %s compression", | ||
498 | compress_type); | ||
499 | /* | 503 | /* |
500 | * If we remount from compress-force=xxx to | 504 | * If we remount from compress-force=xxx to |
501 | * compress=xxx, we need clear FORCE_COMPRESS | 505 | * compress=xxx, we need clear FORCE_COMPRESS |
@@ -504,6 +508,17 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
504 | */ | 508 | */ |
505 | btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS); | 509 | btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS); |
506 | } | 510 | } |
511 | if ((btrfs_test_opt(root, COMPRESS) && | ||
512 | (info->compress_type != saved_compress_type || | ||
513 | compress_force != saved_compress_force)) || | ||
514 | (!btrfs_test_opt(root, COMPRESS) && | ||
515 | no_compress == 1)) { | ||
516 | btrfs_info(root->fs_info, | ||
517 | "%s %s compression", | ||
518 | (compress_force) ? "force" : "use", | ||
519 | compress_type); | ||
520 | } | ||
521 | compress_force = false; | ||
507 | break; | 522 | break; |
508 | case Opt_ssd: | 523 | case Opt_ssd: |
509 | btrfs_set_and_info(root, SSD, | 524 | btrfs_set_and_info(root, SSD, |
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index ad972fcbc0af..9b845155d21f 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
@@ -233,6 +233,7 @@ static struct btrfs_device *__alloc_device(void) | |||
233 | spin_lock_init(&dev->reada_lock); | 233 | spin_lock_init(&dev->reada_lock); |
234 | atomic_set(&dev->reada_in_flight, 0); | 234 | atomic_set(&dev->reada_in_flight, 0); |
235 | atomic_set(&dev->dev_stats_ccnt, 0); | 235 | atomic_set(&dev->dev_stats_ccnt, 0); |
236 | btrfs_device_data_ordered_init(dev); | ||
236 | INIT_RADIX_TREE(&dev->reada_zones, GFP_NOFS & ~__GFP_DIRECT_RECLAIM); | 237 | INIT_RADIX_TREE(&dev->reada_zones, GFP_NOFS & ~__GFP_DIRECT_RECLAIM); |
237 | INIT_RADIX_TREE(&dev->reada_extents, GFP_NOFS & ~__GFP_DIRECT_RECLAIM); | 238 | INIT_RADIX_TREE(&dev->reada_extents, GFP_NOFS & ~__GFP_DIRECT_RECLAIM); |
238 | 239 | ||