Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v6.18 165 lines 5.7 kB view raw
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_DEFER_H__ 7#define __XFS_DEFER_H__ 8 9struct xfs_btree_cur; 10struct xfs_defer_op_type; 11struct xfs_defer_capture; 12 13/* 14 * Save a log intent item and a list of extents, so that we can replay 15 * whatever action had to happen to the extent list and file the log done 16 * item. 17 */ 18struct xfs_defer_pending { 19 struct list_head dfp_list; /* pending items */ 20 struct list_head dfp_work; /* work items */ 21 struct xfs_log_item *dfp_intent; /* log intent item */ 22 struct xfs_log_item *dfp_done; /* log done item */ 23 const struct xfs_defer_op_type *dfp_ops; 24 unsigned int dfp_count; /* # extent items */ 25 unsigned int dfp_flags; 26}; 27 28/* 29 * Create a log intent item for this deferred item, but don't actually finish 30 * the work. Caller must clear this before the final transaction commit. 31 */ 32#define XFS_DEFER_PAUSED (1U << 0) 33 34#define XFS_DEFER_PENDING_STRINGS \ 35 { XFS_DEFER_PAUSED, "paused" } 36 37void xfs_defer_item_pause(struct xfs_trans *tp, struct xfs_defer_pending *dfp); 38void xfs_defer_item_unpause(struct xfs_trans *tp, struct xfs_defer_pending *dfp); 39 40struct xfs_defer_pending *xfs_defer_add(struct xfs_trans *tp, struct list_head *h, 41 const struct xfs_defer_op_type *ops); 42int xfs_defer_finish_noroll(struct xfs_trans **tp); 43int xfs_defer_finish(struct xfs_trans **tp); 44int xfs_defer_finish_one(struct xfs_trans *tp, struct xfs_defer_pending *dfp); 45void xfs_defer_cancel(struct xfs_trans *); 46void xfs_defer_move(struct xfs_trans *dtp, struct xfs_trans *stp); 47 48/* Description of a deferred type. */ 49struct xfs_defer_op_type { 50 const char *name; 51 unsigned int max_items; 52 struct xfs_log_item *(*create_intent)(struct xfs_trans *tp, 53 struct list_head *items, unsigned int count, bool sort); 54 void (*abort_intent)(struct xfs_log_item *intent); 55 struct xfs_log_item *(*create_done)(struct xfs_trans *tp, 56 struct xfs_log_item *intent, unsigned int count); 57 int (*finish_item)(struct xfs_trans *tp, struct xfs_log_item *done, 58 struct list_head *item, struct xfs_btree_cur **state); 59 void (*finish_cleanup)(struct xfs_trans *tp, 60 struct xfs_btree_cur *state, int error); 61 void (*cancel_item)(struct list_head *item); 62 int (*recover_work)(struct xfs_defer_pending *dfp, 63 struct list_head *capture_list); 64 struct xfs_log_item *(*relog_intent)(struct xfs_trans *tp, 65 struct xfs_log_item *intent, 66 struct xfs_log_item *done_item); 67}; 68 69extern const struct xfs_defer_op_type xfs_bmap_update_defer_type; 70extern const struct xfs_defer_op_type xfs_refcount_update_defer_type; 71extern const struct xfs_defer_op_type xfs_rtrefcount_update_defer_type; 72extern const struct xfs_defer_op_type xfs_rmap_update_defer_type; 73extern const struct xfs_defer_op_type xfs_rtrmap_update_defer_type; 74extern const struct xfs_defer_op_type xfs_extent_free_defer_type; 75extern const struct xfs_defer_op_type xfs_agfl_free_defer_type; 76extern const struct xfs_defer_op_type xfs_rtextent_free_defer_type; 77extern const struct xfs_defer_op_type xfs_attr_defer_type; 78extern const struct xfs_defer_op_type xfs_exchmaps_defer_type; 79 80/* 81 * Deferred operation item relogging limits. 82 */ 83 84/* 85 * Rename w/ parent pointers can require up to 5 inodes with deferred ops to 86 * be joined to the transaction: src_dp, target_dp, src_ip, target_ip, and wip. 87 * These inodes are locked in sorted order by their inode numbers 88 */ 89#define XFS_DEFER_OPS_NR_INODES 5 90#define XFS_DEFER_OPS_NR_BUFS 2 /* join up to two buffers */ 91 92/* Resources that must be held across a transaction roll. */ 93struct xfs_defer_resources { 94 /* held buffers */ 95 struct xfs_buf *dr_bp[XFS_DEFER_OPS_NR_BUFS]; 96 97 /* inodes with no unlock flags */ 98 struct xfs_inode *dr_ip[XFS_DEFER_OPS_NR_INODES]; 99 100 /* number of held buffers */ 101 unsigned short dr_bufs; 102 103 /* bitmap of ordered buffers */ 104 unsigned short dr_ordered; 105 106 /* number of held inodes */ 107 unsigned short dr_inos; 108}; 109 110/* 111 * This structure enables a dfops user to detach the chain of deferred 112 * operations from a transaction so that they can be continued later. 113 */ 114struct xfs_defer_capture { 115 /* List of other capture structures. */ 116 struct list_head dfc_list; 117 118 /* Deferred ops state saved from the transaction. */ 119 struct list_head dfc_dfops; 120 unsigned int dfc_tpflags; 121 122 /* Block reservations for the data and rt devices. */ 123 unsigned int dfc_blkres; 124 unsigned int dfc_rtxres; 125 126 /* Log reservation saved from the transaction. */ 127 unsigned int dfc_logres; 128 129 struct xfs_defer_resources dfc_held; 130}; 131 132/* 133 * Functions to capture a chain of deferred operations and continue them later. 134 * This doesn't normally happen except log recovery. 135 */ 136int xfs_defer_ops_capture_and_commit(struct xfs_trans *tp, 137 struct list_head *capture_list); 138void xfs_defer_ops_continue(struct xfs_defer_capture *d, struct xfs_trans *tp, 139 struct xfs_defer_resources *dres); 140void xfs_defer_ops_capture_abort(struct xfs_mount *mp, 141 struct xfs_defer_capture *d); 142void xfs_defer_resources_rele(struct xfs_defer_resources *dres); 143 144void xfs_defer_start_recovery(struct xfs_log_item *lip, 145 struct list_head *r_dfops, const struct xfs_defer_op_type *ops); 146void xfs_defer_cancel_recovery(struct xfs_mount *mp, 147 struct xfs_defer_pending *dfp); 148int xfs_defer_finish_recovery(struct xfs_mount *mp, 149 struct xfs_defer_pending *dfp, struct list_head *capture_list); 150 151static inline void 152xfs_defer_add_item( 153 struct xfs_defer_pending *dfp, 154 struct list_head *work) 155{ 156 list_add_tail(work, &dfp->dfp_work); 157 dfp->dfp_count++; 158} 159 160int __init xfs_defer_init_item_caches(void); 161void xfs_defer_destroy_item_caches(void); 162 163void xfs_defer_add_barrier(struct xfs_trans *tp); 164 165#endif /* __XFS_DEFER_H__ */