Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3b8d9076 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Dave Chinner
Browse files

xfs: remove xfs_filestream_associate



There is no good reason to create a filestream when a directory entry
is created.  Delay it until the first allocation happens to simply
the code and reduce the amount of mru cache lookups we do.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent 1919adda
Loading
Loading
Loading
Loading
+15 −42
Original line number Diff line number Diff line
@@ -318,17 +318,18 @@ out:
}

/*
 * Return the AG of the filestream the file or directory belongs to, or
 * NULLAGNUMBER otherwise.
 * Find the right allocation group for a file, either by finding an
 * existing file stream or creating a new one.
 *
 * Returns NULLAGNUMBER in case of an error.
 */
xfs_agnumber_t
xfs_filestream_lookup_ag(
	struct xfs_inode	*ip)
{
	struct xfs_mount	*mp = ip->i_mount;
	struct xfs_fstrm_item	*item;
	struct xfs_inode	*pip = NULL;
	xfs_agnumber_t		ag = NULLAGNUMBER;
	xfs_agnumber_t		startag, ag = NULLAGNUMBER;
	int			ref = 0;
	struct xfs_mru_cache_elem *mru;

@@ -339,45 +340,13 @@ xfs_filestream_lookup_ag(
		goto out;

	mru = xfs_mru_cache_lookup(mp->m_filestream, pip->i_ino);
	if (!mru)
		goto out;

	item = container_of(mru, struct xfs_fstrm_item, mru);

	ag = item->ag;
	if (mru) {
		ag = container_of(mru, struct xfs_fstrm_item, mru)->ag;
		xfs_mru_cache_done(mp->m_filestream);

		ref = xfs_filestream_peek_ag(ip->i_mount, ag);
out:
		TRACE_LOOKUP(mp, ip, pip, ag, ref);
	IRELE(pip);
	return ag;
}

/*
 * Make sure a directory has a filestream associated with it.
 *
 * This is called when creating regular files in an directory that has
 * filestreams enabled, so that a stream is ready by the time we need it
 * in the allocator for the files inside the directory.
 */
int
xfs_filestream_associate(
	struct xfs_inode	*pip)
{
	struct xfs_mount	*mp = pip->i_mount;
	struct xfs_mru_cache_elem *mru;
	xfs_agnumber_t		startag, ag;

	ASSERT(S_ISDIR(pip->i_d.di_mode));

	/*
	 * If the directory already has a file stream associated we're done.
	 */
	mru = xfs_mru_cache_lookup(mp->m_filestream, pip->i_ino);
	if (mru) {
		xfs_mru_cache_done(mp->m_filestream);
		return 0;
		goto out;
	}

	/*
@@ -392,7 +361,11 @@ xfs_filestream_associate(
	} else
		startag = XFS_INO_TO_AGNO(mp, pip->i_ino);

	return xfs_filestream_pick_ag(pip, startag, &ag, 0, 0);
	if (xfs_filestream_pick_ag(pip, startag, &ag, 0, 0))
		ag = NULLAGNUMBER;
out:
	IRELE(pip);
	return ag;
}

/*
+0 −1
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ int xfs_filestream_mount(struct xfs_mount *mp);
void xfs_filestream_unmount(struct xfs_mount *mp);
void xfs_filestream_deassociate(struct xfs_inode *ip);
xfs_agnumber_t xfs_filestream_lookup_ag(struct xfs_inode *ip);
int xfs_filestream_associate(struct xfs_inode *dip);
int xfs_filestream_new_ag(struct xfs_bmalloca *ap, xfs_agnumber_t *agp);

static inline int
+0 −15
Original line number Diff line number Diff line
@@ -655,7 +655,6 @@ xfs_ialloc(
	uint		flags;
	int		error;
	timespec_t	tv;
	int		filestreams = 0;

	/*
	 * Call the space management code to pick
@@ -772,13 +771,6 @@ xfs_ialloc(
		flags |= XFS_ILOG_DEV;
		break;
	case S_IFREG:
		/*
		 * we can't set up filestreams until after the VFS inode
		 * is set up properly.
		 */
		if (pip && xfs_inode_is_filestream(pip))
			filestreams = 1;
		/* fall through */
	case S_IFDIR:
		if (pip && (pip->i_d.di_flags & XFS_DIFLAG_ANY)) {
			uint	di_flags = 0;
@@ -844,13 +836,6 @@ xfs_ialloc(
	/* now that we have an i_mode we can setup inode ops and unlock */
	xfs_setup_inode(ip);

	/* now we have set up the vfs inode we can associate the filestream */
	if (filestreams) {
		error = xfs_filestream_associate(pip);
		if (error)
			return error;
	}

	*ipp = ip;
	return 0;
}