diff options
Diffstat (limited to 'fs/f2fs/segment.c')
-rw-r--r-- | fs/f2fs/segment.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 5b890ce74b15..9f8bdd02e3a8 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c | |||
@@ -854,16 +854,14 @@ static int __get_segment_type(struct page *page, enum page_type p_type) | |||
854 | return __get_segment_type_6(page, p_type); | 854 | return __get_segment_type_6(page, p_type); |
855 | } | 855 | } |
856 | 856 | ||
857 | static void do_write_page(struct f2fs_sb_info *sbi, struct page *page, | 857 | void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page, |
858 | block_t old_blkaddr, block_t *new_blkaddr, | 858 | block_t old_blkaddr, block_t *new_blkaddr, |
859 | struct f2fs_summary *sum, struct f2fs_io_info *fio) | 859 | struct f2fs_summary *sum, int type) |
860 | { | 860 | { |
861 | struct sit_info *sit_i = SIT_I(sbi); | 861 | struct sit_info *sit_i = SIT_I(sbi); |
862 | struct curseg_info *curseg; | 862 | struct curseg_info *curseg; |
863 | unsigned int old_cursegno; | 863 | unsigned int old_cursegno; |
864 | int type; | ||
865 | 864 | ||
866 | type = __get_segment_type(page, fio->type); | ||
867 | curseg = CURSEG_I(sbi, type); | 865 | curseg = CURSEG_I(sbi, type); |
868 | 866 | ||
869 | mutex_lock(&curseg->curseg_mutex); | 867 | mutex_lock(&curseg->curseg_mutex); |
@@ -896,13 +894,22 @@ static void do_write_page(struct f2fs_sb_info *sbi, struct page *page, | |||
896 | locate_dirty_segment(sbi, GET_SEGNO(sbi, old_blkaddr)); | 894 | locate_dirty_segment(sbi, GET_SEGNO(sbi, old_blkaddr)); |
897 | mutex_unlock(&sit_i->sentry_lock); | 895 | mutex_unlock(&sit_i->sentry_lock); |
898 | 896 | ||
899 | if (fio->type == NODE) | 897 | if (page && IS_NODESEG(type)) |
900 | fill_node_footer_blkaddr(page, NEXT_FREE_BLKADDR(sbi, curseg)); | 898 | fill_node_footer_blkaddr(page, NEXT_FREE_BLKADDR(sbi, curseg)); |
901 | 899 | ||
900 | mutex_unlock(&curseg->curseg_mutex); | ||
901 | } | ||
902 | |||
903 | static void do_write_page(struct f2fs_sb_info *sbi, struct page *page, | ||
904 | block_t old_blkaddr, block_t *new_blkaddr, | ||
905 | struct f2fs_summary *sum, struct f2fs_io_info *fio) | ||
906 | { | ||
907 | int type = __get_segment_type(page, fio->type); | ||
908 | |||
909 | allocate_data_block(sbi, page, old_blkaddr, new_blkaddr, sum, type); | ||
910 | |||
902 | /* writeout dirty page into bdev */ | 911 | /* writeout dirty page into bdev */ |
903 | f2fs_submit_page_mbio(sbi, page, *new_blkaddr, fio); | 912 | f2fs_submit_page_mbio(sbi, page, *new_blkaddr, fio); |
904 | |||
905 | mutex_unlock(&curseg->curseg_mutex); | ||
906 | } | 913 | } |
907 | 914 | ||
908 | void write_meta_page(struct f2fs_sb_info *sbi, struct page *page) | 915 | void write_meta_page(struct f2fs_sb_info *sbi, struct page *page) |