Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 569d0365 authored by Dan Williams's avatar Dan Williams
Browse files

dax: require 'struct page' by default for filesystem dax



If a dax buffer from a device that does not map pages is passed to
read(2) or write(2) as a target for direct-I/O it triggers SIGBUS. If
gdb attempts to examine the contents of a dax buffer from a device that
does not map pages it triggers SIGBUS. If fork(2) is called on a process
with a dax mapping from a device that does not map pages it triggers
SIGBUS. 'struct page' is required otherwise several kernel code paths
break in surprising ways. Disable filesystem-dax on devices that do not
map pages.

In addition to needing pfn_to_page() to be valid we also require devmap
pages.  We need this to detect dax pages in the get_user_pages_fast()
path and so that we can stop managing the VM_MIXEDMAP flag. For DAX
drivers that have not supported get_user_pages() to date we allow them
to opt-in to supporting DAX with the CONFIG_FS_DAX_LIMITED configuration
option which requires ->direct_access() to return pfn_t_special() pfns.
This leaves DAX support in brd disabled and scheduled for removal.

Note that when the initial dax support was being merged a few years back
there was concern that struct page was unsuitable for use with next
generation persistent memory devices. The theoretical concern was that
struct page access, being such a hotly used data structure in the
kernel, would lead to media wear out. While that was a reasonable
conservative starting position it has not held true in practice. We have
long since committed to using devm_memremap_pages() to support higher
order kernel functionality that needs get_user_pages() and
pfn_to_page().


Cc: Jeff Moyer <jmoyer@redhat.com>
Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Reviewed-by: default avatarJan Kara <jack@suse.cz>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarGerald Schaefer <gerald.schaefer@de.ibm.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent b4b5798c
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -297,6 +297,7 @@ config AXON_RAM
	tristate "Axon DDR2 memory device driver"
	tristate "Axon DDR2 memory device driver"
	depends on PPC_IBM_CELL_BLADE && BLOCK
	depends on PPC_IBM_CELL_BLADE && BLOCK
	select DAX
	select DAX
	select FS_DAX_LIMITED
	default m
	default m
	help
	help
	  It registers one block device per Axon's DDR2 memory bank found
	  It registers one block device per Axon's DDR2 memory bank found
+10 −0
Original line number Original line Diff line number Diff line
@@ -15,6 +15,7 @@
#include <linux/mount.h>
#include <linux/mount.h>
#include <linux/magic.h>
#include <linux/magic.h>
#include <linux/genhd.h>
#include <linux/genhd.h>
#include <linux/pfn_t.h>
#include <linux/cdev.h>
#include <linux/cdev.h>
#include <linux/hash.h>
#include <linux/hash.h>
#include <linux/slab.h>
#include <linux/slab.h>
@@ -123,6 +124,15 @@ int __bdev_dax_supported(struct super_block *sb, int blocksize)
		return len < 0 ? len : -EIO;
		return len < 0 ? len : -EIO;
	}
	}


	if ((IS_ENABLED(CONFIG_FS_DAX_LIMITED) && pfn_t_special(pfn))
			|| pfn_t_devmap(pfn))
		/* pass */;
	else {
		pr_debug("VFS (%s): error: dax support not enabled\n",
				sb->s_id);
		return -EOPNOTSUPP;
	}

	return 0;
	return 0;
}
}
EXPORT_SYMBOL_GPL(__bdev_dax_supported);
EXPORT_SYMBOL_GPL(__bdev_dax_supported);
+1 −0
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@ config BLK_DEV_XPRAM
config DCSSBLK
config DCSSBLK
	def_tristate m
	def_tristate m
	select DAX
	select DAX
	select FS_DAX_LIMITED
	prompt "DCSSBLK support"
	prompt "DCSSBLK support"
	depends on S390 && BLOCK
	depends on S390 && BLOCK
	help
	help
+7 −0
Original line number Original line Diff line number Diff line
@@ -58,6 +58,13 @@ config FS_DAX_PMD
	depends on ZONE_DEVICE
	depends on ZONE_DEVICE
	depends on TRANSPARENT_HUGEPAGE
	depends on TRANSPARENT_HUGEPAGE


# Selected by DAX drivers that do not expect filesystem DAX to support
# get_user_pages() of DAX mappings. I.e. "limited" indicates no support
# for fork() of processes with MAP_SHARED mappings or support for
# direct-I/O to a DAX mapping.
config FS_DAX_LIMITED
	bool

endif # BLOCK
endif # BLOCK


# Posix ACL utility routines
# Posix ACL utility routines