diff options
-rw-r--r-- | 0002-Revert-dm-eliminate-split_discard_bios-flag-from-DM-.patch | 187 | ||||
-rw-r--r-- | PKGBUILD | 10 |
2 files changed, 195 insertions, 2 deletions
diff --git a/0002-Revert-dm-eliminate-split_discard_bios-flag-from-DM-.patch b/0002-Revert-dm-eliminate-split_discard_bios-flag-from-DM-.patch new file mode 100644 index 0000000..25c7127 --- /dev/null +++ b/0002-Revert-dm-eliminate-split_discard_bios-flag-from-DM-.patch @@ -0,0 +1,187 @@ +From b79903f026f9eb37da34b8d300910e5d6d626e31 Mon Sep 17 00:00:00 2001 +From: "Jan Alexander Steffens (heftig)" <jan.steffens@gmail.com> +Date: Wed, 22 May 2019 01:12:03 +0200 +Subject: [PATCH 2/3] Revert "dm: eliminate 'split_discard_bios' flag from DM + target interface" + +This reverts commit 61697a6abd24acba941359c6268a94f4afe4a53d. + +https://bugs.archlinux.org/task/62693 +--- + drivers/md/dm-cache-target.c | 1 + + drivers/md/dm-raid.c | 14 +++++--------- + drivers/md/dm-thin.c | 1 + + drivers/md/dm-zoned-target.c | 1 + + drivers/md/dm.c | 25 +++++++++++++++++++------ + include/linux/device-mapper.h | 6 ++++++ + include/uapi/linux/dm-ioctl.h | 4 ++-- + 7 files changed, 35 insertions(+), 17 deletions(-) + +diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c +index d249cf8ac277..694b252d2741 100644 +--- a/drivers/md/dm-cache-target.c ++++ b/drivers/md/dm-cache-target.c +@@ -2505,6 +2505,7 @@ static int cache_create(struct cache_args *ca, struct cache **result) + + ti->num_discard_bios = 1; + ti->discards_supported = true; ++ ti->split_discard_bios = false; + + ti->per_io_data_size = sizeof(struct per_bio_data); + +diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c +index 9fdef6897316..adcfe8ae10aa 100644 +--- a/drivers/md/dm-raid.c ++++ b/drivers/md/dm-raid.c +@@ -2986,6 +2986,11 @@ static void configure_discard_support(struct raid_set *rs) + } + } + ++ /* ++ * RAID1 and RAID10 personalities require bio splitting, ++ * RAID0/4/5/6 don't and process large discard bios properly. ++ */ ++ ti->split_discard_bios = !!(rs_is_raid1(rs) || rs_is_raid10(rs)); + ti->num_discard_bios = 1; + } + +@@ -3742,15 +3747,6 @@ static void raid_io_hints(struct dm_target *ti, struct queue_limits *limits) + + blk_limits_io_min(limits, chunk_size); + blk_limits_io_opt(limits, chunk_size * mddev_data_stripes(rs)); +- +- /* +- * RAID1 and RAID10 personalities require bio splitting, +- * RAID0/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; +- limits->max_discard_sectors = chunk_size; +- } + } + + static void raid_postsuspend(struct dm_target *ti) +diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c +index fcd887703f95..254c26eb963a 100644 +--- a/drivers/md/dm-thin.c ++++ b/drivers/md/dm-thin.c +@@ -4240,6 +4240,7 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) + if (tc->pool->pf.discard_enabled) { + ti->discards_supported = true; + ti->num_discard_bios = 1; ++ ti->split_discard_bios = false; + } + + mutex_unlock(&dm_thin_pool_table.mutex); +diff --git a/drivers/md/dm-zoned-target.c b/drivers/md/dm-zoned-target.c +index 8865c1709e16..6af5babe6837 100644 +--- a/drivers/md/dm-zoned-target.c ++++ b/drivers/md/dm-zoned-target.c +@@ -727,6 +727,7 @@ static int dmz_ctr(struct dm_target *ti, unsigned int argc, char **argv) + ti->per_io_data_size = sizeof(struct dmz_bioctx); + ti->flush_supported = true; + ti->discards_supported = true; ++ ti->split_discard_bios = true; + + /* The exposed capacity is the number of chunks that can be mapped */ + ti->len = (sector_t)dmz_nr_chunks(dmz->metadata) << dev->zone_nr_sectors_shift; +diff --git a/drivers/md/dm.c b/drivers/md/dm.c +index 043f0761e4a0..f40e006ba5fe 100644 +--- a/drivers/md/dm.c ++++ b/drivers/md/dm.c +@@ -1464,10 +1464,17 @@ static unsigned get_num_write_zeroes_bios(struct dm_target *ti) + return ti->num_write_zeroes_bios; + } + ++typedef bool (*is_split_required_fn)(struct dm_target *ti); ++ ++static bool is_split_required_for_discard(struct dm_target *ti) ++{ ++ return ti->split_discard_bios; ++} ++ + static int __send_changing_extent_only(struct clone_info *ci, struct dm_target *ti, +- unsigned num_bios) ++ unsigned num_bios, bool is_split_required) + { +- unsigned len = ci->sector_count; ++ unsigned len; + + /* + * Even though the device advertised support for this type of +@@ -1478,6 +1485,11 @@ static int __send_changing_extent_only(struct clone_info *ci, struct dm_target * + if (!num_bios) + return -EOPNOTSUPP; + ++ if (!is_split_required) ++ len = min((sector_t)ci->sector_count, max_io_len_target_boundary(ci->sector, ti)); ++ else ++ len = min((sector_t)ci->sector_count, max_io_len(ci->sector, ti)); ++ + __send_duplicate_bios(ci, ti, num_bios, &len); + + ci->sector += len; +@@ -1488,22 +1500,23 @@ static int __send_changing_extent_only(struct clone_info *ci, struct dm_target * + + static int __send_discard(struct clone_info *ci, struct dm_target *ti) + { +- return __send_changing_extent_only(ci, ti, get_num_discard_bios(ti)); ++ return __send_changing_extent_only(ci, ti, get_num_discard_bios(ti), ++ is_split_required_for_discard(ti)); + } + + static int __send_secure_erase(struct clone_info *ci, struct dm_target *ti) + { +- return __send_changing_extent_only(ci, ti, get_num_secure_erase_bios(ti)); ++ return __send_changing_extent_only(ci, ti, get_num_secure_erase_bios(ti), false); + } + + static int __send_write_same(struct clone_info *ci, struct dm_target *ti) + { +- return __send_changing_extent_only(ci, ti, get_num_write_same_bios(ti)); ++ return __send_changing_extent_only(ci, ti, get_num_write_same_bios(ti), false); + } + + static int __send_write_zeroes(struct clone_info *ci, struct dm_target *ti) + { +- return __send_changing_extent_only(ci, ti, get_num_write_zeroes_bios(ti)); ++ return __send_changing_extent_only(ci, ti, get_num_write_zeroes_bios(ti), false); + } + + static bool is_abnormal_io(struct bio *bio) +diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h +index b0672756d056..ec063ed4f53e 100644 +--- a/include/linux/device-mapper.h ++++ b/include/linux/device-mapper.h +@@ -316,6 +316,12 @@ struct dm_target { + * whether or not its underlying devices have support. + */ + bool discards_supported:1; ++ ++ /* ++ * Set if the target required discard bios to be split ++ * on max_io_len boundary. ++ */ ++ bool split_discard_bios:1; + }; + + /* Each target can link one of these into the table */ +diff --git a/include/uapi/linux/dm-ioctl.h b/include/uapi/linux/dm-ioctl.h +index f396a82dfd3e..d1e49514977b 100644 +--- a/include/uapi/linux/dm-ioctl.h ++++ b/include/uapi/linux/dm-ioctl.h +@@ -270,9 +270,9 @@ enum { + #define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl) + + #define DM_VERSION_MAJOR 4 +-#define DM_VERSION_MINOR 40 ++#define DM_VERSION_MINOR 39 + #define DM_VERSION_PATCHLEVEL 0 +-#define DM_VERSION_EXTRA "-ioctl (2019-01-18)" ++#define DM_VERSION_EXTRA "-ioctl (2018-04-03)" + + /* Status bits */ + #define DM_READONLY_FLAG (1 << 0) /* In/Out */ +-- +2.21.0 + @@ -17,7 +17,7 @@ pkgbase=linux-ck _majver=5.1 -_minver=3 +_minver=4 if [ "$_minver" == "0" ]; then pkgver=${_majver} else @@ -42,6 +42,7 @@ source=( enable_additional_cpu_optimizations-$_gcc_more_v.tar.gz::https://github.com/graysky2/kernel_gcc_patch/archive/$_gcc_more_v.tar.gz bdver2-fix-for-graysky.patch 0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch + 0002-Revert-dm-eliminate-split_discard_bios-flag-from-DM-.patch ath9k-regdom-hack.patch raid6-default-algo.patch config.x86_64 # the main kernel config files @@ -49,13 +50,14 @@ source=( 90-linux.hook # pacman hook for initramfs regeneration linux.preset # standard config files for mkinitcpio ramdisk ) -sha256sums=('b0f53e12daf8e710992151333edeb7d7da3d935a6aa3db8360681f7d05a6aaa2' +sha256sums=('5c6d65faba54652b3ab4cfcb2f3be88d53478a2cd24d0f1cdd9344c7aad1e7f9' 'SKIP' 'a2db6672b2d35f3006c7151e8fa90f5187dcdac9fcc46e88e78d45c7d8226d1f' 'f8d18a34f6b17ec8e5f2a7354383ca627e0fd00b5578c1ee7d9808a34f33c724' '226e30068ea0fecdb22f337391385701996bfbdba37cdcf0f1dbf55f1080542d' 'd35338c92d0dbf27ffedaf100bd852dd13fd9b5d49b12a10b91194a2ae654447' '91fafa76bf9cb32159ac7f22191b3589278b91e65bc4505cf2fc6013b8037bf3' + 'bb789e82a03b155ba92177403aefe0c97a61028d385fc1fbc2c98be00ee428ab' 'e7ebf050c22bcec0028c0b3c79fd6d3913b0370ecc6a23dfe78ce475630cf503' '0f81d6e4158b7beeb0eb514f1b9401f7e23699cb0f7b0d513e25dae1815daaeb' 'b1a69a9bccdeab017fd1ee3cb86495e3f499bf82cb94c1ca062e2fc086584311' @@ -100,6 +102,10 @@ prepare() { # 0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch msg2 "Applying disallow-unpriv-clone-newuser patch" patch -p1 -i ../0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch + + # 0002-Revert-dm-eliminate-split_discard_bios-flag-from-DM-.patch + msg2 "Applying revert dm eliminate patch" + patch -p1 -i ../0002-Revert-dm-eliminate-split_discard_bios-flag-from-DM -.patch # Ignore ath9k eeprom patch msg2 "Applying ath9k patch" |