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: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
Christoph Hellwig 2014-04-23 07:11:52 +10:00 committed by Dave Chinner
parent 1919adda07
commit 3b8d90766a
3 changed files with 15 additions and 58 deletions

View file

@ -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;
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) {
ag = container_of(mru, struct xfs_fstrm_item, mru)->ag;
xfs_mru_cache_done(mp->m_filestream);
return 0;
ref = xfs_filestream_peek_ag(ip->i_mount, ag);
TRACE_LOOKUP(mp, ip, pip, ag, ref);
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;
}
/*

View file

@ -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

View file

@ -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;
}