xfs: fix node forward in xfs_node_toosmall
Commit f5ea1100 cleans up the disk to host conversions for
node directory entries, but because a variable is reused in
xfs_node_toosmall() the next node is not correctly found.
If the original node is small enough (<= 3/8 of the node size),
this change may incorrectly cause a node collapse when it should
not. That will cause an assert in xfstest generic/319:
   Assertion failed: first <= last && last < BBTOB(bp->b_length),
   file: /root/newest/xfs/fs/xfs/xfs_trans_buf.c, line: 569
Keep the original node header to get the correct forward node.
(When a node is considered for a merge with a sibling, it overwrites the
 sibling pointers of the original incore nodehdr with the sibling's
 pointers.  This leads to loop considering the original node as a merge
 candidate with itself in the second pass, and so it incorrectly
 determines a merge should occur.)
Signed-off-by: Mark Tinguely <tinguely@sgi.com>
Reviewed-by: Ben Myers <bpm@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
[v3: added Dave Chinner's (slightly modified) suggestion to the commit header,
	cleaned up whitespace.  -bpm]
			
			
This commit is contained in:
		
							parent
							
								
									566055d33a
								
							
						
					
					
						commit
						997def25e4
					
				| @ -1224,6 +1224,7 @@ xfs_da3_node_toosmall( | ||||
| 	/* start with smaller blk num */ | ||||
| 	forward = nodehdr.forw < nodehdr.back; | ||||
| 	for (i = 0; i < 2; forward = !forward, i++) { | ||||
| 		struct xfs_da3_icnode_hdr thdr; | ||||
| 		if (forward) | ||||
| 			blkno = nodehdr.forw; | ||||
| 		else | ||||
| @ -1236,10 +1237,10 @@ xfs_da3_node_toosmall( | ||||
| 			return(error); | ||||
| 
 | ||||
| 		node = bp->b_addr; | ||||
| 		xfs_da3_node_hdr_from_disk(&nodehdr, node); | ||||
| 		xfs_da3_node_hdr_from_disk(&thdr, node); | ||||
| 		xfs_trans_brelse(state->args->trans, bp); | ||||
| 
 | ||||
| 		if (count - nodehdr.count >= 0) | ||||
| 		if (count - thdr.count >= 0) | ||||
| 			break;	/* fits with at least 25% to spare */ | ||||
| 	} | ||||
| 	if (i >= 2) { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user