diff options
| author | Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> | 2009-05-30 08:50:58 -0400 |
|---|---|---|
| committer | Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> | 2009-05-30 09:07:50 -0400 |
| commit | 62013ab5d5df297a01ae5863b5c26d758ec0af7f (patch) | |
| tree | 61b8e9b9b0d8e57c0de0f4c87f23a671282bc862 | |
| parent | 59a3759d0fe8d969888c741bb33f4946e4d3750d (diff) | |
nilfs2: fix bh leak in nilfs_cpfile_delete_checkpoints function
The nilfs_cpfile_delete_checkpoints() wrongly skips brelse() for the
header block of checkpoint file in case of errors. This fixes the
leak bug.
Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
| -rw-r--r-- | fs/nilfs2/cpfile.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/nilfs2/cpfile.c b/fs/nilfs2/cpfile.c index e90b60dfced9..300f1cdfa862 100644 --- a/fs/nilfs2/cpfile.c +++ b/fs/nilfs2/cpfile.c | |||
| @@ -311,7 +311,7 @@ int nilfs_cpfile_delete_checkpoints(struct inode *cpfile, | |||
| 311 | ret = nilfs_cpfile_get_checkpoint_block(cpfile, cno, 0, &cp_bh); | 311 | ret = nilfs_cpfile_get_checkpoint_block(cpfile, cno, 0, &cp_bh); |
| 312 | if (ret < 0) { | 312 | if (ret < 0) { |
| 313 | if (ret != -ENOENT) | 313 | if (ret != -ENOENT) |
| 314 | goto out_sem; | 314 | goto out_header; |
| 315 | /* skip hole */ | 315 | /* skip hole */ |
| 316 | ret = 0; | 316 | ret = 0; |
| 317 | continue; | 317 | continue; |
| @@ -344,7 +344,7 @@ int nilfs_cpfile_delete_checkpoints(struct inode *cpfile, | |||
| 344 | continue; | 344 | continue; |
| 345 | printk(KERN_ERR "%s: cannot delete block\n", | 345 | printk(KERN_ERR "%s: cannot delete block\n", |
| 346 | __func__); | 346 | __func__); |
| 347 | goto out_sem; | 347 | goto out_header; |
| 348 | } | 348 | } |
| 349 | } | 349 | } |
| 350 | 350 | ||
| @@ -361,6 +361,8 @@ int nilfs_cpfile_delete_checkpoints(struct inode *cpfile, | |||
| 361 | nilfs_mdt_mark_dirty(cpfile); | 361 | nilfs_mdt_mark_dirty(cpfile); |
| 362 | kunmap_atomic(kaddr, KM_USER0); | 362 | kunmap_atomic(kaddr, KM_USER0); |
| 363 | } | 363 | } |
| 364 | |||
| 365 | out_header: | ||
| 364 | brelse(header_bh); | 366 | brelse(header_bh); |
| 365 | 367 | ||
| 366 | out_sem: | 368 | out_sem: |
