diff options
author | Yunlei He <heyunlei@huawei.com> | 2017-02-23 06:39:59 -0500 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2017-02-27 12:59:53 -0500 |
commit | 5e8256ac2e378089a1bf3fae87370811b1d31625 (patch) | |
tree | 43a8db726ba16de12521ab9a3913540fed8b28a8 /fs/f2fs | |
parent | 3f2be04304cf10f2ef074399f8dd565bd00ddcae (diff) |
f2fs: replace rw semaphore extent_tree_lock with mutex lock
This patch replace rw semaphore extent_tree_lock with mutex lock
for no read cases with this lock.
Signed-off-by: Yunlei He <heyunlei@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs')
-rw-r--r-- | fs/f2fs/extent_cache.c | 22 | ||||
-rw-r--r-- | fs/f2fs/f2fs.h | 2 |
2 files changed, 12 insertions, 12 deletions
diff --git a/fs/f2fs/extent_cache.c b/fs/f2fs/extent_cache.c index 6ed6424807b6..0ab5518e45c2 100644 --- a/fs/f2fs/extent_cache.c +++ b/fs/f2fs/extent_cache.c | |||
@@ -77,7 +77,7 @@ static struct extent_tree *__grab_extent_tree(struct inode *inode) | |||
77 | struct extent_tree *et; | 77 | struct extent_tree *et; |
78 | nid_t ino = inode->i_ino; | 78 | nid_t ino = inode->i_ino; |
79 | 79 | ||
80 | down_write(&sbi->extent_tree_lock); | 80 | mutex_lock(&sbi->extent_tree_lock); |
81 | et = radix_tree_lookup(&sbi->extent_tree_root, ino); | 81 | et = radix_tree_lookup(&sbi->extent_tree_root, ino); |
82 | if (!et) { | 82 | if (!et) { |
83 | et = f2fs_kmem_cache_alloc(extent_tree_slab, GFP_NOFS); | 83 | et = f2fs_kmem_cache_alloc(extent_tree_slab, GFP_NOFS); |
@@ -94,7 +94,7 @@ static struct extent_tree *__grab_extent_tree(struct inode *inode) | |||
94 | atomic_dec(&sbi->total_zombie_tree); | 94 | atomic_dec(&sbi->total_zombie_tree); |
95 | list_del_init(&et->list); | 95 | list_del_init(&et->list); |
96 | } | 96 | } |
97 | up_write(&sbi->extent_tree_lock); | 97 | mutex_unlock(&sbi->extent_tree_lock); |
98 | 98 | ||
99 | /* never died until evict_inode */ | 99 | /* never died until evict_inode */ |
100 | F2FS_I(inode)->extent_tree = et; | 100 | F2FS_I(inode)->extent_tree = et; |
@@ -548,7 +548,7 @@ unsigned int f2fs_shrink_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink) | |||
548 | if (!atomic_read(&sbi->total_zombie_tree)) | 548 | if (!atomic_read(&sbi->total_zombie_tree)) |
549 | goto free_node; | 549 | goto free_node; |
550 | 550 | ||
551 | if (!down_write_trylock(&sbi->extent_tree_lock)) | 551 | if (!mutex_trylock(&sbi->extent_tree_lock)) |
552 | goto out; | 552 | goto out; |
553 | 553 | ||
554 | /* 1. remove unreferenced extent tree */ | 554 | /* 1. remove unreferenced extent tree */ |
@@ -570,11 +570,11 @@ unsigned int f2fs_shrink_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink) | |||
570 | goto unlock_out; | 570 | goto unlock_out; |
571 | cond_resched(); | 571 | cond_resched(); |
572 | } | 572 | } |
573 | up_write(&sbi->extent_tree_lock); | 573 | mutex_unlock(&sbi->extent_tree_lock); |
574 | 574 | ||
575 | free_node: | 575 | free_node: |
576 | /* 2. remove LRU extent entries */ | 576 | /* 2. remove LRU extent entries */ |
577 | if (!down_write_trylock(&sbi->extent_tree_lock)) | 577 | if (!mutex_trylock(&sbi->extent_tree_lock)) |
578 | goto out; | 578 | goto out; |
579 | 579 | ||
580 | remained = nr_shrink - (node_cnt + tree_cnt); | 580 | remained = nr_shrink - (node_cnt + tree_cnt); |
@@ -604,7 +604,7 @@ free_node: | |||
604 | spin_unlock(&sbi->extent_lock); | 604 | spin_unlock(&sbi->extent_lock); |
605 | 605 | ||
606 | unlock_out: | 606 | unlock_out: |
607 | up_write(&sbi->extent_tree_lock); | 607 | mutex_unlock(&sbi->extent_tree_lock); |
608 | out: | 608 | out: |
609 | trace_f2fs_shrink_extent_tree(sbi, node_cnt, tree_cnt); | 609 | trace_f2fs_shrink_extent_tree(sbi, node_cnt, tree_cnt); |
610 | 610 | ||
@@ -651,10 +651,10 @@ void f2fs_destroy_extent_tree(struct inode *inode) | |||
651 | 651 | ||
652 | if (inode->i_nlink && !is_bad_inode(inode) && | 652 | if (inode->i_nlink && !is_bad_inode(inode) && |
653 | atomic_read(&et->node_cnt)) { | 653 | atomic_read(&et->node_cnt)) { |
654 | down_write(&sbi->extent_tree_lock); | 654 | mutex_lock(&sbi->extent_tree_lock); |
655 | list_add_tail(&et->list, &sbi->zombie_list); | 655 | list_add_tail(&et->list, &sbi->zombie_list); |
656 | atomic_inc(&sbi->total_zombie_tree); | 656 | atomic_inc(&sbi->total_zombie_tree); |
657 | up_write(&sbi->extent_tree_lock); | 657 | mutex_unlock(&sbi->extent_tree_lock); |
658 | return; | 658 | return; |
659 | } | 659 | } |
660 | 660 | ||
@@ -662,12 +662,12 @@ void f2fs_destroy_extent_tree(struct inode *inode) | |||
662 | node_cnt = f2fs_destroy_extent_node(inode); | 662 | node_cnt = f2fs_destroy_extent_node(inode); |
663 | 663 | ||
664 | /* delete extent tree entry in radix tree */ | 664 | /* delete extent tree entry in radix tree */ |
665 | down_write(&sbi->extent_tree_lock); | 665 | mutex_lock(&sbi->extent_tree_lock); |
666 | f2fs_bug_on(sbi, atomic_read(&et->node_cnt)); | 666 | f2fs_bug_on(sbi, atomic_read(&et->node_cnt)); |
667 | radix_tree_delete(&sbi->extent_tree_root, inode->i_ino); | 667 | radix_tree_delete(&sbi->extent_tree_root, inode->i_ino); |
668 | kmem_cache_free(extent_tree_slab, et); | 668 | kmem_cache_free(extent_tree_slab, et); |
669 | atomic_dec(&sbi->total_ext_tree); | 669 | atomic_dec(&sbi->total_ext_tree); |
670 | up_write(&sbi->extent_tree_lock); | 670 | mutex_unlock(&sbi->extent_tree_lock); |
671 | 671 | ||
672 | F2FS_I(inode)->extent_tree = NULL; | 672 | F2FS_I(inode)->extent_tree = NULL; |
673 | 673 | ||
@@ -714,7 +714,7 @@ void f2fs_update_extent_cache_range(struct dnode_of_data *dn, | |||
714 | void init_extent_cache_info(struct f2fs_sb_info *sbi) | 714 | void init_extent_cache_info(struct f2fs_sb_info *sbi) |
715 | { | 715 | { |
716 | INIT_RADIX_TREE(&sbi->extent_tree_root, GFP_NOIO); | 716 | INIT_RADIX_TREE(&sbi->extent_tree_root, GFP_NOIO); |
717 | init_rwsem(&sbi->extent_tree_lock); | 717 | mutex_init(&sbi->extent_tree_lock); |
718 | INIT_LIST_HEAD(&sbi->extent_list); | 718 | INIT_LIST_HEAD(&sbi->extent_list); |
719 | spin_lock_init(&sbi->extent_lock); | 719 | spin_lock_init(&sbi->extent_lock); |
720 | atomic_set(&sbi->total_ext_tree, 0); | 720 | atomic_set(&sbi->total_ext_tree, 0); |
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 6efb2d91f5a1..e26cc6909a54 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h | |||
@@ -844,7 +844,7 @@ struct f2fs_sb_info { | |||
844 | 844 | ||
845 | /* for extent tree cache */ | 845 | /* for extent tree cache */ |
846 | struct radix_tree_root extent_tree_root;/* cache extent cache entries */ | 846 | struct radix_tree_root extent_tree_root;/* cache extent cache entries */ |
847 | struct rw_semaphore extent_tree_lock; /* locking extent radix tree */ | 847 | struct mutex extent_tree_lock; /* locking extent radix tree */ |
848 | struct list_head extent_list; /* lru list for shrinker */ | 848 | struct list_head extent_list; /* lru list for shrinker */ |
849 | spinlock_t extent_lock; /* locking extent lru list */ | 849 | spinlock_t extent_lock; /* locking extent lru list */ |
850 | atomic_t total_ext_tree; /* extent tree count */ | 850 | atomic_t total_ext_tree; /* extent tree count */ |