|
@@ -898,18 +898,14 @@ xfs_iread(
|
|
|
* know that this is a new incore inode.
|
|
|
*/
|
|
|
error = xfs_itobp(mp, tp, ip, &dip, &bp, bno, imap_flags, XFS_BUF_LOCK);
|
|
|
- if (error) {
|
|
|
- xfs_idestroy(ip);
|
|
|
- return error;
|
|
|
- }
|
|
|
+ if (error)
|
|
|
+ goto out_destroy_inode;
|
|
|
|
|
|
/*
|
|
|
* If we got something that isn't an inode it means someone
|
|
|
* (nfs or dmi) has a stale handle.
|
|
|
*/
|
|
|
if (be16_to_cpu(dip->di_core.di_magic) != XFS_DINODE_MAGIC) {
|
|
|
- xfs_idestroy(ip);
|
|
|
- xfs_trans_brelse(tp, bp);
|
|
|
#ifdef DEBUG
|
|
|
xfs_fs_cmn_err(CE_ALERT, mp, "xfs_iread: "
|
|
|
"dip->di_core.di_magic (0x%x) != "
|
|
@@ -917,7 +913,8 @@ xfs_iread(
|
|
|
be16_to_cpu(dip->di_core.di_magic),
|
|
|
XFS_DINODE_MAGIC);
|
|
|
#endif /* DEBUG */
|
|
|
- return XFS_ERROR(EINVAL);
|
|
|
+ error = XFS_ERROR(EINVAL);
|
|
|
+ goto out_brelse;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -931,14 +928,12 @@ xfs_iread(
|
|
|
xfs_dinode_from_disk(&ip->i_d, &dip->di_core);
|
|
|
error = xfs_iformat(ip, dip);
|
|
|
if (error) {
|
|
|
- xfs_idestroy(ip);
|
|
|
- xfs_trans_brelse(tp, bp);
|
|
|
#ifdef DEBUG
|
|
|
xfs_fs_cmn_err(CE_ALERT, mp, "xfs_iread: "
|
|
|
"xfs_iformat() returned error %d",
|
|
|
error);
|
|
|
#endif /* DEBUG */
|
|
|
- return error;
|
|
|
+ goto out_brelse;
|
|
|
}
|
|
|
} else {
|
|
|
ip->i_d.di_magic = be16_to_cpu(dip->di_core.di_magic);
|
|
@@ -1004,6 +999,12 @@ xfs_iread(
|
|
|
xfs_trans_brelse(tp, bp);
|
|
|
*ipp = ip;
|
|
|
return 0;
|
|
|
+
|
|
|
+ out_brelse:
|
|
|
+ xfs_trans_brelse(tp, bp);
|
|
|
+ out_destroy_inode:
|
|
|
+ xfs_destroy_inode(ip);
|
|
|
+ return error;
|
|
|
}
|
|
|
|
|
|
/*
|