Loading fs/xfs/xfs_log.c +137 −86 Original line number Diff line number Diff line Loading @@ -45,50 +45,84 @@ xlog_commit_record( struct xlog_in_core **iclog, xfs_lsn_t *commitlsnp); STATIC xlog_t * xlog_alloc_log(xfs_mount_t *mp, xfs_buftarg_t *log_target, STATIC struct xlog * xlog_alloc_log( struct xfs_mount *mp, struct xfs_buftarg *log_target, xfs_daddr_t blk_offset, int num_bblks); STATIC int xlog_space_left( struct xlog *log, atomic64_t *head); STATIC int xlog_sync(xlog_t *log, xlog_in_core_t *iclog); STATIC void xlog_dealloc_log(xlog_t *log); STATIC int xlog_sync( struct xlog *log, struct xlog_in_core *iclog); STATIC void xlog_dealloc_log( struct xlog *log); /* local state machine functions */ STATIC void xlog_state_done_syncing(xlog_in_core_t *iclog, int); STATIC void xlog_state_do_callback(xlog_t *log,int aborted, xlog_in_core_t *iclog); STATIC int xlog_state_get_iclog_space(xlog_t *log, STATIC void xlog_state_do_callback( struct xlog *log, int aborted, struct xlog_in_core *iclog); STATIC int xlog_state_get_iclog_space( struct xlog *log, int len, xlog_in_core_t **iclog, xlog_ticket_t *ticket, struct xlog_in_core **iclog, struct xlog_ticket *ticket, int *continued_write, int *logoffsetp); STATIC int xlog_state_release_iclog(xlog_t *log, xlog_in_core_t *iclog); STATIC void xlog_state_switch_iclogs(xlog_t *log, xlog_in_core_t *iclog, STATIC int xlog_state_release_iclog( struct xlog *log, struct xlog_in_core *iclog); STATIC void xlog_state_switch_iclogs( struct xlog *log, struct xlog_in_core *iclog, int eventual_size); STATIC void xlog_state_want_sync(xlog_t *log, xlog_in_core_t *iclog); STATIC void xlog_state_want_sync( struct xlog *log, struct xlog_in_core *iclog); STATIC void xlog_grant_push_ail( struct xlog *log, int need_bytes); STATIC void xlog_regrant_reserve_log_space(xlog_t *log, xlog_ticket_t *ticket); STATIC void xlog_ungrant_log_space(xlog_t *log, xlog_ticket_t *ticket); STATIC void xlog_regrant_reserve_log_space( struct xlog *log, struct xlog_ticket *ticket); STATIC void xlog_ungrant_log_space( struct xlog *log, struct xlog_ticket *ticket); #if defined(DEBUG) STATIC void xlog_verify_dest_ptr(xlog_t *log, char *ptr); STATIC void xlog_verify_dest_ptr( struct xlog *log, char *ptr); STATIC void xlog_verify_grant_tail( struct xlog *log); STATIC void xlog_verify_iclog(xlog_t *log, xlog_in_core_t *iclog, int count, boolean_t syncing); STATIC void xlog_verify_tail_lsn(xlog_t *log, xlog_in_core_t *iclog, STATIC void xlog_verify_iclog( struct xlog *log, struct xlog_in_core *iclog, int count, boolean_t syncing); STATIC void xlog_verify_tail_lsn( struct xlog *log, struct xlog_in_core *iclog, xfs_lsn_t tail_lsn); #else #define xlog_verify_dest_ptr(a,b) Loading @@ -97,7 +131,9 @@ STATIC void xlog_verify_tail_lsn(xlog_t *log, xlog_in_core_t *iclog, #define xlog_verify_tail_lsn(a,b,c) #endif STATIC int xlog_iclogs_empty(xlog_t *log); STATIC int xlog_iclogs_empty( struct xlog *log); static void xlog_grant_sub_space( Loading Loading @@ -684,7 +720,7 @@ xfs_log_mount_finish(xfs_mount_t *mp) int xfs_log_unmount_write(xfs_mount_t *mp) { xlog_t *log = mp->m_log; struct xlog *log = mp->m_log; xlog_in_core_t *iclog; #ifdef DEBUG xlog_in_core_t *first_iclog; Loading Loading @@ -893,7 +929,7 @@ int xfs_log_need_covered(xfs_mount_t *mp) { int needed = 0; xlog_t *log = mp->m_log; struct xlog *log = mp->m_log; if (!xfs_fs_writable(mp)) return 0; Loading Loading @@ -1024,8 +1060,8 @@ xlog_space_left( void xlog_iodone(xfs_buf_t *bp) { xlog_in_core_t *iclog = bp->b_fspriv; xlog_t *l = iclog->ic_log; struct xlog_in_core *iclog = bp->b_fspriv; struct xlog *l = iclog->ic_log; int aborted = 0; /* Loading Loading @@ -1067,8 +1103,9 @@ xlog_iodone(xfs_buf_t *bp) */ STATIC void xlog_get_iclog_buffer_size(xfs_mount_t *mp, xlog_t *log) xlog_get_iclog_buffer_size( struct xfs_mount *mp, struct xlog *log) { int size; int xhdrs; Loading Loading @@ -1129,13 +1166,14 @@ done: * Its primary purpose is to fill in enough, so recovery can occur. However, * some other stuff may be filled in too. */ STATIC xlog_t * xlog_alloc_log(xfs_mount_t *mp, xfs_buftarg_t *log_target, STATIC struct xlog * xlog_alloc_log( struct xfs_mount *mp, struct xfs_buftarg *log_target, xfs_daddr_t blk_offset, int num_bblks) { xlog_t *log; struct xlog *log; xlog_rec_header_t *head; xlog_in_core_t **iclogp; xlog_in_core_t *iclog, *prev_iclog=NULL; Loading @@ -1144,7 +1182,7 @@ xlog_alloc_log(xfs_mount_t *mp, int error = ENOMEM; uint log2_size = 0; log = kmem_zalloc(sizeof(xlog_t), KM_MAYFAIL); log = kmem_zalloc(sizeof(struct xlog), KM_MAYFAIL); if (!log) { xfs_warn(mp, "Log allocation failed: No memory!"); goto out; Loading Loading @@ -1434,8 +1472,9 @@ xlog_bdstrat( */ STATIC int xlog_sync(xlog_t *log, xlog_in_core_t *iclog) xlog_sync( struct xlog *log, struct xlog_in_core *iclog) { xfs_caddr_t dptr; /* pointer to byte sized element */ xfs_buf_t *bp; Loading Loading @@ -1584,7 +1623,8 @@ xlog_sync(xlog_t *log, * Deallocate a log structure */ STATIC void xlog_dealloc_log(xlog_t *log) xlog_dealloc_log( struct xlog *log) { xlog_in_core_t *iclog, *next_iclog; int i; Loading Loading @@ -1616,8 +1656,9 @@ xlog_dealloc_log(xlog_t *log) */ /* ARGSUSED */ static inline void xlog_state_finish_copy(xlog_t *log, xlog_in_core_t *iclog, xlog_state_finish_copy( struct xlog *log, struct xlog_in_core *iclog, int record_cnt, int copy_bytes) { Loading Loading @@ -2142,7 +2183,8 @@ xlog_write( * State Change: DIRTY -> ACTIVE */ STATIC void xlog_state_clean_log(xlog_t *log) xlog_state_clean_log( struct xlog *log) { xlog_in_core_t *iclog; int changed = 0; Loading Loading @@ -2222,7 +2264,7 @@ xlog_state_clean_log(xlog_t *log) STATIC xfs_lsn_t xlog_get_lowest_lsn( xlog_t *log) struct xlog *log) { xlog_in_core_t *lsn_log; xfs_lsn_t lowest_lsn, lsn; Loading @@ -2245,9 +2287,9 @@ xlog_get_lowest_lsn( STATIC void xlog_state_do_callback( xlog_t *log, struct xlog *log, int aborted, xlog_in_core_t *ciclog) struct xlog_in_core *ciclog) { xlog_in_core_t *iclog; xlog_in_core_t *first_iclog; /* used to know when we've Loading Loading @@ -2467,7 +2509,7 @@ xlog_state_done_syncing( xlog_in_core_t *iclog, int aborted) { xlog_t *log = iclog->ic_log; struct xlog *log = iclog->ic_log; spin_lock(&log->l_icloglock); Loading Loading @@ -2521,10 +2563,11 @@ xlog_state_done_syncing( * is copied. */ STATIC int xlog_state_get_iclog_space(xlog_t *log, xlog_state_get_iclog_space( struct xlog *log, int len, xlog_in_core_t **iclogp, xlog_ticket_t *ticket, struct xlog_in_core **iclogp, struct xlog_ticket *ticket, int *continued_write, int *logoffsetp) { Loading Loading @@ -2631,8 +2674,9 @@ restart: * move grant reservation head forward. */ STATIC void xlog_regrant_reserve_log_space(xlog_t *log, xlog_ticket_t *ticket) xlog_regrant_reserve_log_space( struct xlog *log, struct xlog_ticket *ticket) { trace_xfs_log_regrant_reserve_enter(log, ticket); Loading Loading @@ -2677,8 +2721,9 @@ xlog_regrant_reserve_log_space(xlog_t *log, * in the current reservation field. */ STATIC void xlog_ungrant_log_space(xlog_t *log, xlog_ticket_t *ticket) xlog_ungrant_log_space( struct xlog *log, struct xlog_ticket *ticket) { int bytes; Loading Loading @@ -2717,8 +2762,8 @@ xlog_ungrant_log_space(xlog_t *log, */ STATIC int xlog_state_release_iclog( xlog_t *log, xlog_in_core_t *iclog) struct xlog *log, struct xlog_in_core *iclog) { int sync = 0; /* do we sync? */ Loading Loading @@ -2768,8 +2813,9 @@ xlog_state_release_iclog( * that every data block. We have run out of space in this log record. */ STATIC void xlog_state_switch_iclogs(xlog_t *log, xlog_in_core_t *iclog, xlog_state_switch_iclogs( struct xlog *log, struct xlog_in_core *iclog, int eventual_size) { ASSERT(iclog->ic_state == XLOG_STATE_ACTIVE); Loading Loading @@ -3114,7 +3160,9 @@ xfs_log_force_lsn( * disk. */ STATIC void xlog_state_want_sync(xlog_t *log, xlog_in_core_t *iclog) xlog_state_want_sync( struct xlog *log, struct xlog_in_core *iclog) { assert_spin_locked(&log->l_icloglock); Loading Loading @@ -3158,7 +3206,7 @@ xfs_log_ticket_get( /* * Allocate and initialise a new log ticket. */ xlog_ticket_t * struct xlog_ticket * xlog_ticket_alloc( struct xlog *log, int unit_bytes, Loading Loading @@ -3346,8 +3394,9 @@ xlog_verify_grant_tail( /* check if it will fit */ STATIC void xlog_verify_tail_lsn(xlog_t *log, xlog_in_core_t *iclog, xlog_verify_tail_lsn( struct xlog *log, struct xlog_in_core *iclog, xfs_lsn_t tail_lsn) { int blocks; Loading Loading @@ -3385,8 +3434,9 @@ xlog_verify_tail_lsn(xlog_t *log, * the cycle numbers agree with the current cycle number. */ STATIC void xlog_verify_iclog(xlog_t *log, xlog_in_core_t *iclog, xlog_verify_iclog( struct xlog *log, struct xlog_in_core *iclog, int count, boolean_t syncing) { Loading Loading @@ -3482,7 +3532,7 @@ xlog_verify_iclog(xlog_t *log, */ STATIC int xlog_state_ioerror( xlog_t *log) struct xlog *log) { xlog_in_core_t *iclog, *ic; Loading Loading @@ -3527,7 +3577,7 @@ xfs_log_force_umount( struct xfs_mount *mp, int logerror) { xlog_t *log; struct xlog *log; int retval; log = mp->m_log; Loading Loading @@ -3634,7 +3684,8 @@ xfs_log_force_umount( } STATIC int xlog_iclogs_empty(xlog_t *log) xlog_iclogs_empty( struct xlog *log) { xlog_in_core_t *iclog; Loading fs/xfs/xfs_log_priv.h +13 −5 Original line number Diff line number Diff line Loading @@ -487,7 +487,7 @@ struct xlog_grant_head { * overflow 31 bits worth of byte offset, so using a byte number will mean * that round off problems won't occur when releasing partial reservations. */ typedef struct xlog { struct xlog { /* The following fields don't need locking */ struct xfs_mount *l_mp; /* mount point */ struct xfs_ail *l_ailp; /* AIL log is working with */ Loading Loading @@ -540,7 +540,7 @@ typedef struct xlog { char *l_iclog_bak[XLOG_MAX_ICLOGS]; #endif } xlog_t; }; #define XLOG_BUF_CANCEL_BUCKET(log, blkno) \ ((log)->l_buf_cancel_table + ((__uint64_t)blkno % XLOG_BC_TABLE_SIZE)) Loading @@ -548,9 +548,17 @@ typedef struct xlog { #define XLOG_FORCED_SHUTDOWN(log) ((log)->l_flags & XLOG_IO_ERROR) /* common routines */ extern int xlog_recover(xlog_t *log); extern int xlog_recover_finish(xlog_t *log); extern void xlog_pack_data(xlog_t *log, xlog_in_core_t *iclog, int); extern int xlog_recover( struct xlog *log); extern int xlog_recover_finish( struct xlog *log); extern void xlog_pack_data( struct xlog *log, struct xlog_in_core *iclog, int); extern kmem_zone_t *xfs_log_ticket_zone; struct xlog_ticket * Loading fs/xfs/xfs_log_recover.c +74 −66 Original line number Diff line number Diff line Loading @@ -43,10 +43,18 @@ #include "xfs_utils.h" #include "xfs_trace.h" STATIC int xlog_find_zeroed(xlog_t *, xfs_daddr_t *); STATIC int xlog_clear_stale_blocks(xlog_t *, xfs_lsn_t); STATIC int xlog_find_zeroed( struct xlog *, xfs_daddr_t *); STATIC int xlog_clear_stale_blocks( struct xlog *, xfs_lsn_t); #if defined(DEBUG) STATIC void xlog_recover_check_summary(xlog_t *); STATIC void xlog_recover_check_summary( struct xlog *); #else #define xlog_recover_check_summary(log) #endif Loading Loading @@ -74,7 +82,7 @@ struct xfs_buf_cancel { static inline int xlog_buf_bbcount_valid( xlog_t *log, struct xlog *log, int bbcount) { return bbcount > 0 && bbcount <= log->l_logBBsize; Loading @@ -87,7 +95,7 @@ xlog_buf_bbcount_valid( */ STATIC xfs_buf_t * xlog_get_bp( xlog_t *log, struct xlog *log, int nbblks) { struct xfs_buf *bp; Loading Loading @@ -138,10 +146,10 @@ xlog_put_bp( */ STATIC xfs_caddr_t xlog_align( xlog_t *log, struct xlog *log, xfs_daddr_t blk_no, int nbblks, xfs_buf_t *bp) struct xfs_buf *bp) { xfs_daddr_t offset = blk_no & ((xfs_daddr_t)log->l_sectBBsize - 1); Loading @@ -155,10 +163,10 @@ xlog_align( */ STATIC int xlog_bread_noalign( xlog_t *log, struct xlog *log, xfs_daddr_t blk_no, int nbblks, xfs_buf_t *bp) struct xfs_buf *bp) { int error; Loading Loading @@ -189,10 +197,10 @@ xlog_bread_noalign( STATIC int xlog_bread( xlog_t *log, struct xlog *log, xfs_daddr_t blk_no, int nbblks, xfs_buf_t *bp, struct xfs_buf *bp, xfs_caddr_t *offset) { int error; Loading @@ -211,10 +219,10 @@ xlog_bread( */ STATIC int xlog_bread_offset( xlog_t *log, struct xlog *log, xfs_daddr_t blk_no, /* block to read from */ int nbblks, /* blocks to read */ xfs_buf_t *bp, struct xfs_buf *bp, xfs_caddr_t offset) { xfs_caddr_t orig_offset = bp->b_addr; Loading @@ -241,10 +249,10 @@ xlog_bread_offset( */ STATIC int xlog_bwrite( xlog_t *log, struct xlog *log, xfs_daddr_t blk_no, int nbblks, xfs_buf_t *bp) struct xfs_buf *bp) { int error; Loading Loading @@ -378,8 +386,8 @@ xlog_recover_iodone( */ STATIC int xlog_find_cycle_start( xlog_t *log, xfs_buf_t *bp, struct xlog *log, struct xfs_buf *bp, xfs_daddr_t first_blk, xfs_daddr_t *last_blk, uint cycle) Loading Loading @@ -421,7 +429,7 @@ xlog_find_cycle_start( */ STATIC int xlog_find_verify_cycle( xlog_t *log, struct xlog *log, xfs_daddr_t start_blk, int nbblks, uint stop_on_cycle_no, Loading Loading @@ -490,7 +498,7 @@ out: */ STATIC int xlog_find_verify_log_record( xlog_t *log, struct xlog *log, xfs_daddr_t start_blk, xfs_daddr_t *last_blk, int extra_bblks) Loading Loading @@ -600,7 +608,7 @@ out: */ STATIC int xlog_find_head( xlog_t *log, struct xlog *log, xfs_daddr_t *return_head_blk) { xfs_buf_t *bp; Loading Loading @@ -871,7 +879,7 @@ validate_head: */ STATIC int xlog_find_tail( xlog_t *log, struct xlog *log, xfs_daddr_t *head_blk, xfs_daddr_t *tail_blk) { Loading Loading @@ -1080,7 +1088,7 @@ done: */ STATIC int xlog_find_zeroed( xlog_t *log, struct xlog *log, xfs_daddr_t *blk_no) { xfs_buf_t *bp; Loading Loading @@ -1183,7 +1191,7 @@ bp_err: */ STATIC void xlog_add_record( xlog_t *log, struct xlog *log, xfs_caddr_t buf, int cycle, int block, Loading @@ -1205,7 +1213,7 @@ xlog_add_record( STATIC int xlog_write_log_records( xlog_t *log, struct xlog *log, int cycle, int start_block, int blocks, Loading Loading @@ -1305,7 +1313,7 @@ xlog_write_log_records( */ STATIC int xlog_clear_stale_blocks( xlog_t *log, struct xlog *log, xfs_lsn_t tail_lsn) { int tail_cycle, head_cycle; Loading Loading @@ -2050,11 +2058,11 @@ xfs_qm_dqcheck( */ STATIC void xlog_recover_do_dquot_buffer( xfs_mount_t *mp, xlog_t *log, xlog_recover_item_t *item, xfs_buf_t *bp, xfs_buf_log_format_t *buf_f) struct xfs_mount *mp, struct xlog *log, struct xlog_recover_item *item, struct xfs_buf *bp, struct xfs_buf_log_format *buf_f) { uint type; Loading Loading @@ -2108,9 +2116,9 @@ xlog_recover_do_dquot_buffer( */ STATIC int xlog_recover_buffer_pass2( xlog_t *log, struct xlog *log, struct list_head *buffer_list, xlog_recover_item_t *item) struct xlog_recover_item *item) { xfs_buf_log_format_t *buf_f = item->ri_buf[0].i_addr; xfs_mount_t *mp = log->l_mp; Loading Loading @@ -2189,9 +2197,9 @@ xlog_recover_buffer_pass2( STATIC int xlog_recover_inode_pass2( xlog_t *log, struct xlog *log, struct list_head *buffer_list, xlog_recover_item_t *item) struct xlog_recover_item *item) { xfs_inode_log_format_t *in_f; xfs_mount_t *mp = log->l_mp; Loading Loading @@ -2452,14 +2460,14 @@ error: } /* * Recover QUOTAOFF records. We simply make a note of it in the xlog_t * Recover QUOTAOFF records. We simply make a note of it in the xlog * structure, so that we know not to do any dquot item or dquot buffer recovery, * of that type. */ STATIC int xlog_recover_quotaoff_pass1( xlog_t *log, xlog_recover_item_t *item) struct xlog *log, struct xlog_recover_item *item) { xfs_qoff_logformat_t *qoff_f = item->ri_buf[0].i_addr; ASSERT(qoff_f); Loading @@ -2483,9 +2491,9 @@ xlog_recover_quotaoff_pass1( */ STATIC int xlog_recover_dquot_pass2( xlog_t *log, struct xlog *log, struct list_head *buffer_list, xlog_recover_item_t *item) struct xlog_recover_item *item) { xfs_mount_t *mp = log->l_mp; xfs_buf_t *bp; Loading Loading @@ -2578,8 +2586,8 @@ xlog_recover_dquot_pass2( */ STATIC int xlog_recover_efi_pass2( xlog_t *log, xlog_recover_item_t *item, struct xlog *log, struct xlog_recover_item *item, xfs_lsn_t lsn) { int error; Loading Loading @@ -2616,8 +2624,8 @@ xlog_recover_efi_pass2( */ STATIC int xlog_recover_efd_pass2( xlog_t *log, xlog_recover_item_t *item) struct xlog *log, struct xlog_recover_item *item) { xfs_efd_log_format_t *efd_formatp; xfs_efi_log_item_t *efip = NULL; Loading Loading @@ -2812,9 +2820,9 @@ xlog_recover_unmount_trans( */ STATIC int xlog_recover_process_data( xlog_t *log, struct xlog *log, struct hlist_head rhash[], xlog_rec_header_t *rhead, struct xlog_rec_header *rhead, xfs_caddr_t dp, int pass) { Loading Loading @@ -2986,7 +2994,7 @@ abort_error: */ STATIC int xlog_recover_process_efis( xlog_t *log) struct xlog *log) { xfs_log_item_t *lip; xfs_efi_log_item_t *efip; Loading Loading @@ -3147,7 +3155,7 @@ xlog_recover_process_one_iunlink( */ STATIC void xlog_recover_process_iunlinks( xlog_t *log) struct xlog *log) { xfs_mount_t *mp; xfs_agnumber_t agno; Loading Loading @@ -3209,8 +3217,8 @@ xlog_recover_process_iunlinks( #ifdef DEBUG STATIC void xlog_pack_data_checksum( xlog_t *log, xlog_in_core_t *iclog, struct xlog *log, struct xlog_in_core *iclog, int size) { int i; Loading @@ -3234,8 +3242,8 @@ xlog_pack_data_checksum( */ void xlog_pack_data( xlog_t *log, xlog_in_core_t *iclog, struct xlog *log, struct xlog_in_core *iclog, int roundoff) { int i, j, k; Loading Loading @@ -3274,9 +3282,9 @@ xlog_pack_data( STATIC void xlog_unpack_data( xlog_rec_header_t *rhead, struct xlog_rec_header *rhead, xfs_caddr_t dp, xlog_t *log) struct xlog *log) { int i, j, k; Loading @@ -3299,8 +3307,8 @@ xlog_unpack_data( STATIC int xlog_valid_rec_header( xlog_t *log, xlog_rec_header_t *rhead, struct xlog *log, struct xlog_rec_header *rhead, xfs_daddr_t blkno) { int hlen; Loading Loading @@ -3343,7 +3351,7 @@ xlog_valid_rec_header( */ STATIC int xlog_do_recovery_pass( xlog_t *log, struct xlog *log, xfs_daddr_t head_blk, xfs_daddr_t tail_blk, int pass) Loading Loading @@ -3595,7 +3603,7 @@ xlog_do_recovery_pass( */ STATIC int xlog_do_log_recovery( xlog_t *log, struct xlog *log, xfs_daddr_t head_blk, xfs_daddr_t tail_blk) { Loading Loading @@ -3646,7 +3654,7 @@ xlog_do_log_recovery( */ STATIC int xlog_do_recover( xlog_t *log, struct xlog *log, xfs_daddr_t head_blk, xfs_daddr_t tail_blk) { Loading Loading @@ -3721,7 +3729,7 @@ xlog_do_recover( */ int xlog_recover( xlog_t *log) struct xlog *log) { xfs_daddr_t head_blk, tail_blk; int error; Loading Loading @@ -3767,7 +3775,7 @@ xlog_recover( */ int xlog_recover_finish( xlog_t *log) struct xlog *log) { /* * Now we're ready to do the transactions needed for the Loading Loading @@ -3814,7 +3822,7 @@ xlog_recover_finish( */ void xlog_recover_check_summary( xlog_t *log) struct xlog *log) { xfs_mount_t *mp; xfs_agf_t *agfp; Loading Loading
fs/xfs/xfs_log.c +137 −86 Original line number Diff line number Diff line Loading @@ -45,50 +45,84 @@ xlog_commit_record( struct xlog_in_core **iclog, xfs_lsn_t *commitlsnp); STATIC xlog_t * xlog_alloc_log(xfs_mount_t *mp, xfs_buftarg_t *log_target, STATIC struct xlog * xlog_alloc_log( struct xfs_mount *mp, struct xfs_buftarg *log_target, xfs_daddr_t blk_offset, int num_bblks); STATIC int xlog_space_left( struct xlog *log, atomic64_t *head); STATIC int xlog_sync(xlog_t *log, xlog_in_core_t *iclog); STATIC void xlog_dealloc_log(xlog_t *log); STATIC int xlog_sync( struct xlog *log, struct xlog_in_core *iclog); STATIC void xlog_dealloc_log( struct xlog *log); /* local state machine functions */ STATIC void xlog_state_done_syncing(xlog_in_core_t *iclog, int); STATIC void xlog_state_do_callback(xlog_t *log,int aborted, xlog_in_core_t *iclog); STATIC int xlog_state_get_iclog_space(xlog_t *log, STATIC void xlog_state_do_callback( struct xlog *log, int aborted, struct xlog_in_core *iclog); STATIC int xlog_state_get_iclog_space( struct xlog *log, int len, xlog_in_core_t **iclog, xlog_ticket_t *ticket, struct xlog_in_core **iclog, struct xlog_ticket *ticket, int *continued_write, int *logoffsetp); STATIC int xlog_state_release_iclog(xlog_t *log, xlog_in_core_t *iclog); STATIC void xlog_state_switch_iclogs(xlog_t *log, xlog_in_core_t *iclog, STATIC int xlog_state_release_iclog( struct xlog *log, struct xlog_in_core *iclog); STATIC void xlog_state_switch_iclogs( struct xlog *log, struct xlog_in_core *iclog, int eventual_size); STATIC void xlog_state_want_sync(xlog_t *log, xlog_in_core_t *iclog); STATIC void xlog_state_want_sync( struct xlog *log, struct xlog_in_core *iclog); STATIC void xlog_grant_push_ail( struct xlog *log, int need_bytes); STATIC void xlog_regrant_reserve_log_space(xlog_t *log, xlog_ticket_t *ticket); STATIC void xlog_ungrant_log_space(xlog_t *log, xlog_ticket_t *ticket); STATIC void xlog_regrant_reserve_log_space( struct xlog *log, struct xlog_ticket *ticket); STATIC void xlog_ungrant_log_space( struct xlog *log, struct xlog_ticket *ticket); #if defined(DEBUG) STATIC void xlog_verify_dest_ptr(xlog_t *log, char *ptr); STATIC void xlog_verify_dest_ptr( struct xlog *log, char *ptr); STATIC void xlog_verify_grant_tail( struct xlog *log); STATIC void xlog_verify_iclog(xlog_t *log, xlog_in_core_t *iclog, int count, boolean_t syncing); STATIC void xlog_verify_tail_lsn(xlog_t *log, xlog_in_core_t *iclog, STATIC void xlog_verify_iclog( struct xlog *log, struct xlog_in_core *iclog, int count, boolean_t syncing); STATIC void xlog_verify_tail_lsn( struct xlog *log, struct xlog_in_core *iclog, xfs_lsn_t tail_lsn); #else #define xlog_verify_dest_ptr(a,b) Loading @@ -97,7 +131,9 @@ STATIC void xlog_verify_tail_lsn(xlog_t *log, xlog_in_core_t *iclog, #define xlog_verify_tail_lsn(a,b,c) #endif STATIC int xlog_iclogs_empty(xlog_t *log); STATIC int xlog_iclogs_empty( struct xlog *log); static void xlog_grant_sub_space( Loading Loading @@ -684,7 +720,7 @@ xfs_log_mount_finish(xfs_mount_t *mp) int xfs_log_unmount_write(xfs_mount_t *mp) { xlog_t *log = mp->m_log; struct xlog *log = mp->m_log; xlog_in_core_t *iclog; #ifdef DEBUG xlog_in_core_t *first_iclog; Loading Loading @@ -893,7 +929,7 @@ int xfs_log_need_covered(xfs_mount_t *mp) { int needed = 0; xlog_t *log = mp->m_log; struct xlog *log = mp->m_log; if (!xfs_fs_writable(mp)) return 0; Loading Loading @@ -1024,8 +1060,8 @@ xlog_space_left( void xlog_iodone(xfs_buf_t *bp) { xlog_in_core_t *iclog = bp->b_fspriv; xlog_t *l = iclog->ic_log; struct xlog_in_core *iclog = bp->b_fspriv; struct xlog *l = iclog->ic_log; int aborted = 0; /* Loading Loading @@ -1067,8 +1103,9 @@ xlog_iodone(xfs_buf_t *bp) */ STATIC void xlog_get_iclog_buffer_size(xfs_mount_t *mp, xlog_t *log) xlog_get_iclog_buffer_size( struct xfs_mount *mp, struct xlog *log) { int size; int xhdrs; Loading Loading @@ -1129,13 +1166,14 @@ done: * Its primary purpose is to fill in enough, so recovery can occur. However, * some other stuff may be filled in too. */ STATIC xlog_t * xlog_alloc_log(xfs_mount_t *mp, xfs_buftarg_t *log_target, STATIC struct xlog * xlog_alloc_log( struct xfs_mount *mp, struct xfs_buftarg *log_target, xfs_daddr_t blk_offset, int num_bblks) { xlog_t *log; struct xlog *log; xlog_rec_header_t *head; xlog_in_core_t **iclogp; xlog_in_core_t *iclog, *prev_iclog=NULL; Loading @@ -1144,7 +1182,7 @@ xlog_alloc_log(xfs_mount_t *mp, int error = ENOMEM; uint log2_size = 0; log = kmem_zalloc(sizeof(xlog_t), KM_MAYFAIL); log = kmem_zalloc(sizeof(struct xlog), KM_MAYFAIL); if (!log) { xfs_warn(mp, "Log allocation failed: No memory!"); goto out; Loading Loading @@ -1434,8 +1472,9 @@ xlog_bdstrat( */ STATIC int xlog_sync(xlog_t *log, xlog_in_core_t *iclog) xlog_sync( struct xlog *log, struct xlog_in_core *iclog) { xfs_caddr_t dptr; /* pointer to byte sized element */ xfs_buf_t *bp; Loading Loading @@ -1584,7 +1623,8 @@ xlog_sync(xlog_t *log, * Deallocate a log structure */ STATIC void xlog_dealloc_log(xlog_t *log) xlog_dealloc_log( struct xlog *log) { xlog_in_core_t *iclog, *next_iclog; int i; Loading Loading @@ -1616,8 +1656,9 @@ xlog_dealloc_log(xlog_t *log) */ /* ARGSUSED */ static inline void xlog_state_finish_copy(xlog_t *log, xlog_in_core_t *iclog, xlog_state_finish_copy( struct xlog *log, struct xlog_in_core *iclog, int record_cnt, int copy_bytes) { Loading Loading @@ -2142,7 +2183,8 @@ xlog_write( * State Change: DIRTY -> ACTIVE */ STATIC void xlog_state_clean_log(xlog_t *log) xlog_state_clean_log( struct xlog *log) { xlog_in_core_t *iclog; int changed = 0; Loading Loading @@ -2222,7 +2264,7 @@ xlog_state_clean_log(xlog_t *log) STATIC xfs_lsn_t xlog_get_lowest_lsn( xlog_t *log) struct xlog *log) { xlog_in_core_t *lsn_log; xfs_lsn_t lowest_lsn, lsn; Loading @@ -2245,9 +2287,9 @@ xlog_get_lowest_lsn( STATIC void xlog_state_do_callback( xlog_t *log, struct xlog *log, int aborted, xlog_in_core_t *ciclog) struct xlog_in_core *ciclog) { xlog_in_core_t *iclog; xlog_in_core_t *first_iclog; /* used to know when we've Loading Loading @@ -2467,7 +2509,7 @@ xlog_state_done_syncing( xlog_in_core_t *iclog, int aborted) { xlog_t *log = iclog->ic_log; struct xlog *log = iclog->ic_log; spin_lock(&log->l_icloglock); Loading Loading @@ -2521,10 +2563,11 @@ xlog_state_done_syncing( * is copied. */ STATIC int xlog_state_get_iclog_space(xlog_t *log, xlog_state_get_iclog_space( struct xlog *log, int len, xlog_in_core_t **iclogp, xlog_ticket_t *ticket, struct xlog_in_core **iclogp, struct xlog_ticket *ticket, int *continued_write, int *logoffsetp) { Loading Loading @@ -2631,8 +2674,9 @@ restart: * move grant reservation head forward. */ STATIC void xlog_regrant_reserve_log_space(xlog_t *log, xlog_ticket_t *ticket) xlog_regrant_reserve_log_space( struct xlog *log, struct xlog_ticket *ticket) { trace_xfs_log_regrant_reserve_enter(log, ticket); Loading Loading @@ -2677,8 +2721,9 @@ xlog_regrant_reserve_log_space(xlog_t *log, * in the current reservation field. */ STATIC void xlog_ungrant_log_space(xlog_t *log, xlog_ticket_t *ticket) xlog_ungrant_log_space( struct xlog *log, struct xlog_ticket *ticket) { int bytes; Loading Loading @@ -2717,8 +2762,8 @@ xlog_ungrant_log_space(xlog_t *log, */ STATIC int xlog_state_release_iclog( xlog_t *log, xlog_in_core_t *iclog) struct xlog *log, struct xlog_in_core *iclog) { int sync = 0; /* do we sync? */ Loading Loading @@ -2768,8 +2813,9 @@ xlog_state_release_iclog( * that every data block. We have run out of space in this log record. */ STATIC void xlog_state_switch_iclogs(xlog_t *log, xlog_in_core_t *iclog, xlog_state_switch_iclogs( struct xlog *log, struct xlog_in_core *iclog, int eventual_size) { ASSERT(iclog->ic_state == XLOG_STATE_ACTIVE); Loading Loading @@ -3114,7 +3160,9 @@ xfs_log_force_lsn( * disk. */ STATIC void xlog_state_want_sync(xlog_t *log, xlog_in_core_t *iclog) xlog_state_want_sync( struct xlog *log, struct xlog_in_core *iclog) { assert_spin_locked(&log->l_icloglock); Loading Loading @@ -3158,7 +3206,7 @@ xfs_log_ticket_get( /* * Allocate and initialise a new log ticket. */ xlog_ticket_t * struct xlog_ticket * xlog_ticket_alloc( struct xlog *log, int unit_bytes, Loading Loading @@ -3346,8 +3394,9 @@ xlog_verify_grant_tail( /* check if it will fit */ STATIC void xlog_verify_tail_lsn(xlog_t *log, xlog_in_core_t *iclog, xlog_verify_tail_lsn( struct xlog *log, struct xlog_in_core *iclog, xfs_lsn_t tail_lsn) { int blocks; Loading Loading @@ -3385,8 +3434,9 @@ xlog_verify_tail_lsn(xlog_t *log, * the cycle numbers agree with the current cycle number. */ STATIC void xlog_verify_iclog(xlog_t *log, xlog_in_core_t *iclog, xlog_verify_iclog( struct xlog *log, struct xlog_in_core *iclog, int count, boolean_t syncing) { Loading Loading @@ -3482,7 +3532,7 @@ xlog_verify_iclog(xlog_t *log, */ STATIC int xlog_state_ioerror( xlog_t *log) struct xlog *log) { xlog_in_core_t *iclog, *ic; Loading Loading @@ -3527,7 +3577,7 @@ xfs_log_force_umount( struct xfs_mount *mp, int logerror) { xlog_t *log; struct xlog *log; int retval; log = mp->m_log; Loading Loading @@ -3634,7 +3684,8 @@ xfs_log_force_umount( } STATIC int xlog_iclogs_empty(xlog_t *log) xlog_iclogs_empty( struct xlog *log) { xlog_in_core_t *iclog; Loading
fs/xfs/xfs_log_priv.h +13 −5 Original line number Diff line number Diff line Loading @@ -487,7 +487,7 @@ struct xlog_grant_head { * overflow 31 bits worth of byte offset, so using a byte number will mean * that round off problems won't occur when releasing partial reservations. */ typedef struct xlog { struct xlog { /* The following fields don't need locking */ struct xfs_mount *l_mp; /* mount point */ struct xfs_ail *l_ailp; /* AIL log is working with */ Loading Loading @@ -540,7 +540,7 @@ typedef struct xlog { char *l_iclog_bak[XLOG_MAX_ICLOGS]; #endif } xlog_t; }; #define XLOG_BUF_CANCEL_BUCKET(log, blkno) \ ((log)->l_buf_cancel_table + ((__uint64_t)blkno % XLOG_BC_TABLE_SIZE)) Loading @@ -548,9 +548,17 @@ typedef struct xlog { #define XLOG_FORCED_SHUTDOWN(log) ((log)->l_flags & XLOG_IO_ERROR) /* common routines */ extern int xlog_recover(xlog_t *log); extern int xlog_recover_finish(xlog_t *log); extern void xlog_pack_data(xlog_t *log, xlog_in_core_t *iclog, int); extern int xlog_recover( struct xlog *log); extern int xlog_recover_finish( struct xlog *log); extern void xlog_pack_data( struct xlog *log, struct xlog_in_core *iclog, int); extern kmem_zone_t *xfs_log_ticket_zone; struct xlog_ticket * Loading
fs/xfs/xfs_log_recover.c +74 −66 Original line number Diff line number Diff line Loading @@ -43,10 +43,18 @@ #include "xfs_utils.h" #include "xfs_trace.h" STATIC int xlog_find_zeroed(xlog_t *, xfs_daddr_t *); STATIC int xlog_clear_stale_blocks(xlog_t *, xfs_lsn_t); STATIC int xlog_find_zeroed( struct xlog *, xfs_daddr_t *); STATIC int xlog_clear_stale_blocks( struct xlog *, xfs_lsn_t); #if defined(DEBUG) STATIC void xlog_recover_check_summary(xlog_t *); STATIC void xlog_recover_check_summary( struct xlog *); #else #define xlog_recover_check_summary(log) #endif Loading Loading @@ -74,7 +82,7 @@ struct xfs_buf_cancel { static inline int xlog_buf_bbcount_valid( xlog_t *log, struct xlog *log, int bbcount) { return bbcount > 0 && bbcount <= log->l_logBBsize; Loading @@ -87,7 +95,7 @@ xlog_buf_bbcount_valid( */ STATIC xfs_buf_t * xlog_get_bp( xlog_t *log, struct xlog *log, int nbblks) { struct xfs_buf *bp; Loading Loading @@ -138,10 +146,10 @@ xlog_put_bp( */ STATIC xfs_caddr_t xlog_align( xlog_t *log, struct xlog *log, xfs_daddr_t blk_no, int nbblks, xfs_buf_t *bp) struct xfs_buf *bp) { xfs_daddr_t offset = blk_no & ((xfs_daddr_t)log->l_sectBBsize - 1); Loading @@ -155,10 +163,10 @@ xlog_align( */ STATIC int xlog_bread_noalign( xlog_t *log, struct xlog *log, xfs_daddr_t blk_no, int nbblks, xfs_buf_t *bp) struct xfs_buf *bp) { int error; Loading Loading @@ -189,10 +197,10 @@ xlog_bread_noalign( STATIC int xlog_bread( xlog_t *log, struct xlog *log, xfs_daddr_t blk_no, int nbblks, xfs_buf_t *bp, struct xfs_buf *bp, xfs_caddr_t *offset) { int error; Loading @@ -211,10 +219,10 @@ xlog_bread( */ STATIC int xlog_bread_offset( xlog_t *log, struct xlog *log, xfs_daddr_t blk_no, /* block to read from */ int nbblks, /* blocks to read */ xfs_buf_t *bp, struct xfs_buf *bp, xfs_caddr_t offset) { xfs_caddr_t orig_offset = bp->b_addr; Loading @@ -241,10 +249,10 @@ xlog_bread_offset( */ STATIC int xlog_bwrite( xlog_t *log, struct xlog *log, xfs_daddr_t blk_no, int nbblks, xfs_buf_t *bp) struct xfs_buf *bp) { int error; Loading Loading @@ -378,8 +386,8 @@ xlog_recover_iodone( */ STATIC int xlog_find_cycle_start( xlog_t *log, xfs_buf_t *bp, struct xlog *log, struct xfs_buf *bp, xfs_daddr_t first_blk, xfs_daddr_t *last_blk, uint cycle) Loading Loading @@ -421,7 +429,7 @@ xlog_find_cycle_start( */ STATIC int xlog_find_verify_cycle( xlog_t *log, struct xlog *log, xfs_daddr_t start_blk, int nbblks, uint stop_on_cycle_no, Loading Loading @@ -490,7 +498,7 @@ out: */ STATIC int xlog_find_verify_log_record( xlog_t *log, struct xlog *log, xfs_daddr_t start_blk, xfs_daddr_t *last_blk, int extra_bblks) Loading Loading @@ -600,7 +608,7 @@ out: */ STATIC int xlog_find_head( xlog_t *log, struct xlog *log, xfs_daddr_t *return_head_blk) { xfs_buf_t *bp; Loading Loading @@ -871,7 +879,7 @@ validate_head: */ STATIC int xlog_find_tail( xlog_t *log, struct xlog *log, xfs_daddr_t *head_blk, xfs_daddr_t *tail_blk) { Loading Loading @@ -1080,7 +1088,7 @@ done: */ STATIC int xlog_find_zeroed( xlog_t *log, struct xlog *log, xfs_daddr_t *blk_no) { xfs_buf_t *bp; Loading Loading @@ -1183,7 +1191,7 @@ bp_err: */ STATIC void xlog_add_record( xlog_t *log, struct xlog *log, xfs_caddr_t buf, int cycle, int block, Loading @@ -1205,7 +1213,7 @@ xlog_add_record( STATIC int xlog_write_log_records( xlog_t *log, struct xlog *log, int cycle, int start_block, int blocks, Loading Loading @@ -1305,7 +1313,7 @@ xlog_write_log_records( */ STATIC int xlog_clear_stale_blocks( xlog_t *log, struct xlog *log, xfs_lsn_t tail_lsn) { int tail_cycle, head_cycle; Loading Loading @@ -2050,11 +2058,11 @@ xfs_qm_dqcheck( */ STATIC void xlog_recover_do_dquot_buffer( xfs_mount_t *mp, xlog_t *log, xlog_recover_item_t *item, xfs_buf_t *bp, xfs_buf_log_format_t *buf_f) struct xfs_mount *mp, struct xlog *log, struct xlog_recover_item *item, struct xfs_buf *bp, struct xfs_buf_log_format *buf_f) { uint type; Loading Loading @@ -2108,9 +2116,9 @@ xlog_recover_do_dquot_buffer( */ STATIC int xlog_recover_buffer_pass2( xlog_t *log, struct xlog *log, struct list_head *buffer_list, xlog_recover_item_t *item) struct xlog_recover_item *item) { xfs_buf_log_format_t *buf_f = item->ri_buf[0].i_addr; xfs_mount_t *mp = log->l_mp; Loading Loading @@ -2189,9 +2197,9 @@ xlog_recover_buffer_pass2( STATIC int xlog_recover_inode_pass2( xlog_t *log, struct xlog *log, struct list_head *buffer_list, xlog_recover_item_t *item) struct xlog_recover_item *item) { xfs_inode_log_format_t *in_f; xfs_mount_t *mp = log->l_mp; Loading Loading @@ -2452,14 +2460,14 @@ error: } /* * Recover QUOTAOFF records. We simply make a note of it in the xlog_t * Recover QUOTAOFF records. We simply make a note of it in the xlog * structure, so that we know not to do any dquot item or dquot buffer recovery, * of that type. */ STATIC int xlog_recover_quotaoff_pass1( xlog_t *log, xlog_recover_item_t *item) struct xlog *log, struct xlog_recover_item *item) { xfs_qoff_logformat_t *qoff_f = item->ri_buf[0].i_addr; ASSERT(qoff_f); Loading @@ -2483,9 +2491,9 @@ xlog_recover_quotaoff_pass1( */ STATIC int xlog_recover_dquot_pass2( xlog_t *log, struct xlog *log, struct list_head *buffer_list, xlog_recover_item_t *item) struct xlog_recover_item *item) { xfs_mount_t *mp = log->l_mp; xfs_buf_t *bp; Loading Loading @@ -2578,8 +2586,8 @@ xlog_recover_dquot_pass2( */ STATIC int xlog_recover_efi_pass2( xlog_t *log, xlog_recover_item_t *item, struct xlog *log, struct xlog_recover_item *item, xfs_lsn_t lsn) { int error; Loading Loading @@ -2616,8 +2624,8 @@ xlog_recover_efi_pass2( */ STATIC int xlog_recover_efd_pass2( xlog_t *log, xlog_recover_item_t *item) struct xlog *log, struct xlog_recover_item *item) { xfs_efd_log_format_t *efd_formatp; xfs_efi_log_item_t *efip = NULL; Loading Loading @@ -2812,9 +2820,9 @@ xlog_recover_unmount_trans( */ STATIC int xlog_recover_process_data( xlog_t *log, struct xlog *log, struct hlist_head rhash[], xlog_rec_header_t *rhead, struct xlog_rec_header *rhead, xfs_caddr_t dp, int pass) { Loading Loading @@ -2986,7 +2994,7 @@ abort_error: */ STATIC int xlog_recover_process_efis( xlog_t *log) struct xlog *log) { xfs_log_item_t *lip; xfs_efi_log_item_t *efip; Loading Loading @@ -3147,7 +3155,7 @@ xlog_recover_process_one_iunlink( */ STATIC void xlog_recover_process_iunlinks( xlog_t *log) struct xlog *log) { xfs_mount_t *mp; xfs_agnumber_t agno; Loading Loading @@ -3209,8 +3217,8 @@ xlog_recover_process_iunlinks( #ifdef DEBUG STATIC void xlog_pack_data_checksum( xlog_t *log, xlog_in_core_t *iclog, struct xlog *log, struct xlog_in_core *iclog, int size) { int i; Loading @@ -3234,8 +3242,8 @@ xlog_pack_data_checksum( */ void xlog_pack_data( xlog_t *log, xlog_in_core_t *iclog, struct xlog *log, struct xlog_in_core *iclog, int roundoff) { int i, j, k; Loading Loading @@ -3274,9 +3282,9 @@ xlog_pack_data( STATIC void xlog_unpack_data( xlog_rec_header_t *rhead, struct xlog_rec_header *rhead, xfs_caddr_t dp, xlog_t *log) struct xlog *log) { int i, j, k; Loading @@ -3299,8 +3307,8 @@ xlog_unpack_data( STATIC int xlog_valid_rec_header( xlog_t *log, xlog_rec_header_t *rhead, struct xlog *log, struct xlog_rec_header *rhead, xfs_daddr_t blkno) { int hlen; Loading Loading @@ -3343,7 +3351,7 @@ xlog_valid_rec_header( */ STATIC int xlog_do_recovery_pass( xlog_t *log, struct xlog *log, xfs_daddr_t head_blk, xfs_daddr_t tail_blk, int pass) Loading Loading @@ -3595,7 +3603,7 @@ xlog_do_recovery_pass( */ STATIC int xlog_do_log_recovery( xlog_t *log, struct xlog *log, xfs_daddr_t head_blk, xfs_daddr_t tail_blk) { Loading Loading @@ -3646,7 +3654,7 @@ xlog_do_log_recovery( */ STATIC int xlog_do_recover( xlog_t *log, struct xlog *log, xfs_daddr_t head_blk, xfs_daddr_t tail_blk) { Loading Loading @@ -3721,7 +3729,7 @@ xlog_do_recover( */ int xlog_recover( xlog_t *log) struct xlog *log) { xfs_daddr_t head_blk, tail_blk; int error; Loading Loading @@ -3767,7 +3775,7 @@ xlog_recover( */ int xlog_recover_finish( xlog_t *log) struct xlog *log) { /* * Now we're ready to do the transactions needed for the Loading Loading @@ -3814,7 +3822,7 @@ xlog_recover_finish( */ void xlog_recover_check_summary( xlog_t *log) struct xlog *log) { xfs_mount_t *mp; xfs_agf_t *agfp; Loading