From: Darrick J. Wong Date: Wed, 24 Aug 2022 12:27:38 +0000 (+0200) Subject: xfs: use XFS_IFORK_Q to determine the presence of an xattr fork X-Git-Tag: v6.0.0-rc0~10 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d4292c66974521a5af81ac7967fae617cab322f4;p=thirdparty%2Fxfsprogs-dev.git xfs: use XFS_IFORK_Q to determine the presence of an xattr fork Source kernel commit: e45d7cb2356e6b59fe64da28324025cc6fcd3fbd Modify xfs_ifork_ptr to return a NULL pointer if the caller asks for the attribute fork but i_forkoff is zero. This eliminates the ambiguity between i_forkoff and i_af.if_present, which should make it easier to understand the lifetime of attr forks. While we're at it, remove the if_present checks around calls to xfs_idestroy_fork and xfs_ifork_zap_attr since they can both handle attr forks that have already been torn down. Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Carlos Maiolino --- diff --git a/include/xfs_inode.h b/include/xfs_inode.h index 93ebf8023..6470fe4d7 100644 --- a/include/xfs_inode.h +++ b/include/xfs_inode.h @@ -109,7 +109,7 @@ xfs_ifork_ptr( case XFS_DATA_FORK: return &ip->i_df; case XFS_ATTR_FORK: - if (!ip->i_af.if_present) + if (!XFS_IFORK_Q(ip)) return NULL; return &ip->i_af; case XFS_COW_FORK: diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index c6b4db0f7..ad8e324dc 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -1087,7 +1087,6 @@ libxfs_iget( ip->i_ino = ino; ip->i_mount = mp; ip->i_af.if_format = XFS_DINODE_FMT_EXTENTS; - ip->i_df.if_present = 1; spin_lock_init(&VFS_I(ip)->i_lock); error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, 0); @@ -1126,10 +1125,10 @@ libxfs_idestroy(xfs_inode_t *ip) libxfs_idestroy_fork(&ip->i_df); break; } - if (ip->i_af.if_present) { - libxfs_idestroy_fork(&ip->i_af); - libxfs_ifork_zap_attr(ip); - } + + libxfs_idestroy_fork(&ip->i_af); + libxfs_ifork_zap_attr(ip); + if (ip->i_cowfp) { libxfs_idestroy_fork(ip->i_cowfp); kmem_cache_free(xfs_ifork_cache, ip->i_cowfp); diff --git a/libxfs/util.c b/libxfs/util.c index 974d0e27e..3e12a188f 100644 --- a/libxfs/util.c +++ b/libxfs/util.c @@ -374,7 +374,7 @@ libxfs_iflush_int( if (ip->i_df.if_format == XFS_DINODE_FMT_LOCAL && xfs_ifork_verify_local_data(ip)) return -EFSCORRUPTED; - if (ip->i_af.if_present && + if (XFS_IFORK_Q(ip) && ip->i_af.if_format == XFS_DINODE_FMT_LOCAL && xfs_ifork_verify_local_attr(ip)) return -EFSCORRUPTED; diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index a0d65a374..404cff679 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -67,8 +67,6 @@ xfs_inode_hasattr( { if (!XFS_IFORK_Q(ip)) return 0; - if (!ip->i_af.if_present) - return 0; if (ip->i_af.if_format == XFS_DINODE_FMT_EXTENTS && ip->i_af.if_nextents == 0) return 0; diff --git a/libxfs/xfs_attr.h b/libxfs/xfs_attr.h index 0f100db50..36371c3b9 100644 --- a/libxfs/xfs_attr.h +++ b/libxfs/xfs_attr.h @@ -576,7 +576,7 @@ xfs_attr_init_add_state(struct xfs_da_args *args) * context, i_af is guaranteed to exist. Hence if the attr fork is * null, we were called from a pure remove operation and so we are done. */ - if (!args->dp->i_af.if_present) + if (!XFS_IFORK_Q(args->dp)) return XFS_DAS_DONE; args->op_flags |= XFS_DA_OP_ADDNAME; diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 9e5e6cd61..c2f87bbbd 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -1034,7 +1034,6 @@ xfs_bmap_add_attrfork( error = xfs_bmap_set_attrforkoff(ip, size, &version); if (error) goto trans_cancel; - ASSERT(!ip->i_af.if_present); xfs_ifork_init_attr(ip, XFS_DINODE_FMT_EXTENTS, 0); logflags = 0; diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c index 5e30f94df..e8283e0d7 100644 --- a/libxfs/xfs_inode_buf.c +++ b/libxfs/xfs_inode_buf.c @@ -174,7 +174,6 @@ xfs_inode_from_disk( xfs_failaddr_t fa; ASSERT(ip->i_cowfp == NULL); - ASSERT(!ip->i_af.if_present); fa = xfs_dinode_verify(ip->i_mount, ip->i_ino, from); if (fa) { diff --git a/libxfs/xfs_inode_fork.c b/libxfs/xfs_inode_fork.c index 92ca8095a..225b7f8ca 100644 --- a/libxfs/xfs_inode_fork.c +++ b/libxfs/xfs_inode_fork.c @@ -280,9 +280,6 @@ xfs_ifork_init_attr( enum xfs_dinode_fmt format, xfs_extnum_t nextents) { - ASSERT(!ip->i_af.if_present); - - ip->i_af.if_present = 1; ip->i_af.if_format = format; ip->i_af.if_nextents = nextents; } @@ -291,7 +288,6 @@ void xfs_ifork_zap_attr( struct xfs_inode *ip) { - ASSERT(ip->i_af.if_present); ASSERT(ip->i_af.if_broot == NULL); ASSERT(ip->i_af.if_u1.if_data == NULL); ASSERT(ip->i_af.if_height == 0); @@ -681,7 +677,6 @@ xfs_ifork_init_cow( ip->i_cowfp = kmem_cache_zalloc(xfs_ifork_cache, GFP_NOFS | __GFP_NOFAIL); - ip->i_cowfp->if_present = 1; ip->i_cowfp->if_format = XFS_DINODE_FMT_EXTENTS; } @@ -720,7 +715,7 @@ xfs_ifork_verify_local_attr( struct xfs_ifork *ifp = &ip->i_af; xfs_failaddr_t fa; - if (!ifp->if_present) + if (!XFS_IFORK_Q(ip)) fa = __this_address; else fa = xfs_attr_shortform_verify(ip); diff --git a/libxfs/xfs_inode_fork.h b/libxfs/xfs_inode_fork.h index 63015e9ce..0b912bbe4 100644 --- a/libxfs/xfs_inode_fork.h +++ b/libxfs/xfs_inode_fork.h @@ -24,7 +24,6 @@ struct xfs_ifork { xfs_extnum_t if_nextents; /* # of extents in this fork */ short if_broot_bytes; /* bytes allocated for root */ int8_t if_format; /* format of this fork */ - int8_t if_present; /* 1 if present */ }; /* diff --git a/repair/phase6.c b/repair/phase6.c index e533daf40..d8b23ba52 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -499,8 +499,7 @@ mk_rbmino(xfs_mount_t *mp) VFS_I(ip)->i_mode = S_IFREG; ip->i_df.if_format = XFS_DINODE_FMT_EXTENTS; - if (ip->i_af.if_present) - libxfs_ifork_zap_attr(ip); + libxfs_ifork_zap_attr(ip); set_nlink(VFS_I(ip), 1); /* account for sb ptr */ @@ -739,8 +738,7 @@ mk_rsumino(xfs_mount_t *mp) VFS_I(ip)->i_mode = S_IFREG; ip->i_df.if_format = XFS_DINODE_FMT_EXTENTS; - if (ip->i_af.if_present) - libxfs_ifork_zap_attr(ip); + libxfs_ifork_zap_attr(ip); set_nlink(VFS_I(ip), 1); /* account for sb ptr */ @@ -838,8 +836,7 @@ mk_root_dir(xfs_mount_t *mp) VFS_I(ip)->i_mode = mode|S_IFDIR; ip->i_df.if_format = XFS_DINODE_FMT_EXTENTS; - if (ip->i_af.if_present) - libxfs_ifork_zap_attr(ip); + libxfs_ifork_zap_attr(ip); set_nlink(VFS_I(ip), 2); /* account for . and .. */