Re: [PATCH 08/11] xfs: remove the i_size field in struct xfs_inode

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, Dec 18, 2011 at 03:00:11PM -0500, Christoph Hellwig wrote:
> There is no fundamental need to keep an in-memory inode size copy in the XFS
> inode.  We already have the on-disk value in the dinode, and the separate
> in-memory copy that we need for regular files only in the XFS inode.
> 
> Remove the xfs_inode i_size field and change the XFS_ISIZE macro to use the
> VFS inode i_size field for regular fields.  Switch code that was directly
> accessing the i_size field in the xfs_inode to XFS_ISIZE, or in cases where
> we are limited to regular files direct access of the VFS inode i_size field.
> 
> This also allows dropping some fairly complicated code in the write path
> which dealt with keeping the xfs_inode i_size uptodate with the VFS i_size
> that is getting updated inside ->write_end.
> 
> Note that we do not bother resetting the VFS i_size when truncating a file
> that gets freed to zero as there is point in doing so because the VFS inode
> is no longer in use at this point.  Just relax the assert in xfs_ifree to
> only check the on-disk size instead.
> 
> Reviewed-by: Dave Chinner <dchinner@xxxxxxxxxx>
> Signed-off-by: Christoph Hellwig <hch@xxxxxx>

This looks good to me too.  The only suggestion I had was that in some
of these places where we call XFS_ISIZE or i_size_read twice in a row,
it might be nicer to read them into a local variable and use that.
Dave's comments were very helpful.

Reviewed-by: Ben Myers <bpm@xxxxxxx>

