diff options
author | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2013-03-30 23:47:20 -0400 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2013-04-03 04:27:42 -0400 |
commit | 56ae674cc27230ea86ab25db7fcf1f32dfe17ec1 (patch) | |
tree | 491d3032f5fde1dd5f47826f6491d909b673e470 /fs/f2fs | |
parent | 53cf95222fad7a962cc03fb61a33e37bcf4f5c9d (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')
-rw-r--r-- | fs/f2fs/node.c | 40 | ||||
-rw-r--r-- | fs/f2fs/node.h | 3 |
2 files changed, 28 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 | */ | ||
850 | static int read_node_page(struct page *page, int type) | 856 | static 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 | ||
894 | struct page *get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid) | 902 | struct 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 | } |
923 | got_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 | ||
958 | page_hit: | 968 | page_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 | } |
diff --git a/fs/f2fs/node.h b/fs/f2fs/node.h index d009cdfd2679..271a61c25601 100644 --- a/fs/f2fs/node.h +++ b/fs/f2fs/node.h | |||
@@ -29,6 +29,9 @@ | |||
29 | /* vector size for gang look-up from nat cache that consists of radix tree */ | 29 | /* vector size for gang look-up from nat cache that consists of radix tree */ |
30 | #define NATVEC_SIZE 64 | 30 | #define NATVEC_SIZE 64 |
31 | 31 | ||
32 | /* return value for read_node_page */ | ||
33 | #define LOCKED_PAGE 1 | ||
34 | |||
32 | /* | 35 | /* |
33 | * For node information | 36 | * For node information |
34 | */ | 37 | */ |