From 7cd0afe583211a11cfe3c1041e5b982e65769f37 Mon Sep 17 00:00:00 2001 From: Wang Shilong Date: Thu, 7 May 2020 08:58:54 +0800 Subject: [PATCH] LU-13541 llite: fix possible divide zero in ll_use_fast_io() ll_use_fast_io() is used to check wheather we could use fast IO. Since it is called in fast path, we don't hold ras_lock to protect access, there might have the race @ras_stride_bytes is reset after stride_io_mode() check. Fixes: 9e4c5bdaaec5 ("LU-12644 llite: try fast io for stride io correctly") Change-Id: If57ad074ecfa6560cc527f9f52e7adc2b0a456fd Signed-off-by: Wang Shilong Reviewed-on: https://review.whamcloud.com/38545 Reviewed-by: Andreas Dilger Tested-by: Andreas Dilger Tested-by: jenkins Reviewed-by: Jian Yu Reviewed-by: James Nunez Tested-by: Maloo --- lustre/llite/rw.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lustre/llite/rw.c b/lustre/llite/rw.c index b8404a9..6cf2c74 100644 --- a/lustre/llite/rw.c +++ b/lustre/llite/rw.c @@ -1604,10 +1604,11 @@ static bool ll_use_fast_io(struct file *file, unsigned long fast_read_pages = max(RA_REMAIN_WINDOW_MIN, ras->ras_rpc_pages); loff_t skip_pages; + loff_t stride_bytes = ras->ras_stride_bytes; - if (stride_io_mode(ras)) { + if (stride_io_mode(ras) && stride_bytes) { skip_pages = (ras->ras_stride_length + - ras->ras_stride_bytes - 1) / ras->ras_stride_bytes; + ras->ras_stride_bytes - 1) / stride_bytes; skip_pages *= fast_read_pages; } else { skip_pages = fast_read_pages; -- 1.8.3.1