Commit 4f0dda35 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'xfs-5.16-fixes-1' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux

Pull xfs fixes from Darrick Wong:
 "Fixes for a resource leak and a build robot complaint about totally
  dead code:

   - Fix buffer resource leak that could lead to livelock on corrupt fs.

   - Remove unused function xfs_inew_wait to shut up the build robots"

* tag 'xfs-5.16-fixes-1' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux:
  xfs: remove xfs_inew_wait
  xfs: Fix the free logic of state in xfs_attr_node_hasname
parents adfb743a 1090427b
Loading
Loading
Loading
Loading
+7 −10
Original line number Diff line number Diff line
@@ -1077,21 +1077,18 @@ xfs_attr_node_hasname(

	state = xfs_da_state_alloc(args);
	if (statep != NULL)
		*statep = NULL;
		*statep = state;

	/*
	 * Search to see if name exists, and get back a pointer to it.
	 */
	error = xfs_da3_node_lookup_int(state, &retval);
	if (error) {
		xfs_da_state_free(state);
		return error;
	}
	if (error)
		retval = error;

	if (statep != NULL)
		*statep = state;
	else
	if (!statep)
		xfs_da_state_free(state);

	return retval;
}

@@ -1112,7 +1109,7 @@ xfs_attr_node_addname_find_attr(
	 */
	retval = xfs_attr_node_hasname(args, &dac->da_state);
	if (retval != -ENOATTR && retval != -EEXIST)
		return retval;
		goto error;

	if (retval == -ENOATTR && (args->attr_flags & XATTR_REPLACE))
		goto error;
@@ -1337,7 +1334,7 @@ int xfs_attr_node_removename_setup(

	error = xfs_attr_node_hasname(args, state);
	if (error != -EEXIST)
		return error;
		goto out;
	error = 0;

	ASSERT((*state)->path.blk[(*state)->path.active - 1].bp != NULL);
+0 −21
Original line number Diff line number Diff line
@@ -289,22 +289,6 @@ xfs_perag_clear_inode_tag(
	trace_xfs_perag_clear_inode_tag(mp, pag->pag_agno, tag, _RET_IP_);
}

static inline void
xfs_inew_wait(
	struct xfs_inode	*ip)
{
	wait_queue_head_t *wq = bit_waitqueue(&ip->i_flags, __XFS_INEW_BIT);
	DEFINE_WAIT_BIT(wait, &ip->i_flags, __XFS_INEW_BIT);

	do {
		prepare_to_wait(wq, &wait.wq_entry, TASK_UNINTERRUPTIBLE);
		if (!xfs_iflags_test(ip, XFS_INEW))
			break;
		schedule();
	} while (true);
	finish_wait(wq, &wait.wq_entry);
}

/*
 * When we recycle a reclaimable inode, we need to re-initialise the VFS inode
 * part of the structure. This is made more complex by the fact we store
@@ -368,18 +352,13 @@ xfs_iget_recycle(
	ASSERT(!rwsem_is_locked(&inode->i_rwsem));
	error = xfs_reinit_inode(mp, inode);
	if (error) {
		bool	wake;

		/*
		 * Re-initializing the inode failed, and we are in deep
		 * trouble.  Try to re-add it to the reclaim list.
		 */
		rcu_read_lock();
		spin_lock(&ip->i_flags_lock);
		wake = !!__xfs_iflags_test(ip, XFS_INEW);
		ip->i_flags &= ~(XFS_INEW | XFS_IRECLAIM);
		if (wake)
			wake_up_bit(&ip->i_flags, __XFS_INEW_BIT);
		ASSERT(ip->i_flags & XFS_IRECLAIMABLE);
		spin_unlock(&ip->i_flags_lock);
		rcu_read_unlock();
+1 −3
Original line number Diff line number Diff line
@@ -231,8 +231,7 @@ static inline bool xfs_inode_has_bigtime(struct xfs_inode *ip)
#define XFS_IRECLAIM		(1 << 0) /* started reclaiming this inode */
#define XFS_ISTALE		(1 << 1) /* inode has been staled */
#define XFS_IRECLAIMABLE	(1 << 2) /* inode can be reclaimed */
#define __XFS_INEW_BIT		3	 /* inode has just been allocated */
#define XFS_INEW		(1 << __XFS_INEW_BIT)
#define XFS_INEW		(1 << 3) /* inode has just been allocated */
#define XFS_IPRESERVE_DM_FIELDS	(1 << 4) /* has legacy DMAPI fields set */
#define XFS_ITRUNCATED		(1 << 5) /* truncated down so flush-on-close */
#define XFS_IDIRTY_RELEASE	(1 << 6) /* dirty release already seen */
@@ -492,7 +491,6 @@ static inline void xfs_finish_inode_setup(struct xfs_inode *ip)
	xfs_iflags_clear(ip, XFS_INEW);
	barrier();
	unlock_new_inode(VFS_I(ip));
	wake_up_bit(&ip->i_flags, __XFS_INEW_BIT);
}

static inline void xfs_setup_existing_inode(struct xfs_inode *ip)