summaryrefslogtreecommitdiff
path: root/fs/xfs/xfs_log_recover.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2008-11-28 14:23:42 +1100
committerNiv Sardi <xaiki@sgi.com>2008-12-01 11:38:22 +1100
commit0e446673a15a4e9c336b67c1a638eb12c21d0993 (patch)
tree3da13a58ef93add05e33ef14fba73ed03dd58e01 /fs/xfs/xfs_log_recover.c
parent24f211bad09a31f19dda0c3faffe0244f4f235f5 (diff)
downloadlwn-0e446673a15a4e9c336b67c1a638eb12c21d0993.tar.gz
lwn-0e446673a15a4e9c336b67c1a638eb12c21d0993.zip
[XFS] fix error handling in xlog_recover_process_one_iunlink
If we fail after xfs_iget we have to drop the reference count, spotted by Dave Chinner. Also remove some useless asserts and stop trying to deal with di_mode == 0 inodes because never gets those without passing the IGET_CREATE flag to xfs_iget. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Eric Sandeen <sandeen@sandeen.net> Signed-off-by: Niv Sardi <xaiki@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_log_recover.c')
-rw-r--r--fs/xfs/xfs_log_recover.c18
1 files changed, 5 insertions, 13 deletions
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index ce6e907bec62..51412cced010 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -3147,13 +3147,12 @@ xlog_recover_process_one_iunlink(
/*
* Get the on disk inode to find the next inode in the bucket.
*/
- ASSERT(ip != NULL);
error = xfs_itobp(mp, NULL, ip, &dip, &ibp, XFS_BUF_LOCK);
if (error)
- goto fail;
+ goto fail_iput;
- ASSERT(dip != NULL);
ASSERT(ip->i_d.di_nlink == 0);
+ ASSERT(ip->i_d.di_mode != 0);
/* setup for the next pass */
agino = be32_to_cpu(dip->di_next_unlinked);
@@ -3165,18 +3164,11 @@ xlog_recover_process_one_iunlink(
*/
ip->i_d.di_dmevmask = 0;
- /*
- * If this is a new inode, handle it specially. Otherwise, just
- * drop our reference to the inode. If there are no other
- * references, this will send the inode to xfs_inactive() which
- * will truncate the file and free the inode.
- */
- if (ip->i_d.di_mode == 0)
- xfs_iput_new(ip, 0);
- else
- IRELE(ip);
+ IRELE(ip);
return agino;
+ fail_iput:
+ IRELE(ip);
fail:
/*
* We can't read in the inode this bucket points to, or this inode