xfs: refactor inode update in iunlink_remove
In xfs_iunlink_remove we have two identical calls to xfs_iunlink_update_inode, so move it out of the if statement to simplify the code some more. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Brian Foster <bfoster@redhat.com>
This commit is contained in:
		| @@ -2189,6 +2189,7 @@ xfs_iunlink_remove( | ||||
| 	xfs_agnumber_t		agno = XFS_INO_TO_AGNO(mp, ip->i_ino); | ||||
| 	xfs_agino_t		agino = XFS_INO_TO_AGINO(mp, ip->i_ino); | ||||
| 	xfs_agino_t		next_agino; | ||||
| 	xfs_agino_t		head_agino; | ||||
| 	short			bucket_index = agino % XFS_AGI_UNLINKED_BUCKETS; | ||||
| 	int			error; | ||||
| 
 | ||||
| @@ -2202,23 +2203,23 @@ xfs_iunlink_remove( | ||||
| 	 * Get the index into the agi hash table for the list this inode will | ||||
| 	 * go on.  Make sure the head pointer isn't garbage. | ||||
| 	 */ | ||||
| 	next_agino = be32_to_cpu(agi->agi_unlinked[bucket_index]); | ||||
| 	if (!xfs_verify_agino(mp, agno, next_agino)) { | ||||
| 	head_agino = be32_to_cpu(agi->agi_unlinked[bucket_index]); | ||||
| 	if (!xfs_verify_agino(mp, agno, head_agino)) { | ||||
| 		XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, | ||||
| 				agi, sizeof(*agi)); | ||||
| 		return -EFSCORRUPTED; | ||||
| 	} | ||||
| 
 | ||||
| 	if (next_agino == agino) { | ||||
| 		/*
 | ||||
| 		 * We're at the head of the list.  Get the inode's on-disk | ||||
| 		 * buffer to see if there is anyone after us on the list. | ||||
| 		 */ | ||||
| 		error = xfs_iunlink_update_inode(tp, ip, agno, NULLAGINO, | ||||
| 				&next_agino); | ||||
| 		if (error) | ||||
| 			return error; | ||||
| 	/*
 | ||||
| 	 * Set our inode's next_unlinked pointer to NULL and then return | ||||
| 	 * the old pointer value so that we can update whatever was previous | ||||
| 	 * to us in the list to point to whatever was next in the list. | ||||
| 	 */ | ||||
| 	error = xfs_iunlink_update_inode(tp, ip, agno, NULLAGINO, &next_agino); | ||||
| 	if (error) | ||||
| 		return error; | ||||
| 
 | ||||
| 	if (head_agino == agino) { | ||||
| 		/* Point the head of the list to the next unlinked inode. */ | ||||
| 		error = xfs_iunlink_update_bucket(tp, agno, agibp, bucket_index, | ||||
| 				next_agino); | ||||
| @@ -2229,20 +2230,11 @@ xfs_iunlink_remove( | ||||
| 		xfs_agino_t	prev_agino; | ||||
| 
 | ||||
| 		/* We need to search the list for the inode being freed. */ | ||||
| 		error = xfs_iunlink_map_prev(tp, agno, next_agino, agino, | ||||
| 		error = xfs_iunlink_map_prev(tp, agno, head_agino, agino, | ||||
| 				&prev_agino, &imap, &last_dip, &last_ibp); | ||||
| 		if (error) | ||||
| 			return error; | ||||
| 
 | ||||
| 		/*
 | ||||
| 		 * Now last_ibp points to the buffer previous to us on the | ||||
| 		 * unlinked list.  Pull us from the list. | ||||
| 		 */ | ||||
| 		error = xfs_iunlink_update_inode(tp, ip, agno, NULLAGINO, | ||||
| 				&next_agino); | ||||
| 		if (error) | ||||
| 			return error; | ||||
| 
 | ||||
| 		/* Point the previous inode on the list to the next inode. */ | ||||
| 		xfs_iunlink_update_dinode(tp, agno, prev_agino, last_ibp, | ||||
| 				last_dip, &imap, next_agino); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user