Whamcloud - gitweb
LU-13096 llite: fix potential overflow in ll_max_cached_mb_seq_write() 07/37707/4
authorWang Shilong <wshilong@ddn.com>
Tue, 25 Feb 2020 07:58:55 +0000 (15:58 +0800)
committerOleg Drokin <green@whamcloud.com>
Sun, 1 Mar 2020 05:37:58 +0000 (05:37 +0000)
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 <wshilong@ddn.com>
Reviewed-on: https://review.whamcloud.com/37707
Reviewed-by: Emoly Liu <emoly@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/llite/lproc_llite.c

index 8de8299..65b6479 100644 (file)
@@ -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;