When a partition is not aligned by 4KB, mount -o dax succeeds, but any read/write access to the filesystem fails, except for metadata update.
Call bdev_direct_access to check the alignment when -o dax is specified. Signed-off-by: Toshi Kani <[email protected]> Reviewed-by: Boaz Harrosh <[email protected]> Reviewed-by: Ross Zwisler <[email protected]> Cc: Dave Chinner <[email protected]> Cc: Dan Williams <[email protected]> Cc: Ross Zwisler <[email protected]> Cc: Christoph Hellwig <[email protected]> Cc: Boaz Harrosh <[email protected]> --- v2-UPDATE - Add a period and fix a typo in error messages (Ross Zwisler) --- fs/xfs/xfs_super.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 187e14b..ac18fae 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1557,15 +1557,30 @@ xfs_fs_fill_super( sb->s_flags |= MS_I_VERSION; if (mp->m_flags & XFS_MOUNT_DAX) { + struct blk_dax_ctl dax = { + .sector = 0, + .size = PAGE_SIZE, + }; xfs_warn(mp, - "DAX enabled. Warning: EXPERIMENTAL, use at your own risk"); + "DAX enabled. Warning: EXPERIMENTAL, use at your own risk"); if (sb->s_blocksize != PAGE_SIZE) { xfs_alert(mp, - "Filesystem block size invalid for DAX Turning DAX off."); + "Filesystem block size invalid for DAX. Turning DAX off."); mp->m_flags &= ~XFS_MOUNT_DAX; - } else if (!sb->s_bdev->bd_disk->fops->direct_access) { - xfs_alert(mp, - "Block device does not support DAX Turning DAX off."); + } else if ((error = bdev_direct_access(sb->s_bdev, &dax)) < 0) { + switch (error) { + case -EOPNOTSUPP: + xfs_alert(mp, + "Block device does not support DAX. Turning DAX off."); + break; + case -EINVAL: + xfs_alert(mp, + "Partition alignment invalid for DAX. Turning DAX off."); + break; + default: + xfs_alert(mp, + "DAX access failed (%d). Turning DAX off.", error); + } mp->m_flags &= ~XFS_MOUNT_DAX; } }

