f2fs: fix race on allocating and deallocating a dentry block
authorJaegeuk Kim <jaegeuk@kernel.org>
Wed, 29 Apr 2015 18:18:42 +0000 (11:18 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Thu, 28 May 2015 22:41:35 +0000 (15:41 -0700)
commit01f28610a1691078d0f7ba62b365567f8799f07c
tree5a97946706daa2904f3f112bd3c5025153109785
parenteaa693f4dcf1ca64b41b02d907e9c401c085cf59
f2fs: fix race on allocating and deallocating a dentry block

There are two threads:
 f2fs_delete_entry()              get_new_data_page()
                                  f2fs_reserve_block()
  dn.blkaddr = XXX
 lock_page(dentry_block)
 truncate_hole()
 dn.blkaddr = NULL
 unlock_page(dentry_block)
                                  lock_page(dentry_block)
                                  fill the block from XXX address
                                  add new dentries
                                  unlock_page(dentry_block)

Later, f2fs_write_data_page() will truncate the dentry_block, since
its block address is NULL.

The reason for this was due to the wrong lock order.
In this case, we should do f2fs_reserve_block() after locking its dentry block.

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/data.c