* fix missing RT detection in libxfs
@ 2026-09-11 14:45 Christoph Hellwig
2026-09-11 14:45 ` [PATCH 1/3] libxfs: don't set mp->m_rtdev_targp when no RT devices is provided Christoph Hellwig
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Christoph Hellwig @ 2026-09-11 14:45 UTC (permalink / raw)
To: Andrey Albershteyn; +Cc: linux-xfs
Hi all,
the first patch in this series fixes the detection of a missing rtdev
specification in libxfs, and the other two clean up lose ends in this
area that I stumbled upon while debugging the original issue.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/3] libxfs: don't set mp->m_rtdev_targp when no RT devices is provided
2026-09-11 14:45 fix missing RT detection in libxfs Christoph Hellwig
@ 2026-09-11 14:45 ` Christoph Hellwig
2026-09-11 14:57 ` Darrick J. Wong
2026-09-11 14:45 ` [PATCH 2/3] libxfs: better describe why m_ddev_targp can be set in libxfs_buftarg_init Christoph Hellwig
2026-09-11 14:45 ` [PATCH 3/3] libxfs: remove buftarg member aliases Christoph Hellwig
2 siblings, 1 reply; 10+ messages in thread
From: Christoph Hellwig @ 2026-09-11 14:45 UTC (permalink / raw)
To: Andrey Albershteyn; +Cc: linux-xfs
The user-space only parts of commit 9840f7e09e2f ("xfs: allow internal
RT devices for zoned mode") accidentally set m_rtdev_targp to
m_ddev_targp when not name is set for the RT device, and thus disable
the check for a non-NULL m_rtdev_targp in rtmount_init.
This lead to tools working without specifying a RT device when they
should abort. For example this can lead to repair trying to read
and rewrite the rtsb when called without -rc, which will then fail
in weird ways.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
libxfs/init.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libxfs/init.c b/libxfs/init.c
index 5d8b4a153e28..2a46ddf086ed 100644
--- a/libxfs/init.c
+++ b/libxfs/init.c
@@ -573,7 +573,7 @@ libxfs_buftarg_init(
else
mp->m_logdev_targp = libxfs_buftarg_alloc(mp, xi, &xi->log,
lfail);
- if (!xi->rt.dev || xi->rt.dev == xi->data.dev)
+ if (xi->rt.dev == xi->data.dev)
mp->m_rtdev_targp = mp->m_ddev_targp;
else
mp->m_rtdev_targp = libxfs_buftarg_alloc(mp, xi, &xi->rt,
--
2.53.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/3] libxfs: better describe why m_ddev_targp can be set in libxfs_buftarg_init
2026-09-11 14:45 fix missing RT detection in libxfs Christoph Hellwig
2026-09-11 14:45 ` [PATCH 1/3] libxfs: don't set mp->m_rtdev_targp when no RT devices is provided Christoph Hellwig
@ 2026-09-11 14:45 ` Christoph Hellwig
2026-09-11 14:53 ` Darrick J. Wong
2026-09-11 14:45 ` [PATCH 3/3] libxfs: remove buftarg member aliases Christoph Hellwig
2 siblings, 1 reply; 10+ messages in thread
From: Christoph Hellwig @ 2026-09-11 14:45 UTC (permalink / raw)
To: Andrey Albershteyn; +Cc: linux-xfs
I had to wade through this to understand what is going on here, so dump
the thoughts in a comment to make it easier for the next person to
understand the logic.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
libxfs/init.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/libxfs/init.c b/libxfs/init.c
index 2a46ddf086ed..a47e610934e9 100644
--- a/libxfs/init.c
+++ b/libxfs/init.c
@@ -534,7 +534,12 @@ libxfs_buftarg_init(
}
if (mp->m_ddev_targp) {
- /* should already have all buftargs initialised */
+ /*
+ * This can happen if the utility called libxfs_buftarg_init
+ * manually before libxfs_mount, which calls us again.
+ *
+ * In this case all buftargs should be initialized already.
+ */
if (mp->m_ddev_targp->bt_bdev != xi->data.dev ||
mp->m_ddev_targp->bt_mount != mp) {
fprintf(stderr,
--
2.53.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 3/3] libxfs: remove buftarg member aliases
2026-09-11 14:45 fix missing RT detection in libxfs Christoph Hellwig
2026-09-11 14:45 ` [PATCH 1/3] libxfs: don't set mp->m_rtdev_targp when no RT devices is provided Christoph Hellwig
2026-09-11 14:45 ` [PATCH 2/3] libxfs: better describe why m_ddev_targp can be set in libxfs_buftarg_init Christoph Hellwig
@ 2026-09-11 14:45 ` Christoph Hellwig
2026-09-11 14:53 ` Darrick J. Wong
2 siblings, 1 reply; 10+ messages in thread
From: Christoph Hellwig @ 2026-09-11 14:45 UTC (permalink / raw)
To: Andrey Albershteyn; +Cc: linux-xfs
Remove the #defines giving historic IRIX names to the ddev/logdev/rtdev
buftargs in struct xfs_mount and use the current kernel names everywhere.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
include/xfs_mount.h | 3 ---
libxfs/init.c | 12 ++++++------
libxfs/trans.c | 4 ++--
libxfs/util.c | 2 +-
mkfs/xfs_mkfs.c | 4 ++--
repair/attr_repair.c | 11 ++++++-----
repair/da_util.c | 2 +-
repair/dino_chunks.c | 8 ++++----
repair/dinode.c | 8 ++++----
repair/phase3.c | 2 +-
repair/phase5.c | 6 +++---
repair/prefetch.c | 4 ++--
repair/quotacheck.c | 2 +-
repair/rt.c | 2 +-
repair/scan.c | 16 +++++++++-------
15 files changed, 43 insertions(+), 43 deletions(-)
diff --git a/include/xfs_mount.h b/include/xfs_mount.h
index 5a714333c16e..0dea578ee3a5 100644
--- a/include/xfs_mount.h
+++ b/include/xfs_mount.h
@@ -102,9 +102,6 @@ typedef struct xfs_mount {
struct xfs_buftarg *m_ddev_targp;
struct xfs_buftarg *m_logdev_targp;
struct xfs_buftarg *m_rtdev_targp;
-#define m_dev m_ddev_targp
-#define m_logdev m_logdev_targp
-#define m_rtdev m_rtdev_targp
uint8_t m_dircook_elog; /* log d-cookie entry bits */
uint8_t m_blkbit_log; /* blocklog + NBBY */
uint8_t m_blkbb_log; /* blocklog - BBSHIFT */
diff --git a/libxfs/init.c b/libxfs/init.c
index a47e610934e9..97c4755dd131 100644
--- a/libxfs/init.c
+++ b/libxfs/init.c
@@ -331,7 +331,7 @@ rtmount_init(
(unsigned long long) mp->m_sb.sb_rblocks);
return -1;
}
- error = libxfs_buf_read(mp->m_rtdev, d - XFS_FSB_TO_BB(mp, 1),
+ error = libxfs_buf_read(mp->m_rtdev_targp, d - XFS_FSB_TO_BB(mp, 1),
XFS_FSB_TO_BB(mp, 1), 0, &bp, NULL);
if (error) {
fprintf(stderr, _("%s: realtime size check failed\n"),
@@ -679,7 +679,7 @@ check_many_rtgroups(
xfs_daddr_t d;
int error;
- if (!mp->m_rtdev->bt_bdev) {
+ if (!mp->m_rtdev_targp->bt_bdev) {
fprintf(stderr, _("%s: no rt device, ignoring rgcount %u\n"),
progname, sbp->sb_rgcount);
if (!xfs_is_debugger(mp))
@@ -690,8 +690,8 @@ check_many_rtgroups(
}
d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_rblocks);
- error = libxfs_buf_read(mp->m_rtdev, d - XFS_FSB_TO_BB(mp, 1), 1, 0,
- &bp, NULL);
+ error = libxfs_buf_read(mp->m_rtdev_targp, d - XFS_FSB_TO_BB(mp, 1), 1,
+ 0, &bp, NULL);
if (!error) {
libxfs_buf_relse(bp);
return true;
@@ -806,7 +806,7 @@ libxfs_mount(
return mp;
/* device size checks must pass unless we're a debugger. */
- error = libxfs_buf_read(mp->m_dev, d - XFS_FSS_TO_BB(mp, 1),
+ error = libxfs_buf_read(mp->m_ddev_targp, d - XFS_FSS_TO_BB(mp, 1),
XFS_FSS_TO_BB(mp, 1), 0, &bp, NULL);
if (error) {
fprintf(stderr, _("%s: data size check failed\n"), progname);
@@ -848,7 +848,7 @@ libxfs_mount(
* read the first one and let the user know to check the geometry.
*/
if (sbp->sb_agcount > 1000000) {
- error = libxfs_buf_read(mp->m_dev,
+ error = libxfs_buf_read(mp->m_ddev_targp,
XFS_AG_DADDR(mp, sbp->sb_agcount - 1, 0), 1,
0, &bp, NULL);
if (error) {
diff --git a/libxfs/trans.c b/libxfs/trans.c
index c89b035ffeaf..88022c2fc9c2 100644
--- a/libxfs/trans.c
+++ b/libxfs/trans.c
@@ -500,7 +500,7 @@ libxfs_trans_getsb(
if (tp == NULL)
return libxfs_getsb(mp);
- bp = xfs_trans_buf_item_match(tp, mp->m_dev, &map, 1);
+ bp = xfs_trans_buf_item_match(tp, mp->m_ddev_targp, &map, 1);
if (bp != NULL) {
ASSERT(bp->b_transp == tp);
bip = bp->b_log_item;
@@ -529,7 +529,7 @@ libxfs_trans_getrtsb(
int len = XFS_FSS_TO_BB(mp, 1);
DEFINE_SINGLE_BUF_MAP(map, XFS_SB_DADDR, len);
- bp = xfs_trans_buf_item_match(tp, mp->m_rtdev, &map, 1);
+ bp = xfs_trans_buf_item_match(tp, mp->m_rtdev_targp, &map, 1);
if (bp != NULL) {
ASSERT(bp->b_transp == tp);
bip = bp->b_log_item;
diff --git a/libxfs/util.c b/libxfs/util.c
index 6cbbe9056eba..fae8fce484b7 100644
--- a/libxfs/util.c
+++ b/libxfs/util.c
@@ -527,7 +527,7 @@ libxfs_file_write(
map.br_state == XFS_EXT_UNWRITTEN)
return -EINVAL;
- error = libxfs_buf_get(mp->m_dev,
+ error = libxfs_buf_get(mp->m_ddev_targp,
XFS_FSB_TO_DADDR(mp, map.br_startblock),
XFS_FSB_TO_BB(mp, map.br_blockcount),
&bp);
diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
index 4f11c9de339c..714cd3cda8ca 100644
--- a/mkfs/xfs_mkfs.c
+++ b/mkfs/xfs_mkfs.c
@@ -5666,7 +5666,7 @@ rewrite_secondary_superblocks(
int error;
/* rewrite the last superblock */
- error = -libxfs_buf_read(mp->m_dev,
+ error = -libxfs_buf_read(mp->m_ddev_targp,
XFS_AGB_TO_DADDR(mp, mp->m_sb.sb_agcount - 1,
XFS_SB_DADDR),
XFS_FSS_TO_BB(mp, 1), 0, &buf, &xfs_sb_buf_ops);
@@ -5686,7 +5686,7 @@ rewrite_secondary_superblocks(
if (mp->m_sb.sb_agcount <= 2)
return;
- error = -libxfs_buf_read(mp->m_dev,
+ error = -libxfs_buf_read(mp->m_ddev_targp,
XFS_AGB_TO_DADDR(mp, (mp->m_sb.sb_agcount - 1) / 2,
XFS_SB_DADDR),
XFS_FSS_TO_BB(mp, 1), 0, &buf, &xfs_sb_buf_ops);
diff --git a/repair/attr_repair.c b/repair/attr_repair.c
index fe4089026cae..982dc838ee55 100644
--- a/repair/attr_repair.c
+++ b/repair/attr_repair.c
@@ -443,9 +443,10 @@ rmtval_get(xfs_mount_t *mp, xfs_ino_t ino, blkmap_t *blkmap,
clearit = 1;
break;
}
- error = -libxfs_buf_read(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno),
- XFS_FSB_TO_BB(mp, 1), LIBXFS_READBUF_SALVAGE,
- &bp, &xfs_attr3_rmt_buf_ops);
+ error = -libxfs_buf_read(mp->m_ddev_targp,
+ XFS_FSB_TO_DADDR(mp, bno), XFS_FSB_TO_BB(mp, 1),
+ LIBXFS_READBUF_SALVAGE, &bp,
+ &xfs_attr3_rmt_buf_ops);
if (error) {
do_warn(
_("can't read remote block for attributes of inode %" PRIu64 "\n"), ino);
@@ -879,7 +880,7 @@ process_leaf_attr_level(xfs_mount_t *mp,
goto error_out;
}
- error = -libxfs_buf_read(mp->m_dev,
+ error = -libxfs_buf_read(mp->m_ddev_targp,
XFS_FSB_TO_DADDR(mp, dev_bno),
XFS_FSB_TO_BB(mp, 1), LIBXFS_READBUF_SALVAGE,
&bp, &xfs_attr3_leaf_buf_ops);
@@ -1217,7 +1218,7 @@ process_longform_attr(
return 1;
}
- error = -libxfs_buf_read(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno),
+ error = -libxfs_buf_read(mp->m_ddev_targp, XFS_FSB_TO_DADDR(mp, bno),
XFS_FSB_TO_BB(mp, 1), LIBXFS_READBUF_SALVAGE, &bp,
&xfs_da3_node_buf_ops);
if (error) {
diff --git a/repair/da_util.c b/repair/da_util.c
index 7f94f4012062..c0625b312fc6 100644
--- a/repair/da_util.c
+++ b/repair/da_util.c
@@ -64,7 +64,7 @@ da_read_buf(
map[i].bm_bn = XFS_FSB_TO_DADDR(mp, bmp[i].startblock);
map[i].bm_len = XFS_FSB_TO_BB(mp, bmp[i].blockcount);
}
- libxfs_buf_read_map(mp->m_dev, map, nex, LIBXFS_READBUF_SALVAGE,
+ libxfs_buf_read_map(mp->m_ddev_targp, map, nex, LIBXFS_READBUF_SALVAGE,
&bp, ops);
if (map != map_array)
free(map);
diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c
index 932eaf63f474..6b261a1e99bf 100644
--- a/repair/dino_chunks.c
+++ b/repair/dino_chunks.c
@@ -43,9 +43,9 @@ check_aginode_block(
* tree and we wouldn't be here and we stale the buffers out
* so no one else will overlap them.
*/
- error = -libxfs_buf_read(mp->m_dev, XFS_AGB_TO_DADDR(mp, agno, agbno),
- XFS_FSB_TO_BB(mp, 1), LIBXFS_READBUF_SALVAGE, &bp,
- NULL);
+ error = -libxfs_buf_read(mp->m_ddev_targp,
+ XFS_AGB_TO_DADDR(mp, agno, agbno), XFS_FSB_TO_BB(mp, 1),
+ LIBXFS_READBUF_SALVAGE, &bp, NULL);
if (error) {
do_warn(_("cannot read agbno (%u/%u), disk block %" PRId64 "\n"),
agno, agbno, XFS_AGB_TO_DADDR(mp, agno, agbno));
@@ -699,7 +699,7 @@ process_inode_chunk(
pftrace("about to read off %llu in AG %d",
XFS_AGB_TO_DADDR(mp, agno, agbno), agno);
- error = -libxfs_buf_read(mp->m_dev,
+ error = -libxfs_buf_read(mp->m_ddev_targp,
XFS_AGB_TO_DADDR(mp, agno, agbno),
XFS_FSB_TO_BB(mp,
M_IGEO(mp)->blocks_per_cluster),
diff --git a/repair/dinode.c b/repair/dinode.c
index 48939f8bd159..243fcf7a19f4 100644
--- a/repair/dinode.c
+++ b/repair/dinode.c
@@ -956,8 +956,8 @@ get_agino_buf(
cluster_agino, cluster_daddr, cluster_blks);
#endif
- error = -libxfs_buf_read(mp->m_dev, cluster_daddr, cluster_blks, 0,
- &bp, &xfs_inode_buf_ops);
+ error = -libxfs_buf_read(mp->m_ddev_targp, cluster_daddr, cluster_blks,
+ 0, &bp, &xfs_inode_buf_ops);
if (error) {
do_warn(_("cannot read inode (%u/%u), disk block %" PRIu64 "\n"),
agno, cluster_agino, cluster_daddr);
@@ -1733,7 +1733,7 @@ process_quota_inode(
fsbno = blkmap_get(blkmap, qbno);
dqid = (xfs_dqid_t)qbno * dqperchunk;
- error = -libxfs_buf_read(mp->m_dev,
+ error = -libxfs_buf_read(mp->m_ddev_targp,
XFS_FSB_TO_DADDR(mp, fsbno), dqchunklen,
LIBXFS_READBUF_SALVAGE, &bp,
&xfs_dquot_buf_ops);
@@ -1845,7 +1845,7 @@ _("cannot read inode %" PRIu64 ", file block %d, NULL disk block\n"),
byte_cnt = XFS_FSB_TO_B(mp, blk_cnt);
- error = -libxfs_buf_read(mp->m_dev,
+ error = -libxfs_buf_read(mp->m_ddev_targp,
XFS_FSB_TO_DADDR(mp, fsbno), BTOBB(byte_cnt),
LIBXFS_READBUF_SALVAGE, &bp,
&xfs_symlink_buf_ops);
diff --git a/repair/phase3.c b/repair/phase3.c
index 6ec616d9b31d..64a2c961b080 100644
--- a/repair/phase3.c
+++ b/repair/phase3.c
@@ -30,7 +30,7 @@ process_agi_unlinked(
int agi_dirty = 0;
int error;
- error = -libxfs_buf_read(mp->m_dev,
+ error = -libxfs_buf_read(mp->m_ddev_targp,
XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)),
mp->m_sb.sb_sectsize / BBSIZE, LIBXFS_READBUF_SALVAGE,
&bp, &xfs_agi_buf_ops);
diff --git a/repair/phase5.c b/repair/phase5.c
index e44c26885717..019772346eb1 100644
--- a/repair/phase5.c
+++ b/repair/phase5.c
@@ -135,7 +135,7 @@ build_agi(
int i;
int error;
- error = -libxfs_buf_get(mp->m_dev,
+ error = -libxfs_buf_get(mp->m_ddev_targp,
XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)),
mp->m_sb.sb_sectsize / BBSIZE, &agi_buf);
if (error)
@@ -228,7 +228,7 @@ build_agf_agfl(
__be32 *freelist;
int error;
- error = -libxfs_buf_get(mp->m_dev,
+ error = -libxfs_buf_get(mp->m_ddev_targp,
XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)),
mp->m_sb.sb_sectsize / BBSIZE, &agf_buf);
if (error)
@@ -314,7 +314,7 @@ build_agf_agfl(
platform_uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_meta_uuid);
/* initialise the AGFL, then fill it if there are blocks left over. */
- error = -libxfs_buf_get(mp->m_dev,
+ error = -libxfs_buf_get(mp->m_ddev_targp,
XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)),
mp->m_sb.sb_sectsize / BBSIZE, &agfl_buf);
if (error)
diff --git a/repair/prefetch.c b/repair/prefetch.c
index 8cd3416fa568..3d26636e5e56 100644
--- a/repair/prefetch.c
+++ b/repair/prefetch.c
@@ -121,7 +121,7 @@ pf_queue_io(
* the lock holder is either reading it from disk himself or
* completely overwriting it this behaviour is perfectly fine.
*/
- error = -libxfs_buf_get_map(mp->m_dev, map, nmaps,
+ error = -libxfs_buf_get_map(mp->m_ddev_targp, map, nmaps,
LIBXFS_GETBUF_TRYLOCK, &bp);
if (error)
return;
@@ -275,7 +275,7 @@ pf_scan_lbtree(
int rc;
int error;
- error = -libxfs_buf_read(mp->m_dev, XFS_FSB_TO_DADDR(mp, dbno),
+ error = -libxfs_buf_read(mp->m_ddev_targp, XFS_FSB_TO_DADDR(mp, dbno),
XFS_FSB_TO_BB(mp, 1), LIBXFS_READBUF_SALVAGE, &bp,
&xfs_bmbt_buf_ops);
if (error)
diff --git a/repair/quotacheck.c b/repair/quotacheck.c
index fc7e3864654c..e13092dfcae8 100644
--- a/repair/quotacheck.c
+++ b/repair/quotacheck.c
@@ -369,7 +369,7 @@ qc_walk_dquot_extent(
unsigned int dqnr;
uint64_t dqid;
- error = -libxfs_buf_read(mp->m_dev,
+ error = -libxfs_buf_read(mp->m_ddev_targp,
XFS_FSB_TO_DADDR(mp, map->br_startblock + bno),
dqchunklen, 0, &bp, &xfs_dquot_buf_ops);
if (error) {
diff --git a/repair/rt.c b/repair/rt.c
index 3e51c9b5eb4b..b5b9d4fdc536 100644
--- a/repair/rt.c
+++ b/repair/rt.c
@@ -255,7 +255,7 @@ check_rtfile_contents(
break;
}
- error = -libxfs_buf_read_uncached(mp->m_dev,
+ error = -libxfs_buf_read_uncached(mp->m_ddev_targp,
XFS_FSB_TO_DADDR(mp, map.br_startblock),
XFS_FSB_TO_BB(mp, 1), 0, &bp,
xfs_rtblock_ops(mp, type));
diff --git a/repair/scan.c b/repair/scan.c
index 7d22ff378484..865983d6c9e0 100644
--- a/repair/scan.c
+++ b/repair/scan.c
@@ -102,8 +102,9 @@ scan_sbtree(
struct xfs_buf *bp;
int error;
- error = salvage_buffer(mp->m_dev, XFS_AGB_TO_DADDR(mp, agno, root),
- XFS_FSB_TO_BB(mp, 1), &bp, ops);
+ error = salvage_buffer(mp->m_ddev_targp,
+ XFS_AGB_TO_DADDR(mp, agno, root),XFS_FSB_TO_BB(mp, 1),
+ &bp, ops);
if (error) {
do_error(_("can't read btree block %d/%d\n"), agno, root);
return;
@@ -161,7 +162,7 @@ scan_lbtree(
int dirty = 0;
bool badcrc = false;
- err = salvage_buffer(mp->m_dev, XFS_FSB_TO_DADDR(mp, root),
+ err = salvage_buffer(mp->m_ddev_targp, XFS_FSB_TO_DADDR(mp, root),
XFS_FSB_TO_BB(mp, 1), &bp, ops);
if (err) {
do_error(_("can't read btree block %d/%d\n"),
@@ -3030,7 +3031,7 @@ scan_freelist(
if (be32_to_cpu(agf->agf_flcount) == 0)
return;
- error = salvage_buffer(mp->m_dev,
+ error = salvage_buffer(mp->m_ddev_targp,
XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)),
XFS_FSS_TO_BB(mp, 1), &agflbuf, &xfs_agfl_buf_ops);
if (error) {
@@ -3312,7 +3313,8 @@ scan_ag(
return;
}
- error = salvage_buffer(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_SB_DADDR),
+ error = salvage_buffer(mp->m_ddev_targp,
+ XFS_AG_DADDR(mp, agno, XFS_SB_DADDR),
XFS_FSS_TO_BB(mp, 1), &sbbuf, &xfs_sb_buf_ops);
if (error) {
objname = _("root superblock");
@@ -3322,7 +3324,7 @@ scan_ag(
do_warn(_("superblock has bad CRC for ag %d\n"), agno);
libxfs_sb_from_disk(sb, sbbuf->b_addr);
- error = salvage_buffer(mp->m_dev,
+ error = salvage_buffer(mp->m_ddev_targp,
XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)),
XFS_FSS_TO_BB(mp, 1), &agfbuf, &xfs_agf_buf_ops);
if (error) {
@@ -3333,7 +3335,7 @@ scan_ag(
do_warn(_("agf has bad CRC for ag %d\n"), agno);
agf = agfbuf->b_addr;
- error = salvage_buffer(mp->m_dev,
+ error = salvage_buffer(mp->m_ddev_targp,
XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)),
XFS_FSS_TO_BB(mp, 1), &agibuf, &xfs_agi_buf_ops);
if (error) {
--
2.53.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 3/3] libxfs: remove buftarg member aliases
2026-09-11 14:45 ` [PATCH 3/3] libxfs: remove buftarg member aliases Christoph Hellwig
@ 2026-09-11 14:53 ` Darrick J. Wong
0 siblings, 0 replies; 10+ messages in thread
From: Darrick J. Wong @ 2026-09-11 14:53 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Andrey Albershteyn, linux-xfs
On Fri, Sep 11, 2026 at 04:45:44PM +0200, Christoph Hellwig wrote:
> Remove the #defines giving historic IRIX names to the ddev/logdev/rtdev
> buftargs in struct xfs_mount and use the current kernel names everywhere.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
<shudder> macros goway :)
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
--D
> ---
> include/xfs_mount.h | 3 ---
> libxfs/init.c | 12 ++++++------
> libxfs/trans.c | 4 ++--
> libxfs/util.c | 2 +-
> mkfs/xfs_mkfs.c | 4 ++--
> repair/attr_repair.c | 11 ++++++-----
> repair/da_util.c | 2 +-
> repair/dino_chunks.c | 8 ++++----
> repair/dinode.c | 8 ++++----
> repair/phase3.c | 2 +-
> repair/phase5.c | 6 +++---
> repair/prefetch.c | 4 ++--
> repair/quotacheck.c | 2 +-
> repair/rt.c | 2 +-
> repair/scan.c | 16 +++++++++-------
> 15 files changed, 43 insertions(+), 43 deletions(-)
>
> diff --git a/include/xfs_mount.h b/include/xfs_mount.h
> index 5a714333c16e..0dea578ee3a5 100644
> --- a/include/xfs_mount.h
> +++ b/include/xfs_mount.h
> @@ -102,9 +102,6 @@ typedef struct xfs_mount {
> struct xfs_buftarg *m_ddev_targp;
> struct xfs_buftarg *m_logdev_targp;
> struct xfs_buftarg *m_rtdev_targp;
> -#define m_dev m_ddev_targp
> -#define m_logdev m_logdev_targp
> -#define m_rtdev m_rtdev_targp
> uint8_t m_dircook_elog; /* log d-cookie entry bits */
> uint8_t m_blkbit_log; /* blocklog + NBBY */
> uint8_t m_blkbb_log; /* blocklog - BBSHIFT */
> diff --git a/libxfs/init.c b/libxfs/init.c
> index a47e610934e9..97c4755dd131 100644
> --- a/libxfs/init.c
> +++ b/libxfs/init.c
> @@ -331,7 +331,7 @@ rtmount_init(
> (unsigned long long) mp->m_sb.sb_rblocks);
> return -1;
> }
> - error = libxfs_buf_read(mp->m_rtdev, d - XFS_FSB_TO_BB(mp, 1),
> + error = libxfs_buf_read(mp->m_rtdev_targp, d - XFS_FSB_TO_BB(mp, 1),
> XFS_FSB_TO_BB(mp, 1), 0, &bp, NULL);
> if (error) {
> fprintf(stderr, _("%s: realtime size check failed\n"),
> @@ -679,7 +679,7 @@ check_many_rtgroups(
> xfs_daddr_t d;
> int error;
>
> - if (!mp->m_rtdev->bt_bdev) {
> + if (!mp->m_rtdev_targp->bt_bdev) {
> fprintf(stderr, _("%s: no rt device, ignoring rgcount %u\n"),
> progname, sbp->sb_rgcount);
> if (!xfs_is_debugger(mp))
> @@ -690,8 +690,8 @@ check_many_rtgroups(
> }
>
> d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_rblocks);
> - error = libxfs_buf_read(mp->m_rtdev, d - XFS_FSB_TO_BB(mp, 1), 1, 0,
> - &bp, NULL);
> + error = libxfs_buf_read(mp->m_rtdev_targp, d - XFS_FSB_TO_BB(mp, 1), 1,
> + 0, &bp, NULL);
> if (!error) {
> libxfs_buf_relse(bp);
> return true;
> @@ -806,7 +806,7 @@ libxfs_mount(
> return mp;
>
> /* device size checks must pass unless we're a debugger. */
> - error = libxfs_buf_read(mp->m_dev, d - XFS_FSS_TO_BB(mp, 1),
> + error = libxfs_buf_read(mp->m_ddev_targp, d - XFS_FSS_TO_BB(mp, 1),
> XFS_FSS_TO_BB(mp, 1), 0, &bp, NULL);
> if (error) {
> fprintf(stderr, _("%s: data size check failed\n"), progname);
> @@ -848,7 +848,7 @@ libxfs_mount(
> * read the first one and let the user know to check the geometry.
> */
> if (sbp->sb_agcount > 1000000) {
> - error = libxfs_buf_read(mp->m_dev,
> + error = libxfs_buf_read(mp->m_ddev_targp,
> XFS_AG_DADDR(mp, sbp->sb_agcount - 1, 0), 1,
> 0, &bp, NULL);
> if (error) {
> diff --git a/libxfs/trans.c b/libxfs/trans.c
> index c89b035ffeaf..88022c2fc9c2 100644
> --- a/libxfs/trans.c
> +++ b/libxfs/trans.c
> @@ -500,7 +500,7 @@ libxfs_trans_getsb(
> if (tp == NULL)
> return libxfs_getsb(mp);
>
> - bp = xfs_trans_buf_item_match(tp, mp->m_dev, &map, 1);
> + bp = xfs_trans_buf_item_match(tp, mp->m_ddev_targp, &map, 1);
> if (bp != NULL) {
> ASSERT(bp->b_transp == tp);
> bip = bp->b_log_item;
> @@ -529,7 +529,7 @@ libxfs_trans_getrtsb(
> int len = XFS_FSS_TO_BB(mp, 1);
> DEFINE_SINGLE_BUF_MAP(map, XFS_SB_DADDR, len);
>
> - bp = xfs_trans_buf_item_match(tp, mp->m_rtdev, &map, 1);
> + bp = xfs_trans_buf_item_match(tp, mp->m_rtdev_targp, &map, 1);
> if (bp != NULL) {
> ASSERT(bp->b_transp == tp);
> bip = bp->b_log_item;
> diff --git a/libxfs/util.c b/libxfs/util.c
> index 6cbbe9056eba..fae8fce484b7 100644
> --- a/libxfs/util.c
> +++ b/libxfs/util.c
> @@ -527,7 +527,7 @@ libxfs_file_write(
> map.br_state == XFS_EXT_UNWRITTEN)
> return -EINVAL;
>
> - error = libxfs_buf_get(mp->m_dev,
> + error = libxfs_buf_get(mp->m_ddev_targp,
> XFS_FSB_TO_DADDR(mp, map.br_startblock),
> XFS_FSB_TO_BB(mp, map.br_blockcount),
> &bp);
> diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
> index 4f11c9de339c..714cd3cda8ca 100644
> --- a/mkfs/xfs_mkfs.c
> +++ b/mkfs/xfs_mkfs.c
> @@ -5666,7 +5666,7 @@ rewrite_secondary_superblocks(
> int error;
>
> /* rewrite the last superblock */
> - error = -libxfs_buf_read(mp->m_dev,
> + error = -libxfs_buf_read(mp->m_ddev_targp,
> XFS_AGB_TO_DADDR(mp, mp->m_sb.sb_agcount - 1,
> XFS_SB_DADDR),
> XFS_FSS_TO_BB(mp, 1), 0, &buf, &xfs_sb_buf_ops);
> @@ -5686,7 +5686,7 @@ rewrite_secondary_superblocks(
> if (mp->m_sb.sb_agcount <= 2)
> return;
>
> - error = -libxfs_buf_read(mp->m_dev,
> + error = -libxfs_buf_read(mp->m_ddev_targp,
> XFS_AGB_TO_DADDR(mp, (mp->m_sb.sb_agcount - 1) / 2,
> XFS_SB_DADDR),
> XFS_FSS_TO_BB(mp, 1), 0, &buf, &xfs_sb_buf_ops);
> diff --git a/repair/attr_repair.c b/repair/attr_repair.c
> index fe4089026cae..982dc838ee55 100644
> --- a/repair/attr_repair.c
> +++ b/repair/attr_repair.c
> @@ -443,9 +443,10 @@ rmtval_get(xfs_mount_t *mp, xfs_ino_t ino, blkmap_t *blkmap,
> clearit = 1;
> break;
> }
> - error = -libxfs_buf_read(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno),
> - XFS_FSB_TO_BB(mp, 1), LIBXFS_READBUF_SALVAGE,
> - &bp, &xfs_attr3_rmt_buf_ops);
> + error = -libxfs_buf_read(mp->m_ddev_targp,
> + XFS_FSB_TO_DADDR(mp, bno), XFS_FSB_TO_BB(mp, 1),
> + LIBXFS_READBUF_SALVAGE, &bp,
> + &xfs_attr3_rmt_buf_ops);
> if (error) {
> do_warn(
> _("can't read remote block for attributes of inode %" PRIu64 "\n"), ino);
> @@ -879,7 +880,7 @@ process_leaf_attr_level(xfs_mount_t *mp,
> goto error_out;
> }
>
> - error = -libxfs_buf_read(mp->m_dev,
> + error = -libxfs_buf_read(mp->m_ddev_targp,
> XFS_FSB_TO_DADDR(mp, dev_bno),
> XFS_FSB_TO_BB(mp, 1), LIBXFS_READBUF_SALVAGE,
> &bp, &xfs_attr3_leaf_buf_ops);
> @@ -1217,7 +1218,7 @@ process_longform_attr(
> return 1;
> }
>
> - error = -libxfs_buf_read(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno),
> + error = -libxfs_buf_read(mp->m_ddev_targp, XFS_FSB_TO_DADDR(mp, bno),
> XFS_FSB_TO_BB(mp, 1), LIBXFS_READBUF_SALVAGE, &bp,
> &xfs_da3_node_buf_ops);
> if (error) {
> diff --git a/repair/da_util.c b/repair/da_util.c
> index 7f94f4012062..c0625b312fc6 100644
> --- a/repair/da_util.c
> +++ b/repair/da_util.c
> @@ -64,7 +64,7 @@ da_read_buf(
> map[i].bm_bn = XFS_FSB_TO_DADDR(mp, bmp[i].startblock);
> map[i].bm_len = XFS_FSB_TO_BB(mp, bmp[i].blockcount);
> }
> - libxfs_buf_read_map(mp->m_dev, map, nex, LIBXFS_READBUF_SALVAGE,
> + libxfs_buf_read_map(mp->m_ddev_targp, map, nex, LIBXFS_READBUF_SALVAGE,
> &bp, ops);
> if (map != map_array)
> free(map);
> diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c
> index 932eaf63f474..6b261a1e99bf 100644
> --- a/repair/dino_chunks.c
> +++ b/repair/dino_chunks.c
> @@ -43,9 +43,9 @@ check_aginode_block(
> * tree and we wouldn't be here and we stale the buffers out
> * so no one else will overlap them.
> */
> - error = -libxfs_buf_read(mp->m_dev, XFS_AGB_TO_DADDR(mp, agno, agbno),
> - XFS_FSB_TO_BB(mp, 1), LIBXFS_READBUF_SALVAGE, &bp,
> - NULL);
> + error = -libxfs_buf_read(mp->m_ddev_targp,
> + XFS_AGB_TO_DADDR(mp, agno, agbno), XFS_FSB_TO_BB(mp, 1),
> + LIBXFS_READBUF_SALVAGE, &bp, NULL);
> if (error) {
> do_warn(_("cannot read agbno (%u/%u), disk block %" PRId64 "\n"),
> agno, agbno, XFS_AGB_TO_DADDR(mp, agno, agbno));
> @@ -699,7 +699,7 @@ process_inode_chunk(
> pftrace("about to read off %llu in AG %d",
> XFS_AGB_TO_DADDR(mp, agno, agbno), agno);
>
> - error = -libxfs_buf_read(mp->m_dev,
> + error = -libxfs_buf_read(mp->m_ddev_targp,
> XFS_AGB_TO_DADDR(mp, agno, agbno),
> XFS_FSB_TO_BB(mp,
> M_IGEO(mp)->blocks_per_cluster),
> diff --git a/repair/dinode.c b/repair/dinode.c
> index 48939f8bd159..243fcf7a19f4 100644
> --- a/repair/dinode.c
> +++ b/repair/dinode.c
> @@ -956,8 +956,8 @@ get_agino_buf(
> cluster_agino, cluster_daddr, cluster_blks);
> #endif
>
> - error = -libxfs_buf_read(mp->m_dev, cluster_daddr, cluster_blks, 0,
> - &bp, &xfs_inode_buf_ops);
> + error = -libxfs_buf_read(mp->m_ddev_targp, cluster_daddr, cluster_blks,
> + 0, &bp, &xfs_inode_buf_ops);
> if (error) {
> do_warn(_("cannot read inode (%u/%u), disk block %" PRIu64 "\n"),
> agno, cluster_agino, cluster_daddr);
> @@ -1733,7 +1733,7 @@ process_quota_inode(
> fsbno = blkmap_get(blkmap, qbno);
> dqid = (xfs_dqid_t)qbno * dqperchunk;
>
> - error = -libxfs_buf_read(mp->m_dev,
> + error = -libxfs_buf_read(mp->m_ddev_targp,
> XFS_FSB_TO_DADDR(mp, fsbno), dqchunklen,
> LIBXFS_READBUF_SALVAGE, &bp,
> &xfs_dquot_buf_ops);
> @@ -1845,7 +1845,7 @@ _("cannot read inode %" PRIu64 ", file block %d, NULL disk block\n"),
>
> byte_cnt = XFS_FSB_TO_B(mp, blk_cnt);
>
> - error = -libxfs_buf_read(mp->m_dev,
> + error = -libxfs_buf_read(mp->m_ddev_targp,
> XFS_FSB_TO_DADDR(mp, fsbno), BTOBB(byte_cnt),
> LIBXFS_READBUF_SALVAGE, &bp,
> &xfs_symlink_buf_ops);
> diff --git a/repair/phase3.c b/repair/phase3.c
> index 6ec616d9b31d..64a2c961b080 100644
> --- a/repair/phase3.c
> +++ b/repair/phase3.c
> @@ -30,7 +30,7 @@ process_agi_unlinked(
> int agi_dirty = 0;
> int error;
>
> - error = -libxfs_buf_read(mp->m_dev,
> + error = -libxfs_buf_read(mp->m_ddev_targp,
> XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)),
> mp->m_sb.sb_sectsize / BBSIZE, LIBXFS_READBUF_SALVAGE,
> &bp, &xfs_agi_buf_ops);
> diff --git a/repair/phase5.c b/repair/phase5.c
> index e44c26885717..019772346eb1 100644
> --- a/repair/phase5.c
> +++ b/repair/phase5.c
> @@ -135,7 +135,7 @@ build_agi(
> int i;
> int error;
>
> - error = -libxfs_buf_get(mp->m_dev,
> + error = -libxfs_buf_get(mp->m_ddev_targp,
> XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)),
> mp->m_sb.sb_sectsize / BBSIZE, &agi_buf);
> if (error)
> @@ -228,7 +228,7 @@ build_agf_agfl(
> __be32 *freelist;
> int error;
>
> - error = -libxfs_buf_get(mp->m_dev,
> + error = -libxfs_buf_get(mp->m_ddev_targp,
> XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)),
> mp->m_sb.sb_sectsize / BBSIZE, &agf_buf);
> if (error)
> @@ -314,7 +314,7 @@ build_agf_agfl(
> platform_uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_meta_uuid);
>
> /* initialise the AGFL, then fill it if there are blocks left over. */
> - error = -libxfs_buf_get(mp->m_dev,
> + error = -libxfs_buf_get(mp->m_ddev_targp,
> XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)),
> mp->m_sb.sb_sectsize / BBSIZE, &agfl_buf);
> if (error)
> diff --git a/repair/prefetch.c b/repair/prefetch.c
> index 8cd3416fa568..3d26636e5e56 100644
> --- a/repair/prefetch.c
> +++ b/repair/prefetch.c
> @@ -121,7 +121,7 @@ pf_queue_io(
> * the lock holder is either reading it from disk himself or
> * completely overwriting it this behaviour is perfectly fine.
> */
> - error = -libxfs_buf_get_map(mp->m_dev, map, nmaps,
> + error = -libxfs_buf_get_map(mp->m_ddev_targp, map, nmaps,
> LIBXFS_GETBUF_TRYLOCK, &bp);
> if (error)
> return;
> @@ -275,7 +275,7 @@ pf_scan_lbtree(
> int rc;
> int error;
>
> - error = -libxfs_buf_read(mp->m_dev, XFS_FSB_TO_DADDR(mp, dbno),
> + error = -libxfs_buf_read(mp->m_ddev_targp, XFS_FSB_TO_DADDR(mp, dbno),
> XFS_FSB_TO_BB(mp, 1), LIBXFS_READBUF_SALVAGE, &bp,
> &xfs_bmbt_buf_ops);
> if (error)
> diff --git a/repair/quotacheck.c b/repair/quotacheck.c
> index fc7e3864654c..e13092dfcae8 100644
> --- a/repair/quotacheck.c
> +++ b/repair/quotacheck.c
> @@ -369,7 +369,7 @@ qc_walk_dquot_extent(
> unsigned int dqnr;
> uint64_t dqid;
>
> - error = -libxfs_buf_read(mp->m_dev,
> + error = -libxfs_buf_read(mp->m_ddev_targp,
> XFS_FSB_TO_DADDR(mp, map->br_startblock + bno),
> dqchunklen, 0, &bp, &xfs_dquot_buf_ops);
> if (error) {
> diff --git a/repair/rt.c b/repair/rt.c
> index 3e51c9b5eb4b..b5b9d4fdc536 100644
> --- a/repair/rt.c
> +++ b/repair/rt.c
> @@ -255,7 +255,7 @@ check_rtfile_contents(
> break;
> }
>
> - error = -libxfs_buf_read_uncached(mp->m_dev,
> + error = -libxfs_buf_read_uncached(mp->m_ddev_targp,
> XFS_FSB_TO_DADDR(mp, map.br_startblock),
> XFS_FSB_TO_BB(mp, 1), 0, &bp,
> xfs_rtblock_ops(mp, type));
> diff --git a/repair/scan.c b/repair/scan.c
> index 7d22ff378484..865983d6c9e0 100644
> --- a/repair/scan.c
> +++ b/repair/scan.c
> @@ -102,8 +102,9 @@ scan_sbtree(
> struct xfs_buf *bp;
> int error;
>
> - error = salvage_buffer(mp->m_dev, XFS_AGB_TO_DADDR(mp, agno, root),
> - XFS_FSB_TO_BB(mp, 1), &bp, ops);
> + error = salvage_buffer(mp->m_ddev_targp,
> + XFS_AGB_TO_DADDR(mp, agno, root),XFS_FSB_TO_BB(mp, 1),
> + &bp, ops);
> if (error) {
> do_error(_("can't read btree block %d/%d\n"), agno, root);
> return;
> @@ -161,7 +162,7 @@ scan_lbtree(
> int dirty = 0;
> bool badcrc = false;
>
> - err = salvage_buffer(mp->m_dev, XFS_FSB_TO_DADDR(mp, root),
> + err = salvage_buffer(mp->m_ddev_targp, XFS_FSB_TO_DADDR(mp, root),
> XFS_FSB_TO_BB(mp, 1), &bp, ops);
> if (err) {
> do_error(_("can't read btree block %d/%d\n"),
> @@ -3030,7 +3031,7 @@ scan_freelist(
> if (be32_to_cpu(agf->agf_flcount) == 0)
> return;
>
> - error = salvage_buffer(mp->m_dev,
> + error = salvage_buffer(mp->m_ddev_targp,
> XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)),
> XFS_FSS_TO_BB(mp, 1), &agflbuf, &xfs_agfl_buf_ops);
> if (error) {
> @@ -3312,7 +3313,8 @@ scan_ag(
> return;
> }
>
> - error = salvage_buffer(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_SB_DADDR),
> + error = salvage_buffer(mp->m_ddev_targp,
> + XFS_AG_DADDR(mp, agno, XFS_SB_DADDR),
> XFS_FSS_TO_BB(mp, 1), &sbbuf, &xfs_sb_buf_ops);
> if (error) {
> objname = _("root superblock");
> @@ -3322,7 +3324,7 @@ scan_ag(
> do_warn(_("superblock has bad CRC for ag %d\n"), agno);
> libxfs_sb_from_disk(sb, sbbuf->b_addr);
>
> - error = salvage_buffer(mp->m_dev,
> + error = salvage_buffer(mp->m_ddev_targp,
> XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)),
> XFS_FSS_TO_BB(mp, 1), &agfbuf, &xfs_agf_buf_ops);
> if (error) {
> @@ -3333,7 +3335,7 @@ scan_ag(
> do_warn(_("agf has bad CRC for ag %d\n"), agno);
> agf = agfbuf->b_addr;
>
> - error = salvage_buffer(mp->m_dev,
> + error = salvage_buffer(mp->m_ddev_targp,
> XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)),
> XFS_FSS_TO_BB(mp, 1), &agibuf, &xfs_agi_buf_ops);
> if (error) {
> --
> 2.53.0
>
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/3] libxfs: better describe why m_ddev_targp can be set in libxfs_buftarg_init
2026-09-11 14:45 ` [PATCH 2/3] libxfs: better describe why m_ddev_targp can be set in libxfs_buftarg_init Christoph Hellwig
@ 2026-09-11 14:53 ` Darrick J. Wong
0 siblings, 0 replies; 10+ messages in thread
From: Darrick J. Wong @ 2026-09-11 14:53 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Andrey Albershteyn, linux-xfs
On Fri, Sep 11, 2026 at 04:45:43PM +0200, Christoph Hellwig wrote:
> I had to wade through this to understand what is going on here, so dump
> the thoughts in a comment to make it easier for the next person to
> understand the logic.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> libxfs/init.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/libxfs/init.c b/libxfs/init.c
> index 2a46ddf086ed..a47e610934e9 100644
> --- a/libxfs/init.c
> +++ b/libxfs/init.c
> @@ -534,7 +534,12 @@ libxfs_buftarg_init(
> }
>
> if (mp->m_ddev_targp) {
> - /* should already have all buftargs initialised */
> + /*
> + * This can happen if the utility called libxfs_buftarg_init
> + * manually before libxfs_mount, which calls us again.
That's much clearer about how we get into this state. :)
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
--D
> + *
> + * In this case all buftargs should be initialized already.
> + */
> if (mp->m_ddev_targp->bt_bdev != xi->data.dev ||
> mp->m_ddev_targp->bt_mount != mp) {
> fprintf(stderr,
> --
> 2.53.0
>
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/3] libxfs: don't set mp->m_rtdev_targp when no RT devices is provided
2026-09-11 14:45 ` [PATCH 1/3] libxfs: don't set mp->m_rtdev_targp when no RT devices is provided Christoph Hellwig
@ 2026-09-11 14:57 ` Darrick J. Wong
2026-09-11 15:11 ` Christoph Hellwig
0 siblings, 1 reply; 10+ messages in thread
From: Darrick J. Wong @ 2026-09-11 14:57 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Andrey Albershteyn, linux-xfs
On Fri, Sep 11, 2026 at 04:45:42PM +0200, Christoph Hellwig wrote:
> The user-space only parts of commit 9840f7e09e2f ("xfs: allow internal
> RT devices for zoned mode") accidentally set m_rtdev_targp to
> m_ddev_targp when not name is set for the RT device, and thus disable
> the check for a non-NULL m_rtdev_targp in rtmount_init.
>
> This lead to tools working without specifying a RT device when they
> should abort. For example this can lead to repair trying to read
> and rewrite the rtsb when called without -rc, which will then fail
> in weird ways.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> libxfs/init.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/libxfs/init.c b/libxfs/init.c
> index 5d8b4a153e28..2a46ddf086ed 100644
> --- a/libxfs/init.c
> +++ b/libxfs/init.c
> @@ -573,7 +573,7 @@ libxfs_buftarg_init(
> else
> mp->m_logdev_targp = libxfs_buftarg_alloc(mp, xi, &xi->log,
> lfail);
> - if (!xi->rt.dev || xi->rt.dev == xi->data.dev)
> + if (xi->rt.dev == xi->data.dev)
> mp->m_rtdev_targp = mp->m_ddev_targp;
> else
> mp->m_rtdev_targp = libxfs_buftarg_alloc(mp, xi, &xi->rt,
Does this mean that m_rtdev_targp is never NULL, even when we don't
specify or have a rt device attached? I would have expected this to be:
if (!xi->rt.dev)
mp->m_rtdev_targp = NULL;
else if (xi->rt.dev == xi->data.dev)
mp->m_rtdev_targp = mp->m_ddev_targp;
else
mp->m_rtdev_targp = libxfs_buftarg_alloc(...);
--D
> --
> 2.53.0
>
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/3] libxfs: don't set mp->m_rtdev_targp when no RT devices is provided
2026-09-11 14:57 ` Darrick J. Wong
@ 2026-09-11 15:11 ` Christoph Hellwig
2026-09-11 15:30 ` Darrick J. Wong
0 siblings, 1 reply; 10+ messages in thread
From: Christoph Hellwig @ 2026-09-11 15:11 UTC (permalink / raw)
To: Darrick J. Wong; +Cc: Christoph Hellwig, Andrey Albershteyn, linux-xfs
On Fri, Sep 11, 2026 at 07:57:26AM -0700, Darrick J. Wong wrote:
> > - if (!xi->rt.dev || xi->rt.dev == xi->data.dev)
> > + if (xi->rt.dev == xi->data.dev)
> > mp->m_rtdev_targp = mp->m_ddev_targp;
> > else
> > mp->m_rtdev_targp = libxfs_buftarg_alloc(mp, xi, &xi->rt,
>
> Does this mean that m_rtdev_targp is never NULL, even when we don't
> specify or have a rt device attached?
I think that is the case right now.
> I would have expected this to be:
>
> if (!xi->rt.dev)
> mp->m_rtdev_targp = NULL;
> else if (xi->rt.dev == xi->data.dev)
> mp->m_rtdev_targp = mp->m_ddev_targp;
> else
> mp->m_rtdev_targp = libxfs_buftarg_alloc(...);
And that is what we get with this patch. The zeroing is done by
zeroing the entire mount structure in the callers of libxfs_mount
(don't ask me why..).
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/3] libxfs: don't set mp->m_rtdev_targp when no RT devices is provided
2026-09-11 15:11 ` Christoph Hellwig
@ 2026-09-11 15:30 ` Darrick J. Wong
2026-09-11 15:38 ` Christoph Hellwig
0 siblings, 1 reply; 10+ messages in thread
From: Darrick J. Wong @ 2026-09-11 15:30 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Andrey Albershteyn, linux-xfs
On Fri, Sep 11, 2026 at 05:11:20PM +0200, Christoph Hellwig wrote:
> On Fri, Sep 11, 2026 at 07:57:26AM -0700, Darrick J. Wong wrote:
> > > - if (!xi->rt.dev || xi->rt.dev == xi->data.dev)
> > > + if (xi->rt.dev == xi->data.dev)
> > > mp->m_rtdev_targp = mp->m_ddev_targp;
> > > else
> > > mp->m_rtdev_targp = libxfs_buftarg_alloc(mp, xi, &xi->rt,
> >
> > Does this mean that m_rtdev_targp is never NULL, even when we don't
> > specify or have a rt device attached?
>
> I think that is the case right now.
>
> > I would have expected this to be:
> >
> > if (!xi->rt.dev)
> > mp->m_rtdev_targp = NULL;
> > else if (xi->rt.dev == xi->data.dev)
> > mp->m_rtdev_targp = mp->m_ddev_targp;
> > else
> > mp->m_rtdev_targp = libxfs_buftarg_alloc(...);
>
> And that is what we get with this patch. The zeroing is done by
> zeroing the entire mount structure in the callers of libxfs_mount
> (don't ask me why..).
Sorry, but I don't see how we get to m_rtdev_targp==NULL with this
patch? The end of libxfs_buftarg_init becomes:
mp->m_ddev_targp = libxfs_buftarg_alloc(mp, xi, &xi->data, dfail);
if (!xi->log.dev || xi->log.dev == xi->data.dev)
mp->m_logdev_targp = mp->m_ddev_targp;
else
mp->m_logdev_targp = libxfs_buftarg_alloc(mp, xi, &xi->log,
lfail);
if (xi->rt.dev == xi->data.dev)
mp->m_rtdev_targp = mp->m_ddev_targp;
else
mp->m_rtdev_targp = libxfs_buftarg_alloc(mp, xi, &xi->rt,
rfail);
In the case where the rt and data devices are not the same, we create a
new buftarg object, even if xi->rt.dev == 0. That only happens if we
didn't set xi->rt.name to a path, which means that libxfs_device_open
ignores it:
# truncate -s 3g /tmp/a
# mkfs.xfs -f /tmp/a
# gdb --args ./build-x86_64/db/xfs_db /tmp/a
(gdb) p *mp->m_rtdev_targp
$5 = {
bt_mount = 0x555555659660 <xmount>,
lock = {
__data = {
__lock = 0,
__count = 0,
__owner = 0,
__nusers = 0,
__kind = 0,
__spins = 0,
__elision = 0,
__list = {
__prev = 0x0,
__next = 0x0
}
},
__size = '\000' <repeats 39 times>,
__align = 0
},
writes_left = 0,
bt_bdev = 0,
bt_bdev_fd = -1,
bt_xfile = 0x0,
flags = 0,
bcache = 0x555555684ab0
}
Here we didn't supply an -R option to xfs_db, but libxfs assigns
m_rtdev_targp to a buftarg that can't do anything useful, instead of
NULL which (AFAICT) the code expects:
$ git grep m_rtdev_targp
mkfs/xfs_mkfs.c:5635: if (mp->m_rtdev_targp->bt_bdev &&
mkfs/xfs_mkfs.c:5636: mp->m_rtdev_targp != mp->m_ddev_targp &&
<snip>
libxfs/init.c:981: if (mp->m_rtdev_targp && mp->m_rtdev_targp != mp->m_ddev_targp) {
libxfs/init.c:982: err2 = libxfs_flush_buftarg(mp->m_rtdev_targp,
OTOH there are other places that use other checks that clearly assume
that m_rtdev_targp is always present:
libxfs/init.c:311: if (mp->m_rtdev_targp->bt_bdev == 0 && !xfs_is_debugger(mp)) {
libxfs/init.c:1034: if (mp->m_rtdev_targp != mp->m_ddev_targp)
libxfs/init.c:1035: libxfs_buftarg_free(mp->m_rtdev_targp);
Ok maybe this patch is fine as-is? But xfsprogs needs a treewide change
to make the "do we have a rt device attached?" checks match the kernel
code?
<even more confused>
--D
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/3] libxfs: don't set mp->m_rtdev_targp when no RT devices is provided
2026-09-11 15:30 ` Darrick J. Wong
@ 2026-09-11 15:38 ` Christoph Hellwig
0 siblings, 0 replies; 10+ messages in thread
From: Christoph Hellwig @ 2026-09-11 15:38 UTC (permalink / raw)
To: Darrick J. Wong; +Cc: Christoph Hellwig, Andrey Albershteyn, linux-xfs
On Fri, Sep 11, 2026 at 08:30:26AM -0700, Darrick J. Wong wrote:
> > And that is what we get with this patch. The zeroing is done by
> > zeroing the entire mount structure in the callers of libxfs_mount
> > (don't ask me why..).
>
> Sorry, but I don't see how we get to m_rtdev_targp==NULL with this
> patch? The end of libxfs_buftarg_init becomes:
...
> In the case where the rt and data devices are not the same, we create a
> new buftarg object, even if xi->rt.dev == 0. That only happens if we
> didn't set xi->rt.name to a path, which means that libxfs_device_open
> ignores it:
Yeah, you're right. We'll have a separate m_rtdev_targp, but it
will have a NULL dev. rtmount_init rejects this except for xfs_db,
but xfs_db can see a "weird" targp.
> OTOH there are other places that use other checks that clearly assume
> that m_rtdev_targp is always present:
>
> libxfs/init.c:311: if (mp->m_rtdev_targp->bt_bdev == 0 && !xfs_is_debugger(mp)) {
> libxfs/init.c:1034: if (mp->m_rtdev_targp != mp->m_ddev_targp)
> libxfs/init.c:1035: libxfs_buftarg_free(mp->m_rtdev_targp);
>
> Ok maybe this patch is fine as-is? But xfsprogs needs a treewide change
> to make the "do we have a rt device attached?" checks match the kernel
> code?
It has passed pretty extensive testing so it must be perfect (TM).
But I agree that another cleanup pass to better match the kernel
sounds like a good idea. I'll add it to my bucket list.
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2026-09-11 15:38 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-11 14:45 fix missing RT detection in libxfs Christoph Hellwig
2026-09-11 14:45 ` [PATCH 1/3] libxfs: don't set mp->m_rtdev_targp when no RT devices is provided Christoph Hellwig
2026-09-11 14:57 ` Darrick J. Wong
2026-09-11 15:11 ` Christoph Hellwig
2026-09-11 15:30 ` Darrick J. Wong
2026-09-11 15:38 ` Christoph Hellwig
2026-09-11 14:45 ` [PATCH 2/3] libxfs: better describe why m_ddev_targp can be set in libxfs_buftarg_init Christoph Hellwig
2026-09-11 14:53 ` Darrick J. Wong
2026-09-11 14:45 ` [PATCH 3/3] libxfs: remove buftarg member aliases Christoph Hellwig
2026-09-11 14:53 ` Darrick J. Wong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox