Linux XFS filesystem development
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@kernel.org>
To: Christoph Hellwig <hch@lst.de>
Cc: Andrey Albershteyn <aalbersh@kernel.org>,
	Eric Sandeen <sandeen@redhat.com>,
	Carlos Maiolino <cem@kernel.org>,
	linux-xfs@vger.kernel.org
Subject: Re: [PATCH 13/13] libxfs: use all log item headers from the kernel
Date: Mon, 5 Oct 2026 14:50:12 -0700	[thread overview]
Message-ID: <20261005215012.GS2705364@frogsfrogsfrogs> (raw)
In-Reply-To: <20261005125637.1340355-14-hch@lst.de>

On Mon, Oct 05, 2026 at 02:56:23PM +0200, Christoph Hellwig wrote:
> Wire up all the xfs_*_item.h headers from the kernel instead of
> duplicating the definitions.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>

Can't wait for the log item code to get ported too, though that's a much
bigger lift than the declarations.

Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>

--D

> ---
>  db/logformat.c                           |   4 +
>  include/atomic.h                         |   1 +
>  include/libxfs.h                         |   1 -
>  libxfs/Makefile                          |  10 ++-
>  libxfs/defer_item.c                      |   3 +-
>  libxfs/defer_item.h                      |  56 -------------
>  libxfs/iunlink.c                         |  10 +--
>  libxfs/stubs/xfs_inode.h                 |   8 ++
>  libxfs/trans.c                           |  12 +++
>  libxfs/xfs_alloc.c                       |   2 +-
>  libxfs/xfs_attr.c                        |   2 +-
>  libxfs/xfs_attr_item.h                   |  64 +++++++++++++++
>  libxfs/xfs_bmap.c                        |   2 +-
>  libxfs/xfs_bmap_item.h                   |  78 ++++++++++++++++++
>  libxfs/xfs_exchmaps.c                    |   2 +-
>  libxfs/xfs_exchmaps_item.h               |  64 +++++++++++++++
>  libxfs/xfs_extfree_item.h                | 100 +++++++++++++++++++++++
>  libxfs/xfs_ialloc.c                      |   1 +
>  libxfs/xfs_icreate_item.h                |  22 +++++
>  libxfs/xfs_inode_util.c                  |   3 +-
>  libxfs/{iunlink.h => xfs_iunlink_item.h} |  17 ++--
>  libxfs/xfs_parent.c                      |   2 +-
>  libxfs/xfs_platform.h                    |   1 -
>  libxfs/xfs_refcount.c                    |   2 +-
>  libxfs/xfs_refcount_item.h               |  82 +++++++++++++++++++
>  libxfs/xfs_rmap.c                        |   2 +-
>  libxfs/xfs_rmap_item.h                   |  81 ++++++++++++++++++
>  libxfs/xfs_trans_resv.c                  |   7 +-
>  28 files changed, 551 insertions(+), 88 deletions(-)
>  delete mode 100644 libxfs/defer_item.h
>  create mode 100644 libxfs/xfs_attr_item.h
>  create mode 100644 libxfs/xfs_bmap_item.h
>  create mode 100644 libxfs/xfs_exchmaps_item.h
>  create mode 100644 libxfs/xfs_extfree_item.h
>  create mode 100644 libxfs/xfs_icreate_item.h
>  rename libxfs/{iunlink.h => xfs_iunlink_item.h} (61%)
>  create mode 100644 libxfs/xfs_refcount_item.h
>  create mode 100644 libxfs/xfs_rmap_item.h
> 
> diff --git a/db/logformat.c b/db/logformat.c
> index aba5b0b1b050..5d3d818d5575 100644
> --- a/db/logformat.c
> +++ b/db/logformat.c
> @@ -10,6 +10,10 @@
>  #include "output.h"
>  #include "libxlog.h"
>  #include "logformat.h"
> +#include "xfs_extfree_item.h"
> +#include "xfs_bmap_item.h"
> +#include "xfs_rmap_item.h"
> +#include "xfs_refcount_item.h"
>  
>  #define MAX_LSUNIT	256 * 1024	/* max log buf. size */
>  
> diff --git a/include/atomic.h b/include/atomic.h
> index 3b7eabd0faa7..ee2161fdf9cc 100644
> --- a/include/atomic.h
> +++ b/include/atomic.h
> @@ -18,6 +18,7 @@
>  #include <urcu/uatomic.h>
>  #include "spinlock.h"
>  
> +typedef	int32_t	refcount_t;
>  typedef	int32_t	atomic_t;
>  typedef	int64_t	atomic64_t;
>  
> diff --git a/include/libxfs.h b/include/libxfs.h
> index 549176cf0b2c..e28b79d80143 100644
> --- a/include/libxfs.h
> +++ b/include/libxfs.h
> @@ -105,7 +105,6 @@ struct iomap;
>  #include "xfs_rtbitmap.h"
>  #include "xfs_rtrmap_btree.h"
>  #include "xfs_ag_resv.h"
> -#include "defer_item.h"
>  
>  #ifndef ARRAY_SIZE
>  #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
> diff --git a/libxfs/Makefile b/libxfs/Makefile
> index ac7ddac5acec..df11c119c465 100644
> --- a/libxfs/Makefile
> +++ b/libxfs/Makefile
> @@ -20,12 +20,10 @@ PKGHFILES = xfs_fs.h \
>  	xfs_log_format.h
>  
>  HFILES = \
> -	defer_item.h \
>  	libxfs_io.h \
>  	libxfs_api_defs.h \
>  	listxattr.h \
>  	init.h \
> -	iunlink.h \
>  	xfs_platform.h \
>  	linux-err.h \
>  	topology.h \
> @@ -35,10 +33,12 @@ HFILES = \
>  	xfs_alloc.h \
>  	xfs_alloc_btree.h \
>  	xfs_attr_leaf.h \
> +	xfs_attr_item.h \
>  	xfs_attr_sf.h \
>  	xfs_bit.h \
>  	xfs_buf_item.h \
>  	xfs_bmap.h \
> +	xfs_bmap_item.h \
>  	xfs_bmap_btree.h \
>  	xfs_btree.h \
>  	xfs_btree_mem.h \
> @@ -50,13 +50,17 @@ HFILES = \
>  	xfs_dir2_priv.h \
>  	xfs_errortag.h \
>  	xfs_exchmaps.h \
> +	xfs_exchmaps_item.h \
> +	xfs_extfree_item.h \
>  	xfs_group.h \
>  	xfs_ialloc.h \
>  	xfs_ialloc_btree.h \
> +	xfs_icreate_item.h \
>  	xfs_inode_buf.h \
>  	xfs_inode_fork.h \
>  	xfs_inode_item.h \
>  	xfs_inode_util.h \
> +	xfs_iunlink_item.h \
>  	xfs_log_recover.h \
>  	xfs_metadir.h \
>  	xfs_metafile.h \
> @@ -64,9 +68,11 @@ HFILES = \
>  	xfs_quota_defs.h \
>  	xfs_refcount.h \
>  	xfs_refcount_btree.h \
> +	xfs_refcount_item.h \
>  	xfs_rtrefcount_btree.h \
>  	xfs_rmap.h \
>  	xfs_rmap_btree.h \
> +	xfs_rmap_item.h \
>  	xfs_rtbitmap.h \
>  	xfs_rtgroup.h \
>  	xfs_rtrmap_btree.h \
> diff --git a/libxfs/defer_item.c b/libxfs/defer_item.c
> index fada5b6db2a6..72d79b10d820 100644
> --- a/libxfs/defer_item.c
> +++ b/libxfs/defer_item.c
> @@ -25,12 +25,11 @@
>  #include "xfs_da_btree.h"
>  #include "xfs_attr.h"
>  #include "libxfs.h"
> -#include "defer_item.h"
>  #include "xfs_ag.h"
>  #include "xfs_exchmaps.h"
> -#include "defer_item.h"
>  #include "xfs_group.h"
>  #include "xfs_rtgroup.h"
> +#include "xfs_attr_item.h"
>  
>  /* Dummy defer item ops, since we don't do logging. */
>  
> diff --git a/libxfs/defer_item.h b/libxfs/defer_item.h
> deleted file mode 100644
> index 325a6f7b2dcb..000000000000
> --- a/libxfs/defer_item.h
> +++ /dev/null
> @@ -1,56 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-or-later
> -/*
> - * Copyright (c) 2023-2024 Oracle.  All Rights Reserved.
> - * Author: Darrick J. Wong <djwong@kernel.org>
> - */
> -#ifndef	__LIBXFS_DEFER_ITEM_H_
> -#define	__LIBXFS_DEFER_ITEM_H_
> -
> -struct xfs_bmap_intent;
> -
> -void xfs_bmap_defer_add(struct xfs_trans *tp, struct xfs_bmap_intent *bi);
> -
> -enum xfs_attr_defer_op {
> -	XFS_ATTR_DEFER_SET,
> -	XFS_ATTR_DEFER_REMOVE,
> -	XFS_ATTR_DEFER_REPLACE,
> -};
> -
> -void xfs_attr_defer_add(struct xfs_da_args *args, enum xfs_attr_defer_op op);
> -
> -struct xfs_exchmaps_intent;
> -
> -void xfs_exchmaps_defer_add(struct xfs_trans *tp,
> -		struct xfs_exchmaps_intent *xmi);
> -
> -struct xfs_extent_free_item;
> -struct xfs_defer_pending;
> -
> -void xfs_extent_free_defer_add(struct xfs_trans *tp,
> -		struct xfs_extent_free_item *xefi,
> -		struct xfs_defer_pending **dfpp);
> -
> -struct xfs_rmap_intent;
> -
> -void xfs_rmap_defer_add(struct xfs_trans *tp, struct xfs_rmap_intent *ri);
> -
> -struct xfs_refcount_intent;
> -
> -void xfs_refcount_defer_add(struct xfs_trans *tp,
> -		struct xfs_refcount_intent *ri);
> -
> -/* log intent size calculations */
> -
> -unsigned int xfs_efi_log_space(unsigned int nr);
> -unsigned int xfs_efd_log_space(unsigned int nr);
> -
> -unsigned int xfs_rui_log_space(unsigned int nr);
> -unsigned int xfs_rud_log_space(void);
> -
> -unsigned int xfs_bui_log_space(unsigned int nr);
> -unsigned int xfs_bud_log_space(void);
> -
> -unsigned int xfs_cui_log_space(unsigned int nr);
> -unsigned int xfs_cud_log_space(void);
> -
> -#endif /* __LIBXFS_DEFER_ITEM_H_ */
> diff --git a/libxfs/iunlink.c b/libxfs/iunlink.c
> index 875e0caae988..8008c24a87a5 100644
> --- a/libxfs/iunlink.c
> +++ b/libxfs/iunlink.c
> @@ -17,17 +17,9 @@
>  #include "xfs_inode.h"
>  #include "xfs_trans.h"
>  #include "xfs_ag.h"
> -#include "iunlink.h"
> +#include "xfs_iunlink_item.h"
>  #include "xfs_trace.h"
>  
> -/* in memory log item structure */
> -struct xfs_iunlink_item {
> -	struct xfs_inode	*ip;
> -	struct xfs_perag	*pag;
> -	xfs_agino_t		next_agino;
> -	xfs_agino_t		old_agino;
> -};
> -
>  /*
>   * Look up the inode cluster buffer and log the on-disk unlinked inode change
>   * we need to make.
> diff --git a/libxfs/stubs/xfs_inode.h b/libxfs/stubs/xfs_inode.h
> index 0292beecf903..e6cfdd22c323 100644
> --- a/libxfs/stubs/xfs_inode.h
> +++ b/libxfs/stubs/xfs_inode.h
> @@ -442,4 +442,12 @@ extern void	libxfs_irele(struct xfs_inode *ip);
>  #define xfs_inherit_nosymlinks		(false)
>  #define xfs_inherit_nodefrag		(false)
>  
> +static inline struct xfs_inode *
> +xfs_iunlink_lookup(struct xfs_perag *pag, xfs_agino_t agino)
> +{
> +	return NULL;
> +}
> +int xfs_iunlink_reload_next(struct xfs_trans *tp, struct xfs_buf *agibp,
> +		xfs_agino_t prev_agino, xfs_agino_t next_agino);
> +
>  #endif /* __XFS_INODE_H__ */
> diff --git a/libxfs/trans.c b/libxfs/trans.c
> index 25015ad2795c..c71c9111187f 100644
> --- a/libxfs/trans.c
> +++ b/libxfs/trans.c
> @@ -1315,3 +1315,15 @@ out_blocks:
>  
>  	return error;
>  }
> +
> +void
> +xfs_icreate_log(
> +	struct xfs_trans	*tp,
> +	xfs_agnumber_t		agno,
> +	xfs_agblock_t		agbno,
> +	unsigned int		count,
> +	unsigned int		inode_size,
> +	xfs_agblock_t		length,
> +	unsigned int		generation)
> +{
> +}
> diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c
> index 8feaa0edace1..d99602bcc16f 100644
> --- a/libxfs/xfs_alloc.c
> +++ b/libxfs/xfs_alloc.c
> @@ -27,7 +27,7 @@
>  #include "xfs_ag_resv.h"
>  #include "xfs_bmap.h"
>  #include "xfs_health.h"
> -#include "defer_item.h"
> +#include "xfs_extfree_item.h"
>  
>  struct kmem_cache	*xfs_extfree_item_cache;
>  
> diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c
> index 57a0a175c286..aaf1f9f83c20 100644
> --- a/libxfs/xfs_attr.c
> +++ b/libxfs/xfs_attr.c
> @@ -24,7 +24,7 @@
>  #include "xfs_quota.h"
>  #include "xfs_trans_space.h"
>  #include "xfs_trace.h"
> -#include "defer_item.h"
> +#include "xfs_attr_item.h"
>  #include "xfs_parent.h"
>  
>  struct kmem_cache		*xfs_attr_intent_cache;
> diff --git a/libxfs/xfs_attr_item.h b/libxfs/xfs_attr_item.h
> new file mode 100644
> index 000000000000..d108a11b55ae
> --- /dev/null
> +++ b/libxfs/xfs_attr_item.h
> @@ -0,0 +1,64 @@
> +/* SPDX-License-Identifier: GPL-2.0-or-later
> + *
> + * Copyright (C) 2022 Oracle.  All Rights Reserved.
> + * Author: Allison Henderson <allison.henderson@oracle.com>
> + */
> +#ifndef	__XFS_ATTR_ITEM_H__
> +#define	__XFS_ATTR_ITEM_H__
> +
> +/* kernel only ATTRI/ATTRD definitions */
> +
> +struct xfs_mount;
> +struct kmem_zone;
> +
> +struct xfs_attri_log_nameval {
> +	struct kvec		name;
> +	struct kvec		new_name;	/* PPTR_REPLACE only */
> +	struct kvec		value;
> +	struct kvec		new_value;	/* PPTR_REPLACE only */
> +	refcount_t		refcount;
> +
> +	/* name and value follow the end of this struct */
> +};
> +
> +/*
> + * This is the "attr intention" log item.  It is used to log the fact that some
> + * extended attribute operations need to be processed.  An operation is
> + * currently either a set or remove.  Set or remove operations are described by
> + * the xfs_attr_intent which may be logged to this intent.
> + *
> + * During a normal attr operation, name and value point to the name and value
> + * fields of the caller's xfs_da_args structure.  During a recovery, the name
> + * and value buffers are copied from the log, and stored in a trailing buffer
> + * attached to the xfs_attr_intent until they are committed.  They are freed
> + * when the xfs_attr_intent itself is freed when the work is done.
> + */
> +struct xfs_attri_log_item {
> +	struct xfs_log_item		attri_item;
> +	atomic_t			attri_refcount;
> +	struct xfs_attri_log_nameval	*attri_nameval;
> +	struct xfs_attri_log_format	attri_format;
> +};
> +
> +/*
> + * This is the "attr done" log item.  It is used to log the fact that some attrs
> + * earlier mentioned in an attri item have been freed.
> + */
> +struct xfs_attrd_log_item {
> +	struct xfs_log_item		attrd_item;
> +	struct xfs_attri_log_item	*attrd_attrip;
> +	struct xfs_attrd_log_format	attrd_format;
> +};
> +
> +extern struct kmem_cache	*xfs_attri_cache;
> +extern struct kmem_cache	*xfs_attrd_cache;
> +
> +enum xfs_attr_defer_op {
> +	XFS_ATTR_DEFER_SET,
> +	XFS_ATTR_DEFER_REMOVE,
> +	XFS_ATTR_DEFER_REPLACE,
> +};
> +
> +void xfs_attr_defer_add(struct xfs_da_args *args, enum xfs_attr_defer_op op);
> +
> +#endif	/* __XFS_ATTR_ITEM_H__ */
> diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c
> index 18308d65f92d..148d036bab67 100644
> --- a/libxfs/xfs_bmap.c
> +++ b/libxfs/xfs_bmap.c
> @@ -33,7 +33,7 @@
>  #include "xfs_ag_resv.h"
>  #include "xfs_refcount.h"
>  #include "xfs_health.h"
> -#include "defer_item.h"
> +#include "xfs_bmap_item.h"
>  #include "xfs_symlink_remote.h"
>  #include "xfs_inode_util.h"
>  #include "xfs_rtgroup.h"
> diff --git a/libxfs/xfs_bmap_item.h b/libxfs/xfs_bmap_item.h
> new file mode 100644
> index 000000000000..b42fee06899d
> --- /dev/null
> +++ b/libxfs/xfs_bmap_item.h
> @@ -0,0 +1,78 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2016 Oracle.  All Rights Reserved.
> + * Author: Darrick J. Wong <darrick.wong@oracle.com>
> + */
> +#ifndef	__XFS_BMAP_ITEM_H__
> +#define	__XFS_BMAP_ITEM_H__
> +
> +/*
> + * There are (currently) two pairs of bmap btree redo item types: map & unmap.
> + * The common abbreviations for these are BUI (bmap update intent) and BUD
> + * (bmap update done).  The redo item type is encoded in the flags field of
> + * each xfs_map_extent.
> + *
> + * *I items should be recorded in the *first* of a series of rolled
> + * transactions, and the *D items should be recorded in the same transaction
> + * that records the associated bmbt updates.
> + *
> + * Should the system crash after the commit of the first transaction but
> + * before the commit of the final transaction in a series, log recovery will
> + * use the redo information recorded by the intent items to replay the
> + * bmbt metadata updates in the non-first transaction.
> + */
> +
> +/* kernel only BUI/BUD definitions */
> +
> +struct xfs_mount;
> +struct kmem_cache;
> +
> +/*
> + * Max number of extents in fast allocation path.
> + */
> +#define	XFS_BUI_MAX_FAST_EXTENTS	1
> +
> +/*
> + * This is the "bmap update intent" log item.  It is used to log the fact that
> + * some reverse mappings need to change.  It is used in conjunction with the
> + * "bmap update done" log item described below.
> + *
> + * These log items follow the same rules as struct xfs_efi_log_item; see the
> + * comments about that structure (in xfs_extfree_item.h) for more details.
> + */
> +struct xfs_bui_log_item {
> +	struct xfs_log_item		bui_item;
> +	atomic_t			bui_refcount;
> +	atomic_t			bui_next_extent;
> +	struct xfs_bui_log_format	bui_format;
> +};
> +
> +static inline size_t
> +xfs_bui_log_item_sizeof(
> +	unsigned int		nr)
> +{
> +	return offsetof(struct xfs_bui_log_item, bui_format) +
> +			xfs_bui_log_format_sizeof(nr);
> +}
> +
> +/*
> + * This is the "bmap update done" log item.  It is used to log the fact that
> + * some bmbt updates mentioned in an earlier bui item have been performed.
> + */
> +struct xfs_bud_log_item {
> +	struct xfs_log_item		bud_item;
> +	struct xfs_bui_log_item		*bud_buip;
> +	struct xfs_bud_log_format	bud_format;
> +};
> +
> +extern struct kmem_cache	*xfs_bui_cache;
> +extern struct kmem_cache	*xfs_bud_cache;
> +
> +struct xfs_bmap_intent;
> +
> +void xfs_bmap_defer_add(struct xfs_trans *tp, struct xfs_bmap_intent *bi);
> +
> +unsigned int xfs_bui_log_space(unsigned int nr);
> +unsigned int xfs_bud_log_space(void);
> +
> +#endif	/* __XFS_BMAP_ITEM_H__ */
> diff --git a/libxfs/xfs_exchmaps.c b/libxfs/xfs_exchmaps.c
> index 7d6f949aa1f3..114463c101d6 100644
> --- a/libxfs/xfs_exchmaps.c
> +++ b/libxfs/xfs_exchmaps.c
> @@ -22,7 +22,7 @@
>  #include "xfs_error.h"
>  #include "xfs_errortag.h"
>  #include "xfs_health.h"
> -#include "defer_item.h"
> +#include "xfs_exchmaps_item.h"
>  #include "xfs_da_format.h"
>  #include "xfs_da_btree.h"
>  #include "xfs_attr_leaf.h"
> diff --git a/libxfs/xfs_exchmaps_item.h b/libxfs/xfs_exchmaps_item.h
> new file mode 100644
> index 000000000000..efa368d25d09
> --- /dev/null
> +++ b/libxfs/xfs_exchmaps_item.h
> @@ -0,0 +1,64 @@
> +/* SPDX-License-Identifier: GPL-2.0-or-later */
> +/*
> + * Copyright (c) 2020-2024 Oracle.  All Rights Reserved.
> + * Author: Darrick J. Wong <djwong@kernel.org>
> + */
> +#ifndef	__XFS_EXCHMAPS_ITEM_H__
> +#define	__XFS_EXCHMAPS_ITEM_H__
> +
> +/*
> + * The file mapping exchange intent item helps us exchange multiple file
> + * mappings between two inode forks.  It does this by tracking the range of
> + * file block offsets that still need to be exchanged, and relogs as progress
> + * happens.
> + *
> + * *I items should be recorded in the *first* of a series of rolled
> + * transactions, and the *D items should be recorded in the same transaction
> + * that records the associated bmbt updates.
> + *
> + * Should the system crash after the commit of the first transaction but
> + * before the commit of the final transaction in a series, log recovery will
> + * use the redo information recorded by the intent items to replay the
> + * rest of the mapping exchanges.
> + */
> +
> +/* kernel only XMI/XMD definitions */
> +
> +struct xfs_mount;
> +struct kmem_cache;
> +
> +/*
> + * This is the incore file mapping exchange intent log item.  It is used to log
> + * the fact that we are exchanging mappings between two files.  It is used in
> + * conjunction with the incore file mapping exchange done log item described
> + * below.
> + *
> + * These log items follow the same rules as struct xfs_efi_log_item; see the
> + * comments about that structure (in xfs_extfree_item.h) for more details.
> + */
> +struct xfs_xmi_log_item {
> +	struct xfs_log_item		xmi_item;
> +	atomic_t			xmi_refcount;
> +	struct xfs_xmi_log_format	xmi_format;
> +};
> +
> +/*
> + * This is the incore file mapping exchange done log item.  It is used to log
> + * the fact that an exchange mentioned in an earlier xmi item have been
> + * performed.
> + */
> +struct xfs_xmd_log_item {
> +	struct xfs_log_item		xmd_item;
> +	struct xfs_xmi_log_item		*xmd_intent_log_item;
> +	struct xfs_xmd_log_format	xmd_format;
> +};
> +
> +extern struct kmem_cache	*xfs_xmi_cache;
> +extern struct kmem_cache	*xfs_xmd_cache;
> +
> +struct xfs_exchmaps_intent;
> +
> +void xfs_exchmaps_defer_add(struct xfs_trans *tp,
> +		struct xfs_exchmaps_intent *xmi);
> +
> +#endif	/* __XFS_EXCHMAPS_ITEM_H__ */
> diff --git a/libxfs/xfs_extfree_item.h b/libxfs/xfs_extfree_item.h
> new file mode 100644
> index 000000000000..af1b0331f7af
> --- /dev/null
> +++ b/libxfs/xfs_extfree_item.h
> @@ -0,0 +1,100 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (c) 2000,2005 Silicon Graphics, Inc.
> + * All Rights Reserved.
> + */
> +#ifndef	__XFS_EXTFREE_ITEM_H__
> +#define	__XFS_EXTFREE_ITEM_H__
> +
> +/* kernel only EFI/EFD definitions */
> +
> +struct xfs_mount;
> +struct kmem_cache;
> +
> +/*
> + * Max number of extents in fast allocation path.
> + */
> +#define	XFS_EFI_MAX_FAST_EXTENTS	16
> +
> +/*
> + * This is the "extent free intention" log item.  It is used to log the fact
> + * that some extents need to be free.  It is used in conjunction with the
> + * "extent free done" log item described below.
> + *
> + * The EFI is reference counted so that it is not freed prior to both the EFI
> + * and EFD being committed and unpinned. This ensures the EFI is inserted into
> + * the AIL even in the event of out of order EFI/EFD processing. In other words,
> + * an EFI is born with two references:
> + *
> + * 	1.) an EFI held reference to track EFI AIL insertion
> + * 	2.) an EFD held reference to track EFD commit
> + *
> + * On allocation, both references are the responsibility of the caller. Once the
> + * EFI is added to and dirtied in a transaction, ownership of reference one
> + * transfers to the transaction. The reference is dropped once the EFI is
> + * inserted to the AIL or in the event of failure along the way (e.g., commit
> + * failure, log I/O error, etc.). Note that the caller remains responsible for
> + * the EFD reference under all circumstances to this point. The caller has no
> + * means to detect failure once the transaction is committed, however.
> + * Therefore, an EFD is required after this point, even in the event of
> + * unrelated failure.
> + *
> + * Once an EFD is allocated and dirtied in a transaction, reference two
> + * transfers to the transaction. The EFD reference is dropped once it reaches
> + * the unpin handler. Similar to the EFI, the reference also drops in the event
> + * of commit failure or log I/O errors. Note that the EFD is not inserted in the
> + * AIL, so at this point both the EFI and EFD are freed.
> + */
> +struct xfs_efi_log_item {
> +	struct xfs_log_item	efi_item;
> +	atomic_t		efi_refcount;
> +	atomic_t		efi_next_extent;
> +	struct xfs_efi_log_format efi_format;
> +};
> +
> +static inline size_t
> +xfs_efi_log_item_sizeof(
> +	unsigned int		nr)
> +{
> +	return offsetof(struct xfs_efi_log_item, efi_format) +
> +			xfs_efi_log_format_sizeof(nr);
> +}
> +
> +/*
> + * This is the "extent free done" log item.  It is used to log
> + * the fact that some extents earlier mentioned in an efi item
> + * have been freed.
> + */
> +struct xfs_efd_log_item {
> +	struct xfs_log_item	efd_item;
> +	struct xfs_efi_log_item *efd_efip;
> +	uint			efd_next_extent;
> +	struct xfs_efd_log_format efd_format;
> +};
> +
> +static inline size_t
> +xfs_efd_log_item_sizeof(
> +	unsigned int		nr)
> +{
> +	return offsetof(struct xfs_efd_log_item, efd_format) +
> +			xfs_efd_log_format_sizeof(nr);
> +}
> +
> +/*
> + * Max number of extents in fast allocation path.
> + */
> +#define	XFS_EFD_MAX_FAST_EXTENTS	16
> +
> +extern struct kmem_cache	*xfs_efi_cache;
> +extern struct kmem_cache	*xfs_efd_cache;
> +
> +struct xfs_extent_free_item;
> +
> +void xfs_extent_free_defer_add(struct xfs_trans *tp,
> +		struct xfs_extent_free_item *xefi,
> +		struct xfs_defer_pending **dfpp);
> +
> +unsigned int xfs_efi_log_space(unsigned int nr);
> +unsigned int xfs_efd_log_space(unsigned int nr);
> +
> +#endif	/* __XFS_EXTFREE_ITEM_H__ */
> diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c
> index 91f4cdf2e4f3..a064289e1634 100644
> --- a/libxfs/xfs_ialloc.c
> +++ b/libxfs/xfs_ialloc.c
> @@ -20,6 +20,7 @@
>  #include "xfs_error.h"
>  #include "xfs_bmap.h"
>  #include "xfs_trans.h"
> +#include "xfs_icreate_item.h"
>  #include "xfs_buf_item.h"
>  #include "xfs_trace.h"
>  #include "xfs_log.h"
> diff --git a/libxfs/xfs_icreate_item.h b/libxfs/xfs_icreate_item.h
> new file mode 100644
> index 000000000000..64992823108a
> --- /dev/null
> +++ b/libxfs/xfs_icreate_item.h
> @@ -0,0 +1,22 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (c) 2008-2010, Dave Chinner
> + * All Rights Reserved.
> + */
> +#ifndef XFS_ICREATE_ITEM_H
> +#define XFS_ICREATE_ITEM_H	1
> +
> +/* in memory log item structure */
> +struct xfs_icreate_item {
> +	struct xfs_log_item	ic_item;
> +	struct xfs_icreate_log	ic_format;
> +};
> +
> +extern struct kmem_cache *xfs_icreate_cache;	/* inode create item */
> +
> +void xfs_icreate_log(struct xfs_trans *tp, xfs_agnumber_t agno,
> +			xfs_agblock_t agbno, unsigned int count,
> +			unsigned int inode_size, xfs_agblock_t length,
> +			unsigned int generation);
> +
> +#endif	/* XFS_ICREATE_ITEM_H */
> diff --git a/libxfs/xfs_inode_util.c b/libxfs/xfs_inode_util.c
> index b4f556df64ed..16c4c2ccdbb8 100644
> --- a/libxfs/xfs_inode_util.c
> +++ b/libxfs/xfs_inode_util.c
> @@ -20,8 +20,7 @@
>  #include "xfs_error.h"
>  #include "xfs_trace.h"
>  #include "xfs_ag.h"
> -#include "xfs_inode_item.h"
> -#include "iunlink.h"
> +#include "xfs_iunlink_item.h"
>  #include "xfs_inode_item.h"
>  
>  uint16_t
> diff --git a/libxfs/iunlink.h b/libxfs/xfs_iunlink_item.h
> similarity index 61%
> rename from libxfs/iunlink.h
> rename to libxfs/xfs_iunlink_item.h
> index 8d8032cf9326..c793cdcaccde 100644
> --- a/libxfs/iunlink.h
> +++ b/libxfs/xfs_iunlink_item.h
> @@ -10,15 +10,18 @@ struct xfs_trans;
>  struct xfs_inode;
>  struct xfs_perag;
>  
> -static inline struct xfs_inode *
> -xfs_iunlink_lookup(struct xfs_perag *pag, xfs_agino_t agino)
> -{
> -	return NULL;
> -}
> +/* in memory log item structure */
> +struct xfs_iunlink_item {
> +	struct xfs_log_item	item;
> +	struct xfs_inode	*ip;
> +	struct xfs_perag	*pag;
> +	xfs_agino_t		next_agino;
> +	xfs_agino_t		old_agino;
> +};
> +
> +extern struct kmem_cache *xfs_iunlink_cache;
>  
>  int xfs_iunlink_log_inode(struct xfs_trans *tp, struct xfs_inode *ip,
>  			struct xfs_perag *pag, xfs_agino_t next_agino);
> -int xfs_iunlink_reload_next(struct xfs_trans *tp, struct xfs_buf *agibp,
> -		xfs_agino_t prev_agino, xfs_agino_t next_agino);
>  
>  #endif	/* XFS_IUNLINK_ITEM_H */
> diff --git a/libxfs/xfs_parent.c b/libxfs/xfs_parent.c
> index 9420d8089e8c..992263f810f8 100644
> --- a/libxfs/xfs_parent.c
> +++ b/libxfs/xfs_parent.c
> @@ -25,7 +25,7 @@
>  #include "xfs_defer.h"
>  #include "xfs_parent.h"
>  #include "xfs_trans_space.h"
> -#include "defer_item.h"
> +#include "xfs_attr_item.h"
>  #include "xfs_health.h"
>  #include "xfs_attr_leaf.h"
>  
> diff --git a/libxfs/xfs_platform.h b/libxfs/xfs_platform.h
> index 4b0069fd70d7..4f4990a20dad 100644
> --- a/libxfs/xfs_platform.h
> +++ b/libxfs/xfs_platform.h
> @@ -350,7 +350,6 @@ xfs_buf_readahead(
>  #define uuid_copy(s,d)		platform_uuid_copy((s),(d))
>  #define uuid_equal(s,d)		(platform_uuid_compare((s),(d)) == 0)
>  
> -#define xfs_icreate_log(tp, agno, agbno, cnt, isize, len, gen) ((void) 0)
>  #define xfs_sb_validate_fsb_count(sbp, nblks)		(0)
>  #define xlog_calc_iovec_len(len)		roundup(len, sizeof(uint32_t))
>  
> diff --git a/libxfs/xfs_refcount.c b/libxfs/xfs_refcount.c
> index 3615f747f82a..6b67308fa594 100644
> --- a/libxfs/xfs_refcount.c
> +++ b/libxfs/xfs_refcount.c
> @@ -24,7 +24,7 @@
>  #include "xfs_rmap.h"
>  #include "xfs_ag.h"
>  #include "xfs_health.h"
> -#include "defer_item.h"
> +#include "xfs_refcount_item.h"
>  #include "xfs_rtgroup.h"
>  #include "xfs_rtrefcount_btree.h"
>  
> diff --git a/libxfs/xfs_refcount_item.h b/libxfs/xfs_refcount_item.h
> new file mode 100644
> index 000000000000..0fc3f493342b
> --- /dev/null
> +++ b/libxfs/xfs_refcount_item.h
> @@ -0,0 +1,82 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2016 Oracle.  All Rights Reserved.
> + * Author: Darrick J. Wong <darrick.wong@oracle.com>
> + */
> +#ifndef	__XFS_REFCOUNT_ITEM_H__
> +#define	__XFS_REFCOUNT_ITEM_H__
> +
> +/*
> + * There are (currently) two pairs of refcount btree redo item types:
> + * increase and decrease.  The log items for these are CUI (refcount
> + * update intent) and CUD (refcount update done).  The redo item type
> + * is encoded in the flags field of each xfs_map_extent.
> + *
> + * *I items should be recorded in the *first* of a series of rolled
> + * transactions, and the *D items should be recorded in the same
> + * transaction that records the associated refcountbt updates.
> + *
> + * Should the system crash after the commit of the first transaction
> + * but before the commit of the final transaction in a series, log
> + * recovery will use the redo information recorded by the intent items
> + * to replay the refcountbt metadata updates.
> + */
> +
> +/* kernel only CUI/CUD definitions */
> +
> +struct xfs_mount;
> +struct kmem_cache;
> +
> +/*
> + * Max number of extents in fast allocation path.
> + */
> +#define	XFS_CUI_MAX_FAST_EXTENTS	16
> +
> +/*
> + * This is the "refcount update intent" log item.  It is used to log
> + * the fact that some reverse mappings need to change.  It is used in
> + * conjunction with the "refcount update done" log item described
> + * below.
> + *
> + * These log items follow the same rules as struct xfs_efi_log_item;
> + * see the comments about that structure (in xfs_extfree_item.h) for
> + * more details.
> + */
> +struct xfs_cui_log_item {
> +	struct xfs_log_item		cui_item;
> +	atomic_t			cui_refcount;
> +	atomic_t			cui_next_extent;
> +	struct xfs_cui_log_format	cui_format;
> +};
> +
> +static inline size_t
> +xfs_cui_log_item_sizeof(
> +	unsigned int		nr)
> +{
> +	return offsetof(struct xfs_cui_log_item, cui_format) +
> +			xfs_cui_log_format_sizeof(nr);
> +}
> +
> +/*
> + * This is the "refcount update done" log item.  It is used to log the
> + * fact that some refcountbt updates mentioned in an earlier cui item
> + * have been performed.
> + */
> +struct xfs_cud_log_item {
> +	struct xfs_log_item		cud_item;
> +	struct xfs_cui_log_item		*cud_cuip;
> +	struct xfs_cud_log_format	cud_format;
> +};
> +
> +extern struct kmem_cache	*xfs_cui_cache;
> +extern struct kmem_cache	*xfs_cud_cache;
> +
> +struct xfs_refcount_intent;
> +
> +void xfs_refcount_defer_add(struct xfs_trans *tp,
> +		struct xfs_refcount_intent *ri);
> +
> +unsigned int xfs_cui_log_space(unsigned int nr);
> +unsigned int xfs_cud_log_space(void);
> +
> +#endif	/* __XFS_REFCOUNT_ITEM_H__ */
> diff --git a/libxfs/xfs_rmap.c b/libxfs/xfs_rmap.c
> index 74600c99172d..34d218de21a9 100644
> --- a/libxfs/xfs_rmap.c
> +++ b/libxfs/xfs_rmap.c
> @@ -24,7 +24,7 @@
>  #include "xfs_inode.h"
>  #include "xfs_ag.h"
>  #include "xfs_health.h"
> -#include "defer_item.h"
> +#include "xfs_rmap_item.h"
>  #include "xfs_rtgroup.h"
>  #include "xfs_rtrmap_btree.h"
>  
> diff --git a/libxfs/xfs_rmap_item.h b/libxfs/xfs_rmap_item.h
> new file mode 100644
> index 000000000000..3a99f0117f2d
> --- /dev/null
> +++ b/libxfs/xfs_rmap_item.h
> @@ -0,0 +1,81 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2016 Oracle.  All Rights Reserved.
> + * Author: Darrick J. Wong <darrick.wong@oracle.com>
> + */
> +#ifndef	__XFS_RMAP_ITEM_H__
> +#define	__XFS_RMAP_ITEM_H__
> +
> +/*
> + * There are (currently) three pairs of rmap btree redo item types: map, unmap,
> + * and convert.  The common abbreviations for these are RUI (rmap update
> + * intent) and RUD (rmap update done).  The redo item type is encoded in the
> + * flags field of each xfs_map_extent.
> + *
> + * *I items should be recorded in the *first* of a series of rolled
> + * transactions, and the *D items should be recorded in the same transaction
> + * that records the associated rmapbt updates.  Typically, the first
> + * transaction will record a bmbt update, followed by some number of
> + * transactions containing rmapbt updates, and finally transactions with any
> + * bnobt/cntbt updates.
> + *
> + * Should the system crash after the commit of the first transaction but
> + * before the commit of the final transaction in a series, log recovery will
> + * use the redo information recorded by the intent items to replay the
> + * (rmapbt/bnobt/cntbt) metadata updates in the non-first transaction.
> + */
> +
> +/* kernel only RUI/RUD definitions */
> +
> +struct xfs_mount;
> +struct kmem_cache;
> +
> +/*
> + * Max number of extents in fast allocation path.
> + */
> +#define	XFS_RUI_MAX_FAST_EXTENTS	16
> +
> +/*
> + * This is the "rmap update intent" log item.  It is used to log the fact that
> + * some reverse mappings need to change.  It is used in conjunction with the
> + * "rmap update done" log item described below.
> + *
> + * These log items follow the same rules as struct xfs_efi_log_item; see the
> + * comments about that structure (in xfs_extfree_item.h) for more details.
> + */
> +struct xfs_rui_log_item {
> +	struct xfs_log_item		rui_item;
> +	atomic_t			rui_refcount;
> +	atomic_t			rui_next_extent;
> +	struct xfs_rui_log_format	rui_format;
> +};
> +
> +static inline size_t
> +xfs_rui_log_item_sizeof(
> +	unsigned int		nr)
> +{
> +	return offsetof(struct xfs_rui_log_item, rui_format) +
> +			xfs_rui_log_format_sizeof(nr);
> +}
> +
> +/*
> + * This is the "rmap update done" log item.  It is used to log the fact that
> + * some rmapbt updates mentioned in an earlier rui item have been performed.
> + */
> +struct xfs_rud_log_item {
> +	struct xfs_log_item		rud_item;
> +	struct xfs_rui_log_item		*rud_ruip;
> +	struct xfs_rud_log_format	rud_format;
> +};
> +
> +extern struct kmem_cache	*xfs_rui_cache;
> +extern struct kmem_cache	*xfs_rud_cache;
> +
> +struct xfs_rmap_intent;
> +
> +void xfs_rmap_defer_add(struct xfs_trans *tp, struct xfs_rmap_intent *ri);
> +
> +unsigned int xfs_rui_log_space(unsigned int nr);
> +unsigned int xfs_rud_log_space(void);
> +
> +#endif	/* __XFS_RMAP_ITEM_H__ */
> diff --git a/libxfs/xfs_trans_resv.c b/libxfs/xfs_trans_resv.c
> index d15ca0427584..3a87ab154bb5 100644
> --- a/libxfs/xfs_trans_resv.c
> +++ b/libxfs/xfs_trans_resv.c
> @@ -19,9 +19,14 @@
>  #include "xfs_trans.h"
>  #include "xfs_trans_space.h"
>  #include "xfs_rtbitmap.h"
> +#include "xfs_attr_item.h"
>  #include "xfs_log.h"
> +#include "xfs_defer.h"
> +#include "xfs_bmap_item.h"
> +#include "xfs_extfree_item.h"
> +#include "xfs_rmap_item.h"
> +#include "xfs_refcount_item.h"
>  #include "xfs_trace.h"
> -#include "defer_item.h"
>  
>  #define _ALLOC	true
>  #define _FREE	false
> -- 
> 2.53.0
> 
> 

  reply	other threads:[~2026-10-05 21:50 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-05 12:56 reduce libxfs to kernel differences v2 Christoph Hellwig
2026-10-05 12:56 ` [PATCH 01/13] libxfs: use libxfs.h in xfs_platform.h Christoph Hellwig
2026-10-05 21:44   ` Darrick J. Wong
2026-10-05 12:56 ` [PATCH 02/13] libxfs: provide memalloc_nofs_{save,restore} stubs Christoph Hellwig
2026-10-05 21:45   ` Darrick J. Wong
2026-10-05 12:56 ` [PATCH 03/13] libxfs: remove a spurious xfs_rtbitmap.h include in xfs_sb.c Christoph Hellwig
2026-10-05 21:45   ` Darrick J. Wong
2026-10-05 12:56 ` [PATCH 04/13] libxfs: move the xfs_rtbitmap.h include in xfs_bmap.c Christoph Hellwig
2026-10-06 11:27   ` Andrey Albershteyn
2026-10-05 12:56 ` [PATCH 05/13] libxfs: remove the unused xfs_log_item.li_mountp field Christoph Hellwig
2026-10-05 21:46   ` Darrick J. Wong
2026-10-05 12:56 ` [PATCH 06/13] libxfs: remove the unused xfs_inode_log_item.ili_fsync_fields field Christoph Hellwig
2026-10-05 21:46   ` Darrick J. Wong
2026-10-05 12:56 ` [PATCH 07/13] libxfs: remove the xfs_log_item_t and xfs_buf_log_item_t typedefs Christoph Hellwig
2026-10-05 21:46   ` Darrick J. Wong
2026-10-05 12:56 ` [PATCH 08/13] libxfs: remove libxfs_trans_alloc_rollable Christoph Hellwig
2026-10-05 21:47   ` Darrick J. Wong
2026-10-05 12:56 ` [PATCH 09/13] libxfs: return int from xfs_buf_item_init Christoph Hellwig
2026-10-05 21:48   ` Darrick J. Wong
2026-10-05 12:56 ` [PATCH 10/13] libxfs: use xfs_buf_item.h and xfs_inode_item.h from the kernel source Christoph Hellwig
2026-10-05 21:48   ` Darrick J. Wong
2026-10-05 12:56 ` [PATCH 11/13] libxfs: cleanup xfs_trans.h Christoph Hellwig
2026-10-05 21:48   ` Darrick J. Wong
2026-10-05 12:56 ` [PATCH 12/13] libxfs: use xfs_trans.h from the kernel source Christoph Hellwig
2026-10-05 21:49   ` Darrick J. Wong
2026-10-07 13:41     ` Christoph Hellwig
2026-10-07 15:18       ` Darrick J. Wong
2026-10-08 10:59       ` Carlos Maiolino
2026-10-05 12:56 ` [PATCH 13/13] libxfs: use all log item headers from the kernel Christoph Hellwig
2026-10-05 21:50   ` Darrick J. Wong [this message]
  -- strict thread matches above, loose matches on Subject: below --
2026-09-25 15:20 reduce libxfs to kernel differences Christoph Hellwig
2026-09-25 15:20 ` [PATCH 13/13] libxfs: use all log item headers from the kernel Christoph Hellwig

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=20261005215012.GS2705364@frogsfrogsfrogs \
    --to=djwong@kernel.org \
    --cc=aalbersh@kernel.org \
    --cc=cem@kernel.org \
    --cc=hch@lst.de \
    --cc=linux-xfs@vger.kernel.org \
    --cc=sandeen@redhat.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