Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 62013ab5 authored by Ryusuke Konishi's avatar Ryusuke Konishi
Browse files

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: default avatarRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
parent 59a3759d
Loading
Loading
Loading
Loading
+4 −2
Original line number Original line Diff line number Diff line
@@ -311,7 +311,7 @@ int nilfs_cpfile_delete_checkpoints(struct inode *cpfile,
		ret = nilfs_cpfile_get_checkpoint_block(cpfile, cno, 0, &cp_bh);
		ret = nilfs_cpfile_get_checkpoint_block(cpfile, cno, 0, &cp_bh);
		if (ret < 0) {
		if (ret < 0) {
			if (ret != -ENOENT)
			if (ret != -ENOENT)
				goto out_sem;
				goto out_header;
			/* skip hole */
			/* skip hole */
			ret = 0;
			ret = 0;
			continue;
			continue;
@@ -344,7 +344,7 @@ int nilfs_cpfile_delete_checkpoints(struct inode *cpfile,
					continue;
					continue;
				printk(KERN_ERR "%s: cannot delete block\n",
				printk(KERN_ERR "%s: cannot delete block\n",
				       __func__);
				       __func__);
				goto out_sem;
				goto out_header;
			}
			}
		}
		}


@@ -361,6 +361,8 @@ int nilfs_cpfile_delete_checkpoints(struct inode *cpfile,
		nilfs_mdt_mark_dirty(cpfile);
		nilfs_mdt_mark_dirty(cpfile);
		kunmap_atomic(kaddr, KM_USER0);
		kunmap_atomic(kaddr, KM_USER0);
	}
	}

 out_header:
	brelse(header_bh);
	brelse(header_bh);


 out_sem:
 out_sem: