aboutsummaryrefslogtreecommitdiffstats
path: root/fs/f2fs/node.c
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk.kim@samsung.com>2013-03-30 23:47:20 -0400
committerJaegeuk Kim <jaegeuk.kim@samsung.com>2013-04-03 04:27:42 -0400
commit56ae674cc27230ea86ab25db7fcf1f32dfe17ec1 (patch)
tree491d3032f5fde1dd5f47826f6491d909b673e470 /fs/f2fs/node.c
parent53cf95222fad7a962cc03fb61a33e37bcf4f5c9d (diff)
f2fs: remove redundant lock_page calls
In get_node_page, we do not need to call lock_page all the time. If the node page is cached as uptodate, 1. grab_cache_page locks the page, 2. read_node_page unlocks the page, and 3. lock_page is called for further process. Let's avoid this. Reviewed-by: Namjae Jeon <namjae.jeon@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
Diffstat (limited to 'fs/f2fs/node.c')
-rw-r--r--fs/f2fs/node.c40
1 files changed, 25 insertions, 15 deletions
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
index 10cbee9dc3d1..8510c5ed402e 100644
--- a/fs/f2fs/node.c
+++ b/fs/f2fs/node.c
@@ -847,6 +847,12 @@ fail:
847 return ERR_PTR(err); 847 return ERR_PTR(err);
848} 848}
849 849
850/*
851 * Caller should do after getting the following values.
852 * 0: f2fs_put_page(page, 0)
853 * LOCKED_PAGE: f2fs_put_page(page, 1)
854 * error: nothing
855 */
850static int read_node_page(struct page *page, int type) 856static int read_node_page(struct page *page, int type)
851{ 857{
852 struct f2fs_sb_info *sbi = F2FS_SB(page->mapping->host->i_sb); 858 struct f2fs_sb_info *sbi = F2FS_SB(page->mapping->host->i_sb);
@@ -859,10 +865,8 @@ static int read_node_page(struct page *page, int type)
859 return -ENOENT; 865 return -ENOENT;
860 } 866 }
861 867
862 if (PageUptodate(page)) { 868 if (PageUptodate(page))
863 unlock_page(page); 869 return LOCKED_PAGE;
864 return 0;
865 }
866 870
867 return f2fs_readpage(sbi, page, ni.blk_addr, type); 871 return f2fs_readpage(sbi, page, ni.blk_addr, type);
868} 872}
@@ -874,6 +878,7 @@ void ra_node_page(struct f2fs_sb_info *sbi, nid_t nid)
874{ 878{
875 struct address_space *mapping = sbi->node_inode->i_mapping; 879 struct address_space *mapping = sbi->node_inode->i_mapping;
876 struct page *apage; 880 struct page *apage;
881 int err;
877 882
878 apage = find_get_page(mapping, nid); 883 apage = find_get_page(mapping, nid);
879 if (apage && PageUptodate(apage)) { 884 if (apage && PageUptodate(apage)) {
@@ -886,30 +891,36 @@ void ra_node_page(struct f2fs_sb_info *sbi, nid_t nid)
886 if (!apage) 891 if (!apage)
887 return; 892 return;
888 893
889 if (read_node_page(apage, READA) == 0) 894 err = read_node_page(apage, READA);
895 if (err == 0)
890 f2fs_put_page(apage, 0); 896 f2fs_put_page(apage, 0);
897 else if (err == LOCKED_PAGE)
898 f2fs_put_page(apage, 1);
891 return; 899 return;
892} 900}
893 901
894struct page *get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid) 902struct page *get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid)
895{ 903{
896 int err;
897 struct page *page;
898 struct address_space *mapping = sbi->node_inode->i_mapping; 904 struct address_space *mapping = sbi->node_inode->i_mapping;
905 struct page *page;
906 int err;
899 907
900 page = grab_cache_page(mapping, nid); 908 page = grab_cache_page(mapping, nid);
901 if (!page) 909 if (!page)
902 return ERR_PTR(-ENOMEM); 910 return ERR_PTR(-ENOMEM);
903 911
904 err = read_node_page(page, READ_SYNC); 912 err = read_node_page(page, READ_SYNC);
905 if (err) 913 if (err < 0)
906 return ERR_PTR(err); 914 return ERR_PTR(err);
915 else if (err == LOCKED_PAGE)
916 goto got_it;
907 917
908 lock_page(page); 918 lock_page(page);
909 if (!PageUptodate(page)) { 919 if (!PageUptodate(page)) {
910 f2fs_put_page(page, 1); 920 f2fs_put_page(page, 1);
911 return ERR_PTR(-EIO); 921 return ERR_PTR(-EIO);
912 } 922 }
923got_it:
913 BUG_ON(nid != nid_of_node(page)); 924 BUG_ON(nid != nid_of_node(page));
914 mark_page_accessed(page); 925 mark_page_accessed(page);
915 return page; 926 return page;
@@ -923,10 +934,9 @@ struct page *get_node_page_ra(struct page *parent, int start)
923{ 934{
924 struct f2fs_sb_info *sbi = F2FS_SB(parent->mapping->host->i_sb); 935 struct f2fs_sb_info *sbi = F2FS_SB(parent->mapping->host->i_sb);
925 struct address_space *mapping = sbi->node_inode->i_mapping; 936 struct address_space *mapping = sbi->node_inode->i_mapping;
926 int i, end;
927 int err = 0;
928 nid_t nid;
929 struct page *page; 937 struct page *page;
938 int err, i, end;
939 nid_t nid;
930 940
931 /* First, try getting the desired direct node. */ 941 /* First, try getting the desired direct node. */
932 nid = get_nid(parent, start, false); 942 nid = get_nid(parent, start, false);
@@ -936,12 +946,12 @@ struct page *get_node_page_ra(struct page *parent, int start)
936 page = grab_cache_page(mapping, nid); 946 page = grab_cache_page(mapping, nid);
937 if (!page) 947 if (!page)
938 return ERR_PTR(-ENOMEM); 948 return ERR_PTR(-ENOMEM);
939 else if (PageUptodate(page))
940 goto page_hit;
941 949
942 err = read_node_page(page, READ_SYNC); 950 err = read_node_page(page, READ_SYNC);
943 if (err) 951 if (err < 0)
944 return ERR_PTR(err); 952 return ERR_PTR(err);
953 else if (err == LOCKED_PAGE)
954 goto page_hit;
945 955
946 /* Then, try readahead for siblings of the desired node */ 956 /* Then, try readahead for siblings of the desired node */
947 end = start + MAX_RA_NODE; 957 end = start + MAX_RA_NODE;
@@ -956,7 +966,7 @@ struct page *get_node_page_ra(struct page *parent, int start)
956 lock_page(page); 966 lock_page(page);
957 967
958page_hit: 968page_hit:
959 if (PageError(page)) { 969 if (!PageUptodate(page)) {
960 f2fs_put_page(page, 1); 970 f2fs_put_page(page, 1);
961 return ERR_PTR(-EIO); 971 return ERR_PTR(-EIO);
962 } 972 }