linux-xfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Brian Foster <bfoster@redhat.com>
To: xfs@oss.sgi.com
Subject: [PATCH v3 05/20] xfs: insert newly allocated inode chunks into the finobt
Date: Thu, 10 Apr 2014 12:10:55 -0400	[thread overview]
Message-ID: <1397146270-42993-6-git-send-email-bfoster@redhat.com> (raw)
In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com>

A newly allocated inode chunk, by definition, has at least one
free inode, so a record is always inserted into the finobt.

Create the xfs_inobt_insert() helper from existing code to insert
a record in an inobt based on the provided BTNUM. Update
xfs_ialloc_ag_alloc() to invoke the helper for the existing
XFS_BTNUM_INO tree and XFS_BTNUM_FINO tree, if enabled.

Signed-off-by: Brian Foster <bfoster@redhat.com>
---
 libxfs/xfs_ialloc.c | 93 ++++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 70 insertions(+), 23 deletions(-)

diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c
index 4a7746a..c5759aa 100644
--- a/libxfs/xfs_ialloc.c
+++ b/libxfs/xfs_ialloc.c
@@ -88,6 +88,66 @@ xfs_inobt_get_rec(
 }
 
 /*
+ * Insert a single inobt record. Cursor must already point to desired location.
+ */
+STATIC int
+xfs_inobt_insert_rec(
+	struct xfs_btree_cur	*cur,
+	__int32_t		freecount,
+	xfs_inofree_t		free,
+	int			*stat)
+{
+	cur->bc_rec.i.ir_freecount = freecount;
+	cur->bc_rec.i.ir_free = free;
+	return xfs_btree_insert(cur, stat);
+}
+
+/*
+ * Insert records describing a newly allocated inode chunk into the inobt.
+ */
+STATIC int
+xfs_inobt_insert(
+	struct xfs_mount	*mp,
+	struct xfs_trans	*tp,
+	struct xfs_buf		*agbp,
+	xfs_agino_t		newino,
+	xfs_agino_t		newlen,
+	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_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);
+	}
+
+	xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);
+
+	return 0;
+}
+
+/*
  * Verify that the number of free inodes in the AGI is correct.
  */
 #ifdef DEBUG
@@ -286,13 +346,10 @@ xfs_ialloc_ag_alloc(
 {
 	xfs_agi_t	*agi;		/* allocation group header */
 	xfs_alloc_arg_t	args;		/* allocation argument structure */
-	xfs_btree_cur_t	*cur;		/* inode btree cursor */
 	xfs_agnumber_t	agno;
 	int		error;
-	int		i;
 	xfs_agino_t	newino;		/* new first inode's number */
 	xfs_agino_t	newlen;		/* new number of inodes */
-	xfs_agino_t	thisino;	/* current inode number, for loop */
 	int		isaligned = 0;	/* inode allocation at stripe unit */
 					/* boundary */
 	struct xfs_perag *pag;
@@ -430,29 +487,19 @@ xfs_ialloc_ag_alloc(
 	agi->agi_newino = cpu_to_be32(newino);
 
 	/*
-	 * Insert records describing the new inode chunk into the btree.
+	 * Insert records describing the new inode chunk into the btrees.
 	 */
-	cur = xfs_inobt_init_cursor(args.mp, tp, agbp, agno, XFS_BTNUM_INO);
-	for (thisino = newino;
-	     thisino < newino + newlen;
-	     thisino += XFS_INODES_PER_CHUNK) {
-		cur->bc_rec.i.ir_startino = thisino;
-		cur->bc_rec.i.ir_freecount = XFS_INODES_PER_CHUNK;
-		cur->bc_rec.i.ir_free = XFS_INOBT_ALL_FREE;
-		error = xfs_btree_lookup(cur, XFS_LOOKUP_EQ, &i);
-		if (error) {
-			xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);
-			return error;
-		}
-		ASSERT(i == 0);
-		error = xfs_btree_insert(cur, &i);
-		if (error) {
-			xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);
+	error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen,
+				 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);
+		if (error)
 			return error;
-		}
-		ASSERT(i == 1);
 	}
