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 <toshi.kani@xxxxxxx> Cc: Dave Chinner <david@xxxxxxxxxxxxx> Cc: Dan Williams <dan.j.williams@xxxxxxxxx> Cc: Ross Zwisler <ross.zwisler@xxxxxxxxxxxxxxx> Cc: Christoph Hellwig <hch@xxxxxxxxxxxxx> Cc: Boaz Harrosh <boaz@xxxxxxxxxxxxx> --- fs/xfs/xfs_super.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 187e14b..b7ee323 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."); 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) DAX Turning DAX off.", error); + } mp->m_flags &= ~XFS_MOUNT_DAX; } } -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html