]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 21 Sep 2020 16:06:48 +0000 (18:06 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 21 Sep 2020 16:06:48 +0000 (18:06 +0200)
added patches:
dax-fix-compilation-for-config_dax-config_fs_dax.patch
dm-call-proper-helper-to-determine-dax-support.patch

queue-5.4/dax-fix-compilation-for-config_dax-config_fs_dax.patch [new file with mode: 0644]
queue-5.4/dm-call-proper-helper-to-determine-dax-support.patch [new file with mode: 0644]
queue-5.4/series

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 (file)
index 0000000..3831220
--- /dev/null
@@ -0,0 +1,73 @@
+From 88b67edd7247466bc47f01e1dc539b0d0d4b931e Mon Sep 17 00:00:00 2001
+From: Jan Kara <jack@suse.cz>
+Date: Mon, 21 Sep 2020 11:33:23 +0200
+Subject: dax: Fix compilation for CONFIG_DAX && !CONFIG_FS_DAX
+
+From: Jan Kara <jack@suse.cz>
+
+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: <stable@vger.kernel.org>
+Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
+Reported-by: Naresh Kamboju <naresh.kamboju@linaro.org>
+Reported-by: kernel test robot <lkp@intel.com>
+Signed-off-by: Jan Kara <jack@suse.cz>
+Signed-off-by: Dan Williams <dan.j.williams@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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 (file)
index 0000000..79739c5
--- /dev/null
@@ -0,0 +1,126 @@
+From e2ec5128254518cae320d5dc631b71b94160f663 Mon Sep 17 00:00:00 2001
+From: Jan Kara <jack@suse.cz>
+Date: Sun, 20 Sep 2020 08:54:42 -0700
+Subject: dm: Call proper helper to determine dax support
+
+From: Jan Kara <jack@suse.cz>
+
+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: <stable@vger.kernel.org>
+Tested-by: Adrian Huang <ahuang12@lenovo.com>
+Signed-off-by: Jan Kara <jack@suse.cz>
+Acked-by: Mike Snitzer <snitzer@redhat.com>
+Reported-by: kernel test robot <lkp@intel.com>
+Link: https://lore.kernel.org/r/160061715195.13131.5503173247632041975.stgit@dwillia2-desk3.amr.corp.intel.com
+Signed-off-by: Dan Williams <dan.j.williams@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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,
index 2b33994a48e5a0a9afd7ee9c9fda31ba1be331cd..c129ae5ff4acfdc60e645eedf02645a719f7ae7d 100644 (file)
@@ -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