From: Greg Kroah-Hartman Date: Mon, 21 Sep 2020 16:06:48 +0000 (+0200) Subject: 5.4-stable patches X-Git-Tag: v4.4.237~10 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8af801ed1c7c13ff4c478045beb73871a25d26ba;p=thirdparty%2Fkernel%2Fstable-queue.git 5.4-stable patches added patches: dax-fix-compilation-for-config_dax-config_fs_dax.patch dm-call-proper-helper-to-determine-dax-support.patch --- diff --git a/queue-5.4/dax-fix-compilation-for-config_dax-config_fs_dax.patch b/queue-5.4/dax-fix-compilation-for-config_dax-config_fs_dax.patch new file mode 100644 index 00000000000..3831220d47c --- /dev/null +++ b/queue-5.4/dax-fix-compilation-for-config_dax-config_fs_dax.patch @@ -0,0 +1,73 @@ +From 88b67edd7247466bc47f01e1dc539b0d0d4b931e Mon Sep 17 00:00:00 2001 +From: Jan Kara +Date: Mon, 21 Sep 2020 11:33:23 +0200 +Subject: dax: Fix compilation for CONFIG_DAX && !CONFIG_FS_DAX + +From: Jan Kara + +commit 88b67edd7247466bc47f01e1dc539b0d0d4b931e upstream. + +dax_supported() is defined whenever CONFIG_DAX is enabled. So dummy +implementation should be defined only in !CONFIG_DAX case, not in +!CONFIG_FS_DAX case. + +Fixes: e2ec51282545 ("dm: Call proper helper to determine dax support") +Cc: +Reported-by: Geert Uytterhoeven +Reported-by: Naresh Kamboju +Reported-by: kernel test robot +Signed-off-by: Jan Kara +Signed-off-by: Dan Williams +Signed-off-by: Greg Kroah-Hartman + +--- + include/linux/dax.h | 17 ++++++++--------- + 1 file changed, 8 insertions(+), 9 deletions(-) + +--- a/include/linux/dax.h ++++ b/include/linux/dax.h +@@ -56,6 +56,8 @@ static inline void set_dax_synchronous(s + { + __set_dax_synchronous(dax_dev); + } ++bool dax_supported(struct dax_device *dax_dev, struct block_device *bdev, ++ int blocksize, sector_t start, sector_t len); + /* + * Check if given mapping is supported by the file / underlying device. + */ +@@ -102,6 +104,12 @@ static inline bool dax_synchronous(struc + static inline void set_dax_synchronous(struct dax_device *dax_dev) + { + } ++static inline bool dax_supported(struct dax_device *dax_dev, ++ struct block_device *bdev, int blocksize, sector_t start, ++ sector_t len) ++{ ++ return false; ++} + static inline bool daxdev_mapping_supported(struct vm_area_struct *vma, + struct dax_device *dax_dev) + { +@@ -128,8 +136,6 @@ static inline bool generic_fsdax_support + return __generic_fsdax_supported(dax_dev, bdev, blocksize, start, + sectors); + } +-bool dax_supported(struct dax_device *dax_dev, struct block_device *bdev, +- int blocksize, sector_t start, sector_t len); + + static inline struct dax_device *fs_dax_get_by_host(const char *host) + { +@@ -167,13 +173,6 @@ static inline struct dax_device *fs_dax_ + return NULL; + } + +-static inline bool dax_supported(struct dax_device *dax_dev, +- struct block_device *bdev, int blocksize, sector_t start, +- sector_t len) +-{ +- return false; +-} +- + static inline void fs_put_dax(struct dax_device *dax_dev) + { + } diff --git a/queue-5.4/dm-call-proper-helper-to-determine-dax-support.patch b/queue-5.4/dm-call-proper-helper-to-determine-dax-support.patch new file mode 100644 index 00000000000..79739c540fa --- /dev/null +++ b/queue-5.4/dm-call-proper-helper-to-determine-dax-support.patch @@ -0,0 +1,126 @@ +From e2ec5128254518cae320d5dc631b71b94160f663 Mon Sep 17 00:00:00 2001 +From: Jan Kara +Date: Sun, 20 Sep 2020 08:54:42 -0700 +Subject: dm: Call proper helper to determine dax support + +From: Jan Kara + +commit e2ec5128254518cae320d5dc631b71b94160f663 upstream. + +DM was calling generic_fsdax_supported() to determine whether a device +referenced in the DM table supports DAX. However this is a helper for "leaf" device drivers so that +they don't have to duplicate common generic checks. High level code +should call dax_supported() helper which that calls into appropriate +helper for the particular device. This problem manifested itself as +kernel messages: + +dm-3: error: dax access failed (-95) + +when lvm2-testsuite run in cases where a DM device was stacked on top of +another DM device. + +Fixes: 7bf7eac8d648 ("dax: Arrange for dax_supported check to span multiple devices") +Cc: +Tested-by: Adrian Huang +Signed-off-by: Jan Kara +Acked-by: Mike Snitzer +Reported-by: kernel test robot +Link: https://lore.kernel.org/r/160061715195.13131.5503173247632041975.stgit@dwillia2-desk3.amr.corp.intel.com +Signed-off-by: Dan Williams +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/dax/super.c | 4 ++++ + drivers/md/dm-table.c | 10 +++++++--- + include/linux/dax.h | 22 ++++++++++++++++++++-- + 3 files changed, 31 insertions(+), 5 deletions(-) + +--- a/drivers/dax/super.c ++++ b/drivers/dax/super.c +@@ -318,11 +318,15 @@ EXPORT_SYMBOL_GPL(dax_direct_access); + bool dax_supported(struct dax_device *dax_dev, struct block_device *bdev, + int blocksize, sector_t start, sector_t len) + { ++ if (!dax_dev) ++ return false; ++ + if (!dax_alive(dax_dev)) + return false; + + return dax_dev->ops->dax_supported(dax_dev, bdev, blocksize, start, len); + } ++EXPORT_SYMBOL_GPL(dax_supported); + + size_t dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr, + size_t bytes, struct iov_iter *i) +--- a/drivers/md/dm-table.c ++++ b/drivers/md/dm-table.c +@@ -882,10 +882,14 @@ EXPORT_SYMBOL_GPL(dm_table_set_type); + int device_supports_dax(struct dm_target *ti, struct dm_dev *dev, + sector_t start, sector_t len, void *data) + { +- int blocksize = *(int *) data; ++ int blocksize = *(int *) data, id; ++ bool rc; + +- return generic_fsdax_supported(dev->dax_dev, dev->bdev, blocksize, +- start, len); ++ id = dax_read_lock(); ++ rc = dax_supported(dev->dax_dev, dev->bdev, blocksize, start, len); ++ dax_read_unlock(id); ++ ++ return rc; + } + + /* Check devices support synchronous DAX */ +--- a/include/linux/dax.h ++++ b/include/linux/dax.h +@@ -128,6 +128,8 @@ static inline bool generic_fsdax_support + return __generic_fsdax_supported(dax_dev, bdev, blocksize, start, + sectors); + } ++bool dax_supported(struct dax_device *dax_dev, struct block_device *bdev, ++ int blocksize, sector_t start, sector_t len); + + static inline struct dax_device *fs_dax_get_by_host(const char *host) + { +@@ -165,6 +167,13 @@ static inline struct dax_device *fs_dax_ + return NULL; + } + ++static inline bool dax_supported(struct dax_device *dax_dev, ++ struct block_device *bdev, int blocksize, sector_t start, ++ sector_t len) ++{ ++ return false; ++} ++ + static inline void fs_put_dax(struct dax_device *dax_dev) + { + } +@@ -197,14 +206,23 @@ static inline void dax_unlock_page(struc + } + #endif + ++#if IS_ENABLED(CONFIG_DAX) + int dax_read_lock(void); + void dax_read_unlock(int id); ++#else ++static inline int dax_read_lock(void) ++{ ++ return 0; ++} ++ ++static inline void dax_read_unlock(int id) ++{ ++} ++#endif /* CONFIG_DAX */ + bool dax_alive(struct dax_device *dax_dev); + void *dax_get_private(struct dax_device *dax_dev); + long dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, long nr_pages, + void **kaddr, pfn_t *pfn); +-bool dax_supported(struct dax_device *dax_dev, struct block_device *bdev, +- int blocksize, sector_t start, sector_t len); + size_t dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr, + size_t bytes, struct iov_iter *i); + size_t dax_copy_to_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr, diff --git a/queue-5.4/series b/queue-5.4/series index 2b33994a48e..c129ae5ff4a 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -68,3 +68,5 @@ powerpc-dma-fix-dma_map_ops-get_required_mask.patch selftests-vm-fix-display-of-page-size-in-map_hugetlb.patch dm-dax-fix-table-reference-counts.patch mm-memory_hotplug-drain-per-cpu-pages-again-during-memory-offline.patch +dm-call-proper-helper-to-determine-dax-support.patch +dax-fix-compilation-for-config_dax-config_fs_dax.patch