aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk@kernel.org>2015-03-11 13:42:48 -0400
committerJaegeuk Kim <jaegeuk@kernel.org>2015-04-10 18:08:43 -0400
commit21cb1d99bcc77252e6426010bcc6433f75b581bb (patch)
treecb96433d02fea464b2ce630fd6afd32059d0fb49
parentd6d4f1cb912d9bcf988a529d0934568d4550f7b5 (diff)
f2fs: fix to cover sentry_lock for block allocation
In the following call stack, f2fs changes the bitmap for dirty segments and # of dirty sentries without grabbing sit_i->sentry_lock. This can result in mismatch on bitmap and # of dirty sentries, since if there are some direct_io operations. In allocate_data_block, - __allocate_new_segments - mutex_lock(&curseg->curseg_mutex); - s_ops->allocate_segment - new_curseg/change_curseg - reset_curseg - __set_sit_entry_type - __mark_sit_entry_dirty - set_bit(dirty_sentries_bitmap) - dirty_sentries++; Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r--fs/f2fs/segment.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index 3e80bd69d4a0..eafaf728236b 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -1167,6 +1167,7 @@ void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,
1167 curseg = CURSEG_I(sbi, type); 1167 curseg = CURSEG_I(sbi, type);
1168 1168
1169 mutex_lock(&curseg->curseg_mutex); 1169 mutex_lock(&curseg->curseg_mutex);
1170 mutex_lock(&sit_i->sentry_lock);
1170 1171
1171 /* direct_io'ed data is aligned to the segment for better performance */ 1172 /* direct_io'ed data is aligned to the segment for better performance */
1172 if (direct_io && curseg->next_blkoff) 1173 if (direct_io && curseg->next_blkoff)
@@ -1181,7 +1182,6 @@ void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,
1181 */ 1182 */
1182 __add_sum_entry(sbi, type, sum); 1183 __add_sum_entry(sbi, type, sum);
1183 1184
1184 mutex_lock(&sit_i->sentry_lock);
1185 __refresh_next_blkoff(sbi, curseg); 1185 __refresh_next_blkoff(sbi, curseg);
1186 1186
1187 stat_inc_block_count(sbi, curseg); 1187 stat_inc_block_count(sbi, curseg);