jfs: nlink overflow in jfs_rename
[ Upstream commit 9218dc26fd922b09858ecd3666ed57dfd8098da8 ] If nlink is maximal for a directory (-1) and inside that directory you perform a rename for some child directory (not moving from the parent), then the nlink of the first directory is first incremented and later decremented. Normally this is fine, but when nlink = -1 this causes a wrap around to 0, and then drop_nlink issues a warning. After applying the patch syzbot no longer issues any warnings. I also ran some basic fs tests to look for any regressions. Signed-off-by: Jori Koolstra <jkoolstra@xs4all.nl> Reported-by: syzbot+9131ddfd7870623b719f@syzkaller.appspotmail.com Closes: https://syzbot.org/bug?extid=9131ddfd7870623b719f Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Ulrich Hecht <uli@kernel.org>
This commit is contained in:
1 parent
88a9b8a2d6
commit
6ccc288f1f
1 file changed
+4
-2
+4
-2
@@ -1239,7 +1239,7 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||
jfs_err("jfs_rename: dtInsert returned -EIO");
|
||||
goto out_tx;
|
||||
}
|
||||
if (S_ISDIR(old_ip->i_mode))
|
||||
if (S_ISDIR(old_ip->i_mode) && old_dir != new_dir)
|
||||
inc_nlink(new_dir);
|
||||
}
|
||||
/*
|
||||
@@ -1255,7 +1255,9 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||
goto out_tx;
|
||||
}
|
||||
if (S_ISDIR(old_ip->i_mode)) {
|
||||
drop_nlink(old_dir);
|
||||
if (new_ip || old_dir != new_dir)
|
||||
drop_nlink(old_dir);
|
||||
|
||||
if (old_dir != new_dir) {
|
||||
/*
|
||||
* Change inode number of parent for moved directory
|
||||
|
||||
Reference in new issue
Block a user