> ---
>  fs/xfs/xfs_aops.c        |    2 +-
>  fs/xfs/xfs_bmap.c        |   15 ++++++---------
>  fs/xfs/xfs_file.c        |   45 +++++++++++----------------------------------
>  fs/xfs/xfs_fs_subr.c     |    2 +-
>  fs/xfs/xfs_iget.c        |    1 -
>  fs/xfs/xfs_inode.c       |    8 ++------
>  fs/xfs/xfs_inode.h       |   16 ++++++++++++----
>  fs/xfs/xfs_iomap.c       |   12 ++++++------
>  fs/xfs/xfs_iops.c        |    3 +--
>  fs/xfs/xfs_qm_syscalls.c |    1 -
>  fs/xfs/xfs_trace.h       |    2 +-
>  fs/xfs/xfs_vnodeops.c    |   31 +++++++++++++++----------------
>  12 files changed, 56 insertions(+), 82 deletions(-)
> 
> Index: xfs/fs/xfs/xfs_aops.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_aops.c	2011-12-02 19:39:30.743827732 +0100
> +++ xfs/fs/xfs/xfs_aops.c	2011-12-07 11:18:04.305981907 +0100
> @@ -111,7 +111,7 @@ xfs_ioend_new_eof(
>  	xfs_fsize_t		bsize;
>  
>  	bsize = ioend->io_offset + ioend->io_size;
> -	isize = MAX(ip->i_size, ip->i_new_size);
> +	isize = MAX(i_size_read(VFS_I(ip)), ip->i_new_size);
>  	isize = MIN(isize, bsize);
>  	return isize > ip->i_d.di_size ? isize : 0;
>  }
> Index: xfs/fs/xfs/xfs_file.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_file.c	2011-12-02 19:39:30.753827732 +0100
> +++ xfs/fs/xfs/xfs_file.c	2011-12-07 11:18:04.305981907 +0100
> @@ -327,7 +327,7 @@ xfs_file_aio_read(
>  				mp->m_rtdev_targp : mp->m_ddev_targp;
>  		if ((iocb->ki_pos & target->bt_smask) ||
>  		    (size & target->bt_smask)) {
> -			if (iocb->ki_pos == ip->i_size)
> +			if (iocb->ki_pos == i_size_read(inode))
>  				return 0;
>  			return -XFS_ERROR(EINVAL);
>  		}
> @@ -412,30 +412,6 @@ xfs_file_splice_read(
>  	return ret;
>  }
>  
> -STATIC void
> -xfs_aio_write_isize_update(
> -	struct inode	*inode,
> -	loff_t		*ppos,
> -	ssize_t		bytes_written)
> -{
> -	struct xfs_inode	*ip = XFS_I(inode);
> -	xfs_fsize_t		isize = i_size_read(inode);
> -
> -	if (bytes_written > 0)
> -		XFS_STATS_ADD(xs_write_bytes, bytes_written);
> -
> -	if (unlikely(bytes_written < 0 && bytes_written != -EFAULT &&
> -					*ppos > isize))
> -		*ppos = isize;
> -
> -	if (*ppos > ip->i_size) {
> -		xfs_rw_ilock(ip, XFS_ILOCK_EXCL);
> -		if (*ppos > ip->i_size)
> -			ip->i_size = *ppos;
> -		xfs_rw_iunlock(ip, XFS_ILOCK_EXCL);
> -	}
> -}
> -
>  /*
>   * If this was a direct or synchronous I/O that failed (such as ENOSPC) then
>   * part of the I/O may have been written to disk before the error occurred.  In
> @@ -451,8 +427,8 @@ xfs_aio_write_newsize_update(
>  		xfs_rw_ilock(ip, XFS_ILOCK_EXCL);
>  		if (new_size == ip->i_new_size)
>  			ip->i_new_size = 0;
> -		if (ip->i_d.di_size > ip->i_size)
> -			ip->i_d.di_size = ip->i_size;
> +		if (ip->i_d.di_size > i_size_read(VFS_I(ip)))
> +			ip->i_d.di_size = i_size_read(VFS_I(ip));
>  		xfs_rw_iunlock(ip, XFS_ILOCK_EXCL);
>  	}
>  }
> @@ -492,15 +468,16 @@ xfs_file_splice_write(
>  	new_size = *ppos + count;
>  
>  	xfs_ilock(ip, XFS_ILOCK_EXCL);
> -	if (new_size > ip->i_size)
> +	if (new_size > i_size_read(inode))
>  		ip->i_new_size = new_size;
>  	xfs_iunlock(ip, XFS_ILOCK_EXCL);
>  
>  	trace_xfs_file_splice_write(ip, count, *ppos, ioflags);
>  
>  	ret = generic_file_splice_write(pipe, outfilp, ppos, count, flags);
> +	if (ret > 0)
> +		XFS_STATS_ADD(xs_write_bytes, ret);
>  
> -	xfs_aio_write_isize_update(inode, ppos, ret);
>  	xfs_aio_write_newsize_update(ip, new_size);
>  	xfs_iunlock(ip, XFS_IOLOCK_EXCL);
>  	return ret;
> @@ -728,14 +705,14 @@ restart:
>  	 * values are still valid.
>  	 */
>  	if ((ip->i_new_size && *pos > ip->i_new_size) ||
> -	    (!ip->i_new_size && *pos > ip->i_size)) {
> +	    (!ip->i_new_size && *pos > i_size_read(inode))) {
>  		if (*iolock == XFS_IOLOCK_SHARED) {
>  			xfs_rw_iunlock(ip, XFS_ILOCK_EXCL | *iolock);
>  			*iolock = XFS_IOLOCK_EXCL;
>  			xfs_rw_ilock(ip, XFS_ILOCK_EXCL | *iolock);
>  			goto restart;
>  		}
> -		error = -xfs_zero_eof(ip, *pos, ip->i_size);
> +		error = -xfs_zero_eof(ip, *pos, i_size_read(inode));
>  	}
>  
>  	/*
> @@ -744,7 +721,7 @@ restart:
>  	 * ip->i_new_size if this IO ends beyond any other in-flight writes.
>  	 */
>  	new_size = *pos + *count;
> -	if (new_size > ip->i_size) {
> +	if (new_size > i_size_read(inode)) {
>  		if (new_size > ip->i_new_size)
>  			ip->i_new_size = new_size;
>  		*new_sizep = new_size;
> @@ -957,11 +934,11 @@ xfs_file_aio_write(
>  		ret = xfs_file_buffered_aio_write(iocb, iovp, nr_segs, pos,
>  						ocount, &new_size, &iolock);
>  
> -	xfs_aio_write_isize_update(inode, &iocb->ki_pos, ret);
> -
>  	if (ret <= 0)
>  		goto out_unlock;
>  
> +	XFS_STATS_ADD(xs_write_bytes, ret);
> +
>  	/* Handle various SYNC-type writes */
>  	if ((file->f_flags & O_DSYNC) || IS_SYNC(inode)) {
>  		loff_t end = pos + ret - 1;
> Index: xfs/fs/xfs/xfs_fs_subr.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_fs_subr.c	2011-12-02 19:39:30.763827732 +0100
> +++ xfs/fs/xfs/xfs_fs_subr.c	2011-12-07 11:18:04.305981907 +0100
> @@ -90,7 +90,7 @@ xfs_wait_on_pages(
>  
>  	if (mapping_tagged(mapping, PAGECACHE_TAG_WRITEBACK)) {
>  		return -filemap_fdatawait_range(mapping, first,
> -					last == -1 ? ip->i_size - 1 : last);
> +					last == -1 ? XFS_ISIZE(ip) - 1 : last);
>  	}
>  	return 0;
>  }
> Index: xfs/fs/xfs/xfs_iops.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_iops.c	2011-12-07 11:15:33.600131684 +0100
> +++ xfs/fs/xfs/xfs_iops.c	2011-12-07 11:18:04.309315222 +0100
> @@ -778,7 +778,7 @@ xfs_setattr_size(
>  		lock_flags |= XFS_IOLOCK_EXCL;
>  	xfs_ilock(ip, lock_flags);
>  
> -	oldsize = ip->i_size;
> +	oldsize = inode->i_size;
>  	newsize = iattr->ia_size;
>  
>  	/*
> @@ -897,7 +897,6 @@ xfs_setattr_size(
>  	 * they get written to.
>  	 */
>  	ip->i_d.di_size = newsize;
> -	ip->i_size = newsize;
>  	xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
>  
>  	if (newsize <= oldsize) {
> Index: xfs/fs/xfs/xfs_trace.h
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_trace.h	2011-12-07 11:17:02.346317572 +0100
> +++ xfs/fs/xfs/xfs_trace.h	2011-12-07 11:18:04.309315222 +0100
> @@ -1038,7 +1038,7 @@ DECLARE_EVENT_CLASS(xfs_simple_io_class,
>  	TP_fast_assign(
>  		__entry->dev = VFS_I(ip)->i_sb->s_dev;
>  		__entry->ino = ip->i_ino;
> -		__entry->isize = ip->i_size;
> +		__entry->isize = VFS_I(ip)->i_size;
>  		__entry->disize = ip->i_d.di_size;
>  		__entry->new_size = ip->i_new_size;
>  		__entry->offset = offset;
> Index: xfs/fs/xfs/xfs_bmap.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_bmap.c	2011-12-07 11:17:02.339650941 +0100
> +++ xfs/fs/xfs/xfs_bmap.c	2011-12-07 11:18:04.312648538 +0100
> @@ -3997,11 +3997,8 @@ xfs_bmap_one_block(
>  	xfs_bmbt_irec_t	s;		/* internal version of extent */
>  
>  #ifndef DEBUG
> -	if (whichfork == XFS_DATA_FORK) {
> -		return S_ISREG(ip->i_d.di_mode) ?
> -			(ip->i_size == ip->i_mount->m_sb.sb_blocksize) :
> -			(ip->i_d.di_size == ip->i_mount->m_sb.sb_blocksize);
> -	}
> +	if (whichfork == XFS_DATA_FORK)
> +		return XFS_ISIZE(ip) == ip->i_mount->m_sb.sb_blocksize;
>  #endif	/* !DEBUG */
>  	if (XFS_IFORK_NEXTENTS(ip, whichfork) != 1)
>  		return 0;
> @@ -4013,7 +4010,7 @@ xfs_bmap_one_block(
>  	xfs_bmbt_get_all(ep, &s);
>  	rval = s.br_startoff == 0 && s.br_blockcount == 1;
>  	if (rval && whichfork == XFS_DATA_FORK)
> -		ASSERT(ip->i_size == ip->i_mount->m_sb.sb_blocksize);
> +		ASSERT(XFS_ISIZE(ip) == ip->i_mount->m_sb.sb_blocksize);
>  	return rval;
>  }
>  
> @@ -5425,7 +5422,7 @@ xfs_getbmapx_fix_eof_hole(
>  	if (startblock == HOLESTARTBLOCK) {
>  		mp = ip->i_mount;
>  		out->bmv_block = -1;
> -		fixlen = XFS_FSB_TO_BB(mp, XFS_B_TO_FSB(mp, ip->i_size));
> +		fixlen = XFS_FSB_TO_BB(mp, XFS_B_TO_FSB(mp, XFS_ISIZE(ip)));
>  		fixlen -= out->bmv_offset;
>  		if (prealloced && out->bmv_offset + out->bmv_length == end) {
>  			/* Came to hole at EOF. Trim it. */
> @@ -5513,7 +5510,7 @@ xfs_getbmap(
>  			fixlen = XFS_MAXIOFFSET(mp);
>  		} else {
>  			prealloced = 0;
> -			fixlen = ip->i_size;
> +			fixlen = XFS_ISIZE(ip);
>  		}
>  	}
>  
> @@ -5542,7 +5539,7 @@ xfs_getbmap(
>  
>  	xfs_ilock(ip, XFS_IOLOCK_SHARED);
>  	if (whichfork == XFS_DATA_FORK && !(iflags & BMV_IF_DELALLOC)) {
> -		if (ip->i_delayed_blks || ip->i_size > ip->i_d.di_size) {
> +		if (ip->i_delayed_blks || XFS_ISIZE(ip) > ip->i_d.di_size) {
>  			error = xfs_flush_pages(ip, 0, -1, 0, FI_REMAPF);
>  			if (error)
>  				goto out_unlock_iolock;
> Index: xfs/fs/xfs/xfs_iget.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_iget.c	2011-12-07 11:17:37.032796326 +0100
> +++ xfs/fs/xfs/xfs_iget.c	2011-12-07 11:18:04.312648538 +0100
> @@ -94,7 +94,6 @@ xfs_inode_alloc(
>  	ip->i_update_core = 0;
>  	ip->i_delayed_blks = 0;
>  	memset(&ip->i_d, 0, sizeof(xfs_icdinode_t));
> -	ip->i_size = 0;
>  	ip->i_new_size = 0;
>  
>  	return ip;
> Index: xfs/fs/xfs/xfs_inode.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_inode.c	2011-12-07 11:17:50.642722594 +0100
> +++ xfs/fs/xfs/xfs_inode.c	2011-12-07 11:18:04.315981854 +0100
> @@ -347,7 +347,6 @@ xfs_iformat(
>  			return XFS_ERROR(EFSCORRUPTED);
>  		}
>  		ip->i_d.di_size = 0;
> -		ip->i_size = 0;
>  		ip->i_df.if_u2.if_rdev = xfs_dinode_get_rdev(dip);
>  		break;
>  
> @@ -853,7 +852,6 @@ xfs_iread(
>  	}
>  
>  	ip->i_delayed_blks = 0;
> -	ip->i_size = ip->i_d.di_size;
>  
>  	/*
>  	 * Mark the buffer containing the inode as something to keep
> @@ -1043,7 +1041,6 @@ xfs_ialloc(
>  	}
>  
>  	ip->i_d.di_size = 0;
> -	ip->i_size = 0;
>  	ip->i_d.di_nextents = 0;
>  	ASSERT(ip->i_d.di_nblocks == 0);
>  
> @@ -1198,7 +1195,7 @@ xfs_itruncate_extents(
>  	int			done = 0;
>  
>  	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL));
> -	ASSERT(new_size <= ip->i_size);
> +	ASSERT(new_size <= XFS_ISIZE(ip));
>  	ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES);
>  	ASSERT(ip->i_itemp != NULL);
>  	ASSERT(ip->i_itemp->ili_lock_flags == 0);
> @@ -1712,8 +1709,7 @@ xfs_ifree(
>  	ASSERT(ip->i_d.di_nlink == 0);
>  	ASSERT(ip->i_d.di_nextents == 0);
>  	ASSERT(ip->i_d.di_anextents == 0);
> -	ASSERT((ip->i_d.di_size == 0 && ip->i_size == 0) ||
> -	       (!S_ISREG(ip->i_d.di_mode)));
> +	ASSERT(ip->i_d.di_size == 0 || !S_ISREG(ip->i_d.di_mode));
>  	ASSERT(ip->i_d.di_nblocks == 0);
>  
>  	/*
> Index: xfs/fs/xfs/xfs_iomap.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_iomap.c	2011-12-07 11:15:53.693356164 +0100
> +++ xfs/fs/xfs/xfs_iomap.c	2011-12-07 11:18:04.315981854 +0100
> @@ -74,7 +74,7 @@ xfs_iomap_eof_align_last_fsb(
>  		else if (mp->m_dalign)
>  			align = mp->m_dalign;
>  
> -		if (align && ip->i_size >= XFS_FSB_TO_B(mp, align))
> +		if (align && XFS_ISIZE(ip) >= XFS_FSB_TO_B(mp, align))
>  			new_last_fsb = roundup_64(*last_fsb, align);
>  	}
>  
> @@ -154,7 +154,7 @@ xfs_iomap_write_direct(
>  
>  	offset_fsb = XFS_B_TO_FSBT(mp, offset);
>  	last_fsb = XFS_B_TO_FSB(mp, ((xfs_ufsize_t)(offset + count)));
> -	if ((offset + count) > ip->i_size) {
> +	if ((offset + count) > XFS_ISIZE(ip)) {
>  		error = xfs_iomap_eof_align_last_fsb(mp, ip, extsz, &last_fsb);
>  		if (error)
>  			goto error_out;
> @@ -211,7 +211,7 @@ xfs_iomap_write_direct(
>  	xfs_trans_ijoin(tp, ip, 0);
>  
>  	bmapi_flag = 0;
> -	if (offset < ip->i_size || extsz)
> +	if (offset < XFS_ISIZE(ip) || extsz)
>  		bmapi_flag |= XFS_BMAPI_PREALLOC;
>  
>  	/*
> @@ -286,7 +286,7 @@ xfs_iomap_eof_want_preallocate(
>  	int		found_delalloc = 0;
>  
>  	*prealloc = 0;
> -	if ((offset + count) <= ip->i_size)
> +	if (offset + count <= XFS_ISIZE(ip))
>  		return 0;
>  
>  	/*
> @@ -340,7 +340,7 @@ xfs_iomap_prealloc_size(
>  		 * if we pass in alloc_blocks = 0. Hence the "+ 1" to
>  		 * ensure we always pass in a non-zero value.
>  		 */
> -		alloc_blocks = XFS_B_TO_FSB(mp, ip->i_size) + 1;
> +		alloc_blocks = XFS_B_TO_FSB(mp, XFS_ISIZE(ip)) + 1;
>  		alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN,
>  					rounddown_pow_of_two(alloc_blocks));
>  
> @@ -564,7 +564,7 @@ xfs_iomap_write_allocate(
>  			 * back....
>  			 */
>  			nimaps = 1;
> -			end_fsb = XFS_B_TO_FSB(mp, ip->i_size);
> +			end_fsb = XFS_B_TO_FSB(mp, XFS_ISIZE(ip));
>  			error = xfs_bmap_last_offset(NULL, ip, &last_block,
>  							XFS_DATA_FORK);
>  			if (error)
> Index: xfs/fs/xfs/xfs_vnodeops.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_vnodeops.c	2011-12-07 11:15:33.603464999 +0100
> +++ xfs/fs/xfs/xfs_vnodeops.c	2011-12-07 11:18:04.315981854 +0100
> @@ -175,7 +175,7 @@ xfs_free_eofblocks(
>  	 * Figure out if there are any blocks beyond the end
>  	 * of the file.  If not, then there is nothing to do.
>  	 */
> -	end_fsb = XFS_B_TO_FSB(mp, ((xfs_ufsize_t)ip->i_size));
> +	end_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)XFS_ISIZE(ip));
>  	last_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)XFS_MAXIOFFSET(mp));
>  	if (last_fsb <= end_fsb)
>  		return 0;
> @@ -233,7 +233,7 @@ xfs_free_eofblocks(
>  		 * may be full of holes (ie NULL files bug).
>  		 */
>  		error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK,
> -					      ip->i_size);
> +					      XFS_ISIZE(ip));
>  		if (error) {
>  			/*
>  			 * If we get an error at this point we simply don't
> @@ -547,8 +547,8 @@ xfs_release(
>  		return 0;
>  
>  	if ((S_ISREG(ip->i_d.di_mode) &&
> -	     ((ip->i_size > 0) || (VN_CACHED(VFS_I(ip)) > 0 ||
> -	       ip->i_delayed_blks > 0)) &&
> +	     (VFS_I(ip)->i_size > 0 ||
> +	      (VN_CACHED(VFS_I(ip)) > 0 || ip->i_delayed_blks > 0)) &&
>  	     (ip->i_df.if_flags & XFS_IFEXTENTS))  &&
>  	    (!(ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)))) {
>  
> @@ -625,7 +625,7 @@ xfs_inactive(
>  	 * only one with a reference to the inode.
>  	 */
>  	truncate = ((ip->i_d.di_nlink == 0) &&
> -	    ((ip->i_d.di_size != 0) || (ip->i_size != 0) ||
> +	    ((ip->i_d.di_size != 0) || XFS_ISIZE(ip) != 0 ||
>  	     (ip->i_d.di_nextents > 0) || (ip->i_delayed_blks > 0)) &&
>  	    S_ISREG(ip->i_d.di_mode));
>  
> @@ -639,12 +639,12 @@ xfs_inactive(
>  
>  	if (ip->i_d.di_nlink != 0) {
>  		if ((S_ISREG(ip->i_d.di_mode) &&
> -                     ((ip->i_size > 0) || (VN_CACHED(VFS_I(ip)) > 0 ||
> -                       ip->i_delayed_blks > 0)) &&
> -		      (ip->i_df.if_flags & XFS_IFEXTENTS) &&
> -		     (!(ip->i_d.di_flags &
> +		    (VFS_I(ip)->i_size > 0 ||
> +		     (VN_CACHED(VFS_I(ip)) > 0 || ip->i_delayed_blks > 0)) &&
> +		    (ip->i_df.if_flags & XFS_IFEXTENTS) &&
> +		    (!(ip->i_d.di_flags &
>  				(XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)) ||
> -		      (ip->i_delayed_blks != 0)))) {
> +		     ip->i_delayed_blks != 0))) {
>  			error = xfs_free_eofblocks(mp, ip, 0);
>  			if (error)
>  				return VN_INACTIVE_CACHE;
> @@ -678,7 +678,6 @@ xfs_inactive(
>  		xfs_trans_ijoin(tp, ip, 0);
>  
>  		ip->i_d.di_size = 0;
> -		ip->i_size = 0;
>  		xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
>  
>  		error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, 0);
> @@ -1974,11 +1973,11 @@ xfs_zero_remaining_bytes(
>  	 * since nothing can read beyond eof.  The space will
>  	 * be zeroed when the file is extended anyway.
>  	 */
> -	if (startoff >= ip->i_size)
> +	if (startoff >= XFS_ISIZE(ip))
>  		return 0;
>  
> -	if (endoff > ip->i_size)
> -		endoff = ip->i_size;
> +	if (endoff > XFS_ISIZE(ip))
> +		endoff = XFS_ISIZE(ip);
>  
>  	bp = xfs_buf_get_uncached(XFS_IS_REALTIME_INODE(ip) ?
>  					mp->m_rtdev_targp : mp->m_ddev_targp,
> @@ -2273,7 +2272,7 @@ xfs_change_file_space(
>  		bf->l_start += offset;
>  		break;
>  	case 2: /*SEEK_END*/
> -		bf->l_start += ip->i_size;
> +		bf->l_start += XFS_ISIZE(ip);
>  		break;
>  	default:
>  		return XFS_ERROR(EINVAL);
> @@ -2290,7 +2289,7 @@ xfs_change_file_space(
>  	bf->l_whence = 0;
>  
>  	startoffset = bf->l_start;
> -	fsize = ip->i_size;
> +	fsize = XFS_ISIZE(ip);
>  
>  	/*
>  	 * XFS_IOC_RESVSP and XFS_IOC_UNRESVSP will reserve or unreserve
> Index: xfs/fs/xfs/xfs_inode.h
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_inode.h	2011-12-07 11:17:50.642722594 +0100
> +++ xfs/fs/xfs/xfs_inode.h	2011-12-07 11:18:04.319315170 +0100
> @@ -246,16 +246,12 @@ typedef struct xfs_inode {
>  
>  	xfs_icdinode_t		i_d;		/* most of ondisk inode */
>  
> -	xfs_fsize_t		i_size;		/* in-memory size */
>  	xfs_fsize_t		i_new_size;	/* size when write completes */
>  
>  	/* VFS inode */
>  	struct inode		i_vnode;	/* embedded VFS inode */
>  } xfs_inode_t;
>  
> -#define XFS_ISIZE(ip)	S_ISREG((ip)->i_d.di_mode) ? \
> -				(ip)->i_size : (ip)->i_d.di_size;
> -
>  /* Convert from vfs inode to xfs inode */
>  static inline struct xfs_inode *XFS_I(struct inode *inode)
>  {
> @@ -269,6 +265,18 @@ static inline struct inode *VFS_I(struct
>  }
>  
>  /*
> + * For regular files we only update the on-disk filesize when actually
> + * writing data back to disk.  Until then only the copy in the VFS inode
> + * is uptodate.
> + */
> +static inline xfs_fsize_t XFS_ISIZE(struct xfs_inode *ip)
> +{
> +	if (S_ISREG(ip->i_d.di_mode))
> +		return i_size_read(VFS_I(ip));
> +	return ip->i_d.di_size;
> +}
> +
> +/*
>   * i_flags helper functions
>   */
>  static inline void
> Index: xfs/fs/xfs/xfs_qm_syscalls.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_qm_syscalls.c	2011-12-07 11:15:33.600131684 +0100
> +++ xfs/fs/xfs/xfs_qm_syscalls.c	2011-12-07 11:18:04.319315170 +0100
> @@ -265,7 +265,6 @@ xfs_qm_scall_trunc_qfile(
>  	xfs_trans_ijoin(tp, ip, 0);
>  
>  	ip->i_d.di_size = 0;
> -	ip->i_size = 0;
>  	xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
>  
>  	error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, 0);
> 
> _______________________________________________
> xfs mailing list
> xfs@xxxxxxxxxxx
> http://oss.sgi.com/mailman/listinfo/xfs

_______________________________________________
xfs mailing list
xfs@xxxxxxxxxxx
http://oss.sgi.com/mailman/listinfo/xfs


[Index of Archives]     [Linux XFS Devel]     [Linux Filesystem Development]     [Filesystem Testing]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux