Line data Source code
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_REFCOUNT_ITEM_H__ 7 : #define __XFS_REFCOUNT_ITEM_H__ 8 : 9 : /* 10 : * There are (currently) two pairs of refcount btree redo item types: 11 : * increase and decrease. The log items for these are CUI (refcount 12 : * update intent) and CUD (refcount update done). The redo item type 13 : * is encoded in the 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 17 : * transaction that records the associated refcountbt updates. 18 : * 19 : * Should the system crash after the commit of the first transaction 20 : * but before the commit of the final transaction in a series, log 21 : * recovery will use the redo information recorded by the intent items 22 : * to replay the refcountbt metadata updates. 23 : */ 24 : 25 : /* kernel only CUI/CUD definitions */ 26 : 27 : struct xfs_mount; 28 : struct kmem_cache; 29 : 30 : /* 31 : * Max number of extents in fast allocation path. 32 : */ 33 : #define XFS_CUI_MAX_FAST_EXTENTS 16 34 : 35 : /* 36 : * This is the "refcount update intent" log item. It is used to log 37 : * the fact that some reverse mappings need to change. It is used in 38 : * conjunction with the "refcount update done" log item described 39 : * below. 40 : * 41 : * These log items follow the same rules as struct xfs_efi_log_item; 42 : * see the comments about that structure (in xfs_extfree_item.h) for 43 : * more details. 44 : */ 45 : struct xfs_cui_log_item { 46 : struct xfs_log_item cui_item; 47 : atomic_t cui_refcount; 48 : atomic_t cui_next_extent; 49 : struct xfs_cui_log_format cui_format; 50 : }; 51 : 52 : static inline size_t 53 : xfs_cui_log_item_sizeof( 54 : unsigned int nr) 55 : { 56 0 : return offsetof(struct xfs_cui_log_item, cui_format) + 57 : xfs_cui_log_format_sizeof(nr); 58 : } 59 : 60 : /* 61 : * This is the "refcount update done" log item. It is used to log the 62 : * fact that some refcountbt updates mentioned in an earlier cui item 63 : * have been performed. 64 : */ 65 : struct xfs_cud_log_item { 66 : struct xfs_log_item cud_item; 67 : struct xfs_cui_log_item *cud_cuip; 68 : struct xfs_cud_log_format cud_format; 69 : }; 70 : 71 : extern struct kmem_cache *xfs_cui_cache; 72 : extern struct kmem_cache *xfs_cud_cache; 73 : 74 : #endif /* __XFS_REFCOUNT_ITEM_H__ */