diff options
Diffstat (limited to 'fs/xfs/xfs_inode_fork.c')
| -rw-r--r-- | fs/xfs/xfs_inode_fork.c | 60 | 
1 files changed, 23 insertions, 37 deletions
diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c index 02f1083955b..b031e8d0d92 100644 --- a/fs/xfs/xfs_inode_fork.c +++ b/fs/xfs/xfs_inode_fork.c @@ -20,31 +20,21 @@  #include "xfs.h"  #include "xfs_fs.h"  #include "xfs_format.h" -#include "xfs_log.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h"  #include "xfs_inum.h" -#include "xfs_trans.h" -#include "xfs_trans_priv.h"  #include "xfs_sb.h"  #include "xfs_ag.h"  #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_attr_sf.h" -#include "xfs_dinode.h"  #include "xfs_inode.h" -#include "xfs_buf_item.h" +#include "xfs_trans.h"  #include "xfs_inode_item.h" -#include "xfs_btree.h" -#include "xfs_alloc.h" -#include "xfs_ialloc.h" +#include "xfs_bmap_btree.h"  #include "xfs_bmap.h"  #include "xfs_error.h" -#include "xfs_quota.h" -#include "xfs_filestream.h" -#include "xfs_cksum.h"  #include "xfs_trace.h" -#include "xfs_icache.h" +#include "xfs_attr_sf.h" +#include "xfs_dinode.h"  kmem_zone_t *xfs_ifork_zone; @@ -441,6 +431,8 @@ xfs_iread_extents(  	xfs_ifork_t	*ifp;  	xfs_extnum_t	nextents; +	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); +  	if (unlikely(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE)) {  		XFS_ERROR_REPORT("xfs_iread_extents", XFS_ERRLEVEL_LOW,  				 ip->i_mount); @@ -731,15 +723,16 @@ xfs_idestroy_fork(  }  /* - * xfs_iextents_copy() + * Convert in-core extents to on-disk form   * - * This is called to copy the REAL extents (as opposed to the delayed - * allocation extents) from the inode into the given buffer.  It - * returns the number of bytes copied into the buffer. + * For either the data or attr fork in extent format, we need to endian convert + * the in-core extent as we place them into the on-disk inode.   * - * If there are no delayed allocation extents, then we can just - * memcpy() the extents into the buffer.  Otherwise, we need to - * examine each extent in turn and skip those which are delayed. + * In the case of the data fork, the in-core and on-disk fork sizes can be + * different due to delayed allocation extents. We only copy on-disk extents + * here, so callers must always use the physical fork size to determine the + * size of the buffer passed to this routine.  We will return the size actually + * used.   */  int  xfs_iextents_copy( @@ -805,8 +798,7 @@ xfs_iflush_fork(  	xfs_inode_t		*ip,  	xfs_dinode_t		*dip,  	xfs_inode_log_item_t	*iip, -	int			whichfork, -	xfs_buf_t		*bp) +	int			whichfork)  {  	char			*cp;  	xfs_ifork_t		*ifp; @@ -1031,15 +1023,14 @@ xfs_iext_add(  		 * the next index needed in the indirection array.  		 */  		else { -			int	count = ext_diff; +			uint	count = ext_diff;  			while (count) {  				erp = xfs_iext_irec_new(ifp, erp_idx); -				erp->er_extcount = count; -				count -= MIN(count, (int)XFS_LINEAR_EXTS); -				if (count) { +				erp->er_extcount = min(count, XFS_LINEAR_EXTS); +				count -= erp->er_extcount; +				if (count)  					erp_idx++; -				}  			}  		}  	} @@ -1359,7 +1350,7 @@ xfs_iext_remove_indirect(  void  xfs_iext_realloc_direct(  	xfs_ifork_t	*ifp,		/* inode fork pointer */ -	int		new_size)	/* new size of extents */ +	int		new_size)	/* new size of extents after adding */  {  	int		rnew_size;	/* real new size of extents */ @@ -1397,13 +1388,8 @@ xfs_iext_realloc_direct(  				rnew_size - ifp->if_real_bytes);  		}  	} -	/* -	 * Switch from the inline extent buffer to a direct -	 * extent list. Be sure to include the inline extent -	 * bytes in new_size. -	 */ +	/* Switch from the inline extent buffer to a direct extent list */  	else { -		new_size += ifp->if_bytes;  		if (!is_power_of_2(new_size)) {  			rnew_size = roundup_pow_of_two(new_size);  		}  | 
