@@ -230,34 +230,36 @@ struct ext4_new_flex_group_data {
230230#define MAX_RESIZE_BG 16384
231231
232232/*
233- * alloc_flex_gd() allocates a ext4_new_flex_group_data with size of
234- * @flexbg_size.
233+ * alloc_flex_gd() allocates an ext4_new_flex_group_data that satisfies the
234+ * resizing from @o_group to @n_group, its size is typically @flexbg_size.
235235 *
236236 * Returns NULL on failure otherwise address of the allocated structure.
237237 */
238238static struct ext4_new_flex_group_data * alloc_flex_gd (unsigned int flexbg_size ,
239239 ext4_group_t o_group , ext4_group_t n_group )
240240{
241241 ext4_group_t last_group ;
242+ unsigned int max_resize_bg ;
242243 struct ext4_new_flex_group_data * flex_gd ;
243244
244245 flex_gd = kmalloc (sizeof (* flex_gd ), GFP_NOFS );
245246 if (flex_gd == NULL )
246247 goto out3 ;
247248
248- if (unlikely (flexbg_size > MAX_RESIZE_BG ))
249- flex_gd -> resize_bg = MAX_RESIZE_BG ;
250- else
251- flex_gd -> resize_bg = flexbg_size ;
249+ max_resize_bg = umin (flexbg_size , MAX_RESIZE_BG );
250+ flex_gd -> resize_bg = max_resize_bg ;
252251
253252 /* Avoid allocating large 'groups' array if not needed */
254253 last_group = o_group | (flex_gd -> resize_bg - 1 );
255254 if (n_group <= last_group )
256- flex_gd -> resize_bg = 1 << fls (n_group - o_group + 1 );
255+ flex_gd -> resize_bg = 1 << fls (n_group - o_group );
257256 else if (n_group - last_group < flex_gd -> resize_bg )
258- flex_gd -> resize_bg = 1 << max (fls (last_group - o_group + 1 ),
257+ flex_gd -> resize_bg = 1 << max (fls (last_group - o_group ),
259258 fls (n_group - last_group ));
260259
260+ if (WARN_ON_ONCE (flex_gd -> resize_bg > max_resize_bg ))
261+ flex_gd -> resize_bg = max_resize_bg ;
262+
261263 flex_gd -> groups = kmalloc_array (flex_gd -> resize_bg ,
262264 sizeof (struct ext4_new_group_data ),
263265 GFP_NOFS );
0 commit comments