mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	xfs: clean up calculation of LR header blocks
Let's use DIV_ROUND_UP() to calculate log record header blocks as what did in xlog_get_iclog_buffer_size() and wrap up a common helper for log recovery. Reviewed-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Gao Xiang <hsiangkao@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
		
							parent
							
								
									f692d09e9c
								
							
						
					
					
						commit
						0c771b99d6
					
				
					 2 changed files with 18 additions and 35 deletions
				
			
		| 
						 | 
				
			
			@ -1604,9 +1604,7 @@ xlog_cksum(
 | 
			
		|||
		int		i;
 | 
			
		||||
		int		xheads;
 | 
			
		||||
 | 
			
		||||
		xheads = size / XLOG_HEADER_CYCLE_SIZE;
 | 
			
		||||
		if (size % XLOG_HEADER_CYCLE_SIZE)
 | 
			
		||||
			xheads++;
 | 
			
		||||
		xheads = DIV_ROUND_UP(size, XLOG_HEADER_CYCLE_SIZE);
 | 
			
		||||
 | 
			
		||||
		for (i = 1; i < xheads; i++) {
 | 
			
		||||
			crc = crc32c(crc, &xhdr[i].hic_xheader,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -371,6 +371,19 @@ xlog_find_verify_cycle(
 | 
			
		|||
	return error;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
xlog_logrec_hblks(struct xlog *log, struct xlog_rec_header *rh)
 | 
			
		||||
{
 | 
			
		||||
	if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) {
 | 
			
		||||
		int	h_size = be32_to_cpu(rh->h_size);
 | 
			
		||||
 | 
			
		||||
		if ((be32_to_cpu(rh->h_version) & XLOG_VERSION_2) &&
 | 
			
		||||
		    h_size > XLOG_HEADER_CYCLE_SIZE)
 | 
			
		||||
			return DIV_ROUND_UP(h_size, XLOG_HEADER_CYCLE_SIZE);
 | 
			
		||||
	}
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Potentially backup over partial log record write.
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -463,15 +476,7 @@ xlog_find_verify_log_record(
 | 
			
		|||
	 * reset last_blk.  Only when last_blk points in the middle of a log
 | 
			
		||||
	 * record do we update last_blk.
 | 
			
		||||
	 */
 | 
			
		||||
	if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) {
 | 
			
		||||
		uint	h_size = be32_to_cpu(head->h_size);
 | 
			
		||||
 | 
			
		||||
		xhdrs = h_size / XLOG_HEADER_CYCLE_SIZE;
 | 
			
		||||
		if (h_size % XLOG_HEADER_CYCLE_SIZE)
 | 
			
		||||
			xhdrs++;
 | 
			
		||||
	} else {
 | 
			
		||||
		xhdrs = 1;
 | 
			
		||||
	}
 | 
			
		||||
	xhdrs = xlog_logrec_hblks(log, head);
 | 
			
		||||
 | 
			
		||||
	if (*last_blk - i + extra_bblks !=
 | 
			
		||||
	    BTOBB(be32_to_cpu(head->h_len)) + xhdrs)
 | 
			
		||||
| 
						 | 
				
			
			@ -1158,22 +1163,7 @@ xlog_check_unmount_rec(
 | 
			
		|||
	 * below. We won't want to clear the unmount record if there is one, so
 | 
			
		||||
	 * we pass the lsn of the unmount record rather than the block after it.
 | 
			
		||||
	 */
 | 
			
		||||
	if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) {
 | 
			
		||||
		int	h_size = be32_to_cpu(rhead->h_size);
 | 
			
		||||
		int	h_version = be32_to_cpu(rhead->h_version);
 | 
			
		||||
 | 
			
		||||
		if ((h_version & XLOG_VERSION_2) &&
 | 
			
		||||
		    (h_size > XLOG_HEADER_CYCLE_SIZE)) {
 | 
			
		||||
			hblks = h_size / XLOG_HEADER_CYCLE_SIZE;
 | 
			
		||||
			if (h_size % XLOG_HEADER_CYCLE_SIZE)
 | 
			
		||||
				hblks++;
 | 
			
		||||
		} else {
 | 
			
		||||
			hblks = 1;
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		hblks = 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	hblks = xlog_logrec_hblks(log, rhead);
 | 
			
		||||
	after_umount_blk = xlog_wrap_logbno(log,
 | 
			
		||||
			rhead_blk + hblks + BTOBB(be32_to_cpu(rhead->h_len)));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2989,15 +2979,10 @@ xlog_do_recovery_pass(
 | 
			
		|||
		if (error)
 | 
			
		||||
			goto bread_err1;
 | 
			
		||||
 | 
			
		||||
		if ((be32_to_cpu(rhead->h_version) & XLOG_VERSION_2) &&
 | 
			
		||||
		    (h_size > XLOG_HEADER_CYCLE_SIZE)) {
 | 
			
		||||
			hblks = h_size / XLOG_HEADER_CYCLE_SIZE;
 | 
			
		||||
			if (h_size % XLOG_HEADER_CYCLE_SIZE)
 | 
			
		||||
				hblks++;
 | 
			
		||||
		hblks = xlog_logrec_hblks(log, rhead);
 | 
			
		||||
		if (hblks != 1) {
 | 
			
		||||
			kmem_free(hbp);
 | 
			
		||||
			hbp = xlog_alloc_buffer(log, hblks);
 | 
			
		||||
		} else {
 | 
			
		||||
			hblks = 1;
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		ASSERT(log->l_sectBBsize == 1);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue