diff options
Diffstat (limited to 'fs/xfs/xfs_bmap_util.c')
| -rw-r--r-- | fs/xfs/xfs_bmap_util.c | 45 | 
1 files changed, 20 insertions, 25 deletions
diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 552465e011ec..b9abce524c33 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -359,9 +359,7 @@ xfs_bmap_count_blocks(  	mp = ip->i_mount;  	ifp = XFS_IFORK_PTR(ip, whichfork);  	if ( XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS ) { -		xfs_bmap_count_leaves(ifp, 0, -			ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t), -			count); +		xfs_bmap_count_leaves(ifp, 0, xfs_iext_count(ifp), count);  		return 0;  	} @@ -426,7 +424,7 @@ xfs_getbmapx_fix_eof_hole(  		ifp = XFS_IFORK_PTR(ip, whichfork);  		if (!moretocome &&  		    xfs_iext_bno_to_ext(ifp, fileblock, &lastx) && -		   (lastx == (ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))-1)) +		   (lastx == xfs_iext_count(ifp) - 1))  			out->bmv_oflags |= BMV_OF_LAST;  	} @@ -1792,6 +1790,7 @@ xfs_swap_extent_forks(  	struct xfs_ifork	tempifp, *ifp, *tifp;  	int			aforkblks = 0;  	int			taforkblks = 0; +	xfs_extnum_t		nextents;  	__uint64_t		tmp;  	int			error; @@ -1877,14 +1876,13 @@ xfs_swap_extent_forks(  	switch (ip->i_d.di_format) {  	case XFS_DINODE_FMT_EXTENTS: -		/* If the extents fit in the inode, fix the -		 * pointer.  Otherwise it's already NULL or -		 * pointing to the extent. +		/* +		 * If the extents fit in the inode, fix the pointer.  Otherwise +		 * it's already NULL or pointing to the extent.  		 */ -		if (ip->i_d.di_nextents <= XFS_INLINE_EXTS) { -			ifp->if_u1.if_extents = -				ifp->if_u2.if_inline_ext; -		} +		nextents = xfs_iext_count(&ip->i_df); +		if (nextents <= XFS_INLINE_EXTS) +			ifp->if_u1.if_extents = ifp->if_u2.if_inline_ext;  		(*src_log_flags) |= XFS_ILOG_DEXT;  		break;  	case XFS_DINODE_FMT_BTREE: @@ -1896,14 +1894,13 @@ xfs_swap_extent_forks(  	switch (tip->i_d.di_format) {  	case XFS_DINODE_FMT_EXTENTS: -		/* If the extents fit in the inode, fix the -		 * pointer.  Otherwise it's already NULL or -		 * pointing to the extent. +		/* +		 * If the extents fit in the inode, fix the pointer.  Otherwise +		 * it's already NULL or pointing to the extent.  		 */ -		if (tip->i_d.di_nextents <= XFS_INLINE_EXTS) { -			tifp->if_u1.if_extents = -				tifp->if_u2.if_inline_ext; -		} +		nextents = xfs_iext_count(&tip->i_df); +		if (nextents <= XFS_INLINE_EXTS) +			tifp->if_u1.if_extents = tifp->if_u2.if_inline_ext;  		(*target_log_flags) |= XFS_ILOG_DEXT;  		break;  	case XFS_DINODE_FMT_BTREE: @@ -1938,8 +1935,8 @@ xfs_swap_extents(  	 * page cache safely. Once we have done this we can take the ilocks and  	 * do the rest of the checks.  	 */ -	lock_flags = XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL; -	xfs_lock_two_inodes(ip, tip, XFS_IOLOCK_EXCL); +	lock_two_nondirectories(VFS_I(ip), VFS_I(tip)); +	lock_flags = XFS_MMAPLOCK_EXCL;  	xfs_lock_two_inodes(ip, tip, XFS_MMAPLOCK_EXCL);  	/* Verify that both files have the same format */ @@ -2079,15 +2076,13 @@ xfs_swap_extents(  	trace_xfs_swap_extent_after(ip, 0);  	trace_xfs_swap_extent_after(tip, 1); +out_unlock:  	xfs_iunlock(ip, lock_flags);  	xfs_iunlock(tip, lock_flags); +	unlock_two_nondirectories(VFS_I(ip), VFS_I(tip));  	return error;  out_trans_cancel:  	xfs_trans_cancel(tp); - -out_unlock: -	xfs_iunlock(ip, lock_flags); -	xfs_iunlock(tip, lock_flags); -	return error; +	goto out_unlock;  }  |