Commit b1d2a068 authored by Darrick J. Wong's avatar Darrick J. Wong

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: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
parent 23ffa52c
...@@ -2189,6 +2189,7 @@ xfs_iunlink_remove( ...@@ -2189,6 +2189,7 @@ xfs_iunlink_remove(
xfs_agnumber_t agno = XFS_INO_TO_AGNO(mp, ip->i_ino); 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 agino = XFS_INO_TO_AGINO(mp, ip->i_ino);
xfs_agino_t next_agino; xfs_agino_t next_agino;
xfs_agino_t head_agino;
short bucket_index = agino % XFS_AGI_UNLINKED_BUCKETS; short bucket_index = agino % XFS_AGI_UNLINKED_BUCKETS;
int error; int error;
...@@ -2202,23 +2203,23 @@ xfs_iunlink_remove( ...@@ -2202,23 +2203,23 @@ xfs_iunlink_remove(
* Get the index into the agi hash table for the list this inode will * Get the index into the agi hash table for the list this inode will
* go on. Make sure the head pointer isn't garbage. * go on. Make sure the head pointer isn't garbage.
*/ */
next_agino = be32_to_cpu(agi->agi_unlinked[bucket_index]); head_agino = be32_to_cpu(agi->agi_unlinked[bucket_index]);
if (!xfs_verify_agino(mp, agno, next_agino)) { if (!xfs_verify_agino(mp, agno, head_agino)) {
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
agi, sizeof(*agi)); agi, sizeof(*agi));
return -EFSCORRUPTED; return -EFSCORRUPTED;
} }
if (next_agino == agino) {
/* /*
* We're at the head of the list. Get the inode's on-disk * Set our inode's next_unlinked pointer to NULL and then return
* buffer to see if there is anyone after us on the list. * 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, error = xfs_iunlink_update_inode(tp, ip, agno, NULLAGINO, &next_agino);
&next_agino);
if (error) if (error)
return error; return error;
if (head_agino == agino) {
/* Point the head of the list to the next unlinked inode. */ /* Point the head of the list to the next unlinked inode. */
error = xfs_iunlink_update_bucket(tp, agno, agibp, bucket_index, error = xfs_iunlink_update_bucket(tp, agno, agibp, bucket_index,
next_agino); next_agino);
...@@ -2229,20 +2230,11 @@ xfs_iunlink_remove( ...@@ -2229,20 +2230,11 @@ xfs_iunlink_remove(
xfs_agino_t prev_agino; xfs_agino_t prev_agino;
/* We need to search the list for the inode being freed. */ /* 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); &prev_agino, &imap, &last_dip, &last_ibp);
if (error) if (error)
return 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. */ /* Point the previous inode on the list to the next inode. */
xfs_iunlink_update_dinode(tp, agno, prev_agino, last_ibp, xfs_iunlink_update_dinode(tp, agno, prev_agino, last_ibp,
last_dip, &imap, next_agino); last_dip, &imap, next_agino);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment