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

Reply via email to