Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 124868
b: refs/heads/master
c: 9ed0451
h: refs/heads/master
v: v3
  • Loading branch information
Christoph Hellwig authored and Lachlan McIlroy committed Oct 30, 2008
1 parent b99d210 commit f9570ab
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 12 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 087e3b0460c367d0f4a5b71d7b013968ae23b588
refs/heads/master: 9ed0451ee0a13469f7b38e4ced8974036f6d114f
2 changes: 1 addition & 1 deletion trunk/fs/xfs/xfs_iget.c
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ xfs_iget_cache_miss(
if (lock_flags)
xfs_iunlock(ip, lock_flags);
out_destroy:
xfs_idestroy(ip);
xfs_destroy_inode(ip);
return error;
}

Expand Down
21 changes: 11 additions & 10 deletions trunk/fs/xfs/xfs_inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -898,26 +898,23 @@ 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) != "
"XFS_DINODE_MAGIC (0x%x)",
be16_to_cpu(dip->di_core.di_magic),
XFS_DINODE_MAGIC);
#endif /* DEBUG */
return XFS_ERROR(EINVAL);
error = XFS_ERROR(EINVAL);
goto out_brelse;
}

/*
Expand All @@ -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);
Expand Down Expand Up @@ -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;
}

/*
Expand Down
17 changes: 17 additions & 0 deletions trunk/fs/xfs/xfs_inode.h
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,23 @@ static inline struct inode *VFS_I(struct xfs_inode *ip)
return &ip->i_vnode;
}

/*
* Get rid of a partially initialized inode.
*
* We have to go through destroy_inode to make sure allocations
* from init_inode_always like the security data are undone.
*
* We mark the inode bad so that it takes the short cut in
* the reclaim path instead of going through the flush path
* which doesn't make sense for an inode that has never seen the
* light of day.
*/
static inline void xfs_destroy_inode(struct xfs_inode *ip)
{
make_bad_inode(VFS_I(ip));
return destroy_inode(VFS_I(ip));
}

/*
* i_flags helper functions
*/
Expand Down

0 comments on commit f9570ab

Please sign in to comment.