Commit f5705aa8 authored by Dan Williams's avatar Dan Williams

dax, xfs, ext4: compile out iomap-dax paths in the FS_DAX=n case

Tetsuo reports:

  fs/built-in.o: In function `xfs_file_iomap_end':
  xfs_iomap.c:(.text+0xe0ef9): undefined reference to `put_dax'
  fs/built-in.o: In function `xfs_file_iomap_begin':
  xfs_iomap.c:(.text+0xe1a7f): undefined reference to `dax_get_by_host'
  make: *** [vmlinux] Error 1
  $ grep DAX .config
  CONFIG_DAX=m
  # CONFIG_DEV_DAX is not set
  # CONFIG_FS_DAX is not set

When FS_DAX=n we can/must throw away the dax code in filesystems.
Implement 'fs_' versions of dax_get_by_host() and put_dax() that are
nops in the FS_DAX=n case.

Cc: <linux-xfs@vger.kernel.org>
Cc: <linux-ext4@vger.kernel.org>
Cc: Jan Kara <jack@suse.com>
Cc: "Theodore Ts'o" <tytso@mit.edu>
Cc: "Darrick J. Wong" <darrick.wong@oracle.com>
Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
Tested-by: default avatarTony Luck <tony.luck@intel.com>
Fixes: ef510424 ("block, dax: move 'select DAX' from BLOCK to FS_DAX")
Reported-by: default avatarTetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 9d109081
...@@ -817,7 +817,7 @@ static int ext2_iomap_begin(struct inode *inode, loff_t offset, loff_t length, ...@@ -817,7 +817,7 @@ static int ext2_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
iomap->bdev = bdev; iomap->bdev = bdev;
iomap->offset = (u64)first_block << blkbits; iomap->offset = (u64)first_block << blkbits;
if (blk_queue_dax(bdev->bd_queue)) if (blk_queue_dax(bdev->bd_queue))
iomap->dax_dev = dax_get_by_host(bdev->bd_disk->disk_name); iomap->dax_dev = fs_dax_get_by_host(bdev->bd_disk->disk_name);
else else
iomap->dax_dev = NULL; iomap->dax_dev = NULL;
...@@ -841,7 +841,7 @@ static int ...@@ -841,7 +841,7 @@ static int
ext2_iomap_end(struct inode *inode, loff_t offset, loff_t length, ext2_iomap_end(struct inode *inode, loff_t offset, loff_t length,
ssize_t written, unsigned flags, struct iomap *iomap) ssize_t written, unsigned flags, struct iomap *iomap)
{ {
put_dax(iomap->dax_dev); fs_put_dax(iomap->dax_dev);
if (iomap->type == IOMAP_MAPPED && if (iomap->type == IOMAP_MAPPED &&
written < length && written < length &&
(flags & IOMAP_WRITE)) (flags & IOMAP_WRITE))
......
...@@ -3412,7 +3412,7 @@ static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length, ...@@ -3412,7 +3412,7 @@ static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
bdev = inode->i_sb->s_bdev; bdev = inode->i_sb->s_bdev;
iomap->bdev = bdev; iomap->bdev = bdev;
if (blk_queue_dax(bdev->bd_queue)) if (blk_queue_dax(bdev->bd_queue))
iomap->dax_dev = dax_get_by_host(bdev->bd_disk->disk_name); iomap->dax_dev = fs_dax_get_by_host(bdev->bd_disk->disk_name);
else else
iomap->dax_dev = NULL; iomap->dax_dev = NULL;
iomap->offset = first_block << blkbits; iomap->offset = first_block << blkbits;
...@@ -3447,7 +3447,7 @@ static int ext4_iomap_end(struct inode *inode, loff_t offset, loff_t length, ...@@ -3447,7 +3447,7 @@ static int ext4_iomap_end(struct inode *inode, loff_t offset, loff_t length,
int blkbits = inode->i_blkbits; int blkbits = inode->i_blkbits;
bool truncate = false; bool truncate = false;
put_dax(iomap->dax_dev); fs_put_dax(iomap->dax_dev);
if (!(flags & IOMAP_WRITE) || (flags & IOMAP_FAULT)) if (!(flags & IOMAP_WRITE) || (flags & IOMAP_FAULT))
return 0; return 0;
......
...@@ -1068,7 +1068,7 @@ xfs_file_iomap_begin( ...@@ -1068,7 +1068,7 @@ xfs_file_iomap_begin(
/* optionally associate a dax device with the iomap bdev */ /* optionally associate a dax device with the iomap bdev */
bdev = iomap->bdev; bdev = iomap->bdev;
if (blk_queue_dax(bdev->bd_queue)) if (blk_queue_dax(bdev->bd_queue))
iomap->dax_dev = dax_get_by_host(bdev->bd_disk->disk_name); iomap->dax_dev = fs_dax_get_by_host(bdev->bd_disk->disk_name);
else else
iomap->dax_dev = NULL; iomap->dax_dev = NULL;
...@@ -1149,7 +1149,7 @@ xfs_file_iomap_end( ...@@ -1149,7 +1149,7 @@ xfs_file_iomap_end(
unsigned flags, unsigned flags,
struct iomap *iomap) struct iomap *iomap)
{ {
put_dax(iomap->dax_dev); fs_put_dax(iomap->dax_dev);
if ((flags & IOMAP_WRITE) && iomap->type == IOMAP_DELALLOC) if ((flags & IOMAP_WRITE) && iomap->type == IOMAP_DELALLOC)
return xfs_file_iomap_end_delalloc(XFS_I(inode), offset, return xfs_file_iomap_end_delalloc(XFS_I(inode), offset,
length, written, iomap); length, written, iomap);
......
...@@ -18,6 +18,20 @@ struct dax_operations { ...@@ -18,6 +18,20 @@ struct dax_operations {
void **, pfn_t *); void **, pfn_t *);
}; };
#if IS_ENABLED(CONFIG_DAX)
struct dax_device *dax_get_by_host(const char *host);
void put_dax(struct dax_device *dax_dev);
#else
static inline struct dax_device *dax_get_by_host(const char *host)
{
return NULL;
}
static inline void put_dax(struct dax_device *dax_dev)
{
}
#endif
int bdev_dax_pgoff(struct block_device *, sector_t, size_t, pgoff_t *pgoff); int bdev_dax_pgoff(struct block_device *, sector_t, size_t, pgoff_t *pgoff);
#if IS_ENABLED(CONFIG_FS_DAX) #if IS_ENABLED(CONFIG_FS_DAX)
int __bdev_dax_supported(struct super_block *sb, int blocksize); int __bdev_dax_supported(struct super_block *sb, int blocksize);
...@@ -25,23 +39,29 @@ static inline int bdev_dax_supported(struct super_block *sb, int blocksize) ...@@ -25,23 +39,29 @@ static inline int bdev_dax_supported(struct super_block *sb, int blocksize)
{ {
return __bdev_dax_supported(sb, blocksize); return __bdev_dax_supported(sb, blocksize);
} }
static inline struct dax_device *fs_dax_get_by_host(const char *host)
{
return dax_get_by_host(host);
}
static inline void fs_put_dax(struct dax_device *dax_dev)
{
put_dax(dax_dev);
}
#else #else
static inline int bdev_dax_supported(struct super_block *sb, int blocksize) static inline int bdev_dax_supported(struct super_block *sb, int blocksize)
{ {
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
#endif
#if IS_ENABLED(CONFIG_DAX) static inline struct dax_device *fs_dax_get_by_host(const char *host)
struct dax_device *dax_get_by_host(const char *host);
void put_dax(struct dax_device *dax_dev);
#else
static inline struct dax_device *dax_get_by_host(const char *host)
{ {
return NULL; return NULL;
} }
static inline void put_dax(struct dax_device *dax_dev) static inline void fs_put_dax(struct dax_device *dax_dev)
{ {
} }
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment