1*1da177e4SLinus Torvalds /* 2*1da177e4SLinus Torvalds * Copyright (c) 2000-2003 Silicon Graphics, Inc. All Rights Reserved. 3*1da177e4SLinus Torvalds * 4*1da177e4SLinus Torvalds * This program is free software; you can redistribute it and/or modify it 5*1da177e4SLinus Torvalds * under the terms of version 2 of the GNU General Public License as 6*1da177e4SLinus Torvalds * published by the Free Software Foundation. 7*1da177e4SLinus Torvalds * 8*1da177e4SLinus Torvalds * This program is distributed in the hope that it would be useful, but 9*1da177e4SLinus Torvalds * WITHOUT ANY WARRANTY; without even the implied warranty of 10*1da177e4SLinus Torvalds * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 11*1da177e4SLinus Torvalds * 12*1da177e4SLinus Torvalds * Further, this software is distributed without any warranty that it is 13*1da177e4SLinus Torvalds * free of the rightful claim of any third person regarding infringement 14*1da177e4SLinus Torvalds * or the like. Any license provided herein, whether implied or 15*1da177e4SLinus Torvalds * otherwise, applies only to this software file. Patent licenses, if 16*1da177e4SLinus Torvalds * any, provided herein do not apply to combinations of this program with 17*1da177e4SLinus Torvalds * other software, or any other product whatsoever. 18*1da177e4SLinus Torvalds * 19*1da177e4SLinus Torvalds * You should have received a copy of the GNU General Public License along 20*1da177e4SLinus Torvalds * with this program; if not, write the Free Software Foundation, Inc., 59 21*1da177e4SLinus Torvalds * Temple Place - Suite 330, Boston MA 02111-1307, USA. 22*1da177e4SLinus Torvalds * 23*1da177e4SLinus Torvalds * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, 24*1da177e4SLinus Torvalds * Mountain View, CA 94043, or: 25*1da177e4SLinus Torvalds * 26*1da177e4SLinus Torvalds * http://www.sgi.com 27*1da177e4SLinus Torvalds * 28*1da177e4SLinus Torvalds * For further information regarding this notice, see: 29*1da177e4SLinus Torvalds * 30*1da177e4SLinus Torvalds * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ 31*1da177e4SLinus Torvalds */ 32*1da177e4SLinus Torvalds #ifndef __XFS_LOG_H__ 33*1da177e4SLinus Torvalds #define __XFS_LOG_H__ 34*1da177e4SLinus Torvalds 35*1da177e4SLinus Torvalds /* get lsn fields */ 36*1da177e4SLinus Torvalds 37*1da177e4SLinus Torvalds #define CYCLE_LSN(lsn) ((uint)((lsn)>>32)) 38*1da177e4SLinus Torvalds #define BLOCK_LSN(lsn) ((uint)(lsn)) 39*1da177e4SLinus Torvalds /* this is used in a spot where we might otherwise double-endian-flip */ 40*1da177e4SLinus Torvalds #define CYCLE_LSN_DISK(lsn) (((uint *)&(lsn))[0]) 41*1da177e4SLinus Torvalds 42*1da177e4SLinus Torvalds #ifdef __KERNEL__ 43*1da177e4SLinus Torvalds /* 44*1da177e4SLinus Torvalds * By comparing each compnent, we don't have to worry about extra 45*1da177e4SLinus Torvalds * endian issues in treating two 32 bit numbers as one 64 bit number 46*1da177e4SLinus Torvalds */ 47*1da177e4SLinus Torvalds static 48*1da177e4SLinus Torvalds #if defined(__GNUC__) && (__GNUC__ == 2) && ( (__GNUC_MINOR__ == 95) || (__GNUC_MINOR__ == 96)) 49*1da177e4SLinus Torvalds __attribute__((unused)) /* gcc 2.95, 2.96 miscompile this when inlined */ 50*1da177e4SLinus Torvalds #else 51*1da177e4SLinus Torvalds __inline__ 52*1da177e4SLinus Torvalds #endif 53*1da177e4SLinus Torvalds xfs_lsn_t _lsn_cmp(xfs_lsn_t lsn1, xfs_lsn_t lsn2) 54*1da177e4SLinus Torvalds { 55*1da177e4SLinus Torvalds if (CYCLE_LSN(lsn1) != CYCLE_LSN(lsn2)) 56*1da177e4SLinus Torvalds return (CYCLE_LSN(lsn1)<CYCLE_LSN(lsn2))? -999 : 999; 57*1da177e4SLinus Torvalds 58*1da177e4SLinus Torvalds if (BLOCK_LSN(lsn1) != BLOCK_LSN(lsn2)) 59*1da177e4SLinus Torvalds return (BLOCK_LSN(lsn1)<BLOCK_LSN(lsn2))? -999 : 999; 60*1da177e4SLinus Torvalds 61*1da177e4SLinus Torvalds return 0; 62*1da177e4SLinus Torvalds } 63*1da177e4SLinus Torvalds 64*1da177e4SLinus Torvalds #define XFS_LSN_CMP(x,y) _lsn_cmp(x,y) 65*1da177e4SLinus Torvalds 66*1da177e4SLinus Torvalds /* 67*1da177e4SLinus Torvalds * Macros, structures, prototypes for interface to the log manager. 68*1da177e4SLinus Torvalds */ 69*1da177e4SLinus Torvalds 70*1da177e4SLinus Torvalds /* 71*1da177e4SLinus Torvalds * Flags to xfs_log_mount 72*1da177e4SLinus Torvalds */ 73*1da177e4SLinus Torvalds #define XFS_LOG_RECOVER 0x1 74*1da177e4SLinus Torvalds 75*1da177e4SLinus Torvalds /* 76*1da177e4SLinus Torvalds * Flags to xfs_log_done() 77*1da177e4SLinus Torvalds */ 78*1da177e4SLinus Torvalds #define XFS_LOG_REL_PERM_RESERV 0x1 79*1da177e4SLinus Torvalds 80*1da177e4SLinus Torvalds 81*1da177e4SLinus Torvalds /* 82*1da177e4SLinus Torvalds * Flags to xfs_log_reserve() 83*1da177e4SLinus Torvalds * 84*1da177e4SLinus Torvalds * XFS_LOG_SLEEP: If space is not available, sleep (default) 85*1da177e4SLinus Torvalds * XFS_LOG_NOSLEEP: If space is not available, return error 86*1da177e4SLinus Torvalds * XFS_LOG_PERM_RESERV: Permanent reservation. When writes are 87*1da177e4SLinus Torvalds * performed against this type of reservation, the reservation 88*1da177e4SLinus Torvalds * is not decreased. Long running transactions should use this. 89*1da177e4SLinus Torvalds */ 90*1da177e4SLinus Torvalds #define XFS_LOG_SLEEP 0x0 91*1da177e4SLinus Torvalds #define XFS_LOG_NOSLEEP 0x1 92*1da177e4SLinus Torvalds #define XFS_LOG_PERM_RESERV 0x2 93*1da177e4SLinus Torvalds #define XFS_LOG_RESV_ALL (XFS_LOG_NOSLEEP|XFS_LOG_PERM_RESERV) 94*1da177e4SLinus Torvalds 95*1da177e4SLinus Torvalds 96*1da177e4SLinus Torvalds /* 97*1da177e4SLinus Torvalds * Flags to xfs_log_force() 98*1da177e4SLinus Torvalds * 99*1da177e4SLinus Torvalds * XFS_LOG_SYNC: Synchronous force in-core log to disk 100*1da177e4SLinus Torvalds * XFS_LOG_FORCE: Start in-core log write now. 101*1da177e4SLinus Torvalds * XFS_LOG_URGE: Start write within some window of time. 102*1da177e4SLinus Torvalds * 103*1da177e4SLinus Torvalds * Note: Either XFS_LOG_FORCE or XFS_LOG_URGE must be set. 104*1da177e4SLinus Torvalds */ 105*1da177e4SLinus Torvalds #define XFS_LOG_SYNC 0x1 106*1da177e4SLinus Torvalds #define XFS_LOG_FORCE 0x2 107*1da177e4SLinus Torvalds #define XFS_LOG_URGE 0x4 108*1da177e4SLinus Torvalds 109*1da177e4SLinus Torvalds #endif /* __KERNEL__ */ 110*1da177e4SLinus Torvalds 111*1da177e4SLinus Torvalds 112*1da177e4SLinus Torvalds /* Log Clients */ 113*1da177e4SLinus Torvalds #define XFS_TRANSACTION 0x69 114*1da177e4SLinus Torvalds #define XFS_VOLUME 0x2 115*1da177e4SLinus Torvalds #define XFS_LOG 0xaa 116*1da177e4SLinus Torvalds 117*1da177e4SLinus Torvalds typedef struct xfs_log_iovec { 118*1da177e4SLinus Torvalds xfs_caddr_t i_addr; /* beginning address of region */ 119*1da177e4SLinus Torvalds int i_len; /* length in bytes of region */ 120*1da177e4SLinus Torvalds } xfs_log_iovec_t; 121*1da177e4SLinus Torvalds 122*1da177e4SLinus Torvalds typedef void* xfs_log_ticket_t; 123*1da177e4SLinus Torvalds 124*1da177e4SLinus Torvalds /* 125*1da177e4SLinus Torvalds * Structure used to pass callback function and the function's argument 126*1da177e4SLinus Torvalds * to the log manager. 127*1da177e4SLinus Torvalds */ 128*1da177e4SLinus Torvalds typedef struct xfs_log_callback { 129*1da177e4SLinus Torvalds struct xfs_log_callback *cb_next; 130*1da177e4SLinus Torvalds void (*cb_func)(void *, int); 131*1da177e4SLinus Torvalds void *cb_arg; 132*1da177e4SLinus Torvalds } xfs_log_callback_t; 133*1da177e4SLinus Torvalds 134*1da177e4SLinus Torvalds 135*1da177e4SLinus Torvalds #ifdef __KERNEL__ 136*1da177e4SLinus Torvalds /* Log manager interfaces */ 137*1da177e4SLinus Torvalds struct xfs_mount; 138*1da177e4SLinus Torvalds xfs_lsn_t xfs_log_done(struct xfs_mount *mp, 139*1da177e4SLinus Torvalds xfs_log_ticket_t ticket, 140*1da177e4SLinus Torvalds void **iclog, 141*1da177e4SLinus Torvalds uint flags); 142*1da177e4SLinus Torvalds int xfs_log_force(struct xfs_mount *mp, 143*1da177e4SLinus Torvalds xfs_lsn_t lsn, 144*1da177e4SLinus Torvalds uint flags); 145*1da177e4SLinus Torvalds int xfs_log_mount(struct xfs_mount *mp, 146*1da177e4SLinus Torvalds struct xfs_buftarg *log_target, 147*1da177e4SLinus Torvalds xfs_daddr_t start_block, 148*1da177e4SLinus Torvalds int num_bblocks); 149*1da177e4SLinus Torvalds int xfs_log_mount_finish(struct xfs_mount *mp, int); 150*1da177e4SLinus Torvalds void xfs_log_move_tail(struct xfs_mount *mp, 151*1da177e4SLinus Torvalds xfs_lsn_t tail_lsn); 152*1da177e4SLinus Torvalds int xfs_log_notify(struct xfs_mount *mp, 153*1da177e4SLinus Torvalds void *iclog, 154*1da177e4SLinus Torvalds xfs_log_callback_t *callback_entry); 155*1da177e4SLinus Torvalds int xfs_log_release_iclog(struct xfs_mount *mp, 156*1da177e4SLinus Torvalds void *iclog_hndl); 157*1da177e4SLinus Torvalds int xfs_log_reserve(struct xfs_mount *mp, 158*1da177e4SLinus Torvalds int length, 159*1da177e4SLinus Torvalds int count, 160*1da177e4SLinus Torvalds xfs_log_ticket_t *ticket, 161*1da177e4SLinus Torvalds __uint8_t clientid, 162*1da177e4SLinus Torvalds uint flags); 163*1da177e4SLinus Torvalds int xfs_log_write(struct xfs_mount *mp, 164*1da177e4SLinus Torvalds xfs_log_iovec_t region[], 165*1da177e4SLinus Torvalds int nentries, 166*1da177e4SLinus Torvalds xfs_log_ticket_t ticket, 167*1da177e4SLinus Torvalds xfs_lsn_t *start_lsn); 168*1da177e4SLinus Torvalds int xfs_log_unmount(struct xfs_mount *mp); 169*1da177e4SLinus Torvalds int xfs_log_unmount_write(struct xfs_mount *mp); 170*1da177e4SLinus Torvalds void xfs_log_unmount_dealloc(struct xfs_mount *mp); 171*1da177e4SLinus Torvalds int xfs_log_force_umount(struct xfs_mount *mp, int logerror); 172*1da177e4SLinus Torvalds int xfs_log_need_covered(struct xfs_mount *mp); 173*1da177e4SLinus Torvalds 174*1da177e4SLinus Torvalds void xlog_iodone(struct xfs_buf *); 175*1da177e4SLinus Torvalds 176*1da177e4SLinus Torvalds #endif 177*1da177e4SLinus Torvalds 178*1da177e4SLinus Torvalds 179*1da177e4SLinus Torvalds extern int xlog_debug; /* set to 1 to enable real log */ 180*1da177e4SLinus Torvalds 181*1da177e4SLinus Torvalds 182*1da177e4SLinus Torvalds #endif /* __XFS_LOG_H__ */ 183