Commit e052a18d authored by Darrick J. Wong's avatar Darrick J. Wong Committed by Jialin Zhang
Browse files

xfs: use XFS_IFORK_Q to determine the presence of an xattr fork

mainline inclusion
from mainline-v5.19-rc5
commit e45d7cb2
category: bugfix
bugzilla: 187164, https://gitee.com/openeuler/kernel/issues/I4KIAO
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=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: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>

conflicts:
	fs/xfs/libxfs/xfs_attr.h
	fs/xfs/libxfs/xfs_inode_fork.c
	fs/xfs/libxfs/xfs_inode_fork.h
	fs/xfs/xfs_icache.c
	fs/xfs/xfs_inode.c

Signed-off-by: default avatarLong Li <leo.lilong@huawei.com>
Reviewed-by: default avatarZhang Yi <yi.zhang@huawei.com>
Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parent a29e5f83
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -65,8 +65,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;
+0 −1
Original line number Diff line number Diff line
@@ -1089,7 +1089,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);
	ip->i_af.if_flags = XFS_IFEXTENTS;
+0 −1
Original line number Diff line number Diff line
@@ -198,7 +198,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) {
+1 −6
Original line number Diff line number Diff line
@@ -287,9 +287,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;
}
@@ -298,7 +295,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);
@@ -697,7 +693,6 @@ xfs_ifork_init_cow(

	ip->i_cowfp = kmem_cache_zalloc(xfs_ifork_zone,
				       GFP_NOFS | __GFP_NOFAIL);
	ip->i_cowfp->if_present = 1;
	ip->i_cowfp->if_flags = XFS_IFEXTENTS;
	ip->i_cowfp->if_format = XFS_DINODE_FMT_EXTENTS;
}
@@ -737,7 +732,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);
+0 −1
Original line number Diff line number Diff line
@@ -25,7 +25,6 @@ struct xfs_ifork {
	unsigned char		if_flags;	/* per-fork flags */
	int8_t			if_format;	/* format of this fork */
	xfs_extnum_t		if_nextents;	/* # of extents in this fork */
	int8_t                  if_present;     /* 1 if present */
};

/*
Loading