truncate_partial_nodes puts pages incorrectly in two cases.note that the value for argc 'depth' can only be 2 or 3(see truncate_inode_blocks --->truncate_partial_nodes ). first case:err happened in the first 'for' loop assume depth is 2,when err happened,pages[0] is invalid,so this page don't need to be put when func return,there is no problem. but when depth is 3 ,pages isn't put correctly when 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--) cann't meet the condition because i=-1,so pages[0] cann't be put when func return. second case:err happened in the second 'for' loop now,we've got pages[0] with argc 'depth' is 2 ,or we've got pages[0] and pages[1] with depth is 3.when err happend,we need 'goto fail' to put pages we've got. 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. notes 'depth' has been changed before first 'goto fail'(ref to statemnt depth = i + 1),so pass this modified 'depth' to trace_f2fs_truncate_partial_nodes is also incorrectly.
>From 9de8efa31759ce86a032f5ad092d337b686ede06 Mon Sep 17 00:00:00 2001 Signed-off-by: Shifei Ge <shifei10...@samsung.com> --- fs/f2fs/node.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index 304d5ce..9986930 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c @@ -625,6 +625,7 @@ static int truncate_partial_nodes(struct dnode_of_data *dn, int err = 0; int i; int idx = depth - 2; + int dep = depth; nid[0] = le32_to_cpu(ri->i_nid[offset[0] - NODE_DIR1_BLOCK]); if (!nid[0]) @@ -663,11 +664,12 @@ static int truncate_partial_nodes(struct dnode_of_data *dn, } offset[idx]++; offset[depth - 1] = 0; + depth--; fail: - for (i = depth - 3; i >= 0; i--) + for (i = depth - 2; i >= 0; i--) f2fs_put_page(pages[i], 1); - trace_f2fs_truncate_partial_nodes(dn->inode, nid, depth, err); + trace_f2fs_truncate_partial_nodes(dn->inode, nid, dep, err); return err; } -- 1.7.9.5 ------------------------------------------------------------------------------ October Webinars: Code for Performance Free Intel webinars can help you accelerate application performance. Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from the latest Intel processors and coprocessors. See abstracts and register > http://pubads.g.doubleclick.net/gampad/clk?id=60135991&iu=/4140/ostg.clktrk _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel