xfs: simplify xfs_rtallocate_extent
authorChristoph Hellwig <hch@lst.de>
Fri, 17 Feb 2017 16:21:06 +0000 (08:21 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Sat, 18 Feb 2017 00:52:52 +0000 (16:52 -0800)
We can deduce the allocation type from the bno argument, and do the
return without prod much simpler internally.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
[darrick: fix the macro for the non-rt build]
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/xfs_bmap_util.c
fs/xfs/xfs_rtalloc.c
fs/xfs/xfs_rtalloc.h

index 6be5f26783a17e36607df7f2170828948039cb57..8b75dcea596680f1332412870546181d2f0a579c 100644 (file)
@@ -88,7 +88,6 @@ int
 xfs_bmap_rtalloc(
        struct xfs_bmalloca     *ap)    /* bmap alloc argument struct */
 {
-       xfs_alloctype_t atype = 0;      /* type for allocation routines */
        int             error;          /* error return value */
        xfs_mount_t     *mp;            /* mount point structure */
        xfs_extlen_t    prod = 0;       /* product factor for allocators */
@@ -155,18 +154,14 @@ xfs_bmap_rtalloc(
        /*
         * Realtime allocation, done through xfs_rtallocate_extent.
         */
-       atype = ap->blkno == 0 ?  XFS_ALLOCTYPE_ANY_AG : XFS_ALLOCTYPE_NEAR_BNO;
        do_div(ap->blkno, mp->m_sb.sb_rextsize);
        rtb = ap->blkno;
        ap->length = ralen;
-       if ((error = xfs_rtallocate_extent(ap->tp, ap->blkno, 1, ap->length,
-                               &ralen, atype, ap->wasdel, prod, &rtb)))
-               return error;
-       if (rtb == NULLFSBLOCK && prod > 1 &&
-           (error = xfs_rtallocate_extent(ap->tp, ap->blkno, 1,
-                                          ap->length, &ralen, atype,
-                                          ap->wasdel, 1, &rtb)))
+       error = xfs_rtallocate_extent(ap->tp, ap->blkno, 1, ap->length,
+                               &ralen, ap->wasdel, prod, &rtb);
+       if (error)
                return error;
+
        ap->blkno = rtb;
        if (ap->blkno != NULLFSBLOCK) {
                ap->blkno *= mp->m_sb.sb_rextsize;
index 802bcc326d9fbe37fab8b412ce69b37390d94ba0..c57aa7f18087733f40ac1ba398cb0605e1df109c 100644 (file)
@@ -1093,7 +1093,6 @@ xfs_rtallocate_extent(
        xfs_extlen_t    minlen,         /* minimum length to allocate */
        xfs_extlen_t    maxlen,         /* maximum length to allocate */
        xfs_extlen_t    *len,           /* out: actual length allocated */
-       xfs_alloctype_t type,           /* allocation type XFS_ALLOCTYPE... */
        int             wasdel,         /* was a delayed allocation extent */
        xfs_extlen_t    prod,           /* extent product factor */
        xfs_rtblock_t   *rtblock)       /* out: start block allocated */
@@ -1123,27 +1122,16 @@ xfs_rtallocate_extent(
                }
        }
 
+retry:
        sumbp = NULL;
-       /*
-        * Allocate by size, or near another block, or exactly at some block.
-        */
-       switch (type) {
-       case XFS_ALLOCTYPE_ANY_AG:
+       if (bno == 0) {
                error = xfs_rtallocate_extent_size(mp, tp, minlen, maxlen, len,
                                &sumbp, &sb, prod, &r);
-               break;
-       case XFS_ALLOCTYPE_NEAR_BNO:
+       } else {
                error = xfs_rtallocate_extent_near(mp, tp, bno, minlen, maxlen,
                                len, &sumbp, &sb, prod, &r);
-               break;
-       case XFS_ALLOCTYPE_THIS_BNO:
-               error = xfs_rtallocate_extent_exact(mp, tp, bno, minlen, maxlen,
-                               len, &sumbp, &sb, prod, &r);
-               break;
-       default:
-               error = -EIO;
-               ASSERT(0);
        }
+
        if (error)
                return error;
 
@@ -1158,7 +1146,11 @@ xfs_rtallocate_extent(
                        xfs_trans_mod_sb(tp, XFS_TRANS_SB_RES_FREXTENTS, -slen);
                else
                        xfs_trans_mod_sb(tp, XFS_TRANS_SB_FREXTENTS, -slen);
+       } else if (prod > 1) {
+               prod = 1;
+               goto retry;
        }
+
        *rtblock = r;
        return 0;
 }
index 355dd9e1cb64174b7f4e496b1f4d3ddf6e359c9b..51dd3c7266086d5039e5b77f8ec9ea72c5d95f31 100644 (file)
@@ -40,7 +40,6 @@ xfs_rtallocate_extent(
        xfs_extlen_t            minlen, /* minimum length to allocate */
        xfs_extlen_t            maxlen, /* maximum length to allocate */
        xfs_extlen_t            *len,   /* out: actual length allocated */
-       xfs_alloctype_t         type,   /* allocation type XFS_ALLOCTYPE... */
        int                     wasdel, /* was a delayed allocation extent */
        xfs_extlen_t            prod,   /* extent product factor */
        xfs_rtblock_t           *rtblock); /* out: start block allocated */
@@ -122,7 +121,7 @@ int xfs_rtfree_range(struct xfs_mount *mp, struct xfs_trans *tp,
 
 
 #else
-# define xfs_rtallocate_extent(t,b,min,max,l,a,f,p,rb)  (ENOSYS)
+# define xfs_rtallocate_extent(t,b,min,max,l,f,p,rb)    (ENOSYS)
 # define xfs_rtfree_extent(t,b,l)                       (ENOSYS)
 # define xfs_rtpick_extent(m,t,l,rb)                    (ENOSYS)
 # define xfs_growfs_rt(mp,in)                           (ENOSYS)