* and of the form k * prod + mod unless there's nothing that large.
  * Return the starting a.g. block, or NULLAGBLOCK if we can't do it.
  */
-STATIC int                     /* error */
+static int
 xfs_alloc_ag_vextent(
-       xfs_alloc_arg_t *args)  /* argument structure for allocation */
+       struct xfs_alloc_arg    *args)
 {
-       int             error=0;
+       struct xfs_mount        *mp = args->mp;
+       int                     error = 0;
 
        ASSERT(args->minlen > 0);
        ASSERT(args->maxlen > 0);
        ASSERT(args->minlen <= args->maxlen);
        ASSERT(args->mod < args->prod);
        ASSERT(args->alignment > 0);
+       ASSERT(args->resv != XFS_AG_RESV_AGFL);
+
+
+       error = xfs_alloc_fix_freelist(args, 0);
+       if (error) {
+               trace_xfs_alloc_vextent_nofix(args);
+               return error;
+       }
+       if (!args->agbp) {
+               /* cannot allocate in this AG at all */
+               trace_xfs_alloc_vextent_noagbp(args);
+               args->agbno = NULLAGBLOCK;
+               return 0;
+       }
+       args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno);
+       args->wasfromfl = 0;
 
        /*
         * Branch to correct routine based on the type.
         */
-       args->wasfromfl = 0;
        switch (args->type) {
        case XFS_ALLOCTYPE_THIS_AG:
                error = xfs_alloc_ag_vextent_size(args);
 
        ASSERT(args->len >= args->minlen);
        ASSERT(args->len <= args->maxlen);
-       ASSERT(!args->wasfromfl || args->resv != XFS_AG_RESV_AGFL);
        ASSERT(args->agbno % args->alignment == 0);
 
        /* if not file data, insert new block into the reverse map btree */
                targs.resv = XFS_AG_RESV_AGFL;
 
                /* Allocate as many blocks as possible at once. */
-               error = xfs_alloc_ag_vextent(&targs);
+               error = xfs_alloc_ag_vextent_size(&targs);
                if (error)
                        goto out_agflbp_relse;
 
                                break;
                        goto out_agflbp_relse;
                }
+
+               if (!xfs_rmap_should_skip_owner_update(&targs.oinfo)) {
+                       error = xfs_rmap_alloc(tp, agbp, pag,
+                                      targs.agbno, targs.len, &targs.oinfo);
+                       if (error)
+                               goto out_agflbp_relse;
+               }
+               error = xfs_alloc_update_counters(tp, agbp,
+                                                 -((long)(targs.len)));
+               if (error)
+                       goto out_agflbp_relse;
+
                /*
                 * Put each allocated block on the list.
                 */
 /*
  * Allocate within a single AG only.
  */
-static int
-__xfs_alloc_vextent_this_ag(
-       struct xfs_alloc_arg    *args)
-{
-       struct xfs_mount        *mp = args->mp;
-       int                     error;
-
-       error = xfs_alloc_fix_freelist(args, 0);
-       if (error) {
-               trace_xfs_alloc_vextent_nofix(args);
-               return error;
-       }
-       if (!args->agbp) {
-               /* cannot allocate in this AG at all */
-               trace_xfs_alloc_vextent_noagbp(args);
-               args->agbno = NULLAGBLOCK;
-               return 0;
-       }
-       args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno);
-       return xfs_alloc_ag_vextent(args);
-}
-
 static int
 xfs_alloc_vextent_this_ag(
        struct xfs_alloc_arg    *args,
        }
 
        args->pag = xfs_perag_get(mp, args->agno);
-       error = __xfs_alloc_vextent_this_ag(args);
+       error = xfs_alloc_ag_vextent(args);
 
        xfs_alloc_vextent_set_fsbno(args, minimum_agno);
        xfs_perag_put(args->pag);
        args->agno = start_agno;
        for (;;) {
                args->pag = xfs_perag_get(mp, args->agno);
-               error = __xfs_alloc_vextent_this_ag(args);
+               error = xfs_alloc_ag_vextent(args);
                if (error) {
                        args->agbno = NULLAGBLOCK;
                        break;