|
@@ -112,6 +112,8 @@ static struct xfs_kobj xfs_dbg_kobj; /* global debug sysfs attrs */
|
|
|
#define MNTOPT_DISCARD "discard" /* Discard unused blocks */
|
|
|
#define MNTOPT_NODISCARD "nodiscard" /* Do not discard unused blocks */
|
|
|
|
|
|
+#define MNTOPT_DAX "dax" /* Enable direct access to bdev pages */
|
|
|
+
|
|
|
/*
|
|
|
* Table driven mount option parser.
|
|
|
*
|
|
@@ -363,6 +365,10 @@ xfs_parseargs(
|
|
|
mp->m_flags |= XFS_MOUNT_DISCARD;
|
|
|
} else if (!strcmp(this_char, MNTOPT_NODISCARD)) {
|
|
|
mp->m_flags &= ~XFS_MOUNT_DISCARD;
|
|
|
+#ifdef CONFIG_FS_DAX
|
|
|
+ } else if (!strcmp(this_char, MNTOPT_DAX)) {
|
|
|
+ mp->m_flags |= XFS_MOUNT_DAX;
|
|
|
+#endif
|
|
|
} else {
|
|
|
xfs_warn(mp, "unknown mount option [%s].", this_char);
|
|
|
return -EINVAL;
|
|
@@ -452,8 +458,8 @@ done:
|
|
|
}
|
|
|
|
|
|
struct proc_xfs_info {
|
|
|
- int flag;
|
|
|
- char *str;
|
|
|
+ uint64_t flag;
|
|
|
+ char *str;
|
|
|
};
|
|
|
|
|
|
STATIC int
|
|
@@ -474,6 +480,7 @@ xfs_showargs(
|
|
|
{ XFS_MOUNT_GRPID, "," MNTOPT_GRPID },
|
|
|
{ XFS_MOUNT_DISCARD, "," MNTOPT_DISCARD },
|
|
|
{ XFS_MOUNT_SMALL_INUMS, "," MNTOPT_32BITINODE },
|
|
|
+ { XFS_MOUNT_DAX, "," MNTOPT_DAX },
|
|
|
{ 0, NULL }
|
|
|
};
|
|
|
static struct proc_xfs_info xfs_info_unset[] = {
|
|
@@ -1507,6 +1514,20 @@ xfs_fs_fill_super(
|
|
|
if (XFS_SB_VERSION_NUM(&mp->m_sb) == XFS_SB_VERSION_5)
|
|
|
sb->s_flags |= MS_I_VERSION;
|
|
|
|
|
|
+ if (mp->m_flags & XFS_MOUNT_DAX) {
|
|
|
+ xfs_warn(mp,
|
|
|
+ "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.");
|
|
|
+ mp->m_flags &= ~XFS_MOUNT_DAX;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
error = xfs_mountfs(mp);
|
|
|
if (error)
|
|
|
goto out_filestream_unmount;
|