1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. 4 * All Rights Reserved. 5 */ 6 #ifndef __XFS_LOG_H__ 7 #define __XFS_LOG_H__ 8 9 struct xlog_format_buf; 10 struct xfs_cil_ctx; 11 12 /* Region types for iovec's i_type */ 13 #define XLOG_REG_TYPE_BFORMAT 1 14 #define XLOG_REG_TYPE_BCHUNK 2 15 #define XLOG_REG_TYPE_EFI_FORMAT 3 16 #define XLOG_REG_TYPE_EFD_FORMAT 4 17 #define XLOG_REG_TYPE_IFORMAT 5 18 #define XLOG_REG_TYPE_ICORE 6 19 #define XLOG_REG_TYPE_IEXT 7 20 #define XLOG_REG_TYPE_IBROOT 8 21 #define XLOG_REG_TYPE_ILOCAL 9 22 #define XLOG_REG_TYPE_IATTR_EXT 10 23 #define XLOG_REG_TYPE_IATTR_BROOT 11 24 #define XLOG_REG_TYPE_IATTR_LOCAL 12 25 #define XLOG_REG_TYPE_QFORMAT 13 26 #define XLOG_REG_TYPE_DQUOT 14 27 #define XLOG_REG_TYPE_QUOTAOFF 15 28 #define XLOG_REG_TYPE_LRHEADER 16 29 #define XLOG_REG_TYPE_UNMOUNT 17 30 #define XLOG_REG_TYPE_COMMIT 18 31 #define XLOG_REG_TYPE_TRANSHDR 19 32 #define XLOG_REG_TYPE_ICREATE 20 33 #define XLOG_REG_TYPE_RUI_FORMAT 21 34 #define XLOG_REG_TYPE_RUD_FORMAT 22 35 #define XLOG_REG_TYPE_CUI_FORMAT 23 36 #define XLOG_REG_TYPE_CUD_FORMAT 24 37 #define XLOG_REG_TYPE_BUI_FORMAT 25 38 #define XLOG_REG_TYPE_BUD_FORMAT 26 39 #define XLOG_REG_TYPE_ATTRI_FORMAT 27 40 #define XLOG_REG_TYPE_ATTRD_FORMAT 28 41 #define XLOG_REG_TYPE_ATTR_NAME 29 42 #define XLOG_REG_TYPE_ATTR_VALUE 30 43 #define XLOG_REG_TYPE_XMI_FORMAT 31 44 #define XLOG_REG_TYPE_XMD_FORMAT 32 45 #define XLOG_REG_TYPE_ATTR_NEWNAME 33 46 #define XLOG_REG_TYPE_ATTR_NEWVALUE 34 47 #define XLOG_REG_TYPE_MAX 34 48 49 #define XFS_LOG_VEC_ORDERED (-1) 50 51 /* 52 * Calculate the log iovec length for a given user buffer length. Intended to be 53 * used by ->iop_size implementations when sizing buffers of arbitrary 54 * alignments. 55 */ 56 static inline int 57 xlog_calc_iovec_len(int len) 58 { 59 return roundup(len, sizeof(uint32_t)); 60 } 61 62 void *xlog_format_start(struct xlog_format_buf *lfb, uint16_t type); 63 void xlog_format_commit(struct xlog_format_buf *lfb, unsigned int data_len); 64 65 /* 66 * Copy the amount of data requested by the caller into a new log iovec. 67 */ 68 static inline void * 69 xlog_format_copy( 70 struct xlog_format_buf *lfb, 71 uint16_t type, 72 void *data, 73 unsigned int len) 74 { 75 void *buf; 76 77 buf = xlog_format_start(lfb, type); 78 memcpy(buf, data, len); 79 xlog_format_commit(lfb, len); 80 return buf; 81 } 82 83 /* 84 * By comparing each component, we don't have to worry about extra 85 * endian issues in treating two 32 bit numbers as one 64 bit number 86 */ 87 static inline xfs_lsn_t _lsn_cmp(xfs_lsn_t lsn1, xfs_lsn_t lsn2) 88 { 89 if (CYCLE_LSN(lsn1) != CYCLE_LSN(lsn2)) 90 return (CYCLE_LSN(lsn1)<CYCLE_LSN(lsn2))? -999 : 999; 91 92 if (BLOCK_LSN(lsn1) != BLOCK_LSN(lsn2)) 93 return (BLOCK_LSN(lsn1)<BLOCK_LSN(lsn2))? -999 : 999; 94 95 return 0; 96 } 97 98 #define XFS_LSN_CMP(x,y) _lsn_cmp(x,y) 99 100 /* 101 * Flags to xfs_log_force() 102 * 103 * XFS_LOG_SYNC: Synchronous force in-core log to disk 104 */ 105 #define XFS_LOG_SYNC 0x1 106 107 /* Log manager interfaces */ 108 struct xfs_mount; 109 struct xlog_in_core; 110 struct xlog_ticket; 111 struct xfs_log_item; 112 struct xfs_item_ops; 113 struct xfs_trans; 114 struct xlog; 115 116 int xfs_log_force(struct xfs_mount *mp, uint flags); 117 int xfs_log_force_seq(struct xfs_mount *mp, xfs_csn_t seq, uint flags, 118 int *log_forced); 119 int xfs_log_mount(struct xfs_mount *mp, 120 struct xfs_buftarg *log_target, 121 xfs_daddr_t start_block, 122 int num_bblocks); 123 int xfs_log_mount_finish(struct xfs_mount *mp); 124 void xfs_log_mount_cancel(struct xfs_mount *); 125 xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp); 126 xfs_lsn_t xlog_assign_tail_lsn_locked(struct xfs_mount *mp); 127 void xfs_log_space_wake(struct xfs_mount *mp); 128 int xfs_log_reserve(struct xfs_mount *mp, int length, int count, 129 struct xlog_ticket **ticket, bool permanent); 130 int xfs_log_regrant(struct xfs_mount *mp, struct xlog_ticket *tic); 131 void xfs_log_unmount(struct xfs_mount *mp); 132 bool xfs_log_writable(struct xfs_mount *mp); 133 134 struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket); 135 void xfs_log_ticket_put(struct xlog_ticket *ticket); 136 137 void xlog_cil_process_committed(struct list_head *list); 138 bool xfs_log_item_in_current_chkpt(struct xfs_log_item *lip); 139 140 void xfs_log_work_queue(struct xfs_mount *mp); 141 int xfs_log_quiesce(struct xfs_mount *mp); 142 void xfs_log_clean(struct xfs_mount *mp); 143 bool xfs_log_check_lsn(struct xfs_mount *, xfs_lsn_t); 144 145 bool xlog_force_shutdown(struct xlog *log, uint32_t shutdown_flags); 146 147 #endif /* __XFS_LOG_H__ */ 148