summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2022-09-21 14:07:18 -0700
committerDarrick J. Wong <djwong@kernel.org>2022-11-09 19:07:58 -0800
commitdf2fde340c50b53da701f3d0741e8724a70c7a79 (patch)
tree021bbd6148edba8b2aee1d47b88e24d49bc7ca93
parente5636817166323daf80948d41150549459ea97cc (diff)
xfs: encode the rtbitmap in little endian format
Currently, the ondisk realtime bitmap file is accessed in units of 32-bit words. There's no endian translation of the contents of this file, which means that the Bad Things Happen(tm) if you go from (say) x86 to powerpc. Since we have a new feature flag, let's take the opportunity to enforce an endianness on the file. The natural format of a bitmap is (IMHO) little endian, because the byte offsets of the bitmap data should always increase in step with the information being indexed. Signed-off-by: Darrick J. Wong <djwong@kernel.org>
-rw-r--r--fs/xfs/libxfs/xfs_format.h4
-rw-r--r--fs/xfs/libxfs/xfs_rtbitmap.c8
2 files changed, 10 insertions, 2 deletions
diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h
index 35e33ed132fb..0a5963c73bc2 100644
--- a/fs/xfs/libxfs/xfs_format.h
+++ b/fs/xfs/libxfs/xfs_format.h
@@ -738,10 +738,12 @@ struct xfs_agfl {
/*
* Realtime bitmap information is accessed by the word, which is currently
- * stored in host-endian format.
+ * stored in host-endian format. Starting with the realtime groups feature,
+ * the words are stored in le32 ondisk.
*/
union xfs_rtword_ondisk {
__u32 raw;
+ __le32 rtg;
};
/*
diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c
index 05b0e4e92a0a..3e99afea78a6 100644
--- a/fs/xfs/libxfs/xfs_rtbitmap.c
+++ b/fs/xfs/libxfs/xfs_rtbitmap.c
@@ -177,6 +177,9 @@ xfs_rtbitmap_getword(
struct xfs_mount *mp,
union xfs_rtword_ondisk *wordptr)
{
+ if (xfs_has_rtgroups(mp))
+ return le32_to_cpu(wordptr->rtg);
+
return wordptr->raw;
}
@@ -187,7 +190,10 @@ xfs_rtbitmap_setword(
union xfs_rtword_ondisk *wordptr,
xfs_rtword_t incore)
{
- wordptr->raw = incore;
+ if (xfs_has_rtgroups(mp))
+ wordptr->rtg = cpu_to_le32(incore);
+ else
+ wordptr->raw = incore;
}
/*