Commit e45d7cb2 authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

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



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>
parent 2ed5b09b
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -69,8 +69,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;
+1 −1
Original line number Diff line number Diff line
@@ -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;
+0 −1
Original line number Diff line number Diff line
@@ -1041,7 +1041,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;
+0 −1
Original line number Diff line number Diff line
@@ -177,7 +177,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
@@ -282,9 +282,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;
}
@@ -293,7 +290,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);
@@ -683,7 +679,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;
}

@@ -722,7 +717,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);
Loading