When mounted with nodataio, add the NOSUBMIT iomap flag to all data
mappings passed into the iomap layer. This causes iomap to skip all
data I/O submission and thus facilitates metadata only performance
testing.

For experimental use only. Only tested insofar as fsstress runs for
a few minutes without blowing up.

Signed-off-by: Brian Foster <bfos...@redhat.com>
---
 fs/xfs/xfs_iomap.c | 3 +++
 fs/xfs/xfs_mount.h | 2 ++
 fs/xfs/xfs_super.c | 6 +++++-
 3 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
index 4087af7f3c9f..9b71a649e106 100644
--- a/fs/xfs/xfs_iomap.c
+++ b/fs/xfs/xfs_iomap.c
@@ -101,6 +101,9 @@ xfs_bmbt_to_iomap(
        struct xfs_mount        *mp = ip->i_mount;
        struct xfs_buftarg      *target = xfs_inode_buftarg(ip);
 
+       if (xfs_has_nodataio(mp))
+               iomap_flags |= IOMAP_F_NOSUBMIT;
+
        if (unlikely(!xfs_valid_startblock(ip, imap->br_startblock))) {
                xfs_bmap_mark_sick(ip, XFS_DATA_FORK);
                return xfs_alert_fsblock_zero(ip, imap);
diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h
index e880aa48de68..fd8a5b46d449 100644
--- a/fs/xfs/xfs_mount.h
+++ b/fs/xfs/xfs_mount.h
@@ -294,6 +294,7 @@ typedef struct xfs_mount {
 #define XFS_FEAT_NREXT64       (1ULL << 26)    /* large extent counters */
 
 /* Mount features */
+#define XFS_FEAT_NODATAIO      (1ULL << 47)    /* skip all data I/O */
 #define XFS_FEAT_NOATTR2       (1ULL << 48)    /* disable attr2 creation */
 #define XFS_FEAT_NOALIGN       (1ULL << 49)    /* ignore alignment */
 #define XFS_FEAT_ALLOCSIZE     (1ULL << 50)    /* user specified allocation 
size */
@@ -363,6 +364,7 @@ __XFS_HAS_FEAT(large_extent_counts, NREXT64)
  * bit inodes and read-only state, are kept as operational state rather than
  * features.
  */
+__XFS_HAS_FEAT(nodataio, NODATAIO)
 __XFS_HAS_FEAT(noattr2, NOATTR2)
 __XFS_HAS_FEAT(noalign, NOALIGN)
 __XFS_HAS_FEAT(allocsize, ALLOCSIZE)
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
index bce020374c5e..1fb24b5ba684 100644
--- a/fs/xfs/xfs_super.c
+++ b/fs/xfs/xfs_super.c
@@ -103,7 +103,7 @@ enum {
        Opt_filestreams, Opt_quota, Opt_noquota, Opt_usrquota, Opt_grpquota,
        Opt_prjquota, Opt_uquota, Opt_gquota, Opt_pquota,
        Opt_uqnoenforce, Opt_gqnoenforce, Opt_pqnoenforce, Opt_qnoenforce,
-       Opt_discard, Opt_nodiscard, Opt_dax, Opt_dax_enum,
+       Opt_discard, Opt_nodiscard, Opt_dax, Opt_dax_enum, Opt_nodataio,
 };
 
 static const struct fs_parameter_spec xfs_fs_parameters[] = {
@@ -148,6 +148,7 @@ static const struct fs_parameter_spec xfs_fs_parameters[] = 
{
        fsparam_flag("nodiscard",       Opt_nodiscard),
        fsparam_flag("dax",             Opt_dax),
        fsparam_enum("dax",             Opt_dax_enum, dax_param_enums),
+       fsparam_flag("nodataio",        Opt_nodataio),
        {}
 };
 
@@ -1385,6 +1386,9 @@ xfs_fs_parse_param(
                xfs_fs_warn_deprecated(fc, param, XFS_FEAT_NOATTR2, true);
                parsing_mp->m_features |= XFS_FEAT_NOATTR2;
                return 0;
+       case Opt_nodataio:
+               parsing_mp->m_features |= XFS_FEAT_NODATAIO;
+               return 0;
        default:
                xfs_warn(parsing_mp, "unknown mount option [%s].", param->key);
                return -EINVAL;
-- 
2.44.0


Reply via email to