summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2014-04-23 07:11:52 +1000
committerDave Chinner <david@fromorbit.com>2014-04-23 07:11:52 +1000
commit3b8d90766a85e079fefaee74ca9dde43ce75edea (patch)
tree4d8127027451b32e5629463dadc6495dadd80496 /fs
parent1919adda0732e661c6163a6505dddb0bc423b8d8 (diff)
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>
Diffstat (limited to 'fs')
-rw-r--r--fs/xfs/xfs_filestream.c57
-rw-r--r--fs/xfs/xfs_filestream.h1
-rw-r--r--fs/xfs/xfs_inode.c15
3 files changed, 15 insertions, 58 deletions
diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c
index 7b940369001..c8a8840e502 100644
--- a/fs/xfs/xfs_filestream.c
+++ b/fs/xfs/xfs_filestream.c
@@ -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;
}
/*
diff --git a/fs/xfs/xfs_filestream.h b/fs/xfs/xfs_filestream.h
index 578d49e7cff..2de853e03bf 100644
--- a/fs/xfs/xfs_filestream.h
+++ b/fs/xfs/xfs_filestream.h
@@ -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
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index b9b531f7fa3..cec18e9ba1d 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -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;
}