aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorChris Mason <clm@fb.com>2016-01-19 21:21:30 -0500
committerChris Mason <clm@fb.com>2016-01-19 21:21:30 -0500
commit326f784281fbbdcd91bb401b2a3e32132c0f5c72 (patch)
treeebee8e2cf51dd901d8c31b88e1a93b1655e6abf4 /fs
parentacc308556c812485462b6b43843c3f64530dd843 (diff)
parent546bed631203344611f42b2af1d224d2eedb4e6b (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.c27
-rw-r--r--fs/btrfs/inode-map.c9
-rw-r--r--fs/btrfs/inode-map.h1
-rw-r--r--fs/btrfs/ioctl.c4
-rw-r--r--fs/btrfs/super.c29
-rw-r--r--fs/btrfs/volumes.c1
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
1601free_root_dev:
1602 free_anon_bdev(root->anon_dev);
1588free_writers: 1603free_writers:
1589 btrfs_free_subvolume_writers(root->subv_writers); 1604 btrfs_free_subvolume_writers(root->subv_writers);
1590fail: 1605fail:
@@ -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
518static int btrfs_find_highest_objectid(struct btrfs_root *root, u64 *objectid) 518int 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
11int btrfs_find_free_objectid(struct btrfs_root *root, u64 *objectid); 11int btrfs_find_free_objectid(struct btrfs_root *root, u64 *objectid);
12int 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