diff options
author | Christoph Hellwig <hch@infradead.org> | 2012-07-04 10:54:48 -0400 |
---|---|---|
committer | Ben Myers <bpm@sgi.com> | 2012-07-29 16:03:23 -0500 |
commit | 4bb61069d2019dea2a7e4e0f4432101f03a9b820 (patch) | |
tree | 678553dacf1696eab22649880a24119fcdce138a /fs/xfs | |
parent | 08358906ed78f6ab4d3ff8e4fd1b87b9a4aea645 (diff) | |
download | linux-stable-4bb61069d2019dea2a7e4e0f4432101f03a9b820.tar.gz linux-stable-4bb61069d2019dea2a7e4e0f4432101f03a9b820.tar.bz2 linux-stable-4bb61069d2019dea2a7e4e0f4432101f03a9b820.zip |
xfs: add a short cut to xfs_dialloc for the non-NULL agbp case
In this case we already have selected an AG and know it has free space
beause the buffer lock never got released. Jump directly into xfs_dialloc_ag
and short cut the AG selection loop.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Mark Tinguely <tinguely@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
Diffstat (limited to 'fs/xfs')
-rw-r--r-- | fs/xfs/xfs_ialloc.c | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 2b70952c9d8c..7aa8a02b7937 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -634,6 +634,10 @@ xfs_dialloc_ag( pag = xfs_perag_get(mp, agno); + ASSERT(pag->pagi_init); + ASSERT(pag->pagi_inodeok); + ASSERT(pag->pagi_freecount > 0); + restart_pagno: cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); /* @@ -907,32 +911,32 @@ xfs_dialloc( xfs_agnumber_t tagno; struct xfs_perag *pag; - if (*IO_agbp == NULL) { - /* - * We do not have an agbp, so select an initial allocation - * group for inode allocation. - */ - agbp = xfs_ialloc_ag_select(tp, parent, mode, okalloc); + if (*IO_agbp) { /* - * Couldn't find an allocation group satisfying the - * criteria, give up. - */ - if (!agbp) { - *inop = NULLFSINO; - return 0; - } - agi = XFS_BUF_TO_AGI(agbp); - ASSERT(agi->agi_magicnum == cpu_to_be32(XFS_AGI_MAGIC)); - } else { - /* - * Continue where we left off before. In this case, we + * If the caller passes in a pointer to the AGI buffer, + * continue where we left off before. In this case, we * know that the allocation group has free inodes. */ agbp = *IO_agbp; - agi = XFS_BUF_TO_AGI(agbp); - ASSERT(agi->agi_magicnum == cpu_to_be32(XFS_AGI_MAGIC)); - ASSERT(be32_to_cpu(agi->agi_freecount) > 0); + goto out_alloc; } + + /* + * We do not have an agbp, so select an initial allocation + * group for inode allocation. + */ + agbp = xfs_ialloc_ag_select(tp, parent, mode, okalloc); + + /* + * Couldn't find an allocation group satisfying the + * criteria, give up. + */ + if (!agbp) { + *inop = NULLFSINO; + return 0; + } + agi = XFS_BUF_TO_AGI(agbp); + mp = tp->t_mountp; agno = be32_to_cpu(agi->agi_seqno); tagno = agno; @@ -1012,6 +1016,7 @@ nextag: ASSERT(agi->agi_magicnum == cpu_to_be32(XFS_AGI_MAGIC)); } +out_alloc: *IO_agbp = NULL; return xfs_dialloc_ag(tp, agbp, parent, inop); } |