diff options
Diffstat (limited to 'fs/xfs/xfs_iget.c')
| -rw-r--r-- | fs/xfs/xfs_iget.c | 108 | 
1 files changed, 5 insertions, 103 deletions
diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index 8f8b91be2c9..b1ecc6f97ad 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -25,14 +25,10 @@  #include "xfs_trans.h"  #include "xfs_sb.h"  #include "xfs_ag.h" -#include "xfs_dir2.h" -#include "xfs_dmapi.h"  #include "xfs_mount.h"  #include "xfs_bmap_btree.h"  #include "xfs_alloc_btree.h"  #include "xfs_ialloc_btree.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h"  #include "xfs_dinode.h"  #include "xfs_inode.h"  #include "xfs_btree.h" @@ -95,7 +91,7 @@ xfs_inode_alloc(  	return ip;  } -STATIC void +void  xfs_inode_free(  	struct xfs_inode	*ip)  { @@ -212,7 +208,7 @@ xfs_iget_cache_hit(  			ip->i_flags &= ~XFS_INEW;  			ip->i_flags |= XFS_IRECLAIMABLE;  			__xfs_inode_set_reclaim_tag(pag, ip); -			trace_xfs_iget_reclaim(ip); +			trace_xfs_iget_reclaim_fail(ip);  			goto out_error;  		} @@ -227,6 +223,7 @@ xfs_iget_cache_hit(  	} else {  		/* If the VFS inode is being torn down, pause and try again. */  		if (!igrab(inode)) { +			trace_xfs_iget_skip(ip);  			error = EAGAIN;  			goto out_error;  		} @@ -234,6 +231,7 @@ xfs_iget_cache_hit(  		/* We've got a live one. */  		spin_unlock(&ip->i_flags_lock);  		read_unlock(&pag->pag_ici_lock); +		trace_xfs_iget_hit(ip);  	}  	if (lock_flags != 0) @@ -242,7 +240,6 @@ xfs_iget_cache_hit(  	xfs_iflags_clear(ip, XFS_ISTALE);  	XFS_STATS_INC(xs_ig_found); -	trace_xfs_iget_found(ip);  	return 0;  out_error: @@ -264,7 +261,6 @@ xfs_iget_cache_miss(  {  	struct xfs_inode	*ip;  	int			error; -	unsigned long		first_index, mask;  	xfs_agino_t		agino = XFS_INO_TO_AGINO(mp, ino);  	ip = xfs_inode_alloc(mp, ino); @@ -275,7 +271,7 @@ xfs_iget_cache_miss(  	if (error)  		goto out_destroy; -	xfs_itrace_entry(ip); +	trace_xfs_iget_miss(ip);  	if ((ip->i_d.di_mode == 0) && !(flags & XFS_IGET_CREATE)) {  		error = ENOENT; @@ -301,8 +297,6 @@ xfs_iget_cache_miss(  			BUG();  	} -	mask = ~(((XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog)) - 1); -	first_index = agino & mask;  	write_lock(&pag->pag_ici_lock);  	/* insert the new inode */ @@ -321,7 +315,6 @@ xfs_iget_cache_miss(  	write_unlock(&pag->pag_ici_lock);  	radix_tree_preload_end(); -	trace_xfs_iget_alloc(ip);  	*ipp = ip;  	return 0; @@ -422,97 +415,6 @@ out_error_or_again:  }  /* - * Decrement reference count of an inode structure and unlock it. - * - * ip -- the inode being released - * lock_flags -- this parameter indicates the inode's locks to be - *       to be released.  See the comment on xfs_iunlock() for a list - *	 of valid values. - */ -void -xfs_iput(xfs_inode_t	*ip, -	 uint		lock_flags) -{ -	xfs_itrace_entry(ip); -	xfs_iunlock(ip, lock_flags); -	IRELE(ip); -} - -/* - * Special iput for brand-new inodes that are still locked - */ -void -xfs_iput_new( -	xfs_inode_t	*ip, -	uint		lock_flags) -{ -	struct inode	*inode = VFS_I(ip); - -	xfs_itrace_entry(ip); - -	if ((ip->i_d.di_mode == 0)) { -		ASSERT(!xfs_iflags_test(ip, XFS_IRECLAIMABLE)); -		make_bad_inode(inode); -	} -	if (inode->i_state & I_NEW) -		unlock_new_inode(inode); -	if (lock_flags) -		xfs_iunlock(ip, lock_flags); -	IRELE(ip); -} - -/* - * This is called free all the memory associated with an inode. - * It must free the inode itself and any buffers allocated for - * if_extents/if_data and if_broot.  It must also free the lock - * associated with the inode. - * - * Note: because we don't initialise everything on reallocation out - * of the zone, we must ensure we nullify everything correctly before - * freeing the structure. - */ -void -xfs_ireclaim( -	struct xfs_inode	*ip) -{ -	struct xfs_mount	*mp = ip->i_mount; -	struct xfs_perag	*pag; -	xfs_agino_t		agino = XFS_INO_TO_AGINO(mp, ip->i_ino); - -	XFS_STATS_INC(xs_ig_reclaims); - -	/* -	 * Remove the inode from the per-AG radix tree. -	 * -	 * Because radix_tree_delete won't complain even if the item was never -	 * added to the tree assert that it's been there before to catch -	 * problems with the inode life time early on. -	 */ -	pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); -	write_lock(&pag->pag_ici_lock); -	if (!radix_tree_delete(&pag->pag_ici_root, agino)) -		ASSERT(0); -	write_unlock(&pag->pag_ici_lock); -	xfs_perag_put(pag); - -	/* -	 * Here we do an (almost) spurious inode lock in order to coordinate -	 * with inode cache radix tree lookups.  This is because the lookup -	 * can reference the inodes in the cache without taking references. -	 * -	 * We make that OK here by ensuring that we wait until the inode is -	 * unlocked after the lookup before we go ahead and free it.  We get -	 * both the ilock and the iolock because the code may need to drop the -	 * ilock one but will still hold the iolock. -	 */ -	xfs_ilock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); -	xfs_qm_dqdetach(ip); -	xfs_iunlock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); - -	xfs_inode_free(ip); -} - -/*   * This is a wrapper routine around the xfs_ilock() routine   * used to centralize some grungy code.  It is used in places   * that wish to lock the inode solely for reading the extents.  | 
