From 20d6935ce1d49c5fb6dc07397e979a45928619d5 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 14 Dec 2020 15:52:13 +0100 Subject: [PATCH] 5.9-stable patches added patches: dm-raid-fix-discard-limits-for-raid1-and-raid10.patch md-change-mddev-chunk_sectors-from-int-to-unsigned.patch --- ...-discard-limits-for-raid1-and-raid10.patch | 54 ++++++++++++ ...v-chunk_sectors-from-int-to-unsigned.patch | 83 +++++++++++++++++++ queue-5.9/series | 2 + 3 files changed, 139 insertions(+) create mode 100644 queue-5.9/dm-raid-fix-discard-limits-for-raid1-and-raid10.patch create mode 100644 queue-5.9/md-change-mddev-chunk_sectors-from-int-to-unsigned.patch diff --git a/queue-5.9/dm-raid-fix-discard-limits-for-raid1-and-raid10.patch b/queue-5.9/dm-raid-fix-discard-limits-for-raid1-and-raid10.patch new file mode 100644 index 00000000000..32659f0d8b0 --- /dev/null +++ b/queue-5.9/dm-raid-fix-discard-limits-for-raid1-and-raid10.patch @@ -0,0 +1,54 @@ +From e0910c8e4f87bb9f767e61a778b0d9271c4dc512 Mon Sep 17 00:00:00 2001 +From: Mike Snitzer +Date: Thu, 24 Sep 2020 13:14:52 -0400 +Subject: dm raid: fix discard limits for raid1 and raid10 + +From: Mike Snitzer + +commit e0910c8e4f87bb9f767e61a778b0d9271c4dc512 upstream. + +Block core warned that discard_granularity was 0 for dm-raid with +personality of raid1. Reason is that raid_io_hints() was incorrectly +special-casing raid1 rather than raid0. + +But since commit 29efc390b9462 ("md/md0: optimize raid0 discard +handling") even raid0 properly handles large discards. + +Fix raid_io_hints() by removing discard limits settings for raid1. +Also, fix limits for raid10 by properly stacking underlying limits as +done in blk_stack_limits(). + +Depends-on: 29efc390b9462 ("md/md0: optimize raid0 discard handling") +Fixes: 61697a6abd24a ("dm: eliminate 'split_discard_bios' flag from DM target interface") +Cc: stable@vger.kernel.org +Reported-by: Zdenek Kabelac +Reported-by: Mikulas Patocka +Signed-off-by: Mike Snitzer +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/md/dm-raid.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +--- a/drivers/md/dm-raid.c ++++ b/drivers/md/dm-raid.c +@@ -3730,12 +3730,14 @@ static void raid_io_hints(struct dm_targ + blk_limits_io_opt(limits, chunk_size_bytes * mddev_data_stripes(rs)); + + /* +- * RAID1 and RAID10 personalities require bio splitting, +- * RAID0/4/5/6 don't and process large discard bios properly. ++ * RAID10 personality requires bio splitting, ++ * RAID0/1/4/5/6 don't and process large discard bios properly. + */ +- if (rs_is_raid1(rs) || rs_is_raid10(rs)) { +- limits->discard_granularity = chunk_size_bytes; +- limits->max_discard_sectors = rs->md.chunk_sectors; ++ if (rs_is_raid10(rs)) { ++ limits->discard_granularity = max(chunk_size_bytes, ++ limits->discard_granularity); ++ limits->max_discard_sectors = min_not_zero(rs->md.chunk_sectors, ++ limits->max_discard_sectors); + } + } + diff --git a/queue-5.9/md-change-mddev-chunk_sectors-from-int-to-unsigned.patch b/queue-5.9/md-change-mddev-chunk_sectors-from-int-to-unsigned.patch new file mode 100644 index 00000000000..e1c0065b51b --- /dev/null +++ b/queue-5.9/md-change-mddev-chunk_sectors-from-int-to-unsigned.patch @@ -0,0 +1,83 @@ +From 6ffeb1c3f8226244c08105bcdbeecc04bad6b89a Mon Sep 17 00:00:00 2001 +From: Mike Snitzer +Date: Sat, 12 Dec 2020 11:55:37 -0500 +Subject: md: change mddev 'chunk_sectors' from int to unsigned +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Mike Snitzer + +commit 6ffeb1c3f8226244c08105bcdbeecc04bad6b89a upstream. + +Commit e2782f560c29 ("Revert "dm raid: remove unnecessary discard +limits for raid10"") exposed compiler warnings introduced by commit +e0910c8e4f87 ("dm raid: fix discard limits for raid1 and raid10"): + +In file included from ./include/linux/kernel.h:14, + from ./include/asm-generic/bug.h:20, + from ./arch/x86/include/asm/bug.h:93, + from ./include/linux/bug.h:5, + from ./include/linux/mmdebug.h:5, + from ./include/linux/gfp.h:5, + from ./include/linux/slab.h:15, + from drivers/md/dm-raid.c:8: +drivers/md/dm-raid.c: In function ‘raid_io_hints’: +./include/linux/minmax.h:18:28: warning: comparison of distinct pointer types lacks a cast + (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1))) + ^~ +./include/linux/minmax.h:32:4: note: in expansion of macro ‘__typecheck’ + (__typecheck(x, y) && __no_side_effects(x, y)) + ^~~~~~~~~~~ +./include/linux/minmax.h:42:24: note: in expansion of macro ‘__safe_cmp’ + __builtin_choose_expr(__safe_cmp(x, y), \ + ^~~~~~~~~~ +./include/linux/minmax.h:51:19: note: in expansion of macro ‘__careful_cmp’ + #define min(x, y) __careful_cmp(x, y, <) + ^~~~~~~~~~~~~ +./include/linux/minmax.h:84:39: note: in expansion of macro ‘min’ + __x == 0 ? __y : ((__y == 0) ? __x : min(__x, __y)); }) + ^~~ +drivers/md/dm-raid.c:3739:33: note: in expansion of macro ‘min_not_zero’ + limits->max_discard_sectors = min_not_zero(rs->md.chunk_sectors, + ^~~~~~~~~~~~ + +Fix this by changing the chunk_sectors member of 'struct mddev' from +int to 'unsigned int' to match the type used for the 'chunk_sectors' +member of 'struct queue_limits'. Various MD code still uses 'int' but +none of it appears to ever make use of signed int; and storing +positive signed int in unsigned is perfectly safe. + +Reported-by: Song Liu +Fixes: e2782f560c29 ("Revert "dm raid: remove unnecessary discard limits for raid10"") +Fixes: e0910c8e4f87 ("dm raid: fix discard limits for raid1 and raid10") +Cc: stable@vger,kernel.org # e0910c8e4f87 was marked for stable@ +Signed-off-by: Mike Snitzer +Reviewed-by: Song Liu +Signed-off-by: Jens Axboe +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/md/md.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/md/md.h ++++ b/drivers/md/md.h +@@ -311,7 +311,7 @@ struct mddev { + int external; /* metadata is + * managed externally */ + char metadata_type[17]; /* externally set*/ +- int chunk_sectors; ++ unsigned int chunk_sectors; + time64_t ctime, utime; + int level, layout; + char clevel[16]; +@@ -339,7 +339,7 @@ struct mddev { + */ + sector_t reshape_position; + int delta_disks, new_level, new_layout; +- int new_chunk_sectors; ++ unsigned int new_chunk_sectors; + int reshape_backwards; + + struct md_thread *thread; /* management thread */ diff --git a/queue-5.9/series b/queue-5.9/series index 38cd5d1338d..b79e790010a 100644 --- a/queue-5.9/series +++ b/queue-5.9/series @@ -102,3 +102,5 @@ x86-mm-mem_encrypt-fix-definition-of-pmd_flags_dec_wp.patch x86-membarrier-get-rid-of-a-dubious-optimization.patch x86-apic-vector-fix-ordering-in-vector-assignment.patch x86-kprobes-fix-optprobe-to-detect-int3-padding-correctly.patch +dm-raid-fix-discard-limits-for-raid1-and-raid10.patch +md-change-mddev-chunk_sectors-from-int-to-unsigned.patch -- 2.47.3