linux/fs/f2fs
Jaegeuk Kim bd859c6598 f2fs: fix to truncate dentry pages in the error case
When a new directory is allocated, if an error is occurred, we should truncate
preallocated dentry pages too.

This bug was reported by Andrey Tsyvarev after a while as follows.

mkdir()->
 f2fs_add_link()->
  init_inode_metadata()->
    f2fs_init_acl()->
      f2fs_get_acl()->
        f2fs_getxattr()->
          read_all_xattrs() fails.

Also there was a BUG_ON triggered after the fault in
mkdir()->
 f2fs_add_link()->
   init_inode_metadata()->
    remove_inode_page() ->
      f2fs_bug_on(inode->i_blocks != 0 && inode->i_blocks != 1);

But, previous patch wasn't perfect to resolve that bug, so the following bug
report was also submitted.

kernel BUG at fs/f2fs/inode.c:274!
Call Trace:
 [<ffffffff811fde03>] evict+0xa3/0x1a0
 [<ffffffff811fe615>] iput+0xf5/0x180
 [<ffffffffa01c7f63>] f2fs_mkdir+0xf3/0x150 [f2fs]
 [<ffffffff811f2a77>] vfs_mkdir+0xb7/0x160
 [<ffffffff811f36bf>] SyS_mkdir+0x5f/0xc0
 [<ffffffff81680769>] system_call_fastpath+0x16/0x1b

Finally, this patch resolves all the issues like below.

If an error is occurred after make_empty_dir(),
 1. truncate_inode_pages()
   The make_bad_inode() prior to iput() will change i_mode to S_IFREG, which
   means that f2fs will not decrement fi->dirty_dents during f2fs_evict_inode.
   But, by calling it here, we can do that.

 2. truncate_blocks()
   Preallocated dentry pages are trucated here to sync i_blocks.

 3. remove_dirty_dir_inode()
   Remove this directory inode from the list.

Reported-and-Tested-by: Andrey Tsyvarev <tsyvarev@ispras.ru>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2014-02-17 14:58:52 +09:00
..
acl.c f2fs: use generic posix ACL infrastructure 2014-01-25 23:58:19 -05:00
acl.h f2fs: use generic posix ACL infrastructure 2014-01-25 23:58:19 -05:00
checkpoint.c f2fs: introduce NODE_MAPPING for code consistency 2014-01-22 18:41:08 +09:00
data.c f2fs: remove the ugly pointer conversion 2014-02-17 14:58:52 +09:00
debug.c f2fs: introduce NODE_MAPPING for code consistency 2014-01-22 18:41:08 +09:00
dir.c f2fs: fix to truncate dentry pages in the error case 2014-02-17 14:58:52 +09:00
f2fs.h f2fs: remove the ugly pointer conversion 2014-02-17 14:58:52 +09:00
file.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2014-01-28 08:38:04 -08:00
gc.c f2fs: remove the needless parameter of f2fs_wait_on_page_writeback 2014-01-14 17:45:54 +09:00
gc.h f2fs: add a sysfs entry to control max_victim_search 2014-01-08 13:45:08 +09:00
hash.c f2fs: unify string length declarations and usage 2012-12-28 11:27:53 +09:00
inline.c f2fs: remove the needless parameter of f2fs_wait_on_page_writeback 2014-01-14 17:45:54 +09:00
inode.c f2fs: update_inode_page should be done all the time 2014-02-17 14:58:51 +09:00
Kconfig f2fs: introduce CONFIG_F2FS_CHECK_FS for BUG_ON control 2013-10-29 15:43:01 +09:00
Makefile f2fs: key functions to handle inline data 2013-12-26 20:40:09 +09:00
namei.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2014-01-28 08:38:04 -08:00
node.c f2fs: fix to recover xattr node block 2014-02-17 14:58:52 +09:00
node.h f2fs: update several comments 2013-12-23 10:26:03 +09:00
recovery.c f2fs: fix a build warning 2014-02-17 14:58:52 +09:00
segment.c f2fs: clean up with a macro 2014-02-17 14:58:52 +09:00
segment.h f2fs: clean up with a macro 2014-02-17 14:58:52 +09:00
super.c f2fs: clean checkpatch warnings 2014-01-20 10:27:12 +09:00
xattr.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2014-01-28 08:38:04 -08:00
xattr.h f2fs: use generic posix ACL infrastructure 2014-01-25 23:58:19 -05:00