xfs
[Top] [All Lists]

[PATCH 01/18] xfs: refactor xfs_inobt_insert() to eliminate loop and sup

To: xfs@xxxxxxxxxxx
Subject: [PATCH 01/18] xfs: refactor xfs_inobt_insert() to eliminate loop and support variable count
From: Brian Foster <bfoster@xxxxxxxxxx>
Date: Thu, 24 Jul 2014 10:22:51 -0400
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <1406211788-63206-1-git-send-email-bfoster@xxxxxxxxxx>
References: <1406211788-63206-1-git-send-email-bfoster@xxxxxxxxxx>
Inodes are always allocated in chunks of 64 and thus the loop in
xfs_inobt_insert() is unnecessary. Also replace the use of hardcoded
constants (i.e., XFS_INODES_PER_CHUNK) with values provided by the
caller. This prepares the codepath to support sparse inode chunks, which
might have varying numbers of free inodes.

Signed-off-by: Brian Foster <bfoster@xxxxxxxxxx>
---
 fs/xfs/libxfs/xfs_ialloc.c | 37 ++++++++++++++++---------------------
 1 file changed, 16 insertions(+), 21 deletions(-)

diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c
index b62771f..6e2ccb3 100644
--- a/fs/xfs/libxfs/xfs_ialloc.c
+++ b/fs/xfs/libxfs/xfs_ialloc.c
@@ -134,37 +134,32 @@ xfs_inobt_insert(
        struct xfs_mount        *mp,
        struct xfs_trans        *tp,
        struct xfs_buf          *agbp,
-       xfs_agino_t             newino,
-       xfs_agino_t             newlen,
+       xfs_agino_t             newino, /* start inode of record */
+       xfs_agino_t             count,  /* inode count */
+       xfs_inofree_t           free,   /* free mask */
        xfs_btnum_t             btnum)
 {
        struct xfs_btree_cur    *cur;
        struct xfs_agi          *agi = XFS_BUF_TO_AGI(agbp);
        xfs_agnumber_t          agno = be32_to_cpu(agi->agi_seqno);
-       xfs_agino_t             thisino;
        int                     i;
        int                     error;
 
        cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, btnum);
 
-       for (thisino = newino;
-            thisino < newino + newlen;
-            thisino += XFS_INODES_PER_CHUNK) {
-               error = xfs_inobt_lookup(cur, thisino, XFS_LOOKUP_EQ, &i);
-               if (error) {
-                       xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);
-                       return error;
-               }
-               ASSERT(i == 0);
+       error = xfs_inobt_lookup(cur, newino, XFS_LOOKUP_EQ, &i);
+       if (error) {
+               xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);
+               return error;
+       }
+       ASSERT(i == 0);
 
-               error = xfs_inobt_insert_rec(cur, XFS_INODES_PER_CHUNK,
-                                            XFS_INOBT_ALL_FREE, &i);
-               if (error) {
-                       xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);
-                       return error;
-               }
-               ASSERT(i == 1);
+       error = xfs_inobt_insert_rec(cur, count, free, &i);
+       if (error) {
+               xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);
+               return error;
        }
+       ASSERT(i == 1);
 
        xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);
 
@@ -517,13 +512,13 @@ xfs_ialloc_ag_alloc(
         * Insert records describing the new inode chunk into the btrees.
         */
        error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen,
-                                XFS_BTNUM_INO);
+                                XFS_INOBT_ALL_FREE, XFS_BTNUM_INO);
        if (error)
                return error;
 
        if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) {
                error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen,
-                                        XFS_BTNUM_FINO);
+                                        XFS_INOBT_ALL_FREE, XFS_BTNUM_FINO);
                if (error)
                        return error;
        }
-- 
1.8.3.1

<Prev in Thread] Current Thread [Next in Thread>