As reported by Arnd (https://lkml.org/lkml/2018/5/28/1697), dm-writecache will fail with link errors in configs where DAX isn't present: drivers/md/dm-writecache.o: In function `writecache_ctr': dm-writecache.c:(.text+0x1fdc): undefined reference to `dax_read_lock' dm-writecache.c:(.text+0x2004): undefined reference to `dax_direct_access' dm-writecache.c:(.text+0x21cc): undefined reference to `dax_read_unlock' Fix this by following the lead of the other DM modules and wrapping calls to the generic DAX code in #if IS_ENABLED(CONFIG_DAX_DRIVER) blocks. We also expand the failure case for the 'p' (persistent memory) flag so that fails on both architectures that don't support persistent memory and on kernels that don't have DAX support configured. This prevents us from ever hitting the BUG() in the persistent_memory_claim() stub. Signed-off-by: Ross Zwisler <ross.zwisler@xxxxxxxxxxxxxxx> Reported-by: Arnd Bergmann <arnd@xxxxxxxx> --- drivers/md/dm-writecache.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/drivers/md/dm-writecache.c b/drivers/md/dm-writecache.c index 92af65fdf4af..1c2b53ae1a96 100644 --- a/drivers/md/dm-writecache.c +++ b/drivers/md/dm-writecache.c @@ -253,6 +253,7 @@ static void wc_unlock(struct dm_writecache *wc) mutex_unlock(&wc->lock); } +#if IS_ENABLED(CONFIG_DAX_DRIVER) static int persistent_memory_claim(struct dm_writecache *wc) { int r; @@ -337,6 +338,12 @@ static int persistent_memory_claim(struct dm_writecache *wc) err1: return r; } +#else +static int persistent_memory_claim(struct dm_writecache *wc) +{ + BUG(); +} +#endif static void persistent_memory_release(struct dm_writecache *wc) { @@ -1901,16 +1908,17 @@ static int writecache_ctr(struct dm_target *ti, unsigned argc, char **argv) if (!strcasecmp(string, "s")) { wc->pmem_mode = false; } else if (!strcasecmp(string, "p")) { -#ifdef CONFIG_ARCH_HAS_PMEM_API +#if defined(CONFIG_ARCH_HAS_PMEM_API) && IS_ENABLED(CONFIG_DAX_DRIVER) wc->pmem_mode = true; wc->writeback_fua = true; #else /* - * If the architecture doesn't support persistent memory, this - * driver can only be used in SSD-only mode. + * If the architecture doesn't support persistent memory or + * the kernel doesn't support any DAX drivers, this driver can + * only be used in SSD-only mode. */ r = -EOPNOTSUPP; - ti->error = "Persistent memory not supported on this architecture"; + ti->error = "Persistent memory or DAX not supported on this system"; goto bad; #endif } else { -- 2.14.3