diff options
author | Jaegeuk Kim <jaegeuk@kernel.org> | 2015-03-11 13:42:48 -0400 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2015-04-10 18:08:43 -0400 |
commit | 21cb1d99bcc77252e6426010bcc6433f75b581bb (patch) | |
tree | cb96433d02fea464b2ce630fd6afd32059d0fb49 | |
parent | d6d4f1cb912d9bcf988a529d0934568d4550f7b5 (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.c | 2 |
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); |