Commit c259c7c5 authored by Chengguang Xu's avatar Chengguang Xu Committed by Baokun Li
Browse files

quota: check time limit when back out space/inode change

stable inclusion
from stable-v4.19.311
commit e87ed533e7a6167f4a5e1b0fdbf21784acf115cc
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I9HJX7
CVE: CVE-2024-26878

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=e87ed533e7a6167f4a5e1b0fdbf21784acf115cc



--------------------------------

[ Upstream commit 632a9f3a ]

When we fail from allocating inode/space, we back out
the change we already did. In a special case which has
exceeded soft limit by the change, we should also check
time limit and reset it properly.

Signed-off-by: default avatarChengguang Xu <cgxu519@gmx.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Stable-dep-of: 179b8c97ebf6 ("quota: Fix rcu annotations of inode dquot pointers")
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarBaokun Li <libaokun1@huawei.com>
parent c2efdfab
Loading
Loading
Loading
Loading
+6 −8
Original line number Diff line number Diff line
@@ -1705,13 +1705,11 @@ int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags)
				if (!dquots[cnt])
					continue;
				spin_lock(&dquots[cnt]->dq_dqb_lock);
				if (reserve) {
					dquots[cnt]->dq_dqb.dqb_rsvspace -=
									number;
				} else {
					dquots[cnt]->dq_dqb.dqb_curspace -=
									number;
				}
				if (reserve)
					dquot_free_reserved_space(dquots[cnt],
								  number);
				else
					dquot_decr_space(dquots[cnt], number);
				spin_unlock(&dquots[cnt]->dq_dqb_lock);
			}
			spin_unlock(&inode->i_lock);
@@ -1762,7 +1760,7 @@ int dquot_alloc_inode(struct inode *inode)
					continue;
				/* Back out changes we already did */
				spin_lock(&dquots[cnt]->dq_dqb_lock);
				dquots[cnt]->dq_dqb.dqb_curinodes--;
				dquot_decr_inodes(dquots[cnt], 1);
				spin_unlock(&dquots[cnt]->dq_dqb_lock);
			}
			goto warn_put_all;