summaryrefslogtreecommitdiff
path: root/fs/xfs
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2022-07-28 11:48:02 -0700
committerDarrick J. Wong <djwong@kernel.org>2022-10-14 14:16:50 -0700
commitf604d801d8e390dbafd893732d3e0b55142d8108 (patch)
tree3fea36a6fafa75595f4c0fef9f7bdcf00302fd51 /fs/xfs
parente4655f49de5f6cf713a769381ae847877e2169aa (diff)
xfs: enable xlog users to toggle atomic extent swapping
Plumb the necessary bits into the xlog code so that higher level callers can enable the atomic extent swapping feature and have it clear automatically when possible. Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Diffstat (limited to 'fs/xfs')
-rw-r--r--fs/xfs/xfs_log.c13
-rw-r--r--fs/xfs/xfs_log.h1
-rw-r--r--fs/xfs/xfs_log_priv.h1
3 files changed, 15 insertions, 0 deletions
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
index 525367567feb..8af9e530d7ad 100644
--- a/fs/xfs/xfs_log.c
+++ b/fs/xfs/xfs_log.c
@@ -1474,11 +1474,17 @@ xlog_clear_incompat(
if (down_write_trylock(&log->l_incompat_xattrs))
incompat_mask |= XFS_SB_FEAT_INCOMPAT_LOG_XATTRS;
+ if (down_write_trylock(&log->l_incompat_swapext))
+ incompat_mask |= XFS_SB_FEAT_INCOMPAT_LOG_SWAPEXT;
+
if (!incompat_mask)
return;
xfs_clear_incompat_log_features(mp, incompat_mask);
+ if (incompat_mask & XFS_SB_FEAT_INCOMPAT_LOG_SWAPEXT)
+ up_write(&log->l_incompat_swapext);
+
if (incompat_mask & XFS_SB_FEAT_INCOMPAT_LOG_XATTRS)
up_write(&log->l_incompat_xattrs);
}
@@ -1598,6 +1604,7 @@ xlog_alloc_log(
log->l_sectBBsize = 1 << log2_size;
init_rwsem(&log->l_incompat_xattrs);
+ init_rwsem(&log->l_incompat_swapext);
xlog_get_iclog_buffer_size(mp, log);
@@ -3906,6 +3913,9 @@ xlog_use_incompat_feat(
case XLOG_INCOMPAT_FEAT_XATTRS:
down_read(&log->l_incompat_xattrs);
break;
+ case XLOG_INCOMPAT_FEAT_SWAPEXT:
+ down_read(&log->l_incompat_swapext);
+ break;
}
}
@@ -3919,5 +3929,8 @@ xlog_drop_incompat_feat(
case XLOG_INCOMPAT_FEAT_XATTRS:
up_read(&log->l_incompat_xattrs);
break;
+ case XLOG_INCOMPAT_FEAT_SWAPEXT:
+ up_read(&log->l_incompat_swapext);
+ break;
}
}
diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h
index d187f6445909..30bdbf8ee25c 100644
--- a/fs/xfs/xfs_log.h
+++ b/fs/xfs/xfs_log.h
@@ -161,6 +161,7 @@ bool xlog_force_shutdown(struct xlog *log, uint32_t shutdown_flags);
enum xlog_incompat_feat {
XLOG_INCOMPAT_FEAT_XATTRS = XFS_SB_FEAT_INCOMPAT_LOG_XATTRS,
+ XLOG_INCOMPAT_FEAT_SWAPEXT = XFS_SB_FEAT_INCOMPAT_LOG_SWAPEXT
};
void xlog_use_incompat_feat(struct xlog *log, enum xlog_incompat_feat what);
diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h
index a13b5b6b744d..6cbee6996de5 100644
--- a/fs/xfs/xfs_log_priv.h
+++ b/fs/xfs/xfs_log_priv.h
@@ -448,6 +448,7 @@ struct xlog {
/* Users of log incompat features should take a read lock. */
struct rw_semaphore l_incompat_xattrs;
+ struct rw_semaphore l_incompat_swapext;
};
/*