diff mbox

xfs: store rmapbt block count in the AGF

Message ID 20160803023711.GE8593@birch.djwong.org (mailing list archive)
State Accepted, archived
Headers show

Commit Message

Darrick J. Wong Aug. 3, 2016, 2:37 a.m. UTC
Track the number of blocks used for the rmapbt in the AGF.  When we
get to the AG reservation code we need this counter to quickly
make our reservation during mount.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 fs/xfs/libxfs/xfs_alloc.c      |    1 +
 fs/xfs/libxfs/xfs_format.h     |   11 ++++++++---
 fs/xfs/libxfs/xfs_rmap_btree.c |    6 ++++++
 3 files changed, 15 insertions(+), 3 deletions(-)

Comments

Darrick J. Wong Aug. 3, 2016, 9:47 p.m. UTC | #1
<grumble> Ok, let's try this again, but this time with the chunk we
need for growfs actually included in the commit.  Someone forgot to
run 'stg ref'.  v2 patch (and xfsprogs stuff) will be out shortly.

--D

On Tue, Aug 02, 2016 at 07:37:11PM -0700, Darrick J. Wong wrote:
> Track the number of blocks used for the rmapbt in the AGF.  When we
> get to the AG reservation code we need this counter to quickly
> make our reservation during mount.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
>  fs/xfs/libxfs/xfs_alloc.c      |    1 +
>  fs/xfs/libxfs/xfs_format.h     |   11 ++++++++---
>  fs/xfs/libxfs/xfs_rmap_btree.c |    6 ++++++
>  3 files changed, 15 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c
> index 776ae2f..af1a72e 100644
> --- a/fs/xfs/libxfs/xfs_alloc.c
> +++ b/fs/xfs/libxfs/xfs_alloc.c
> @@ -2264,6 +2264,7 @@ xfs_alloc_log_agf(
>  		offsetof(xfs_agf_t, agf_longest),
>  		offsetof(xfs_agf_t, agf_btreeblks),
>  		offsetof(xfs_agf_t, agf_uuid),
> +		offsetof(xfs_agf_t, agf_rmap_blocks),
>  		sizeof(xfs_agf_t)
>  	};
>  
> diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h
> index f814d42..e6a8bea 100644
> --- a/fs/xfs/libxfs/xfs_format.h
> +++ b/fs/xfs/libxfs/xfs_format.h
> @@ -640,12 +640,15 @@ typedef struct xfs_agf {
>  	__be32		agf_btreeblks;	/* # of blocks held in AGF btrees */
>  	uuid_t		agf_uuid;	/* uuid of filesystem */
>  
> +	__be32		agf_rmap_blocks;	/* rmapbt blocks used */
> +	__be32		agf_padding;		/* padding */
> +
>  	/*
>  	 * reserve some contiguous space for future logged fields before we add
>  	 * the unlogged fields. This makes the range logging via flags and
>  	 * structure offsets much simpler.
>  	 */
> -	__be64		agf_spare64[16];
> +	__be64		agf_spare64[15];
>  
>  	/* unlogged fields, written during buffer writeback. */
>  	__be64		agf_lsn;	/* last write sequence */
> @@ -670,7 +673,8 @@ typedef struct xfs_agf {
>  #define	XFS_AGF_LONGEST		0x00000400
>  #define	XFS_AGF_BTREEBLKS	0x00000800
>  #define	XFS_AGF_UUID		0x00001000
> -#define	XFS_AGF_NUM_BITS	13
> +#define	XFS_AGF_RMAP_BLOCKS	0x00002000
> +#define	XFS_AGF_NUM_BITS	14
>  #define	XFS_AGF_ALL_BITS	((1 << XFS_AGF_NUM_BITS) - 1)
>  
>  #define XFS_AGF_FLAGS \
> @@ -686,7 +690,8 @@ typedef struct xfs_agf {
>  	{ XFS_AGF_FREEBLKS,	"FREEBLKS" }, \
>  	{ XFS_AGF_LONGEST,	"LONGEST" }, \
>  	{ XFS_AGF_BTREEBLKS,	"BTREEBLKS" }, \
> -	{ XFS_AGF_UUID,		"UUID" }
> +	{ XFS_AGF_UUID,		"UUID" }, \
> +	{ XFS_AGF_RMAP_BLOCKS,	"RMAP_BLOCKS" }
>  
>  /* disk block (xfs_daddr_t) in the AG */
>  #define XFS_AGF_DADDR(mp)	((xfs_daddr_t)(1 << (mp)->m_sectbb_log))
> diff --git a/fs/xfs/libxfs/xfs_rmap_btree.c b/fs/xfs/libxfs/xfs_rmap_btree.c
> index bc1faeb..17b8eeb 100644
> --- a/fs/xfs/libxfs/xfs_rmap_btree.c
> +++ b/fs/xfs/libxfs/xfs_rmap_btree.c
> @@ -98,6 +98,8 @@ xfs_rmapbt_alloc_block(
>  	union xfs_btree_ptr	*new,
>  	int			*stat)
>  {
> +	struct xfs_buf		*agbp = cur->bc_private.a.agbp;
> +	struct xfs_agf		*agf = XFS_BUF_TO_AGF(agbp);
>  	int			error;
>  	xfs_agblock_t		bno;
>  
> @@ -124,6 +126,8 @@ xfs_rmapbt_alloc_block(
>  
>  	xfs_trans_agbtree_delta(cur->bc_tp, 1);
>  	new->s = cpu_to_be32(bno);
> +	be32_add_cpu(&agf->agf_rmap_blocks, 1);
> +	xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_RMAP_BLOCKS);
>  
>  	XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT);
>  	*stat = 1;
> @@ -143,6 +147,8 @@ xfs_rmapbt_free_block(
>  	bno = xfs_daddr_to_agbno(cur->bc_mp, XFS_BUF_ADDR(bp));
>  	trace_xfs_rmapbt_free_block(cur->bc_mp, cur->bc_private.a.agno,
>  			bno, 1);
> +	be32_add_cpu(&agf->agf_rmap_blocks, -1);
> +	xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_RMAP_BLOCKS);
>  	error = xfs_alloc_put_freelist(cur->bc_tp, agbp, NULL, bno, 1);
>  	if (error)
>  		return error;
> 
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs
diff mbox

Patch

diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c
index 776ae2f..af1a72e 100644
--- a/fs/xfs/libxfs/xfs_alloc.c
+++ b/fs/xfs/libxfs/xfs_alloc.c
@@ -2264,6 +2264,7 @@  xfs_alloc_log_agf(
 		offsetof(xfs_agf_t, agf_longest),
 		offsetof(xfs_agf_t, agf_btreeblks),
 		offsetof(xfs_agf_t, agf_uuid),
+		offsetof(xfs_agf_t, agf_rmap_blocks),
 		sizeof(xfs_agf_t)
 	};
 
diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h
index f814d42..e6a8bea 100644
--- a/fs/xfs/libxfs/xfs_format.h
+++ b/fs/xfs/libxfs/xfs_format.h
@@ -640,12 +640,15 @@  typedef struct xfs_agf {
 	__be32		agf_btreeblks;	/* # of blocks held in AGF btrees */
 	uuid_t		agf_uuid;	/* uuid of filesystem */
 
+	__be32		agf_rmap_blocks;	/* rmapbt blocks used */
+	__be32		agf_padding;		/* padding */
+
 	/*
 	 * reserve some contiguous space for future logged fields before we add
 	 * the unlogged fields. This makes the range logging via flags and
 	 * structure offsets much simpler.
 	 */
-	__be64		agf_spare64[16];
+	__be64		agf_spare64[15];
 
 	/* unlogged fields, written during buffer writeback. */
 	__be64		agf_lsn;	/* last write sequence */
@@ -670,7 +673,8 @@  typedef struct xfs_agf {
 #define	XFS_AGF_LONGEST		0x00000400
 #define	XFS_AGF_BTREEBLKS	0x00000800
 #define	XFS_AGF_UUID		0x00001000
-#define	XFS_AGF_NUM_BITS	13
+#define	XFS_AGF_RMAP_BLOCKS	0x00002000
+#define	XFS_AGF_NUM_BITS	14
 #define	XFS_AGF_ALL_BITS	((1 << XFS_AGF_NUM_BITS) - 1)
 
 #define XFS_AGF_FLAGS \
@@ -686,7 +690,8 @@  typedef struct xfs_agf {
 	{ XFS_AGF_FREEBLKS,	"FREEBLKS" }, \
 	{ XFS_AGF_LONGEST,	"LONGEST" }, \
 	{ XFS_AGF_BTREEBLKS,	"BTREEBLKS" }, \
-	{ XFS_AGF_UUID,		"UUID" }
+	{ XFS_AGF_UUID,		"UUID" }, \
+	{ XFS_AGF_RMAP_BLOCKS,	"RMAP_BLOCKS" }
 
 /* disk block (xfs_daddr_t) in the AG */
 #define XFS_AGF_DADDR(mp)	((xfs_daddr_t)(1 << (mp)->m_sectbb_log))
diff --git a/fs/xfs/libxfs/xfs_rmap_btree.c b/fs/xfs/libxfs/xfs_rmap_btree.c
index bc1faeb..17b8eeb 100644
--- a/fs/xfs/libxfs/xfs_rmap_btree.c
+++ b/fs/xfs/libxfs/xfs_rmap_btree.c
@@ -98,6 +98,8 @@  xfs_rmapbt_alloc_block(
 	union xfs_btree_ptr	*new,
 	int			*stat)
 {
+	struct xfs_buf		*agbp = cur->bc_private.a.agbp;
+	struct xfs_agf		*agf = XFS_BUF_TO_AGF(agbp);
 	int			error;
 	xfs_agblock_t		bno;
 
@@ -124,6 +126,8 @@  xfs_rmapbt_alloc_block(
 
 	xfs_trans_agbtree_delta(cur->bc_tp, 1);
 	new->s = cpu_to_be32(bno);
+	be32_add_cpu(&agf->agf_rmap_blocks, 1);
+	xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_RMAP_BLOCKS);
 
 	XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT);
 	*stat = 1;
@@ -143,6 +147,8 @@  xfs_rmapbt_free_block(
 	bno = xfs_daddr_to_agbno(cur->bc_mp, XFS_BUF_ADDR(bp));
 	trace_xfs_rmapbt_free_block(cur->bc_mp, cur->bc_private.a.agno,
 			bno, 1);
+	be32_add_cpu(&agf->agf_rmap_blocks, -1);
+	xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_RMAP_BLOCKS);
 	error = xfs_alloc_put_freelist(cur->bc_tp, agbp, NULL, bno, 1);
 	if (error)
 		return error;