linux/fs/f2fs
shifei10.ge a225dca394 f2fs: fix truncate_partial_nodes bug
The truncate_partial_nodes puts pages incorrectly in the following two cases.
Note that the value for argc 'depth' can only be 2 or 3.
Please see truncate_inode_blocks() and truncate_partial_nodes().

1) An err is occurred in the first 'for' loop
  When err is occurred with depth = 2, pages[0] is invalid, so this page doesn't
  need to be put. There is no problem, however, when depth is 3, it doesn't put
  the pages correctly where pages[0] is valid and pages[1] is invalid.
  In this case, depth is set to 2 (ref to statemnt depth = i + 1), and then
  'goto fail'.
  In label 'fail', for (i = depth - 3; i >= 0; i--) cannot meet the condition
  because i = -1, so pages[0] cann't be put.

2) An err happened in the second 'for' loop
  Now we've got pages[0] with depth = 2, or we've got pages[0] and pages[1]
  with depth = 3. When an err is detected, we need 'goto fail' to put such
  the pages.
  When depth is 2, in label 'fail', for (i = depth - 3; i >= 0; i--) cann't
  meet the condition because i = -1, so pages[0] cann't be put.
  When depth is 3, in label 'fail', for (i = depth - 3; i >= 0; i--) can
  only put pages[0], pages[1] also cann't be put.

Note that 'depth' has been changed before first 'goto fail' (ref to statemnt
depth = i + 1), so passing this modified 'depth' to the tracepoint,
trace_f2fs_truncate_partial_nodes, is also incorrect.

Signed-off-by: Shifei Ge <shifei10.ge@samsung.com>
[Jaegeuk Kim: modify the description and fix one bug]
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2014-01-06 16:42:21 +09:00
..
acl.c f2fs: fix a deadlock during init_acl procedure 2013-10-28 13:39:09 +09:00
acl.h f2fs: fix a deadlock during init_acl procedure 2013-10-28 13:39:09 +09:00
checkpoint.c f2fs: convert max_orphans to a field of f2fs_sb_info 2013-12-26 20:37:52 +09:00
data.c f2fs: handle errors correctly during f2fs_reserve_block 2014-01-06 16:42:21 +09:00
debug.c f2fs: add the number of inline_data files to status info 2014-01-06 16:42:20 +09:00
dir.c f2fs: handle errors correctly during f2fs_reserve_block 2014-01-06 16:42:21 +09:00
f2fs.h f2fs: add inline_data recovery routine 2014-01-06 16:42:20 +09:00
file.c f2fs: add inline_data recovery routine 2014-01-06 16:42:20 +09:00
gc.c f2fs: remove the rw_flag domain from f2fs_io_info 2013-12-23 10:18:07 +09:00
gc.h f2fs: optimize gc for better performance 2013-09-05 13:50:32 +09:00
hash.c f2fs: unify string length declarations and usage 2012-12-28 11:27:53 +09:00
inline.c f2fs: handle errors correctly during f2fs_reserve_block 2014-01-06 16:42:21 +09:00
inode.c f2fs: add the number of inline_data files to status info 2014-01-06 16:42:20 +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 f2fs: avoid to set wrong pino of inode when rename dir 2013-12-23 10:42:51 +09:00
node.c f2fs: fix truncate_partial_nodes bug 2014-01-06 16:42:21 +09:00
node.h f2fs: update several comments 2013-12-23 10:26:03 +09:00
recovery.c f2fs: add inline_data recovery routine 2014-01-06 16:42:20 +09:00
segment.c f2fs: remove the rw_flag domain from f2fs_io_info 2013-12-23 10:18:07 +09:00
segment.h f2fs: introduce sysfs entry to control in-place-update policy 2013-12-23 10:18:07 +09:00
super.c f2fs: introduce sysfs entry to control in-place-update policy 2013-12-23 10:18:07 +09:00
xattr.c f2fs: add unlikely() macro for compiler more aggressively 2013-12-23 10:18:06 +09:00
xattr.h f2fs: support the inline xattrs 2013-08-26 20:15:23 +09:00