1508578f2SNishad Kamdar /* SPDX-License-Identifier: GPL-2.0+ */ 24e0cc29bSDarrick J. Wong /* 34e0cc29bSDarrick J. Wong * Copyright (C) 2016 Oracle. All Rights Reserved. 44e0cc29bSDarrick J. Wong * Author: Darrick J. Wong <darrick.wong@oracle.com> 54e0cc29bSDarrick J. Wong */ 64e0cc29bSDarrick J. Wong #ifndef __XFS_DEFER_H__ 74e0cc29bSDarrick J. Wong #define __XFS_DEFER_H__ 84e0cc29bSDarrick J. Wong 93ec1b26cSChristoph Hellwig struct xfs_btree_cur; 104e0cc29bSDarrick J. Wong struct xfs_defer_op_type; 11e6fff81eSDarrick J. Wong struct xfs_defer_capture; 124e0cc29bSDarrick J. Wong 134e0cc29bSDarrick J. Wong /* 144e0cc29bSDarrick J. Wong * Header for deferred operation list. 154e0cc29bSDarrick J. Wong */ 164e0cc29bSDarrick J. Wong enum xfs_defer_ops_type { 179f3afb57SDarrick J. Wong XFS_DEFER_OPS_TYPE_BMAP, 1833ba6129SDarrick J. Wong XFS_DEFER_OPS_TYPE_REFCOUNT, 19f8dbebefSDarrick J. Wong XFS_DEFER_OPS_TYPE_RMAP, 209749fee8SDarrick J. Wong XFS_DEFER_OPS_TYPE_FREE, 21f8f2835aSBrian Foster XFS_DEFER_OPS_TYPE_AGFL_FREE, 221d08e11dSAllison Henderson XFS_DEFER_OPS_TYPE_ATTR, 234e0cc29bSDarrick J. Wong XFS_DEFER_OPS_TYPE_MAX, 244e0cc29bSDarrick J. Wong }; 254e0cc29bSDarrick J. Wong 2602b100fbSDarrick J. Wong /* 2702b100fbSDarrick J. Wong * Save a log intent item and a list of extents, so that we can replay 2802b100fbSDarrick J. Wong * whatever action had to happen to the extent list and file the log done 2902b100fbSDarrick J. Wong * item. 3002b100fbSDarrick J. Wong */ 3102b100fbSDarrick J. Wong struct xfs_defer_pending { 3202b100fbSDarrick J. Wong struct list_head dfp_list; /* pending items */ 3302b100fbSDarrick J. Wong struct list_head dfp_work; /* work items */ 3413a83333SChristoph Hellwig struct xfs_log_item *dfp_intent; /* log intent item */ 35f09d167cSChristoph Hellwig struct xfs_log_item *dfp_done; /* log done item */ 3602b100fbSDarrick J. Wong unsigned int dfp_count; /* # extent items */ 3702b100fbSDarrick J. Wong enum xfs_defer_ops_type dfp_type; 3802b100fbSDarrick J. Wong }; 3902b100fbSDarrick J. Wong 400f37d178SBrian Foster void xfs_defer_add(struct xfs_trans *tp, enum xfs_defer_ops_type type, 414e0cc29bSDarrick J. Wong struct list_head *h); 42b277c37fSBrian Foster int xfs_defer_finish_noroll(struct xfs_trans **tp); 439e28a242SBrian Foster int xfs_defer_finish(struct xfs_trans **tp); 447279aa13SBrian Foster void xfs_defer_cancel(struct xfs_trans *); 45ce356d64SBrian Foster void xfs_defer_move(struct xfs_trans *dtp, struct xfs_trans *stp); 464e0cc29bSDarrick J. Wong 474e0cc29bSDarrick J. Wong /* Description of a deferred type. */ 484e0cc29bSDarrick J. Wong struct xfs_defer_op_type { 4913a83333SChristoph Hellwig struct xfs_log_item *(*create_intent)(struct xfs_trans *tp, 5013a83333SChristoph Hellwig struct list_head *items, unsigned int count, bool sort); 5113a83333SChristoph Hellwig void (*abort_intent)(struct xfs_log_item *intent); 52f09d167cSChristoph Hellwig struct xfs_log_item *(*create_done)(struct xfs_trans *tp, 53f09d167cSChristoph Hellwig struct xfs_log_item *intent, unsigned int count); 54f09d167cSChristoph Hellwig int (*finish_item)(struct xfs_trans *tp, struct xfs_log_item *done, 553ec1b26cSChristoph Hellwig struct list_head *item, struct xfs_btree_cur **state); 563ec1b26cSChristoph Hellwig void (*finish_cleanup)(struct xfs_trans *tp, 573ec1b26cSChristoph Hellwig struct xfs_btree_cur *state, int error); 582f88f1efSChristoph Hellwig void (*cancel_item)(struct list_head *item); 5902b100fbSDarrick J. Wong unsigned int max_items; 604e0cc29bSDarrick J. Wong }; 614e0cc29bSDarrick J. Wong 62bc9f2b7cSDarrick J. Wong extern const struct xfs_defer_op_type xfs_bmap_update_defer_type; 63bc9f2b7cSDarrick J. Wong extern const struct xfs_defer_op_type xfs_refcount_update_defer_type; 64bc9f2b7cSDarrick J. Wong extern const struct xfs_defer_op_type xfs_rmap_update_defer_type; 65bc9f2b7cSDarrick J. Wong extern const struct xfs_defer_op_type xfs_extent_free_defer_type; 66bc9f2b7cSDarrick J. Wong extern const struct xfs_defer_op_type xfs_agfl_free_defer_type; 67fd920008SAllison Henderson extern const struct xfs_defer_op_type xfs_attr_defer_type; 68fd920008SAllison Henderson 694e0cc29bSDarrick J. Wong 7093293bcbSDarrick J. Wong /* 71c5db9f93SDarrick J. Wong * Deferred operation item relogging limits. 72c5db9f93SDarrick J. Wong */ 73c5db9f93SDarrick J. Wong #define XFS_DEFER_OPS_NR_INODES 2 /* join up to two inodes */ 74c5db9f93SDarrick J. Wong #define XFS_DEFER_OPS_NR_BUFS 2 /* join up to two buffers */ 75c5db9f93SDarrick J. Wong 76c5db9f93SDarrick J. Wong /* Resources that must be held across a transaction roll. */ 77c5db9f93SDarrick J. Wong struct xfs_defer_resources { 78c5db9f93SDarrick J. Wong /* held buffers */ 79c5db9f93SDarrick J. Wong struct xfs_buf *dr_bp[XFS_DEFER_OPS_NR_BUFS]; 80c5db9f93SDarrick J. Wong 81c5db9f93SDarrick J. Wong /* inodes with no unlock flags */ 82c5db9f93SDarrick J. Wong struct xfs_inode *dr_ip[XFS_DEFER_OPS_NR_INODES]; 83c5db9f93SDarrick J. Wong 84c5db9f93SDarrick J. Wong /* number of held buffers */ 85c5db9f93SDarrick J. Wong unsigned short dr_bufs; 86c5db9f93SDarrick J. Wong 87c5db9f93SDarrick J. Wong /* bitmap of ordered buffers */ 88c5db9f93SDarrick J. Wong unsigned short dr_ordered; 89c5db9f93SDarrick J. Wong 90c5db9f93SDarrick J. Wong /* number of held inodes */ 91c5db9f93SDarrick J. Wong unsigned short dr_inos; 92c5db9f93SDarrick J. Wong }; 93c5db9f93SDarrick J. Wong 94c5db9f93SDarrick J. Wong /* 95e6fff81eSDarrick J. Wong * This structure enables a dfops user to detach the chain of deferred 96e6fff81eSDarrick J. Wong * operations from a transaction so that they can be continued later. 97e6fff81eSDarrick J. Wong */ 98e6fff81eSDarrick J. Wong struct xfs_defer_capture { 99e6fff81eSDarrick J. Wong /* List of other capture structures. */ 100e6fff81eSDarrick J. Wong struct list_head dfc_list; 101e6fff81eSDarrick J. Wong 102e6fff81eSDarrick J. Wong /* Deferred ops state saved from the transaction. */ 103e6fff81eSDarrick J. Wong struct list_head dfc_dfops; 104e6fff81eSDarrick J. Wong unsigned int dfc_tpflags; 1054f9a60c4SDarrick J. Wong 1064f9a60c4SDarrick J. Wong /* Block reservations for the data and rt devices. */ 1074f9a60c4SDarrick J. Wong unsigned int dfc_blkres; 1084f9a60c4SDarrick J. Wong unsigned int dfc_rtxres; 109929b92f6SDarrick J. Wong 110929b92f6SDarrick J. Wong /* Log reservation saved from the transaction. */ 111929b92f6SDarrick J. Wong unsigned int dfc_logres; 112ff4ab5e0SDarrick J. Wong 113512edfacSDarrick J. Wong struct xfs_defer_resources dfc_held; 114e6fff81eSDarrick J. Wong }; 115e6fff81eSDarrick J. Wong 116e6fff81eSDarrick J. Wong /* 11793293bcbSDarrick J. Wong * Functions to capture a chain of deferred operations and continue them later. 11893293bcbSDarrick J. Wong * This doesn't normally happen except log recovery. 11993293bcbSDarrick J. Wong */ 120e6fff81eSDarrick J. Wong int xfs_defer_ops_capture_and_commit(struct xfs_trans *tp, 121512edfacSDarrick J. Wong struct list_head *capture_list); 122ff4ab5e0SDarrick J. Wong void xfs_defer_ops_continue(struct xfs_defer_capture *d, struct xfs_trans *tp, 123512edfacSDarrick J. Wong struct xfs_defer_resources *dres); 124005be668SLong Li void xfs_defer_ops_capture_abort(struct xfs_mount *mp, 125512edfacSDarrick J. Wong struct xfs_defer_capture *d); 126512edfacSDarrick J. Wong void xfs_defer_resources_rele(struct xfs_defer_resources *dres); 12793293bcbSDarrick J. Wong 128*cd3c2cf3SDarrick J. Wong void xfs_defer_start_recovery(struct xfs_log_item *lip, 129*cd3c2cf3SDarrick J. Wong enum xfs_defer_ops_type dfp_type, struct list_head *r_dfops); 130*cd3c2cf3SDarrick J. Wong void xfs_defer_cancel_recovery(struct xfs_mount *mp, 131*cd3c2cf3SDarrick J. Wong struct xfs_defer_pending *dfp); 132*cd3c2cf3SDarrick J. Wong 133f3c799c2SDarrick J. Wong int __init xfs_defer_init_item_caches(void); 134f3c799c2SDarrick J. Wong void xfs_defer_destroy_item_caches(void); 135f3c799c2SDarrick J. Wong 1364e0cc29bSDarrick J. Wong #endif /* __XFS_DEFER_H__ */ 137