| From 887c5d2da4fb85f5dda5ba46b0246f5c3f65af43 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 15 Oct 2020 13:03:30 +0200 |
| Subject: ext4: Detect already used quota file early |
| |
| From: Jan Kara <jack@suse.cz> |
| |
| [ Upstream commit e0770e91424f694b461141cbc99adf6b23006b60 ] |
| |
| When we try to use file already used as a quota file again (for the same |
| or different quota type), strange things can happen. At the very least |
| lockdep annotations may be wrong but also inode flags may be wrongly set |
| / reset. When the file is used for two quota types at once we can even |
| corrupt the file and likely crash the kernel. Catch all these cases by |
| checking whether passed file is already used as quota file and bail |
| early in that case. |
| |
| This fixes occasional generic/219 failure due to lockdep complaint. |
| |
| Reviewed-by: Andreas Dilger <adilger@dilger.ca> |
| Reported-by: Ritesh Harjani <riteshh@linux.ibm.com> |
| Signed-off-by: Jan Kara <jack@suse.cz> |
| Link: https://lore.kernel.org/r/20201015110330.28716-1-jack@suse.cz |
| Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/ext4/super.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| diff --git a/fs/ext4/super.c b/fs/ext4/super.c |
| index ea425b49b3456..d31ae5a878594 100644 |
| --- a/fs/ext4/super.c |
| +++ b/fs/ext4/super.c |
| @@ -6042,6 +6042,11 @@ static int ext4_quota_on(struct super_block *sb, int type, int format_id, |
| /* Quotafile not on the same filesystem? */ |
| if (path->dentry->d_sb != sb) |
| return -EXDEV; |
| + |
| + /* Quota already enabled for this file? */ |
| + if (IS_NOQUOTA(d_inode(path->dentry))) |
| + return -EBUSY; |
| + |
| /* Journaling quota? */ |
| if (EXT4_SB(sb)->s_qf_names[type]) { |
| /* Quotafile not in fs root? */ |
| -- |
| 2.27.0 |
| |