-	xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);
 	/*
 	 * Log allocation group header fields
 	 */
-- 
1.8.3.1

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

  parent reply	other threads:[~2014-04-10 16:11 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-10 16:10 [PATCH v3 00/20] xfsprogs: introduce the free inode btree Brian Foster
2014-04-10 16:10 ` [PATCH v3 01/20] xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers Brian Foster
2014-04-10 16:10 ` [PATCH v3 02/20] xfs: reserve v5 superblock read-only compat. feature bit for finobt Brian Foster
2014-04-10 16:10 ` [PATCH v3 03/20] xfs: support the XFS_BTNUM_FINOBT free inode btree type Brian Foster
2014-04-10 16:10 ` [PATCH v3 04/20] xfs: update inode allocation/free transaction reservations for finobt Brian Foster
2014-04-10 16:10 ` Brian Foster [this message]
2014-04-10 16:10 ` [PATCH v3 06/20] xfs: use and update the finobt on inode allocation Brian Foster
2014-04-10 16:10 ` [PATCH v3 07/20] xfs: refactor xfs_difree() inobt bits into xfs_difree_inobt() helper Brian Foster
2014-04-10 16:10 ` [PATCH v3 08/20] xfs: update the finobt on inode free Brian Foster
2014-04-10 16:10 ` [PATCH v3 09/20] xfs: report finobt status in fs geometry Brian Foster
2014-04-10 16:11 ` [PATCH v3 10/20] xfs: enable the finobt feature on v5 superblocks Brian Foster
2014-04-10 16:11 ` [PATCH v3 11/20] xfsprogs/mkfs: finobt mkfs support Brian Foster
2014-04-23  6:03   ` Dave Chinner
2014-04-23 20:01     ` Brian Foster
2014-04-10 16:11 ` [PATCH v3 12/20] xfsprogs/db: finobt support Brian Foster
2014-04-10 16:11 ` [PATCH v3 13/20] xfsprogs/repair: account for finobt in ag 0 geometry pre-calculation Brian Foster
2014-04-23  6:12   ` Dave Chinner
2014-04-23 20:02     ` Brian Foster
2014-04-23 22:53       ` Dave Chinner
2014-04-10 16:11 ` [PATCH v3 14/20] xfsprogs/repair: phase 2 finobt scan Brian Foster
2014-04-23  6:10   ` Dave Chinner
2014-04-23  6:19   ` Dave Chinner
2014-04-23 20:01     ` Brian Foster
2014-04-23 23:06       ` Dave Chinner
2014-04-24  0:39         ` Brian Foster
2014-04-10 16:11 ` [PATCH v3 15/20] xfsprogs/repair: pass btree block magic as param to build_ino_tree() Brian Foster
2014-04-10 16:11 ` [PATCH v3 16/20] xfsprogs/repair: pull the build_agi() call up out of the inode tree build Brian Foster
2014-04-10 16:11 ` [PATCH v3 17/20] xfsprogs/repair: helpers for finding in-core inode records w/ free inodes Brian Foster
2014-04-23  6:24   ` Dave Chinner
2014-04-23 20:02     ` Brian Foster
2014-04-23 22:58       ` Dave Chinner
2014-04-10 16:11 ` [PATCH v3 18/20] xfsprogs/repair: reconstruct the finobt in phase 5 Brian Foster
2014-04-10 16:11 ` [PATCH v3 19/20] xfsprogs/growfs: report finobt status in fs geometry (xfs_info) Brian Foster
2014-04-10 16:11 ` [PATCH v3 20/20] xfsprogs/db: add finobt support to metadump Brian Foster
2014-04-23  6:35 ` [PATCH v3 00/20] xfsprogs: introduce the free inode btree Dave Chinner
2014-04-23 20:02   ` Brian Foster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1397146270-42993-6-git-send-email-bfoster@redhat.com \
    --to=bfoster@redhat.com \
    --cc=xfs@oss.sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).