diff options
| author | Jaegeuk Kim <jaegeuk@kernel.org> | 2015-03-11 13:42:48 -0400 | 
|---|---|---|
| committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2015-04-10 15:08:43 -0700 | 
| 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,  	curseg = CURSEG_I(sbi, type);  	mutex_lock(&curseg->curseg_mutex); +	mutex_lock(&sit_i->sentry_lock);  	/* direct_io'ed data is aligned to the segment for better performance */  	if (direct_io && curseg->next_blkoff) @@ -1181,7 +1182,6 @@ void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,  	 */  	__add_sum_entry(sbi, type, sum); -	mutex_lock(&sit_i->sentry_lock);  	__refresh_next_blkoff(sbi, curseg);  	stat_inc_block_count(sbi, curseg); | 
