FAILED: patch "[PATCH] xfs: don't stash removename operations with unknown ftype" failed to apply to 6.18-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.18-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.18.y
git checkout FETCH_HEAD
git cherry-pick -x 865b751e75039fc07838b3200f9740256653da9a
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026091651-freedom-anger-bd4d@gregkh' --subject-prefix 'PATCH 6.18.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 865b751e75039fc07838b3200f9740256653da9a Mon Sep 17 00:00:00 2001
From: "Darrick J. Wong" <[email protected]>
Date: Wed, 26 Aug 2026 22:31:25 -0700
Subject: [PATCH] xfs: don't stash removename operations with unknown ftype
LOLLM notices that the behavior of xrep_dir_replay_update changes based on the ftype recorded in the stashed removename information. It also notices that the unlink iops sometimes set that ftype to FT_UNKNOWN because the regular directory tree update code paths don't need to know the ftype of the child.
Unfortunately, this results in incorrect link counts, which eventually trips link count errors in later phases of xfs_scrub, or in xfs_repair. Fix this by creating a second xfs_name with the type set correctly.
fs/xfs/scrub/dir_repair.c +17 -2
@@ -1381,9 +1381,24 @@ xrep_dir_live_update(if (p->delta >0 ) error =xrep_dir_stash_createname (rd, p->name,I_INO (p->ip)); -else - error =xrep_dir_stash_removename (rd, p->name, +else { +/* +* xfs_dentry_to_name in unlink or rename-exchange can +* pass us names with ftype FT_UNKNOWN, but we really +* must know the ftype of the child that is being +* removed so that we can do nlink updates correctly +* without holding inode references. +*/ +struct xfs_name name = { + .name = p->name->name, + .len = p->name->len, + .type =xfs_mode_to_ftype ( +VFS_IC (p->ip)->i_mode), + }; + + error =xrep_dir_stash_removename (rd, &name,I_INO (p->ip)); + }mutex_unlock (&rd->pscan.lock);if (error) goto out_abort;
Sasha Levin
maintainerPATCH 1/9 xfs: factor out xfs_attr3_leaf_init
From: Long Li <[email protected]>
[ Upstream commit e65bb55d7f8c2041c8fdb73cd29b0b4cad4ed847 ]
Factor out wrapper xfs_attr3_leaf_init function, which exported for external use.
Stable-dep-of: 865b751e7503 ("xfs: don't stash removename operations with unknown ftype")
--- fs/xfs/libxfs/xfs_attr_leaf.c | 22 ++++++++++++++++++++++ fs/xfs/libxfs/xfs_attr_leaf.h | 3 +++ 2 files changed, 25 insertions(+)
fs/xfs/libxfs/xfs_attr_leaf.c +22 -0
@@ -1330,6 +1330,28 @@ xfs_attr3_leaf_create(return 0 ; } +/* +* Reinitialize an existing attr fork block as an empty leaf, and attach +* the buffer to tp. +*/ +int +xfs_attr3_leaf_init ( +struct xfs_trans *tp, +struct xfs_inode *dp, +xfs_dablk_t blkno) +{ +struct xfs_buf *bp =NULL ; +struct xfs_da_args args = { + .trans = tp, + .dp = dp, + .owner = dp->i_ino, + .geo = dp->i_mount->m_attr_geo, + }; + +ASSERT (tp !=NULL ); + +return xfs_attr3_leaf_create (&args, blkno, &bp); +}/* * Split the leaf node, rebalance, then add the new entry. *
fs/xfs/libxfs/xfs_attr_leaf.h +3 -0
@@ -86,6 +86,9 @@ int xfs_attr3_leaf_list_int(struct xfs_buf *bp,/* * Routines used for shrinking the Btree. */ + +int xfs_attr3_leaf_init (struct xfs_trans *tp,struct xfs_inode *dp, +xfs_dablk_t blkno);int xfs_attr3_leaf_toosmall (struct xfs_da_state *state,int *retval); void xfs_attr3_leaf_unbalance(struct xfs_da_state *state, struct xfs_da_state_blk *drop_blk,
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/9 xfs: add a XFS_INODE_TO_AGNO helper
From: Christoph Hellwig <[email protected]>
[ Upstream commit a22166add624818a6c43b807d37f99483ba268a6 ]
Add a shortcut for the common XFS_INO_TO_AGNO(mp, ip->i_ino) pattern.
Stable-dep-of: 865b751e7503 ("xfs: don't stash removename operations with unknown ftype")
--- fs/xfs/libxfs/xfs_dir2.c | 4 ++-- fs/xfs/libxfs/xfs_format.h | 2 ++ fs/xfs/libxfs/xfs_ialloc.c | 2 +- fs/xfs/libxfs/xfs_inode_util.c | 2 +- fs/xfs/scrub/agheader_repair.c | 8 +++----- fs/xfs/scrub/dir_repair.c | 2 +- fs/xfs/scrub/inode_repair.c | 3 +-- fs/xfs/scrub/nlinks_repair.c | 2 +- fs/xfs/scrub/parent_repair.c | 2 +- fs/xfs/scrub/trace.h | 8 ++++---- fs/xfs/xfs_icache.c | 14 ++++++-------- fs/xfs/xfs_inode.c | 9 ++++----- fs/xfs/xfs_trace.h | 9 ++++----- 13 files changed, 31 insertions(+), 36 deletions(-)
fs/xfs/libxfs/xfs_dir2.c +2 -2
@@ -920,7 +920,7 @@ xfs_dir_add_child(if (VFS_I (ip)->i_nlink ==0 ) {struct xfs_perag *pag; - pag =xfs_perag_get (mp,XFS_INO_TO_AGNO (mp, ip->i_ino)); + pag =xfs_perag_get (mp,XFS_INODE_TO_AGNO (ip)); error =xfs_iunlink_remove (tp, pag, ip);xfs_perag_put (pag);if (error)
@@ -1247,7 +1247,7 @@ xfs_dir_rename_children(ASSERT (VFS_I (du_wip->ip)->i_nlink ==0 ); - pag =xfs_perag_get (mp,XFS_INO_TO_AGNO (mp, du_wip->ip->i_ino)); + pag =xfs_perag_get (mp,XFS_INODE_TO_AGNO (du_wip->ip)); error =xfs_iunlink_remove (tp, pag, du_wip->ip);xfs_perag_put (pag);if (error)
fs/xfs/libxfs/xfs_format.h +2 -0
@@ -1276,6 +1276,8 @@ static inline bool xfs_dinode_is_metadir(const struct xfs_dinode *dip) XFS_INO_AGNO_BITS(mp) + XFS_INO_AGINO_BITS(mp)#define XFS_INO_TO_AGNO (mp,i) \ ((xfs_agnumber_t)((i) >> XFS_INO_AGINO_BITS(mp))) +#define XFS_INODE_TO_AGNO (ip) \ + XFS_INO_TO_AGNO((ip)->i_mount, (ip)->i_ino)#define XFS_INO_TO_AGINO (mp,i) \ ((xfs_agino_t)(i) & XFS_INO_MASK(XFS_INO_AGINO_BITS(mp)))#define XFS_INO_TO_AGBNO (mp,i) \
fs/xfs/libxfs/xfs_ialloc.c +1 -1
@@ -1870,7 +1870,7 @@ xfs_dialloc_pick_ag(if (S_ISDIR (mode))return (atomic_inc_return (&mp->m_agirotor) -1 ) % mp->m_maxagi; - start_agno =XFS_INO_TO_AGNO (mp, dp->i_ino); + start_agno =XFS_INODE_TO_AGNO (dp);if (start_agno >= mp->m_maxagi) start_agno =0 ;
fs/xfs/libxfs/xfs_inode_util.c +1 -1
@@ -529,7 +529,7 @@ xfs_iunlink(ASSERT (VFS_I (ip)->i_mode !=0 );trace_xfs_iunlink (ip); - pag =xfs_perag_get (mp,XFS_INO_TO_AGNO (mp, ip->i_ino)); + pag =xfs_perag_get (mp,XFS_INODE_TO_AGNO (ip));/* Get the agi buffer first. It ensures lock ordering on the list. */ error =xfs_read_agi (pag, tp,0 , &agibp);
fs/xfs/scrub/agheader_repair.c +3 -5
@@ -1148,9 +1148,7 @@ xrep_iunlink_igrab( struct xfs_perag *pag, struct xfs_inode *ip) { - struct xfs_mount *mp = pag_mount(pag); - -if (XFS_INO_TO_AGNO (mp, ip->i_ino) !=pag_agno (pag)) + if (XFS_INODE_TO_AGNO(ip) != pag_agno(pag)) return false;if (!xfs_inode_on_unlinked_list (ip))
@@ -1174,7 +1172,7 @@ xrep_iunlink_visit(unsigned int bucket;int error; -ASSERT (XFS_INO_TO_AGNO (mp, ip->i_ino) ==pag_agno (ragi->sc->sa.pag)); +ASSERT (XFS_INODE_TO_AGNO (ip) ==pag_agno (ragi->sc->sa.pag));ASSERT (xfs_inode_on_unlinked_list (ip)); agino =XFS_INO_TO_AGINO (mp, ip->i_ino);
@@ -1245,7 +1243,7 @@ xrep_iunlink_mark_incore(* us to see this inode, so another lookup from the * same index will not find it again. */ -if (XFS_INO_TO_AGNO (mp, ip->i_ino) !=pag_agno (pag)) +if (XFS_INODE_TO_AGNO (ip) !=pag_agno (pag))continue ; first_index =XFS_INO_TO_AGINO (mp, ip->i_ino +1 );if (first_index <XFS_INO_TO_AGINO (mp, ip->i_ino))
fs/xfs/scrub/dir_repair.c +1 -1
@@ -1576,7 +1576,7 @@ xrep_dir_set_nlink(* count. If the directory has no parent, it will be moved to the * orphanage. */ - pag =xfs_perag_get (sc->mp,XFS_INO_TO_AGNO (sc->mp, dp->i_ino)); + pag =xfs_perag_get (sc->mp,XFS_INODE_TO_AGNO (dp));if (!pag) {ASSERT (0 );return -EFSCORRUPTED ;
fs/xfs/scrub/inode_repair.c +1 -2
@@ -2011,8 +2011,7 @@ xrep_inode_unlinked(struct xfs_perag *pag;int error; - pag =xfs_perag_get (sc->mp, -XFS_INO_TO_AGNO (sc->mp, sc->ip->i_ino)); + pag =xfs_perag_get (sc->mp,XFS_INODE_TO_AGNO (sc->ip)); error =xfs_iunlink_remove (sc->tp, pag, sc->ip);xfs_perag_put (pag);if (error)
fs/xfs/scrub/nlinks_repair.c +1 -1
@@ -75,7 +75,7 @@ xrep_nlinks_iunlink_remove(struct xfs_perag *pag;int error; - pag =xfs_perag_get (sc->mp,XFS_INO_TO_AGNO (sc->mp, sc->ip->i_ino)); + pag =xfs_perag_get (sc->mp,XFS_INODE_TO_AGNO (sc->ip)); error =xfs_iunlink_remove (sc->tp, pag, sc->ip);xfs_perag_put (pag);return error;
fs/xfs/scrub/parent_repair.c +1 -1
@@ -1451,7 +1451,7 @@ xrep_parent_set_nondir_nlink(* The file is on the unlinked list but we found parents. * Remove the file from the unlinked list. */ - pag =xfs_perag_get (sc->mp,XFS_INO_TO_AGNO (sc->mp, ip->i_ino)); + pag =xfs_perag_get (sc->mp,XFS_INODE_TO_AGNO (ip));if (!pag) {ASSERT (0 );return -EFSCORRUPTED ;
fs/xfs/scrub/trace.h +4 -4
@@ -3479,7 +3479,7 @@ TRACE_EVENT(xrep_iunlink_reload_next, ), TP_fast_assign( __entry->dev = ip->i_mount->m_super->s_dev; - __entry->agno =XFS_INO_TO_AGNO (ip->i_mount, ip->i_ino); + __entry->agno =XFS_INODE_TO_AGNO (ip); __entry->agino =XFS_INO_TO_AGINO (ip->i_mount, ip->i_ino); __entry->old_prev_agino = ip->i_prev_unlinked; __entry->prev_agino = prev_agino;
@@ -3509,7 +3509,7 @@ TRACE_EVENT(xrep_iunlink_reload_ondisk, ), TP_fast_assign( __entry->dev = ip->i_mount->m_super->s_dev; - __entry->agno =XFS_INO_TO_AGNO (ip->i_mount, ip->i_ino); + __entry->agno =XFS_INODE_TO_AGNO (ip); __entry->agino =XFS_INO_TO_AGINO (ip->i_mount, ip->i_ino); __entry->nlink =VFS_I (ip)->i_nlink; __entry->next_agino = ip->i_next_unlinked;
@@ -3598,7 +3598,7 @@ TRACE_EVENT(xrep_iunlink_relink_next, ), TP_fast_assign( __entry->dev = ip->i_mount->m_super->s_dev; - __entry->agno =XFS_INO_TO_AGNO (ip->i_mount, ip->i_ino); + __entry->agno =XFS_INODE_TO_AGNO (ip); __entry->agino =XFS_INO_TO_AGINO (ip->i_mount, ip->i_ino); __entry->next_agino = ip->i_next_unlinked; __entry->new_next_agino = next_agino;
@@ -3624,7 +3624,7 @@ TRACE_EVENT(xrep_iunlink_relink_prev, ), TP_fast_assign( __entry->dev = ip->i_mount->m_super->s_dev; - __entry->agno =XFS_INO_TO_AGNO (ip->i_mount, ip->i_ino); + __entry->agno =XFS_INODE_TO_AGNO (ip); __entry->agino =XFS_INO_TO_AGINO (ip->i_mount, ip->i_ino); __entry->prev_agino = ip->i_prev_unlinked; __entry->new_prev_agino = prev_agino;
fs/xfs/xfs_icache.c +6 -8
@@ -439,8 +439,7 @@ xfs_iget_check_free_state(xfs_warn (ip->i_mount,"Corruption detected! Free inode 0x%llx not marked free! (mode 0x%x)" , ip->i_ino,VFS_I (ip)->i_mode); -xfs_agno_mark_sick (ip->i_mount, -XFS_INO_TO_AGNO (ip->i_mount, ip->i_ino), +xfs_agno_mark_sick (ip->i_mount,XFS_INODE_TO_AGNO (ip),XFS_SICK_AG_INOBT );return -EFSCORRUPTED ; }
@@ -449,8 +448,7 @@ xfs_iget_check_free_state(xfs_warn (ip->i_mount,"Corruption detected! Free inode 0x%llx has blocks allocated!" , ip->i_ino); -xfs_agno_mark_sick (ip->i_mount, -XFS_INO_TO_AGNO (ip->i_mount, ip->i_ino), +xfs_agno_mark_sick (ip->i_mount,XFS_INODE_TO_AGNO (ip),XFS_SICK_AG_INOBT );return -EFSCORRUPTED ; }
@@ -1283,7 +1281,7 @@ xfs_blockgc_set_iflag( ip->i_flags |= iflag;spin_unlock (&ip->i_flags_lock); - pag =xfs_perag_get (mp,XFS_INO_TO_AGNO (mp, ip->i_ino)); + pag =xfs_perag_get (mp,XFS_INODE_TO_AGNO (ip));spin_lock (&pag->pag_ici_lock); xfs_perag_set_inode_tag(pag, XFS_INO_TO_AGINO(mp, ip->i_ino),
@@ -1320,7 +1318,7 @@ xfs_blockgc_clear_iflag(if (!clear_tag)return ; - pag =xfs_perag_get (mp,XFS_INO_TO_AGNO (mp, ip->i_ino)); + pag =xfs_perag_get (mp,XFS_INODE_TO_AGNO (ip));spin_lock (&pag->pag_ici_lock); xfs_perag_clear_inode_tag(pag, XFS_INO_TO_AGINO(mp, ip->i_ino),
@@ -1798,7 +1796,7 @@ xfs_icwalk_ag(* us to see this inode, so another lookup from the * same index will not find it again. */ -if (XFS_INO_TO_AGNO (mp, ip->i_ino) !=pag_agno (pag)) +if (XFS_INODE_TO_AGNO (ip) !=pag_agno (pag))continue ; first_index =XFS_INO_TO_AGINO (mp, ip->i_ino +1 );if (first_index <XFS_INO_TO_AGINO (mp, ip->i_ino))
@@ -1912,7 +1910,7 @@ xfs_inodegc_set_reclaimable(ASSERT (0 ); } - pag =xfs_perag_get (mp,XFS_INO_TO_AGNO (mp, ip->i_ino)); + pag =xfs_perag_get (mp,XFS_INODE_TO_AGNO (ip));spin_lock (&pag->pag_ici_lock);spin_lock (&ip->i_flags_lock);
fs/xfs/xfs_inode.c +4 -5
@@ -1362,7 +1362,7 @@ xfs_inactive_health(if (sick &XFS_SICK_INO_FORGET )return ; - pag =xfs_perag_get (mp,XFS_INO_TO_AGNO (mp, ip->i_ino)); + pag =xfs_perag_get (mp,XFS_INODE_TO_AGNO (ip));if (!pag) {/* There had better still be a perag structure! */ ASSERT (0 );
@@ -1801,7 +1801,7 @@ xfs_ifree(ASSERT (ip->i_disk_size ==0 || !S_ISREG (VFS_I (ip)->i_mode));ASSERT (ip->i_nblocks ==0 ); - pag =xfs_perag_get (mp,XFS_INO_TO_AGNO (mp, ip->i_ino)); + pag =xfs_perag_get (mp,XFS_INODE_TO_AGNO (ip)); error =xfs_inode_uninit (tp, pag, ip, &xic);if (error)
@@ -2310,8 +2310,7 @@ xfs_rename(struct xfs_perag *pag;struct xfs_buf *bp; - pag =xfs_perag_get (mp, -XFS_INO_TO_AGNO (mp, inodes[i]->i_ino)); + pag =xfs_perag_get (mp,XFS_INODE_TO_AGNO (inodes[i])); error =xfs_read_agi (pag, tp,0 , &bp);xfs_perag_put (pag);if (error)
@@ -2858,7 +2857,7 @@ xfs_inode_reload_unlinked_bucket(struct xfs_buf *agibp;struct xfs_agi *agi;struct xfs_perag *pag; -xfs_agnumber_t agno =XFS_INO_TO_AGNO (mp, ip->i_ino); +xfs_agnumber_t agno =XFS_INODE_TO_AGNO (ip);xfs_agino_t agino =XFS_INO_TO_AGINO (mp, ip->i_ino);xfs_agino_t prev_agino, next_agino;unsigned int bucket;
fs/xfs/xfs_trace.h +4 -5
@@ -4525,7 +4525,7 @@ TRACE_EVENT(xfs_iunlink_reload_next, ), TP_fast_assign( __entry->dev = ip->i_mount->m_super->s_dev; - __entry->agno =XFS_INO_TO_AGNO (ip->i_mount, ip->i_ino); + __entry->agno =XFS_INODE_TO_AGNO (ip); __entry->agino =XFS_INO_TO_AGINO (ip->i_mount, ip->i_ino); __entry->prev_agino = ip->i_prev_unlinked; __entry->next_agino = ip->i_next_unlinked;
@@ -4548,7 +4548,7 @@ TRACE_EVENT(xfs_inode_reload_unlinked_bucket, ), TP_fast_assign( __entry->dev = ip->i_mount->m_super->s_dev; - __entry->agno =XFS_INO_TO_AGNO (ip->i_mount, ip->i_ino); + __entry->agno =XFS_INODE_TO_AGNO (ip); __entry->agino =XFS_INO_TO_AGINO (ip->i_mount, ip->i_ino); ), TP_printk("dev %d:%d agno 0x%x agino 0x%x bucket %u",
@@ -4568,7 +4568,7 @@ DECLARE_EVENT_CLASS(xfs_ag_inode_class, ), TP_fast_assign( __entry->dev = VFS_I(ip)->i_sb->s_dev; - __entry->agno =XFS_INO_TO_AGNO (ip->i_mount, ip->i_ino); + __entry->agno =XFS_INODE_TO_AGNO (ip); __entry->agino =XFS_INO_TO_AGINO (ip->i_mount, ip->i_ino); ), TP_printk("dev %d:%d agno 0x%x agino 0x%x",
@@ -4765,8 +4765,7 @@ TRACE_EVENT(xfs_btree_commit_ifakeroot,TP_fast_assign ( __entry->dev = cur->bc_mp->m_super->s_dev;__assign_str (name); - __entry->agno =XFS_INO_TO_AGNO (cur->bc_mp, - cur->bc_ino.ip->i_ino); + __entry->agno =XFS_INODE_TO_AGNO (cur->bc_ino.ip); __entry->agino =XFS_INO_TO_AGINO (cur->bc_mp, cur->bc_ino.ip->i_ino); __entry->levels = cur->bc_ino.ifake->if_levels;
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 3/9 xfs: add a XFS_INODE_TO_AGINO helper
In reply to Sasha LevinFrom: Christoph Hellwig <[email protected]>
[ Upstream commit f46edc9f1310d27710e2b39bf561ecef51f879d2 ]
Add a shortcut for the common XFS_INO_TO_AGINO(mp, ip->i_ino) pattern.
Stable-dep-of: 865b751e7503 ("xfs: don't stash removename operations with unknown ftype")
--- fs/xfs/libxfs/xfs_format.h | 2 ++ fs/xfs/libxfs/xfs_inode_util.c | 5 ++--- fs/xfs/scrub/agheader_repair.c | 10 +++------- fs/xfs/scrub/trace.h | 10 +++++----- fs/xfs/xfs_icache.c | 10 +++++----- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_trace.h | 12 +++++------- 7 files changed, 23 insertions(+), 28 deletions(-)
fs/xfs/libxfs/xfs_format.h +2 -0
@@ -1280,6 +1280,8 @@ static inline bool xfs_dinode_is_metadir(const struct xfs_dinode *dip) XFS_INO_TO_AGNO((ip)->i_mount, (ip)->i_ino)#define XFS_INO_TO_AGINO (mp,i) \ ((xfs_agino_t)(i) & XFS_INO_MASK(XFS_INO_AGINO_BITS(mp))) +#define XFS_INODE_TO_AGINO (ip) \ + XFS_INO_TO_AGINO((ip)->i_mount, (ip)->i_ino)#define XFS_INO_TO_AGBNO (mp,i) \ (((xfs_agblock_t)(i) >> XFS_INO_OFFSET_BITS(mp)) & \ XFS_INO_MASK(XFS_INO_AGBNO_BITS(mp)))
fs/xfs/libxfs/xfs_inode_util.c +2 -3
@@ -462,10 +462,9 @@ xfs_iunlink_insert_inode(struct xfs_buf *agibp, struct xfs_inode *ip) { - struct xfs_mount *mp = tp->t_mountp; struct xfs_agi *agi = agibp->b_addr;xfs_agino_t next_agino; -xfs_agino_t agino =XFS_INO_TO_AGINO (mp, ip->i_ino); +xfs_agino_t agino =XFS_INODE_TO_AGINO (ip);short bucket_index = agino %XFS_AGI_UNLINKED_BUCKETS ;int error;
@@ -551,7 +550,7 @@ xfs_iunlink_remove_inode( {struct xfs_mount *mp = tp->t_mountp;struct xfs_agi *agi = agibp->b_addr; -xfs_agino_t agino =XFS_INO_TO_AGINO (mp, ip->i_ino); +xfs_agino_t agino =XFS_INODE_TO_AGINO (ip);xfs_agino_t head_agino;short bucket_index = agino %XFS_AGI_UNLINKED_BUCKETS ;int error;
fs/xfs/scrub/agheader_repair.c +3 -7
@@ -1166,18 +1166,14 @@ xrep_iunlink_visit(struct xrep_agi *ragi, unsigned int batch_idx) { - struct xfs_mount *mp = ragi->sc->mp; struct xfs_inode *ip = ragi->lookup_batch[batch_idx]; -xfs_agino_t agino; -unsigned int bucket; +xfs_agino_t agino =XFS_INODE_TO_AGINO (ip); +unsigned int bucket = agino %XFS_AGI_UNLINKED_BUCKETS ;int error;ASSERT (XFS_INODE_TO_AGNO (ip) ==pag_agno (ragi->sc->sa.pag));ASSERT (xfs_inode_on_unlinked_list (ip)); - agino =XFS_INO_TO_AGINO (mp, ip->i_ino); - bucket = agino %XFS_AGI_UNLINKED_BUCKETS ; -trace_xrep_iunlink_visit (ragi->sc->sa.pag, bucket, ragi->iunlink_heads[bucket], ip);
@@ -1246,7 +1242,7 @@ xrep_iunlink_mark_incore(if (XFS_INODE_TO_AGNO (ip) !=pag_agno (pag))continue ; first_index =XFS_INO_TO_AGINO (mp, ip->i_ino +1 ); -if (first_index <XFS_INO_TO_AGINO (mp, ip->i_ino)) +if (first_index <XFS_INODE_TO_AGINO (ip)) done = true; }
fs/xfs/scrub/trace.h +5 -5
@@ -3449,7 +3449,7 @@ TRACE_EVENT(xrep_iunlink_visit,TP_fast_assign ( __entry->dev = pag_mount(pag)->m_super->s_dev; __entry->agno =pag_agno (pag); - __entry->agino =XFS_INO_TO_AGINO (pag_mount (pag), ip->i_ino); + __entry->agino =XFS_INODE_TO_AGINO (ip); __entry->bucket = bucket; __entry->bucket_agino = bucket_agino; __entry->prev_agino = ip->i_prev_unlinked;
@@ -3480,7 +3480,7 @@ TRACE_EVENT(xrep_iunlink_reload_next,TP_fast_assign ( __entry->dev = ip->i_mount->m_super->s_dev; __entry->agno =XFS_INODE_TO_AGNO (ip); - __entry->agino =XFS_INO_TO_AGINO (ip->i_mount, ip->i_ino); + __entry->agino =XFS_INODE_TO_AGINO (ip); __entry->old_prev_agino = ip->i_prev_unlinked; __entry->prev_agino = prev_agino; __entry->next_agino = ip->i_next_unlinked;
@@ -3510,7 +3510,7 @@ TRACE_EVENT(xrep_iunlink_reload_ondisk,TP_fast_assign ( __entry->dev = ip->i_mount->m_super->s_dev; __entry->agno =XFS_INODE_TO_AGNO (ip); - __entry->agino =XFS_INO_TO_AGINO (ip->i_mount, ip->i_ino); + __entry->agino =XFS_INODE_TO_AGINO (ip); __entry->nlink =VFS_I (ip)->i_nlink; __entry->next_agino = ip->i_next_unlinked; ),
@@ -3599,7 +3599,7 @@ TRACE_EVENT(xrep_iunlink_relink_next,TP_fast_assign ( __entry->dev = ip->i_mount->m_super->s_dev; __entry->agno =XFS_INODE_TO_AGNO (ip); - __entry->agino =XFS_INO_TO_AGINO (ip->i_mount, ip->i_ino); + __entry->agino =XFS_INODE_TO_AGINO (ip); __entry->next_agino = ip->i_next_unlinked; __entry->new_next_agino = next_agino; ),
@@ -3625,7 +3625,7 @@ TRACE_EVENT(xrep_iunlink_relink_prev,TP_fast_assign ( __entry->dev = ip->i_mount->m_super->s_dev; __entry->agno =XFS_INODE_TO_AGNO (ip); - __entry->agino =XFS_INO_TO_AGINO (ip->i_mount, ip->i_ino); + __entry->agino =XFS_INODE_TO_AGINO (ip); __entry->prev_agino = ip->i_prev_unlinked; __entry->new_prev_agino = prev_agino; ),
fs/xfs/xfs_icache.c +5 -5
@@ -409,7 +409,7 @@ xfs_iget_recycle(*/ ip->i_flags &= ~XFS_IRECLAIM_RESET_FLAGS ; ip->i_flags |=XFS_INEW ; -xfs_perag_clear_inode_tag (pag,XFS_INO_TO_AGINO (mp, ip->i_ino), +xfs_perag_clear_inode_tag (pag,XFS_INODE_TO_AGINO (ip),XFS_ICI_RECLAIM_TAG ); inode->i_state =I_NEW ;spin_unlock (&ip->i_flags_lock);
@@ -1284,7 +1284,7 @@ xfs_blockgc_set_iflag( pag =xfs_perag_get (mp,XFS_INODE_TO_AGNO (ip));spin_lock (&pag->pag_ici_lock); -xfs_perag_set_inode_tag (pag,XFS_INO_TO_AGINO (mp, ip->i_ino), +xfs_perag_set_inode_tag (pag,XFS_INODE_TO_AGINO (ip),XFS_ICI_BLOCKGC_TAG );spin_unlock (&pag->pag_ici_lock);
@@ -1321,7 +1321,7 @@ xfs_blockgc_clear_iflag( pag =xfs_perag_get (mp,XFS_INODE_TO_AGNO (ip));spin_lock (&pag->pag_ici_lock); -xfs_perag_clear_inode_tag (pag,XFS_INO_TO_AGINO (mp, ip->i_ino), +xfs_perag_clear_inode_tag (pag,XFS_INODE_TO_AGINO (ip),XFS_ICI_BLOCKGC_TAG );spin_unlock (&pag->pag_ici_lock);
@@ -1799,7 +1799,7 @@ xfs_icwalk_ag(if (XFS_INODE_TO_AGNO (ip) !=pag_agno (pag))continue ; first_index =XFS_INO_TO_AGINO (mp, ip->i_ino +1 ); -if (first_index <XFS_INO_TO_AGINO (mp, ip->i_ino)) +if (first_index <XFS_INODE_TO_AGINO (ip)) done = true; }
@@ -1917,7 +1917,7 @@ xfs_inodegc_set_reclaimable(trace_xfs_inode_set_reclaimable (ip); ip->i_flags &= ~(XFS_NEED_INACTIVE |XFS_INACTIVATING ); ip->i_flags |=XFS_IRECLAIMABLE ; -xfs_perag_set_inode_tag (pag,XFS_INO_TO_AGINO (mp, ip->i_ino), +xfs_perag_set_inode_tag (pag,XFS_INODE_TO_AGINO (ip),XFS_ICI_RECLAIM_TAG );spin_unlock (&ip->i_flags_lock);
fs/xfs/xfs_inode.c +1 -1
@@ -2858,7 +2858,7 @@ xfs_inode_reload_unlinked_bucket(struct xfs_agi *agi;struct xfs_perag *pag;xfs_agnumber_t agno =XFS_INODE_TO_AGNO (ip); -xfs_agino_t agino =XFS_INO_TO_AGINO (mp, ip->i_ino); +xfs_agino_t agino =XFS_INODE_TO_AGINO (ip);xfs_agino_t prev_agino, next_agino;unsigned int bucket;bool foundit = false;
fs/xfs/xfs_trace.h +5 -7
@@ -4500,8 +4500,7 @@ TRACE_EVENT(xfs_iunlink_update_dinode,TP_fast_assign ( __entry->dev = pag_mount(iup->pag)->m_super->s_dev; __entry->agno =pag_agno (iup->pag); - __entry->agino = -XFS_INO_TO_AGINO (iup->ip->i_mount, iup->ip->i_ino); + __entry->agino =XFS_INODE_TO_AGINO (iup->ip); __entry->old_ptr = old_ptr; __entry->new_ptr = iup->next_agino; ),
@@ -4526,7 +4525,7 @@ TRACE_EVENT(xfs_iunlink_reload_next,TP_fast_assign ( __entry->dev = ip->i_mount->m_super->s_dev; __entry->agno =XFS_INODE_TO_AGNO (ip); - __entry->agino =XFS_INO_TO_AGINO (ip->i_mount, ip->i_ino); + __entry->agino =XFS_INODE_TO_AGINO (ip); __entry->prev_agino = ip->i_prev_unlinked; __entry->next_agino = ip->i_next_unlinked; ),
@@ -4549,7 +4548,7 @@ TRACE_EVENT(xfs_inode_reload_unlinked_bucket,TP_fast_assign ( __entry->dev = ip->i_mount->m_super->s_dev; __entry->agno =XFS_INODE_TO_AGNO (ip); - __entry->agino =XFS_INO_TO_AGINO (ip->i_mount, ip->i_ino); + __entry->agino =XFS_INODE_TO_AGINO (ip); ), TP_printk("dev %d:%d agno 0x%x agino 0x%x bucket %u", MAJOR(__entry->dev), MINOR(__entry->dev),
@@ -4569,7 +4568,7 @@ DECLARE_EVENT_CLASS(xfs_ag_inode_class,TP_fast_assign ( __entry->dev = VFS_I(ip)->i_sb->s_dev; __entry->agno =XFS_INODE_TO_AGNO (ip); - __entry->agino =XFS_INO_TO_AGINO (ip->i_mount, ip->i_ino); + __entry->agino =XFS_INODE_TO_AGINO (ip); ), TP_printk("dev %d:%d agno 0x%x agino 0x%x", MAJOR(__entry->dev), MINOR(__entry->dev),
@@ -4766,8 +4765,7 @@ TRACE_EVENT(xfs_btree_commit_ifakeroot, __entry->dev = cur->bc_mp->m_super->s_dev;__assign_str (name); __entry->agno =XFS_INODE_TO_AGNO (cur->bc_ino.ip); - __entry->agino =XFS_INO_TO_AGINO (cur->bc_mp, - cur->bc_ino.ip->i_ino); + __entry->agino =XFS_INODE_TO_AGINO (cur->bc_ino.ip); __entry->levels = cur->bc_ino.ifake->if_levels; __entry->blocks = cur->bc_ino.ifake->if_blocks; __entry->whichfork = cur->bc_ino.whichfork;
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 4/9 xfs: add a XFS_INO_TO_FSB helper
In reply to Sasha LevinFrom: Christoph Hellwig <[email protected]>
[ Upstream commit f8b7c9a8b0a9e43b054981d134b426d9464264f6 ]
Add a shortcut for the common XFS_INO_TO_FSB(mp, ip->i_ino) pattern.
Stable-dep-of: 865b751e7503 ("xfs: don't stash removename operations with unknown ftype")
--- fs/xfs/libxfs/xfs_bmap.c | 8 +++----- fs/xfs/libxfs/xfs_btree.c | 6 ++---- fs/xfs/libxfs/xfs_format.h | 2 ++ fs/xfs/scrub/cow_repair.c | 3 +-- fs/xfs/scrub/newbt.c | 6 ++---- fs/xfs/scrub/trace.c | 2 +- 6 files changed, 11 insertions(+), 16 deletions(-)
fs/xfs/libxfs/xfs_bmap.c +3 -5
@@ -681,8 +681,7 @@ xfs_bmap_extents_to_btree( args.minlen = args.maxlen = args.prod =1 ; args.wasdel = wasdel; *logflagsp =0 ; - error =xfs_alloc_vextent_start_ag (&args, -XFS_INO_TO_FSB (mp, ip->i_ino)); + error =xfs_alloc_vextent_start_ag (&args,XFS_INODE_TO_FSB (ip));if (error) goto out_root_realloc;
@@ -828,8 +827,7 @@ xfs_bmap_local_to_extents(*/ args.total = total; args.minlen = args.maxlen = args.prod =1 ; - error =xfs_alloc_vextent_start_ag (&args, -XFS_INO_TO_FSB (args.mp, ip->i_ino)); + error =xfs_alloc_vextent_start_ag (&args,XFS_INODE_TO_FSB (ip));if (error) goto done;
@@ -3590,7 +3588,7 @@ xfs_bmap_btalloc_best_length(xfs_extlen_t blen =0 ;int error; - ap->blkno =XFS_INO_TO_FSB (args->mp, ap->ip->i_ino); + ap->blkno =XFS_INODE_TO_FSB (ap->ip);if (!xfs_bmap_adjacent (ap)) ap->eof = false;
fs/xfs/libxfs/xfs_btree.c +2 -4
@@ -3243,8 +3243,7 @@ xfs_btree_new_iroot(if (level >0 ) aptr = *xfs_btree_ptr_addr (cur,1 , block);else - aptr.l =cpu_to_be64 (XFS_INO_TO_FSB (cur->bc_mp, - cur->bc_ino.ip->i_ino)); + aptr.l =cpu_to_be64 (XFS_INODE_TO_FSB (cur->bc_ino.ip));/* Allocate the new block. If we can't do it, we're toast. Give up. */ error =xfs_btree_alloc_block (cur, &aptr, &nptr, stat);
@@ -5609,8 +5608,7 @@ xfs_btree_alloc_metafile_block(ASSERT (xfs_is_metadir_inode (ip));xfs_rmap_ino_bmbt_owner (&args.oinfo, ip->i_ino, cur->bc_ino.whichfork); - error =xfs_alloc_vextent_start_ag (&args, -XFS_INO_TO_FSB (cur->bc_mp, ip->i_ino)); + error =xfs_alloc_vextent_start_ag (&args,XFS_INODE_TO_FSB (ip));if (error)return error;if (args.fsbno ==NULLFSBLOCK ) {
fs/xfs/libxfs/xfs_format.h +2 -0
@@ -1289,6 +1289,8 @@ static inline bool xfs_dinode_is_metadir(const struct xfs_dinode *dip) ((int)(i) & XFS_INO_MASK(XFS_INO_OFFSET_BITS(mp)))#define XFS_INO_TO_FSB (mp,i) \ XFS_AGB_TO_FSB(mp, XFS_INO_TO_AGNO(mp,i), XFS_INO_TO_AGBNO(mp,i)) +#define XFS_INODE_TO_FSB (ip) \ + XFS_INO_TO_FSB((ip)->i_mount, (ip)->i_ino)#define XFS_AGINO_TO_INO (mp,a,i) \ (((xfs_ino_t)(a) << XFS_INO_AGINO_BITS(mp)) | (i))#define XFS_AGINO_TO_AGBNO (mp,i) ((i) >> XFS_INO_OFFSET_BITS(mp))
fs/xfs/scrub/cow_repair.c +1 -2
@@ -413,8 +413,7 @@ xrep_cow_alloc(if (error)return error; - error =xfs_alloc_vextent_start_ag (&args, -XFS_INO_TO_FSB (sc->mp, sc->ip->i_ino)); + error =xfs_alloc_vextent_start_ag (&args,XFS_INODE_TO_FSB (sc->ip));if (error)return error;if (args.fsbno ==NULLFSBLOCK )
fs/xfs/scrub/newbt.c +2 -4
@@ -123,8 +123,7 @@ xrep_newbt_init_inode(if (!ifp)return -ENOMEM ; -xrep_newbt_init_ag (xnr, sc, oinfo, -XFS_INO_TO_FSB (sc->mp, sc->ip->i_ino), +xrep_newbt_init_ag (xnr, sc, oinfo,XFS_INODE_TO_FSB (sc->ip),XFS_AG_RESV_NONE ); xnr->ifake.if_fork = ifp; xnr->ifake.if_fork_size =xfs_inode_fork_size (sc->ip, whichfork);
@@ -160,8 +159,7 @@ xrep_newbt_init_metadir_inode(* as if they were regular file blocks. This exposes us to a higher * risk of the repair being cancelled due to ENOSPC. */ -xrep_newbt_init_ag (xnr, sc, &oinfo, -XFS_INO_TO_FSB (sc->mp, sc->ip->i_ino), +xrep_newbt_init_ag (xnr, sc, &oinfo,XFS_INODE_TO_FSB (sc->ip),XFS_AG_RESV_NONE ); xnr->ifake.if_fork = ifp; xnr->ifake.if_fork_size =xfs_inode_fork_size (sc->ip,XFS_DATA_FORK );
fs/xfs/scrub/trace.c +1 -1
@@ -48,7 +48,7 @@ xchk_btree_cur_fsbno(if (level == cur->bc_nlevels -1 && cur->bc_ops->type ==XFS_BTREE_TYPE_INODE ) -return XFS_INO_TO_FSB (cur->bc_mp, cur->bc_ino.ip->i_ino); +return XFS_INODE_TO_FSB (cur->bc_ino.ip);return NULLFSBLOCK ; }
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 5/9 xfs: add a xfs_rmap_inode_bmbt_owner
In reply to Sasha LevinFrom: Christoph Hellwig <[email protected]>
[ Upstream commit ee237a900ceef00c8d1ca17a5cfadbd50fba67e9 ]
Add a small wrapper for initializing the bmbt owner to i_ino.
Stable-dep-of: 865b751e7503 ("xfs: don't stash removename operations with unknown ftype")
--- fs/xfs/libxfs/xfs_bmap.c | 4 ++-- fs/xfs/libxfs/xfs_bmap_btree.c | 4 ++-- fs/xfs/libxfs/xfs_btree.c | 4 ++-- fs/xfs/libxfs/xfs_rmap.h | 2 ++ fs/xfs/scrub/bmap.c | 2 +- fs/xfs/scrub/bmap_repair.c | 4 ++-- fs/xfs/scrub/newbt.c | 2 +- fs/xfs/scrub/reap.c | 2 +- fs/xfs/scrub/rtrefcount.c | 2 +- fs/xfs/scrub/rtrmap.c | 3 +-- 10 files changed, 15 insertions(+), 14 deletions(-)
fs/xfs/libxfs/xfs_bmap.c +2 -2
@@ -602,7 +602,7 @@ xfs_bmap_btree_to_extents(if ((error =xfs_btree_check_block (cur, cblock,0 , cbp)))return error; -xfs_rmap_ino_bmbt_owner (&oinfo, ip->i_ino, whichfork); +xfs_rmap_inode_bmbt_owner (&oinfo, ip, whichfork); error =xfs_free_extent_later (cur->bc_tp, cbno,1 , &oinfo,XFS_AG_RESV_NONE ,0 );if (error)
@@ -676,7 +676,7 @@ xfs_bmap_extents_to_btree(memset (&args,0 ,sizeof (args)); args.tp = tp; args.mp = mp; -xfs_rmap_ino_bmbt_owner (&args.oinfo, ip->i_ino, whichfork); +xfs_rmap_inode_bmbt_owner (&args.oinfo, ip, whichfork); args.minlen = args.maxlen = args.prod =1 ; args.wasdel = wasdel;
fs/xfs/libxfs/xfs_bmap_btree.c +2 -2
@@ -217,7 +217,7 @@ xfs_bmbt_alloc_block(memset (&args,0 ,sizeof (args)); args.tp = cur->bc_tp; args.mp = cur->bc_mp; -xfs_rmap_ino_bmbt_owner (&args.oinfo, cur->bc_ino.ip->i_ino, +xfs_rmap_inode_bmbt_owner (&args.oinfo, cur->bc_ino.ip, cur->bc_ino.whichfork); args.minlen = args.maxlen = args.prod =1 ; args.wasdel = cur->bc_flags &XFS_BTREE_BMBT_WASDEL ;
@@ -280,7 +280,7 @@ xfs_bmbt_free_block(struct xfs_owner_info oinfo;int error; -xfs_rmap_ino_bmbt_owner (&oinfo, ip->i_ino, cur->bc_ino.whichfork); +xfs_rmap_inode_bmbt_owner (&oinfo, ip, cur->bc_ino.whichfork); error =xfs_free_extent_later (cur->bc_tp, fsbno,1 , &oinfo,XFS_AG_RESV_NONE ,0 );if (error)
fs/xfs/libxfs/xfs_btree.c +2 -2
@@ -5607,7 +5607,7 @@ xfs_btree_alloc_metafile_block(ASSERT (xfs_is_metadir_inode (ip)); -xfs_rmap_ino_bmbt_owner (&args.oinfo, ip->i_ino, cur->bc_ino.whichfork); +xfs_rmap_inode_bmbt_owner (&args.oinfo, ip, cur->bc_ino.whichfork); error =xfs_alloc_vextent_start_ag (&args,XFS_INODE_TO_FSB (ip));if (error)return error;
@@ -5639,7 +5639,7 @@ xfs_btree_free_metafile_block(ASSERT (xfs_is_metadir_inode (ip)); -xfs_rmap_ino_bmbt_owner (&oinfo, ip->i_ino, cur->bc_ino.whichfork); +xfs_rmap_inode_bmbt_owner (&oinfo, ip, cur->bc_ino.whichfork); error =xfs_free_extent_later (tp, fsbno,1 , &oinfo,XFS_AG_RESV_METAFILE ,0 );if (error)
fs/xfs/libxfs/xfs_rmap.h +2 -0
@@ -21,6 +21,8 @@ xfs_rmap_ino_bmbt_owner(if (whichfork ==XFS_ATTR_FORK ) oi->oi_flags |=XFS_OWNER_INFO_ATTR_FORK ; } +#define xfs_rmap_inode_bmbt_owner (oi, ip, whichfork) \ + xfs_rmap_ino_bmbt_owner(oi, (ip)->i_ino, whichfork)static inline void xfs_rmap_ino_owner(
fs/xfs/scrub/bmap.c +1 -1
@@ -600,7 +600,7 @@ xchk_bmap_btree(/* Check the btree structure. */ cur =xfs_bmbt_init_cursor (mp, sc->tp, ip, whichfork); -xfs_rmap_ino_bmbt_owner (&oinfo, ip->i_ino, whichfork); +xfs_rmap_inode_bmbt_owner (&oinfo, ip, whichfork); error =xchk_btree (sc, cur, xchk_bmapbt_rec, &oinfo, info);xfs_btree_del_cursor (cur, error); out:
fs/xfs/scrub/bmap_repair.c +2 -2
@@ -760,7 +760,7 @@ xrep_bmap_build_new_fork(* Prepare to construct the new fork by initializing the new btree * structure and creating a fake ifork in the ifakeroot structure. */ -xfs_rmap_ino_bmbt_owner (&oinfo, sc->ip->i_ino, rb->whichfork); +xfs_rmap_inode_bmbt_owner (&oinfo, sc->ip, rb->whichfork); error =xrep_newbt_init_inode (&rb->new_bmapbt, sc, rb->whichfork, &oinfo);if (error)
@@ -833,7 +833,7 @@ xrep_bmap_remove_old_tree(struct xfs_owner_info oinfo;/* Free the old bmbt blocks if they're not in use. */ -xfs_rmap_ino_bmbt_owner (&oinfo, sc->ip->i_ino, rb->whichfork); +xfs_rmap_inode_bmbt_owner (&oinfo, sc->ip, rb->whichfork);return xrep_reap_fsblocks (sc, &rb->old_bmbt_blocks, &oinfo); }
fs/xfs/scrub/newbt.c +1 -1
@@ -145,7 +145,7 @@ xrep_newbt_init_metadir_inode(ASSERT (xfs_is_metadir_inode (sc->ip)); -xfs_rmap_ino_bmbt_owner (&oinfo, sc->ip->i_ino,XFS_DATA_FORK ); +xfs_rmap_inode_bmbt_owner (&oinfo, sc->ip,XFS_DATA_FORK ); ifp =kmem_cache_zalloc (xfs_ifork_cache,XCHK_GFP_FLAGS );if (!ifp)
fs/xfs/scrub/reap.c +1 -1
@@ -1205,7 +1205,7 @@ xrep_reap_metadir_fsblocks(ASSERT (xfs_is_metadir_inode (sc->ip));xreap_configure_agextent_limits (&rs); -xfs_rmap_ino_bmbt_owner (&oinfo, sc->ip->i_ino,XFS_DATA_FORK ); +xfs_rmap_inode_bmbt_owner (&oinfo, sc->ip,XFS_DATA_FORK ); error =xfsb_bitmap_walk (bitmap, xreap_fsmeta_extent, &rs);if (error)return error;
fs/xfs/scrub/rtrefcount.c +1 -1
@@ -556,7 +556,7 @@ xchk_rtrefcountbt(if (error || (sc->sm->sm_flags &XFS_SCRUB_OFLAG_CORRUPT ))return error; -xfs_rmap_ino_bmbt_owner (&btree_oinfo,rtg_refcount (sc->sr.rtg)->i_ino, +xfs_rmap_inode_bmbt_owner (&btree_oinfo,rtg_refcount (sc->sr.rtg),XFS_DATA_FORK ); error =xchk_btree (sc, sc->sr.refc_cur, xchk_rtrefcountbt_rec, &btree_oinfo, &rrc);
fs/xfs/scrub/rtrmap.c +1 -2
@@ -250,7 +250,6 @@ intxchk_rtrmapbt ( struct xfs_scrub *sc) { -struct xfs_inode *ip =rtg_rmap (sc->sr.rtg);struct xfs_owner_info oinfo;struct xchk_rtrmap cr = { };int error;
@@ -259,7 +258,7 @@ xchk_rtrmapbt(if (error || (sc->sm->sm_flags &XFS_SCRUB_OFLAG_CORRUPT ))return error; -xfs_rmap_ino_bmbt_owner (&oinfo, ip->i_ino,XFS_DATA_FORK ); +xfs_rmap_inode_bmbt_owner (&oinfo,rtg_rmap (sc->sr.rtg),XFS_DATA_FORK );return xchk_btree (sc, sc->sr.rmap_cur, xchk_rtrmapbt_rec, &oinfo, &cr); }
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 6/9 xfs: add a xfs_rmap_inode_owner helper
In reply to Sasha LevinFrom: Christoph Hellwig <[email protected]>
[ Upstream commit f882fc7dd9f04f73d94379deb9e68d8db613c976 ]
Add a small wrapper for initializing the rmap owner to i_ino.
Stable-dep-of: 865b751e7503 ("xfs: don't stash removename operations with unknown ftype")
--- fs/xfs/libxfs/xfs_bmap.c | 2 +- fs/xfs/libxfs/xfs_rmap.h | 2 ++ fs/xfs/scrub/bmap.c | 6 +++--- fs/xfs/scrub/reap.c | 3 +-- 4 files changed, 7 insertions(+), 6 deletions(-)
fs/xfs/libxfs/xfs_bmap.c +1 -1
@@ -819,7 +819,7 @@ xfs_bmap_local_to_extents( args.mp = ip->i_mount; args.total = total; args.minlen = args.maxlen = args.prod =1 ; -xfs_rmap_ino_owner (&args.oinfo, ip->i_ino, whichfork,0 ); +xfs_rmap_inode_owner (&args.oinfo, ip, whichfork,0 );/* * Allocate a block. We know we need only one, since the
fs/xfs/libxfs/xfs_rmap.h +2 -0
@@ -37,6 +37,8 @@ xfs_rmap_ino_owner(if (whichfork ==XFS_ATTR_FORK ) oi->oi_flags |=XFS_OWNER_INFO_ATTR_FORK ; } +#define xfs_rmap_inode_owner (oi, ip, whichfork, offset) \ + xfs_rmap_ino_owner(oi, (ip)->i_ino, whichfork, offset)static inline bool xfs_rmap_should_skip_owner_update(
fs/xfs/scrub/bmap.c +3 -3
@@ -352,7 +352,7 @@ xchk_bmap_rt_iextent_xref(case XFS_DATA_FORK :xchk_bmap_xref_rmap (info, irec, rgbno);if (!xfs_is_reflink_inode (info->sc->ip)) { -xfs_rmap_ino_owner (&oinfo, info->sc->ip->i_ino, +xfs_rmap_inode_owner (&oinfo, info->sc->ip, info->whichfork, irec->br_startoff);xchk_xref_is_only_rt_owned_by (info->sc, rgbno, irec->br_blockcount, &oinfo);
@@ -407,7 +407,7 @@ xchk_bmap_iextent_xref(case XFS_DATA_FORK :xchk_bmap_xref_rmap (info, irec, agbno);if (!xfs_is_reflink_inode (info->sc->ip)) { -xfs_rmap_ino_owner (&oinfo, info->sc->ip->i_ino, +xfs_rmap_inode_owner (&oinfo, info->sc->ip, info->whichfork, irec->br_startoff);xchk_xref_is_only_owned_by (info->sc, agbno, irec->br_blockcount, &oinfo);
@@ -419,7 +419,7 @@ xchk_bmap_iextent_xref(break ;case XFS_ATTR_FORK :xchk_bmap_xref_rmap (info, irec, agbno); -xfs_rmap_ino_owner (&oinfo, info->sc->ip->i_ino, +xfs_rmap_inode_owner (&oinfo, info->sc->ip, info->whichfork, irec->br_startoff);xchk_xref_is_only_owned_by (info->sc, agbno, irec->br_blockcount, &oinfo);
fs/xfs/scrub/reap.c +1 -2
@@ -1249,8 +1249,7 @@ xreap_bmapi_select( cur =xfs_rmapbt_init_cursor (sc->mp, sc->tp, sc->sa.agf_bp, sc->sa.pag); -xfs_rmap_ino_owner (&oinfo, rs->ip->i_ino, rs->whichfork, - imap->br_startoff); +xfs_rmap_inode_owner (&oinfo, rs->ip, rs->whichfork, imap->br_startoff); error =xfs_rmap_has_other_keys (cur, agbno,1 , &oinfo, crosslinked);if (error) goto out_cur;
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 7/9 xfs: convert xchk_inode_xref_set_corrupt to xchk_ip_xref_set_corrupt
In reply to Sasha LevinFrom: Christoph Hellwig <[email protected]>
[ Upstream commit bef4cee25fbc26ee8b07028e461190fa57b02788 ]
All xref corruption reports have the xfs_inode structure, so switch the helper to work based on that.
Stable-dep-of: 865b751e7503 ("xfs: don't stash removename operations with unknown ftype")
--- fs/xfs/scrub/common.c | 6 +++--- fs/xfs/scrub/common.h | 4 ++-- fs/xfs/scrub/dirtree.c | 4 ++-- fs/xfs/scrub/inode.c | 6 +++--- fs/xfs/scrub/nlinks.c | 2 +- fs/xfs/scrub/rtbitmap.c | 4 ++-- fs/xfs/scrub/rtsummary.c | 2 +- 7 files changed, 14 insertions(+), 14 deletions(-)
fs/xfs/scrub/common.c +3 -3
@@ -309,12 +309,12 @@ xchk_ino_set_corrupt(/* Record a corruption while cross-referencing with an inode. */ void -xchk_ino_xref_set_corrupt ( +xchk_ip_xref_set_corrupt (struct xfs_scrub *sc, -xfs_ino_t ino) +struct xfs_inode *ip) { sc->sm->sm_flags |=XFS_SCRUB_OFLAG_XCORRUPT ; -trace_xchk_ino_error (sc, ino, __return_address); +trace_xchk_ino_error (sc, ip->i_ino, __return_address); }/* Record corruption in a block indexed by a file fork. */
fs/xfs/scrub/common.h +2 -2
@@ -41,8 +41,8 @@ void xchk_qcheck_set_corrupt(struct xfs_scrub *sc, unsigned int dqtype,void xchk_block_xref_set_corrupt (struct xfs_scrub *sc,struct xfs_buf *bp); -void xchk_ino_xref_set_corrupt (struct xfs_scrub *sc, -xfs_ino_t ino); +void xchk_ip_xref_set_corrupt (struct xfs_scrub *sc, +struct xfs_inode *ip);void xchk_fblock_xref_set_corrupt (struct xfs_scrub *sc,int whichfork,xfs_fileoff_t offset);
fs/xfs/scrub/dirtree.c +2 -2
@@ -954,7 +954,7 @@ xchk_dirtree(* parent pointers are corrupt; this scan cannot be completed * without full information. */ -xchk_ino_xref_set_corrupt (sc, sc->ip->i_ino); +xchk_ip_xref_set_corrupt (sc, sc->ip); error =0 ; goto out_scanlock; }
@@ -984,7 +984,7 @@ xchk_dirtree(if (oc.bad || oc.good + oc.suspect !=1 )xchk_ip_set_corrupt (sc, sc->ip);if (oc.suspect) -xchk_ino_xref_set_corrupt (sc, sc->ip->i_ino); +xchk_ip_xref_set_corrupt (sc, sc->ip); } out_scanlock:
fs/xfs/scrub/inode.c +3 -3
@@ -710,17 +710,17 @@ xchk_inode_xref_bmap(if (!xchk_should_check_xref (sc, &error,NULL ))return ;if (nextents <xfs_dfork_data_extents (dip)) -xchk_ino_xref_set_corrupt (sc, sc->ip->i_ino); +xchk_ip_xref_set_corrupt (sc, sc->ip); error =xchk_inode_count_blocks (sc,XFS_ATTR_FORK , &nextents, &acount);if (!xchk_should_check_xref (sc, &error,NULL ))return ;if (nextents !=xfs_dfork_attr_extents (dip)) -xchk_ino_xref_set_corrupt (sc, sc->ip->i_ino); +xchk_ip_xref_set_corrupt (sc, sc->ip);/* Check nblocks against the inode. */ if (count + acount !=be64_to_cpu (dip->di_nblocks)) -xchk_ino_xref_set_corrupt (sc, sc->ip->i_ino); +xchk_ip_xref_set_corrupt (sc, sc->ip); }/* Cross-reference with the other btrees. */
fs/xfs/scrub/nlinks.c +1 -1
@@ -741,7 +741,7 @@ xchk_nlinks_compare_inode(* number of subdirectory entries in the directory. */ if (obs.children != obs.backrefs) -xchk_ino_xref_set_corrupt (sc, ip->i_ino); +xchk_ip_xref_set_corrupt (sc, ip); }else {/* * Non-directories and unlinked directories should not have
fs/xfs/scrub/rtbitmap.c +2 -2
@@ -284,7 +284,7 @@ xchk_xref_is_used_rt_space(if (xfs_has_zoned (sc->mp)) {if (!xfs_zone_rgbno_is_valid (rtg,xfs_rtb_to_rgbno (sc->mp, rtbno) + len -1 )) -xchk_ino_xref_set_corrupt (sc,rtg_rmap (rtg)->i_ino); +xchk_ip_xref_set_corrupt (sc,rtg_rmap (rtg));return ; }
@@ -295,5 +295,5 @@ xchk_xref_is_used_rt_space(if (!xchk_should_check_xref (sc, &error,NULL ))return ;if (is_free) -xchk_ino_xref_set_corrupt (sc,rtg_bitmap (rtg)->i_ino); +xchk_ip_xref_set_corrupt (sc,rtg_bitmap (rtg)); }
fs/xfs/scrub/rtsummary.c +1 -1
@@ -190,7 +190,7 @@ xchk_rtsum_record_free( rtlen =xfs_rtxlen_to_extlen (mp, rec->ar_extcount);if (!xfs_verify_rtbext (mp, rtbno, rtlen)) { -xchk_ino_xref_set_corrupt (sc,rtg_bitmap (rtg)->i_ino); +xchk_ip_xref_set_corrupt (sc,rtg_bitmap (rtg));return -EFSCORRUPTED ; }
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 8/9 xfs: remove the i_ino field in struct xfs_inode
In reply to Sasha LevinFrom: Christoph Hellwig <[email protected]>
[ Upstream commit 1113a6d6d5d1336f4415fa1367aac0f853f0892d ]
Now that the VFS inode has a u64 i_ino field, there is no need to store a copy of the inode number in the xfs_inode structure.
Introduce an I_INO() wrapper as a shortcut to the inode number so that we don't have to propagate the VFS inode everywhere.
The only non-obvious part is the clearing of i_ino to 0 for RCU freeing the inode. None of this calls into VFS paths, which makes clearing the VFS inode field here just as safe as clearing the old field in the xfs_inode.
Stable backport for 865b751e75039fc07838b3200f9740256653da9a:
The 6.18 VFS inode still stores i_ino as unsigned long. Keep the existing 64-bit xfs_inode.i_ino field and its initialization/reclaim lifecycle so that inode numbers are not truncated on 32-bit systems.
Retain only the I_INO accessor and the two dirent-stashing conversions in xrep_dir_live_update that the target patch needs. Define I_INO as a macro using the existing XFS field, without introducing a function. Drop the remaining field-removal and caller-conversion hunks, including references to the absent health monitor and newer parent, tracing, and inode APIs. The upstream subject is retained, but this stable dependency deliberately does not remove xfs_inode.i_ino.
Also convert the remaining xchk_rtsummary error-path call to xchk_ip_xref_set_corrupt(sc, rbmip). The preceding stable dependency 7a4a29522ee8 renamed that helper but missed this stable-only caller, leaving allmodconfig builds with an implicit-function-declaration error. This completes the caller conversion without adding a function.
[ sashal: Reduced backport -- upstream 1113a6d6d5d13 touches 91 file(s), this
backport carries 3. Not backported here:
fs/xfs/libxfs/xfs_attr.c
fs/xfs/libxfs/xfs_attr_leaf.c
fs/xfs/libxfs/xfs_bmap_btree.c
fs/xfs/libxfs/xfs_bmap.c
fs/xfs/libxfs/xfs_btree.c
fs/xfs/libxfs/xfs_btree_staging.c
fs/xfs/libxfs/xfs_da_btree.c
fs/xfs/libxfs/xfs_dir2.c
... and 81 more
This note is generated from the file lists only; see the resolution record for the reasoning. ]
Stable-dep-of: 865b751e7503 ("xfs: don't stash removename operations with unknown ftype")
--- fs/xfs/scrub/dir_repair.c | 4 ++-- fs/xfs/scrub/rtsummary.c | 2 +- fs/xfs/xfs_inode.h | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-)
fs/xfs/scrub/dir_repair.c +2 -2
@@ -1374,10 +1374,10 @@ xrep_dir_live_update(mutex_lock (&rd->pscan.lock);if (p->delta >0 ) error =xrep_dir_stash_createname (rd, p->name, - p->ip->i_ino); +I_INO (p->ip));else error =xrep_dir_stash_removename (rd, p->name, - p->ip->i_ino); +I_INO (p->ip));mutex_unlock (&rd->pscan.lock);if (error) goto out_abort;
fs/xfs/scrub/rtsummary.c +1 -1
@@ -359,7 +359,7 @@ xchk_rtsummary(* EFSCORRUPTED means the rtbitmap is corrupt, which is an xref * error since we're checking the summary file. */ -xchk_ino_xref_set_corrupt (sc, rbmip->i_ino); +xchk_ip_xref_set_corrupt (sc, rbmip);return 0 ; }if (error)
fs/xfs/xfs_inode.h +3 -0
@@ -184,6 +184,9 @@ static inline const struct inode *VFS_IC(const struct xfs_inode *ip)return &ip->i_vnode; } +/* The VFS inode number can still be 32 bits on this branch. */ +#define I_INO (ip) ((ip)->i_ino) +/* * For regular files we only update the on-disk filesize when actually * writing data back to disk. Until then only the copy in the VFS inode
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 9/9 xfs: don't stash removename operations with unknown ftype
In reply to Sasha LevinFrom: "Darrick J. Wong" <[email protected]>
[ Upstream commit 865b751e75039fc07838b3200f9740256653da9a ]
LOLLM notices that the behavior of xrep_dir_replay_update changes based on the ftype recorded in the stashed removename information. It also notices that the unlink iops sometimes set that ftype to FT_UNKNOWN because the regular directory tree update code paths don't need to know the ftype of the child.
Unfortunately, this results in incorrect link counts, which eventually trips link count errors in later phases of xfs_scrub, or in xfs_repair. Fix this by creating a second xfs_name with the type set correctly.
--- fs/xfs/scrub/dir_repair.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-)
fs/xfs/scrub/dir_repair.c +17 -2
@@ -1375,9 +1375,24 @@ xrep_dir_live_update(if (p->delta >0 ) error =xrep_dir_stash_createname (rd, p->name,I_INO (p->ip)); -else - error =xrep_dir_stash_removename (rd, p->name, +else { +/* +* xfs_dentry_to_name in unlink or rename-exchange can +* pass us names with ftype FT_UNKNOWN, but we really +* must know the ftype of the child that is being +* removed so that we can do nlink updates correctly +* without holding inode references. +*/ +struct xfs_name name = { + .name = p->name->name, + .len = p->name->len, + .type =xfs_mode_to_ftype ( +VFS_IC (p->ip)->i_mode), + }; + + error =xrep_dir_stash_removename (rd, &name,I_INO (p->ip)); + }mutex_unlock (&rd->pscan.lock);if (error) goto out_abort;
Signature · 1 line
2.53.0
Re: [PATCH 6.18.y 1/9] xfs: factor out xfs_attr3_leaf_init
In reply to Sasha LevinQuoted 68 lines · Sasha Levin
From: Long Li <[email protected]>
[ Upstream commit
e65bb55d7f8c2041c8fdb73cd29b0b4cad4ed847]Factor out wrapper
xfs_attr3_leaf_initfunction, which exported for external use.Reviewed-by Darrick J. Wong <[email protected]>Signed-off-by Long Li <[email protected]>Signed-off-by Carlos Maiolino <[email protected]>Stable-dep-of:
865b751e7503("xfs: don't stash removename operations with unknown ftype")Signed-off-by Sasha Levin <[email protected]>--- fs/xfs/libxfs/xfs_attr_leaf.c | 22 ++++++++++++++++++++++ fs/xfs/libxfs/xfs_attr_leaf.h | 3 +++ 2 files changed, 25 insertions(+)fs/xfs/libxfs/xfs_attr_leaf.c +22
-0@@ -1330,6 +1330,28 @@ xfs_attr3_leaf_create(return 0 ; } +/* +* Reinitialize an existing attr fork block as an empty leaf, and attach +* the buffer to tp. +*/ +int +xfs_attr3_leaf_init ( +struct xfs_trans *tp, +struct xfs_inode *dp, +xfs_dablk_t blkno) +{ +struct xfs_buf *bp =NULL ; +struct xfs_da_args args = { + .trans = tp, + .dp = dp, + .owner = dp->i_ino, + .geo = dp->i_mount->m_attr_geo, + }; + +ASSERT (tp !=NULL ); + +return xfs_attr3_leaf_create (&args, blkno, &bp); +}/* * Split the leaf node, rebalance, then add the new entry. * fs/xfs/libxfs/xfs_attr_leaf.h +3
-0@@ -86,6 +86,9 @@ int xfs_attr3_leaf_list_int(struct xfs_buf *bp,/* * Routines used for shrinking the Btree. */ + +int xfs_attr3_leaf_init (struct xfs_trans *tp,struct xfs_inode *dp, +xfs_dablk_t blkno);int xfs_attr3_leaf_toosmall (struct xfs_da_state *state,int *retval); void xfs_attr3_leaf_unbalance(struct xfs_da_state *state, struct xfs_da_state_blk *drop_blk,Signature · 1 line
2.53.0
Series does not apply :(
Sasha Levin
maintainerRe: [PATCH 6.18.y 1/9] xfs: factor out xfs_attr3_leaf_init
Quoted 1 line
Series does not apply :(
This series is superseded. I've queued a single-patch backport of 865b751e7503 ("xfs: don't stash removename operations with unknown ftype") for 6.18 and 6.12 instead, so the series can be dropped.
Signature · 2 lines
Thanks, Sasha