On Fri, Jan 21, 2011 at 04:22:29AM -0500, Christoph Hellwig wrote:
> Updating the AGF/trans counters is duplicated between allocating and
> freeing extents. Factor the code into a common helper.
>
> Signed-off-by: Christoph Hellwig <hch@xxxxxx>
Looks good, but one minor thing:
> ASSERT(0);
> /* NOTREACHED */
> }
> - if (error)
> +
> + if (error || args->agbno == NULLAGBLOCK)
> return error;
> - /*
> - * If the allocation worked, need to change the agf structure
> - * (and log it), and the superblock.
> - */
> - if (args->agbno != NULLAGBLOCK) {
> - xfs_agf_t *agf; /* allocation group freelist header */
> - long slen = (long)args->len;
> -
> - ASSERT(args->len >= args->minlen && args->len <= args->maxlen);
> - ASSERT(!(args->wasfromfl) || !args->isfl);
> - ASSERT(args->agbno % args->alignment == 0);
> - if (!(args->wasfromfl)) {
> -
> - agf = XFS_BUF_TO_AGF(args->agbp);
> - be32_add_cpu(&agf->agf_freeblks, -(args->len));
> - xfs_trans_agblocks_delta(args->tp,
> - -((long)(args->len)));
> - args->pag->pagf_freeblks -= args->len;
> - ASSERT(be32_to_cpu(agf->agf_freeblks) <=
> - be32_to_cpu(agf->agf_length));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The assert is lost in this path.
> - xfs_alloc_log_agf(args->tp, args->agbp,
> - XFS_AGF_FREEBLKS);
> - /*
> - * Search the busylist for these blocks and mark the
> - * transaction as synchronous if blocks are found. This
> - * avoids the need to block due to a synchronous log
> - * force to ensure correct ordering as the synchronous
> - * transaction will guarantee that for us.
> - */
> - if (xfs_alloc_busy_search(args->mp, args->agno,
> - args->agbno, args->len))
> - xfs_trans_set_sync(args->tp);
> - }
> - if (!args->isfl)
> - xfs_trans_mod_sb(args->tp,
> - args->wasdel ? XFS_TRANS_SB_RES_FDBLOCKS :
> - XFS_TRANS_SB_FDBLOCKS, -slen);
> - XFS_STATS_INC(xs_allocx);
> - XFS_STATS_ADD(xs_allocb, args->len);
> +
> + ASSERT(args->len >= args->minlen);
> + ASSERT(args->len <= args->maxlen);
> + ASSERT(!args->wasfromfl || !args->isfl);
> + ASSERT(args->agbno % args->alignment == 0);
> +
> + if (!args->wasfromfl) {
> + xfs_alloc_update_counters(args->tp, args->pag, args->agbp,
> + -((long)(args->len)));
Perhaps catching the error here and adding an ASSERT(error == 0)
would be a good idea.
Otherwise,
Reviewed-by: Dave Chinner <dchinner@xxxxxxxxxx>
--
Dave Chinner
david@xxxxxxxxxxxxx
|