diff options
Diffstat (limited to 'fs/xfs/xfs_log.c')
| -rw-r--r-- | fs/xfs/xfs_log.c | 87 | 
1 files changed, 66 insertions, 21 deletions
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 3731f13f63e9..0053bcf2b10a 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -434,7 +434,7 @@ xfs_log_reserve(  	int		 	unit_bytes,  	int		 	cnt,  	struct xlog_ticket	**ticp, -	__uint8_t	 	client, +	uint8_t		 	client,  	bool			permanent)  {  	struct xlog		*log = mp->m_log; @@ -825,9 +825,9 @@ xfs_log_unmount_write(xfs_mount_t *mp)  		if (!error) {  			/* the data section must be 32 bit size aligned */  			struct { -			    __uint16_t magic; -			    __uint16_t pad1; -			    __uint32_t pad2; /* may as well make it 64 bits */ +			    uint16_t magic; +			    uint16_t pad1; +			    uint32_t pad2; /* may as well make it 64 bits */  			} magic = {  				.magic = XLOG_UNMOUNT_TYPE,  			}; @@ -1189,8 +1189,7 @@ xlog_iodone(xfs_buf_t *bp)  	 * IOABORT state. The IOABORT state is only set in DEBUG mode to inject  	 * CRC errors into log recovery.  	 */ -	if (XFS_TEST_ERROR(bp->b_error, l->l_mp, XFS_ERRTAG_IODONE_IOERR, -			   XFS_RANDOM_IODONE_IOERR) || +	if (XFS_TEST_ERROR(bp->b_error, l->l_mp, XFS_ERRTAG_IODONE_IOERR) ||  	    iclog->ic_state & XLOG_STATE_IOABORT) {  		if (iclog->ic_state & XLOG_STATE_IOABORT)  			iclog->ic_state &= ~XLOG_STATE_IOABORT; @@ -1665,7 +1664,7 @@ xlog_cksum(  	char			*dp,  	int			size)  { -	__uint32_t		crc; +	uint32_t		crc;  	/* first generate the crc for the record header ... */  	crc = xfs_start_cksum_update((char *)rhead, @@ -1828,7 +1827,7 @@ xlog_sync(  		 */  		dptr = (char *)&iclog->ic_header + count;  		for (i = 0; i < split; i += BBSIZE) { -			__uint32_t cycle = be32_to_cpu(*(__be32 *)dptr); +			uint32_t cycle = be32_to_cpu(*(__be32 *)dptr);  			if (++cycle == XLOG_HEADER_MAGIC_NUM)  				cycle++;  			*(__be32 *)dptr = cpu_to_be32(cycle); @@ -1842,7 +1841,6 @@ xlog_sync(  	/* calculcate the checksum */  	iclog->ic_header.h_crc = xlog_cksum(log, &iclog->ic_header,  					    iclog->ic_datap, size); -#ifdef DEBUG  	/*  	 * Intentionally corrupt the log record CRC based on the error injection  	 * frequency, if defined. This facilitates testing log recovery in the @@ -1850,15 +1848,13 @@ xlog_sync(  	 * write on I/O completion and shutdown the fs. The subsequent mount  	 * detects the bad CRC and attempts to recover.  	 */ -	if (log->l_badcrc_factor && -	    (prandom_u32() % log->l_badcrc_factor == 0)) { +	if (XFS_TEST_ERROR(false, log->l_mp, XFS_ERRTAG_LOG_BAD_CRC)) {  		iclog->ic_header.h_crc &= cpu_to_le32(0xAAAAAAAA);  		iclog->ic_state |= XLOG_STATE_IOABORT;  		xfs_warn(log->l_mp,  	"Intentionally corrupted log record at LSN 0x%llx. Shutdown imminent.",  			 be64_to_cpu(iclog->ic_header.h_lsn));  	} -#endif  	bp->b_io_length = BTOBB(count);  	bp->b_fspriv = iclog; @@ -2024,7 +2020,7 @@ xlog_print_tic_res(  	};  #undef REG_TYPE_STR -	xfs_warn(mp, "xlog_write: reservation summary:"); +	xfs_warn(mp, "ticket reservation summary:");  	xfs_warn(mp, "  unit res    = %d bytes",  		 ticket->t_unit_res);  	xfs_warn(mp, "  current res = %d bytes", @@ -2045,10 +2041,55 @@ xlog_print_tic_res(  			    "bad-rtype" : res_type_str[r_type]),  			    ticket->t_res_arr[i].r_len);  	} +} + +/* + * Print a summary of the transaction. + */ +void +xlog_print_trans( +	struct xfs_trans		*tp) +{ +	struct xfs_mount		*mp = tp->t_mountp; +	struct xfs_log_item_desc	*lidp; + +	/* dump core transaction and ticket info */ +	xfs_warn(mp, "transaction summary:"); +	xfs_warn(mp, "  flags	= 0x%x", tp->t_flags); + +	xlog_print_tic_res(mp, tp->t_ticket); -	xfs_alert_tag(mp, XFS_PTAG_LOGRES, -		"xlog_write: reservation ran out. Need to up reservation"); -	xfs_force_shutdown(mp, SHUTDOWN_LOG_IO_ERROR); +	/* dump each log item */ +	list_for_each_entry(lidp, &tp->t_items, lid_trans) { +		struct xfs_log_item	*lip = lidp->lid_item; +		struct xfs_log_vec	*lv = lip->li_lv; +		struct xfs_log_iovec	*vec; +		int			i; + +		xfs_warn(mp, "log item: "); +		xfs_warn(mp, "  type	= 0x%x", lip->li_type); +		xfs_warn(mp, "  flags	= 0x%x", lip->li_flags); +		if (!lv) +			continue; +		xfs_warn(mp, "  niovecs	= %d", lv->lv_niovecs); +		xfs_warn(mp, "  size	= %d", lv->lv_size); +		xfs_warn(mp, "  bytes	= %d", lv->lv_bytes); +		xfs_warn(mp, "  buf len	= %d", lv->lv_buf_len); + +		/* dump each iovec for the log item */ +		vec = lv->lv_iovecp; +		for (i = 0; i < lv->lv_niovecs; i++) { +			int dumplen = min(vec->i_len, 32); + +			xfs_warn(mp, "  iovec[%d]", i); +			xfs_warn(mp, "    type	= 0x%x", vec->i_type); +			xfs_warn(mp, "    len	= %d", vec->i_len); +			xfs_warn(mp, "    first %d bytes of iovec[%d]:", dumplen, i); +			xfs_hex_dump(vec->i_addr, dumplen); + +			vec++; +		} +	}  }  /* @@ -2321,8 +2362,12 @@ xlog_write(  	if (flags & (XLOG_COMMIT_TRANS | XLOG_UNMOUNT_TRANS))  		ticket->t_curr_res -= sizeof(xlog_op_header_t); -	if (ticket->t_curr_res < 0) +	if (ticket->t_curr_res < 0) { +		xfs_alert_tag(log->l_mp, XFS_PTAG_LOGRES, +		     "ctx ticket reservation ran out. Need to up reservation");  		xlog_print_tic_res(log->l_mp, ticket); +		xfs_force_shutdown(log->l_mp, SHUTDOWN_LOG_IO_ERROR); +	}  	index = 0;  	lv = log_vector; @@ -2363,8 +2408,8 @@ xlog_write(  			}  			reg = &vecp[index]; -			ASSERT(reg->i_len % sizeof(__int32_t) == 0); -			ASSERT((unsigned long)ptr % sizeof(__int32_t) == 0); +			ASSERT(reg->i_len % sizeof(int32_t) == 0); +			ASSERT((unsigned long)ptr % sizeof(int32_t) == 0);  			start_rec_copy = xlog_write_start_rec(ptr, ticket);  			if (start_rec_copy) { @@ -3143,7 +3188,7 @@ xlog_state_switch_iclogs(  	/* Round up to next log-sunit */  	if (xfs_sb_version_haslogv2(&log->l_mp->m_sb) &&  	    log->l_mp->m_sb.sb_logsunit > 1) { -		__uint32_t sunit_bb = BTOBB(log->l_mp->m_sb.sb_logsunit); +		uint32_t sunit_bb = BTOBB(log->l_mp->m_sb.sb_logsunit);  		log->l_curr_block = roundup(log->l_curr_block, sunit_bb);  	} @@ -3771,7 +3816,7 @@ xlog_verify_iclog(  	xlog_in_core_2_t	*xhdr;  	void			*base_ptr, *ptr, *p;  	ptrdiff_t		field_offset; -	__uint8_t		clientid; +	uint8_t			clientid;  	int			len, i, j, k, op_len;  	int			idx;  | 
