diff options
author | majianpeng <majianpeng@gmail.com> | 2012-05-21 23:55:03 -0400 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2012-05-21 23:55:03 -0400 |
commit | 5fdd2cf8265c6de0f190dea80cc4c50da8f31293 (patch) | |
tree | ddb9bb1da6654d9d9de86c916fceed8280be95fe /drivers/md | |
parent | da8840a747c0dbf49506ec906757a6b87b9741e9 (diff) |
md/raid10: Fix memleak in r10buf_pool_alloc
If the allocation of rep1_bio fails, we currently don't free the 'bio'
of the same dev.
Reported by kmemleak.
Signed-off-by: majianpeng <majianpeng@gmail.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/raid10.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index ec271ae4318f..fb9062b5022c 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -173,10 +173,11 @@ out_free_pages: | |||
173 | while (j--) | 173 | while (j--) |
174 | for (i = 0; i < RESYNC_PAGES ; i++) | 174 | for (i = 0; i < RESYNC_PAGES ; i++) |
175 | safe_put_page(r10_bio->devs[j].bio->bi_io_vec[i].bv_page); | 175 | safe_put_page(r10_bio->devs[j].bio->bi_io_vec[i].bv_page); |
176 | j = -1; | 176 | j = 0; |
177 | out_free_bio: | 177 | out_free_bio: |
178 | while (++j < nalloc) { | 178 | for ( ; j < nalloc; j++) { |
179 | bio_put(r10_bio->devs[j].bio); | 179 | if (r10_bio->devs[j].bio) |
180 | bio_put(r10_bio->devs[j].bio); | ||
180 | if (r10_bio->devs[j].repl_bio) | 181 | if (r10_bio->devs[j].repl_bio) |
181 | bio_put(r10_bio->devs[j].repl_bio); | 182 | bio_put(r10_bio->devs[j].repl_bio); |
182 | } | 183 | } |