diff options
Diffstat (limited to 'fs/xfs/xfs_inode.c')
| -rw-r--r-- | fs/xfs/xfs_inode.c | 60 | 
1 files changed, 22 insertions, 38 deletions
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index b76a829d7e2..68415cb4f23 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -27,13 +27,10 @@  #include "xfs_trans_priv.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" @@ -44,7 +41,6 @@  #include "xfs_alloc.h"  #include "xfs_ialloc.h"  #include "xfs_bmap.h" -#include "xfs_rw.h"  #include "xfs_error.h"  #include "xfs_utils.h"  #include "xfs_quota.h" @@ -426,7 +422,7 @@ xfs_iformat(  	if (!XFS_DFORK_Q(dip))  		return 0;  	ASSERT(ip->i_afp == NULL); -	ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP); +	ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP | KM_NOFS);  	ip->i_afp->if_ext_max =  		XFS_IFORK_ASIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t);  	switch (dip->di_aformat) { @@ -509,7 +505,7 @@ xfs_iformat_local(  		ifp->if_u1.if_data = ifp->if_u2.if_inline_data;  	else {  		real_size = roundup(size, 4); -		ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP); +		ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP | KM_NOFS);  	}  	ifp->if_bytes = size;  	ifp->if_real_bytes = real_size; @@ -636,7 +632,7 @@ xfs_iformat_btree(  	}  	ifp->if_broot_bytes = size; -	ifp->if_broot = kmem_alloc(size, KM_SLEEP); +	ifp->if_broot = kmem_alloc(size, KM_SLEEP | KM_NOFS);  	ASSERT(ifp->if_broot != NULL);  	/*  	 * Copy and convert from the on-disk structure @@ -922,7 +918,6 @@ xfs_iread_extents(  	int		error;  	xfs_ifork_t	*ifp;  	xfs_extnum_t	nextents; -	size_t		size;  	if (unlikely(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE)) {  		XFS_ERROR_REPORT("xfs_iread_extents", XFS_ERRLEVEL_LOW, @@ -930,7 +925,6 @@ xfs_iread_extents(  		return XFS_ERROR(EFSCORRUPTED);  	}  	nextents = XFS_IFORK_NEXTENTS(ip, whichfork); -	size = nextents * sizeof(xfs_bmbt_rec_t);  	ifp = XFS_IFORK_PTR(ip, whichfork);  	/* @@ -1226,7 +1220,7 @@ xfs_isize_check(  				       (xfs_ufsize_t)XFS_MAXIOFFSET(mp)) -  			  map_first),  			 XFS_BMAPI_ENTIRE, NULL, 0, imaps, &nimaps, -			 NULL, NULL)) +			 NULL))  	    return;  	ASSERT(nimaps == 1);  	ASSERT(imaps[0].br_startblock == HOLESTARTBLOCK); @@ -1460,7 +1454,7 @@ xfs_itruncate_finish(  	ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES);  	ASSERT(ip->i_transp == *tp);  	ASSERT(ip->i_itemp != NULL); -	ASSERT(ip->i_itemp->ili_flags & XFS_ILI_HOLD); +	ASSERT(ip->i_itemp->ili_lock_flags == 0);  	ntp = *tp; @@ -1589,11 +1583,10 @@ xfs_itruncate_finish(  		xfs_bmap_init(&free_list, &first_block);  		error = xfs_bunmapi(ntp, ip,  				    first_unmap_block, unmap_len, -				    xfs_bmapi_aflag(fork) | -				      (sync ? 0 : XFS_BMAPI_ASYNC), +				    xfs_bmapi_aflag(fork),  				    XFS_ITRUNC_MAX_EXTENTS,  				    &first_block, &free_list, -				    NULL, &done); +				    &done);  		if (error) {  			/*  			 * If the bunmapi call encounters an error, @@ -1612,12 +1605,8 @@ xfs_itruncate_finish(  		 */  		error = xfs_bmap_finish(tp, &free_list, &committed);  		ntp = *tp; -		if (committed) { -			/* link the inode into the next xact in the chain */ -			xfs_trans_ijoin(ntp, ip, -					XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); -			xfs_trans_ihold(ntp, ip); -		} +		if (committed) +			xfs_trans_ijoin(ntp, ip);  		if (error) {  			/* @@ -1646,9 +1635,7 @@ xfs_itruncate_finish(  		error = xfs_trans_commit(*tp, 0);  		*tp = ntp; -		/* link the inode into the next transaction in the chain */ -		xfs_trans_ijoin(ntp, ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); -		xfs_trans_ihold(ntp, ip); +		xfs_trans_ijoin(ntp, ip);  		if (error)  			return error; @@ -1985,7 +1972,7 @@ xfs_ifree_cluster(  			if (lip->li_type == XFS_LI_INODE) {  				iip = (xfs_inode_log_item_t *)lip;  				ASSERT(iip->ili_logged == 1); -				lip->li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*)) xfs_istale_done; +				lip->li_cb = xfs_istale_done;  				xfs_trans_ail_copy_lsn(mp->m_ail,  							&iip->ili_flush_lsn,  							&iip->ili_item.li_lsn); @@ -2055,9 +2042,8 @@ xfs_ifree_cluster(  			xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn,  						&iip->ili_item.li_lsn); -			xfs_buf_attach_iodone(bp, -				(void(*)(xfs_buf_t*,xfs_log_item_t*)) -				xfs_istale_done, (xfs_log_item_t *)iip); +			xfs_buf_attach_iodone(bp, xfs_istale_done, +						  &iip->ili_item);  			if (ip != free_ip)  				xfs_iunlock(ip, XFS_ILOCK_EXCL); @@ -2203,7 +2189,7 @@ xfs_iroot_realloc(  		 */  		if (ifp->if_broot_bytes == 0) {  			new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(rec_diff); -			ifp->if_broot = kmem_alloc(new_size, KM_SLEEP); +			ifp->if_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS);  			ifp->if_broot_bytes = (int)new_size;  			return;  		} @@ -2219,7 +2205,7 @@ xfs_iroot_realloc(  		new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max);  		ifp->if_broot = kmem_realloc(ifp->if_broot, new_size,  				(size_t)XFS_BMAP_BROOT_SPACE_CALC(cur_max), /* old size */ -				KM_SLEEP); +				KM_SLEEP | KM_NOFS);  		op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1,  						     ifp->if_broot_bytes);  		np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, @@ -2245,7 +2231,7 @@ xfs_iroot_realloc(  	else  		new_size = 0;  	if (new_size > 0) { -		new_broot = kmem_alloc(new_size, KM_SLEEP); +		new_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS);  		/*  		 * First copy over the btree block header.  		 */ @@ -2349,7 +2335,8 @@ xfs_idata_realloc(  		real_size = roundup(new_size, 4);  		if (ifp->if_u1.if_data == NULL) {  			ASSERT(ifp->if_real_bytes == 0); -			ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP); +			ifp->if_u1.if_data = kmem_alloc(real_size, +							KM_SLEEP | KM_NOFS);  		} else if (ifp->if_u1.if_data != ifp->if_u2.if_inline_data) {  			/*  			 * Only do the realloc if the underlying size @@ -2360,11 +2347,12 @@ xfs_idata_realloc(  					kmem_realloc(ifp->if_u1.if_data,  							real_size,  							ifp->if_real_bytes, -							KM_SLEEP); +							KM_SLEEP | KM_NOFS);  			}  		} else {  			ASSERT(ifp->if_real_bytes == 0); -			ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP); +			ifp->if_u1.if_data = kmem_alloc(real_size, +							KM_SLEEP | KM_NOFS);  			memcpy(ifp->if_u1.if_data, ifp->if_u2.if_inline_data,  				ifp->if_bytes);  		} @@ -2731,7 +2719,6 @@ cluster_corrupt_out:  		 * mark it as stale and brelse.  		 */  		if (XFS_BUF_IODONE_FUNC(bp)) { -			XFS_BUF_CLR_BDSTRAT_FUNC(bp);  			XFS_BUF_UNDONE(bp);  			XFS_BUF_STALE(bp);  			XFS_BUF_ERROR(bp,EIO); @@ -3069,8 +3056,7 @@ xfs_iflush_int(  		 * and unlock the inode's flush lock when the inode is  		 * completely written to disk.  		 */ -		xfs_buf_attach_iodone(bp, (void(*)(xfs_buf_t*,xfs_log_item_t*)) -				      xfs_iflush_done, (xfs_log_item_t *)iip); +		xfs_buf_attach_iodone(bp, xfs_iflush_done, &iip->ili_item);  		ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL);  		ASSERT(XFS_BUF_IODONE_FUNC(bp) != NULL); @@ -3514,13 +3500,11 @@ xfs_iext_remove_indirect(  	xfs_extnum_t	ext_diff;	/* extents to remove in current list */  	xfs_extnum_t	nex1;		/* number of extents before idx */  	xfs_extnum_t	nex2;		/* extents after idx + count */ -	int		nlists;		/* entries in indirection array */  	int		page_idx = idx;	/* index in target extent list */  	ASSERT(ifp->if_flags & XFS_IFEXTIREC);  	erp = xfs_iext_idx_to_irec(ifp,  &page_idx, &erp_idx, 0);  	ASSERT(erp != NULL); -	nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;  	nex1 = page_idx;  	ext_cnt = count;  	while (ext_cnt) {  | 
