From a7d0e91ea687564d3d5be0eb96bd5b6a260e665b Mon Sep 17 00:00:00 2001 From: Wang Shilong Date: Tue, 25 Feb 2020 15:58:55 +0800 Subject: [PATCH] LU-13096 llite: fix potential overflow in ll_max_cached_mb_seq_write() atomic_long_cmpxchg() return long, however @rc is int, if we have a larger memory etc 24T, we will get overflow, and @diff will never change thus we get a hang loop there. Test-Parameters: trivial Fixes: adb5aca3d673 ("LU-8066 llite: Move all remaining procfs entries to debugfs") Change-Id: I20d6feff9797ba10a089587bee0d8691bee460df Signed-off-by: Wang Shilong Reviewed-on: https://review.whamcloud.com/37707 Reviewed-by: Emoly Liu Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- lustre/llite/lproc_llite.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lustre/llite/lproc_llite.c b/lustre/llite/lproc_llite.c index 8de8299..65b6479 100644 --- a/lustre/llite/lproc_llite.c +++ b/lustre/llite/lproc_llite.c @@ -549,15 +549,16 @@ static ssize_t ll_max_cached_mb_seq_write(struct file *file, /* reduce LRU budget from free slots. */ do { - long ov, nv; + long ov, nv, retv; ov = atomic_long_read(&cache->ccc_lru_left); if (ov == 0) break; nv = ov > diff ? ov - diff : 0; - rc = atomic_long_cmpxchg(&cache->ccc_lru_left, ov, nv); - if (likely(ov == rc)) { + retv = atomic_long_cmpxchg(&cache->ccc_lru_left, + ov, nv); + if (likely(ov == retv)) { diff -= ov - nv; nrpages += ov - nv; break; -- 1.8.3.1