1  // SPDX-License-Identifier: GPL-2.0+
2  /*
3   * Copyright (C) 2016 Oracle.  All Rights Reserved.
4   * Author: Darrick J. Wong <darrick.wong@oracle.com>
5   */
6  #ifndef	__XFS_RMAP_ITEM_H__
7  #define	__XFS_RMAP_ITEM_H__
8  
9  /*
10   * There are (currently) three pairs of rmap btree redo item types: map, unmap,
11   * and convert.  The common abbreviations for these are RUI (rmap update
12   * intent) and RUD (rmap update done).  The redo item type is encoded in the
13   * flags field of each xfs_map_extent.
14   *
15   * *I items should be recorded in the *first* of a series of rolled
16   * transactions, and the *D items should be recorded in the same transaction
17   * that records the associated rmapbt updates.  Typically, the first
18   * transaction will record a bmbt update, followed by some number of
19   * transactions containing rmapbt updates, and finally transactions with any
20   * bnobt/cntbt updates.
21   *
22   * Should the system crash after the commit of the first transaction but
23   * before the commit of the final transaction in a series, log recovery will
24   * use the redo information recorded by the intent items to replay the
25   * (rmapbt/bnobt/cntbt) metadata updates in the non-first transaction.
26   */
27  
28  /* kernel only RUI/RUD definitions */
29  
30  struct xfs_mount;
31  struct kmem_cache;
32  
33  /*
34   * Max number of extents in fast allocation path.
35   */
36  #define	XFS_RUI_MAX_FAST_EXTENTS	16
37  
38  /*
39   * This is the "rmap update intent" log item.  It is used to log the fact that
40   * some reverse mappings need to change.  It is used in conjunction with the
41   * "rmap update done" log item described below.
42   *
43   * These log items follow the same rules as struct xfs_efi_log_item; see the
44   * comments about that structure (in xfs_extfree_item.h) for more details.
45   */
46  struct xfs_rui_log_item {
47  	struct xfs_log_item		rui_item;
48  	atomic_t			rui_refcount;
49  	atomic_t			rui_next_extent;
50  	struct xfs_rui_log_format	rui_format;
51  };
52  
53  static inline size_t
xfs_rui_log_item_sizeof(unsigned int nr)54  xfs_rui_log_item_sizeof(
55  	unsigned int		nr)
56  {
57  	return offsetof(struct xfs_rui_log_item, rui_format) +
58  			xfs_rui_log_format_sizeof(nr);
59  }
60  
61  /*
62   * This is the "rmap update done" log item.  It is used to log the fact that
63   * some rmapbt updates mentioned in an earlier rui item have been performed.
64   */
65  struct xfs_rud_log_item {
66  	struct xfs_log_item		rud_item;
67  	struct xfs_rui_log_item		*rud_ruip;
68  	struct xfs_rud_log_format	rud_format;
69  };
70  
71  extern struct kmem_cache	*xfs_rui_cache;
72  extern struct kmem_cache	*xfs_rud_cache;
73  
74  struct xfs_rmap_intent;
75  
76  void xfs_rmap_defer_add(struct xfs_trans *tp, struct xfs_rmap_intent *ri);
77  
78  #endif	/* __XFS_RMAP_ITEM_H__ */
79