Chunguang Xu 82ef1370b0 ext4: avoid s_mb_prefetch to be zero in individual scenarios
Commit cfd732377221 ("ext4: add prefetching for block allocation
bitmaps") introduced block bitmap prefetch, and expects to read block
bitmaps of flex_bg through an IO.  However, it seems to ignore the
value range of s_log_groups_per_flex.  In the scenario where the value
of s_log_groups_per_flex is greater than 27, s_mb_prefetch or
s_mb_prefetch_limit will overflow, cause a divide zero exception.

In addition, the logic of calculating nr is also flawed, because the
size of flexbg is fixed during a single mount, but s_mb_prefetch can
be modified, which causes nr to fail to meet the value condition of
[1, flexbg_size].

To solve this problem, we need to set the upper limit of
s_mb_prefetch.  Since we expect to load block bitmaps of a flex_bg
through an IO, we can consider determining a reasonable upper limit
among the IO limit parameters.  After consideration, we chose
BLK_MAX_SEGMENT_SIZE.  This is a good choice to solve divide zero
problem and avoiding performance degradation.

[ Some minor code simplifications to make the changes easy to follow -- TYT ]

Reported-by: Tosk Robot <tencent_os_robot@tencent.com>
Signed-off-by: Chunguang Xu <brookxu@tencent.com>
Reviewed-by: Samuel Liao <samuelliao@tencent.com>
Reviewed-by: Andreas Dilger <adilger@dilger.ca>
Link: https://lore.kernel.org/r/1607051143-24508-1-git-send-email-brookxu@tencent.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
2020-12-22 13:08:45 -05:00
..
2020-10-16 11:11:22 -07:00
2020-11-10 10:07:15 -08:00
2020-10-19 14:28:30 -07:00
2020-09-21 08:59:26 -07:00
2020-11-14 11:26:04 -08:00
2020-11-20 11:47:22 -08:00
\n
2020-10-15 14:56:15 -07:00
2020-10-01 11:15:31 +02:00
2020-09-10 14:03:31 -07:00
2020-10-05 10:38:33 -06:00
2020-10-19 14:28:30 -07:00
\n
2020-10-15 15:03:10 -07:00
2020-10-16 12:21:15 -07:00
2020-10-13 12:12:44 -07:00
2020-08-04 21:02:38 -04:00
2020-10-16 11:11:15 -07:00
2020-09-22 23:45:57 -04:00
2020-11-20 11:47:22 -08:00
2020-07-31 08:16:01 +02:00
2020-08-07 11:33:24 -07:00
2020-10-23 11:33:41 -07:00
2020-05-14 16:44:24 +02:00
2020-08-12 10:58:01 -07:00
2020-10-23 11:33:41 -07:00
2020-07-31 08:16:00 +02:00
2020-11-06 10:05:18 -08:00
2020-10-24 12:40:18 -07:00
2020-09-26 22:55:05 -04:00
2020-08-27 16:06:47 -04:00
2020-06-09 15:40:50 -07:00
2020-07-31 08:16:01 +02:00