Re: [PATCH 2/8] xfs: remove timestamps from incore inode

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

 



On Thu, Jan 14, 2016 at 05:09:19PM +1100, Dave Chinner wrote:
> From: Dave Chinner <dchinner@xxxxxxxxxx>
> 
> The struct xfs_inode has two copies of the current timestamps in it,
> one in the vfs inode and one in the struct xfs_icdinode. Now that we
> no longer log the struct xfs_icdinode directly, we don't need to
> keep the timestamps in this structure. instead we can copy them
> straight out of the VFS inode when formatting the inode log item or
> the on-disk inode.
> 
> This reduces the struct xfs_inode in size by 24 bytes.
> 
> Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx>
> ---

Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx>

>  fs/xfs/libxfs/xfs_inode_buf.c | 91 +++++++++++++++++++++++++++++++++++++------
>  fs/xfs/libxfs/xfs_inode_buf.h |  9 ++---
>  fs/xfs/libxfs/xfs_rtbitmap.c  |  2 +-
>  fs/xfs/xfs_inode.c            | 21 +++++-----
>  fs/xfs/xfs_inode_item.c       | 73 ++++++----------------------------
>  fs/xfs/xfs_inode_item.h       |  2 -
>  fs/xfs/xfs_iops.c             | 37 ++++--------------
>  fs/xfs/xfs_itable.c           | 16 +++++---
>  fs/xfs/xfs_log_recover.c      |  8 ++--
>  fs/xfs/xfs_rtalloc.c          |  2 +-
>  fs/xfs/xfs_trans_inode.c      | 12 +-----
>  11 files changed, 130 insertions(+), 143 deletions(-)
> 
> diff --git a/fs/xfs/libxfs/xfs_inode_buf.c b/fs/xfs/libxfs/xfs_inode_buf.c
> index 63d46bf..26e3c46 100644
> --- a/fs/xfs/libxfs/xfs_inode_buf.c
> +++ b/fs/xfs/libxfs/xfs_inode_buf.c
> @@ -195,10 +195,13 @@ xfs_imap_to_bp(
>  }
>  
>  void
> -xfs_dinode_from_disk(
> -	struct xfs_icdinode	*to,
> +xfs_inode_from_disk(
> +	struct xfs_inode	*ip,
>  	struct xfs_dinode	*from)
>  {
> +	struct xfs_icdinode	*to = &ip->i_d;
> +	struct inode		*inode = VFS_I(ip);
> +
>  	to->di_magic = be16_to_cpu(from->di_magic);
>  	to->di_mode = be16_to_cpu(from->di_mode);
>  	to->di_version = from ->di_version;
> @@ -211,12 +214,20 @@ xfs_dinode_from_disk(
>  	to->di_projid_hi = be16_to_cpu(from->di_projid_hi);
>  	memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad));
>  	to->di_flushiter = be16_to_cpu(from->di_flushiter);
> -	to->di_atime.t_sec = be32_to_cpu(from->di_atime.t_sec);
> -	to->di_atime.t_nsec = be32_to_cpu(from->di_atime.t_nsec);
> -	to->di_mtime.t_sec = be32_to_cpu(from->di_mtime.t_sec);
> -	to->di_mtime.t_nsec = be32_to_cpu(from->di_mtime.t_nsec);
> -	to->di_ctime.t_sec = be32_to_cpu(from->di_ctime.t_sec);
> -	to->di_ctime.t_nsec = be32_to_cpu(from->di_ctime.t_nsec);
> +
> +	/*
> +	 * time is signed, so need to convert to signed 32 bit before
> +	 * storing in inode timestamp which may be 64 bit. Otherwise
> +	 * a time before epoch is converted to a time long after epoch
> +	 * on 64 bit systems.
> +	 */
> +	inode->i_atime.tv_sec = (int)be32_to_cpu(from->di_atime.t_sec);
> +	inode->i_atime.tv_nsec = (int)be32_to_cpu(from->di_atime.t_nsec);
> +	inode->i_mtime.tv_sec = (int)be32_to_cpu(from->di_mtime.t_sec);
> +	inode->i_mtime.tv_nsec = (int)be32_to_cpu(from->di_mtime.t_nsec);
> +	inode->i_ctime.tv_sec = (int)be32_to_cpu(from->di_ctime.t_sec);
> +	inode->i_ctime.tv_nsec = (int)be32_to_cpu(from->di_ctime.t_nsec);
> +
>  	to->di_size = be64_to_cpu(from->di_size);
>  	to->di_nblocks = be64_to_cpu(from->di_nblocks);
>  	to->di_extsize = be32_to_cpu(from->di_extsize);
> @@ -242,9 +253,63 @@ xfs_dinode_from_disk(
>  }
>  
>  void
> -xfs_dinode_to_disk(
> -	struct xfs_dinode	*to,
> -	struct xfs_icdinode	*from)
> +xfs_inode_to_disk(
> +	struct xfs_inode	*ip,
> +	struct xfs_dinode	*to)
> +{
> +	struct xfs_icdinode	*from = &ip->i_d;
> +	struct inode		*inode = VFS_I(ip);
> +
> +	to->di_magic = cpu_to_be16(from->di_magic);
> +	to->di_mode = cpu_to_be16(from->di_mode);
> +	to->di_version = from ->di_version;
> +	to->di_format = from->di_format;
> +	to->di_onlink = cpu_to_be16(from->di_onlink);
> +	to->di_uid = cpu_to_be32(from->di_uid);
> +	to->di_gid = cpu_to_be32(from->di_gid);
> +	to->di_nlink = cpu_to_be32(from->di_nlink);
> +	to->di_projid_lo = cpu_to_be16(from->di_projid_lo);
> +	to->di_projid_hi = cpu_to_be16(from->di_projid_hi);
> +	memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad));
> +
> +	to->di_atime.t_sec = cpu_to_be32(inode->i_atime.tv_sec);
> +	to->di_atime.t_nsec = cpu_to_be32(inode->i_atime.tv_nsec);
> +	to->di_mtime.t_sec = cpu_to_be32(inode->i_mtime.tv_sec);
> +	to->di_mtime.t_nsec = cpu_to_be32(inode->i_mtime.tv_nsec);
> +	to->di_ctime.t_sec = cpu_to_be32(inode->i_ctime.tv_sec);
> +	to->di_ctime.t_nsec = cpu_to_be32(inode->i_ctime.tv_nsec);
> +
> +	to->di_size = cpu_to_be64(from->di_size);
> +	to->di_nblocks = cpu_to_be64(from->di_nblocks);
> +	to->di_extsize = cpu_to_be32(from->di_extsize);
> +	to->di_nextents = cpu_to_be32(from->di_nextents);
> +	to->di_anextents = cpu_to_be16(from->di_anextents);
> +	to->di_forkoff = from->di_forkoff;
> +	to->di_aformat = from->di_aformat;
> +	to->di_dmevmask = cpu_to_be32(from->di_dmevmask);
> +	to->di_dmstate = cpu_to_be16(from->di_dmstate);
> +	to->di_flags = cpu_to_be16(from->di_flags);
> +	to->di_gen = cpu_to_be32(from->di_gen);
> +
> +	if (from->di_version == 3) {
> +		to->di_changecount = cpu_to_be64(from->di_changecount);
> +		to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.t_sec);
> +		to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.t_nsec);
> +		to->di_flags2 = cpu_to_be64(from->di_flags2);
> +		to->di_ino = cpu_to_be64(from->di_ino);
> +		to->di_lsn = cpu_to_be64(from->di_lsn);
> +		memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2));
> +		uuid_copy(&to->di_uuid, &from->di_uuid);
> +		to->di_flushiter = 0;
> +	} else {
> +		to->di_flushiter = cpu_to_be16(from->di_flushiter);
> +	}
> +}
> +
> +void
> +xfs_log_dinode_to_disk(
> +	struct xfs_log_dinode	*from,
> +	struct xfs_dinode	*to)
>  {
>  	to->di_magic = cpu_to_be16(from->di_magic);
>  	to->di_mode = cpu_to_be16(from->di_mode);
> @@ -257,12 +322,14 @@ xfs_dinode_to_disk(
>  	to->di_projid_lo = cpu_to_be16(from->di_projid_lo);
>  	to->di_projid_hi = cpu_to_be16(from->di_projid_hi);
>  	memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad));
> +
>  	to->di_atime.t_sec = cpu_to_be32(from->di_atime.t_sec);
>  	to->di_atime.t_nsec = cpu_to_be32(from->di_atime.t_nsec);
>  	to->di_mtime.t_sec = cpu_to_be32(from->di_mtime.t_sec);
>  	to->di_mtime.t_nsec = cpu_to_be32(from->di_mtime.t_nsec);
>  	to->di_ctime.t_sec = cpu_to_be32(from->di_ctime.t_sec);
>  	to->di_ctime.t_nsec = cpu_to_be32(from->di_ctime.t_nsec);
> +
>  	to->di_size = cpu_to_be64(from->di_size);
>  	to->di_nblocks = cpu_to_be64(from->di_nblocks);
>  	to->di_extsize = cpu_to_be32(from->di_extsize);
> @@ -403,7 +470,7 @@ xfs_iread(
>  	 * Otherwise, just get the truly permanent information.
>  	 */
>  	if (dip->di_mode) {
> -		xfs_dinode_from_disk(&ip->i_d, dip);
> +		xfs_inode_from_disk(ip, dip);
>  		error = xfs_iformat_fork(ip, dip);
>  		if (error)  {
>  #ifdef DEBUG
> diff --git a/fs/xfs/libxfs/xfs_inode_buf.h b/fs/xfs/libxfs/xfs_inode_buf.h
> index 642f2a2..adcc9bf 100644
> --- a/fs/xfs/libxfs/xfs_inode_buf.h
> +++ b/fs/xfs/libxfs/xfs_inode_buf.h
> @@ -40,9 +40,6 @@ struct xfs_icdinode {
>  	__uint16_t	di_projid_hi;	/* higher part of owner's project id */
>  	__uint8_t	di_pad[6];	/* unused, zeroed space */
>  	__uint16_t	di_flushiter;	/* incremented on flush */
> -	xfs_ictimestamp_t di_atime;	/* time last accessed */
> -	xfs_ictimestamp_t di_mtime;	/* time last modified */
> -	xfs_ictimestamp_t di_ctime;	/* time created/inode modified */
>  	xfs_fsize_t	di_size;	/* number of bytes in file */
>  	xfs_rfsblock_t	di_nblocks;	/* # of direct & btree blocks used */
>  	xfs_extlen_t	di_extsize;	/* basic/minimum extent size for file */
> @@ -89,8 +86,10 @@ int	xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *,
>  int	xfs_iread(struct xfs_mount *, struct xfs_trans *,
>  		  struct xfs_inode *, uint);
>  void	xfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *);
> -void	xfs_dinode_to_disk(struct xfs_dinode *to, struct xfs_icdinode *from);
> -void	xfs_dinode_from_disk(struct xfs_icdinode *to, struct xfs_dinode *from);
> +void	xfs_inode_to_disk(struct xfs_inode *ip, struct xfs_dinode *to);
> +void	xfs_inode_from_disk(struct xfs_inode *ip, struct xfs_dinode *from);
> +void	xfs_log_dinode_to_disk(struct xfs_log_dinode *from,
> +			       struct xfs_dinode *to);
>  
>  #if defined(DEBUG)
>  void	xfs_inobp_check(struct xfs_mount *, struct xfs_buf *);
> diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c
> index 9b59ffa..acc71dd 100644
> --- a/fs/xfs/libxfs/xfs_rtbitmap.c
> +++ b/fs/xfs/libxfs/xfs_rtbitmap.c
> @@ -983,7 +983,7 @@ xfs_rtfree_extent(
>  	    mp->m_sb.sb_rextents) {
>  		if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM))
>  			mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM;
> -		*(__uint64_t *)&mp->m_rbmip->i_d.di_atime = 0;
> +		*(__uint64_t *)&VFS_I(mp->m_rbmip)->i_atime = 0;
>  		xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE);
>  	}
>  	return 0;
> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
> index 7e24232..3e9b8a0 100644
> --- a/fs/xfs/xfs_inode.c
> +++ b/fs/xfs/xfs_inode.c
> @@ -757,6 +757,7 @@ xfs_ialloc(
>  	uint		flags;
>  	int		error;
>  	struct timespec	tv;
> +	struct inode	*inode;
>  
>  	/*
>  	 * Call the space management code to pick
> @@ -782,6 +783,7 @@ xfs_ialloc(
>  	if (error)
>  		return error;
>  	ASSERT(ip != NULL);
> +	inode = VFS_I(ip);
>  
>  	/*
>  	 * We always convert v1 inodes to v2 now - we only support filesystems
> @@ -823,10 +825,9 @@ xfs_ialloc(
>  	ASSERT(ip->i_d.di_nblocks == 0);
>  
>  	tv = current_fs_time(mp->m_super);
> -	ip->i_d.di_mtime.t_sec = (__int32_t)tv.tv_sec;
> -	ip->i_d.di_mtime.t_nsec = (__int32_t)tv.tv_nsec;
> -	ip->i_d.di_atime = ip->i_d.di_mtime;
> -	ip->i_d.di_ctime = ip->i_d.di_mtime;
> +	inode->i_mtime = tv;
> +	inode->i_atime = tv;
> +	inode->i_ctime = tv;
>  
>  	/*
>  	 * di_gen will have been taken care of in xfs_iread.
> @@ -844,7 +845,8 @@ xfs_ialloc(
>  		ip->i_d.di_lsn = 0;
>  		ip->i_d.di_flags2 = 0;
>  		memset(&(ip->i_d.di_pad2[0]), 0, sizeof(ip->i_d.di_pad2));
> -		ip->i_d.di_crtime = ip->i_d.di_mtime;
> +		ip->i_d.di_crtime.t_sec = (__int32_t)tv.tv_sec;
> +		ip->i_d.di_crtime.t_nsec = (__int32_t)tv.tv_nsec;
>  	}
>  
>  
> @@ -3509,12 +3511,11 @@ xfs_iflush_int(
>  		ip->i_d.di_flushiter++;
>  
>  	/*
> -	 * Copy the dirty parts of the inode into the on-disk
> -	 * inode.  We always copy out the core of the inode,
> -	 * because if the inode is dirty at all the core must
> -	 * be.
> +	 * Copy the dirty parts of the inode into the on-disk inode.  We always
> +	 * copy out the core of the inode, because if the inode is dirty at all
> +	 * the core must be.
>  	 */
> -	xfs_dinode_to_disk(dip, &ip->i_d);
> +	xfs_inode_to_disk(ip, dip);
>  
>  	/* Wrap, we never let the log put out DI_MAX_FLUSH */
>  	if (ip->i_d.di_flushiter == DI_MAX_FLUSH)
> diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c
> index 3ad9972..9dcbf58 100644
> --- a/fs/xfs/xfs_inode_item.c
> +++ b/fs/xfs/xfs_inode_item.c
> @@ -323,10 +323,13 @@ xfs_inode_item_format_attr_fork(
>  }
>  
>  static void
> -xfs_icdinode_to_log_dinode(
> -	struct xfs_icdinode	*from,
> +xfs_inode_to_log_dinode(
> +	struct xfs_inode	*ip,
>  	struct xfs_log_dinode	*to)
>  {
> +	struct xfs_icdinode	*from = &ip->i_d;
> +	struct inode		*inode = VFS_I(ip);
> +
>  	to->di_magic = from->di_magic;
>  	to->di_mode = from->di_mode;
>  	to->di_version = from->di_version;
> @@ -338,66 +341,14 @@ xfs_icdinode_to_log_dinode(
>  	to->di_projid_lo = from->di_projid_lo;
>  	to->di_projid_hi = from->di_projid_hi;
>  	memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad));
> -	to->di_atime.t_sec = from->di_atime.t_sec;
> -	to->di_atime.t_nsec = from->di_atime.t_nsec;
> -	to->di_mtime.t_sec = from->di_mtime.t_sec;
> -	to->di_mtime.t_nsec = from->di_mtime.t_nsec;
> -	to->di_ctime.t_sec = from->di_ctime.t_sec;
> -	to->di_ctime.t_nsec = from->di_ctime.t_nsec;
> -	to->di_size = from->di_size;
> -	to->di_nblocks = from->di_nblocks;
> -	to->di_extsize = from->di_extsize;
> -	to->di_nextents = from->di_nextents;
> -	to->di_anextents = from->di_anextents;
> -	to->di_forkoff = from->di_forkoff;
> -	to->di_aformat = from->di_aformat;
> -	to->di_dmevmask = from->di_dmevmask;
> -	to->di_dmstate = from->di_dmstate;
> -	to->di_flags = from->di_flags;
> -	to->di_gen = from->di_gen;
>  
> -	if (from->di_version == 3) {
> -		to->di_changecount = from->di_changecount;
> -		to->di_crtime.t_sec = from->di_crtime.t_sec;
> -		to->di_crtime.t_nsec = from->di_crtime.t_nsec;
> -		to->di_flags2 = from->di_flags2;
> -		to->di_ino = from->di_ino;
> -		to->di_lsn = from->di_lsn;
> -		memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2));
> -		uuid_copy(&to->di_uuid, &from->di_uuid);
> -		to->di_flushiter = 0;
> -	} else {
> -		to->di_flushiter = from->di_flushiter;
> -	}
> -}
> +	to->di_atime.t_sec = inode->i_atime.tv_sec;
> +	to->di_atime.t_nsec = inode->i_atime.tv_nsec;
> +	to->di_mtime.t_sec = inode->i_mtime.tv_sec;
> +	to->di_mtime.t_nsec = inode->i_mtime.tv_nsec;
> +	to->di_ctime.t_sec = inode->i_ctime.tv_sec;
> +	to->di_ctime.t_nsec = inode->i_ctime.tv_nsec;
>  
> -/*
> - * Recovery needs to be able to convert a log dinode back to a real dinode
> - * for writeback we do that by converting a log dinode to a icdinode, and
> - * then passing that to the formatting function.
> - */
> -void
> -xfs_log_dinode_to_icdinode(
> -	struct xfs_log_dinode	*from,
> -	struct xfs_icdinode	*to)
> -{
> -	to->di_magic = from->di_magic;
> -	to->di_mode = from->di_mode;
> -	to->di_version = from->di_version;
> -	to->di_format = from->di_format;
> -	to->di_onlink = from->di_onlink;
> -	to->di_uid = from->di_uid;
> -	to->di_gid = from->di_gid;
> -	to->di_nlink = from->di_nlink;
> -	to->di_projid_lo = from->di_projid_lo;
> -	to->di_projid_hi = from->di_projid_hi;
> -	memset(to->di_pad, 0, sizeof(to->di_pad));
> -	to->di_atime.t_sec = from->di_atime.t_sec;
> -	to->di_atime.t_nsec = from->di_atime.t_nsec;
> -	to->di_mtime.t_sec = from->di_mtime.t_sec;
> -	to->di_mtime.t_nsec = from->di_mtime.t_nsec;
> -	to->di_ctime.t_sec = from->di_ctime.t_sec;
> -	to->di_ctime.t_nsec = from->di_ctime.t_nsec;
>  	to->di_size = from->di_size;
>  	to->di_nblocks = from->di_nblocks;
>  	to->di_extsize = from->di_extsize;
> @@ -439,7 +390,7 @@ xfs_inode_item_format_core(
>  	struct xfs_log_dinode	*dic;
>  
>  	dic = xlog_prepare_iovec(lv, vecp, XLOG_REG_TYPE_ICORE);
> -	xfs_icdinode_to_log_dinode(&ip->i_d, dic);
> +	xfs_inode_to_log_dinode(ip, dic);
>  	xlog_finish_iovec(lv, *vecp, xfs_log_dinode_size(ip->i_d.di_version));
>  }
>  
> diff --git a/fs/xfs/xfs_inode_item.h b/fs/xfs/xfs_inode_item.h
> index 2426118..4c7722e 100644
> --- a/fs/xfs/xfs_inode_item.h
> +++ b/fs/xfs/xfs_inode_item.h
> @@ -49,8 +49,6 @@ extern void xfs_istale_done(struct xfs_buf *, struct xfs_log_item *);
>  extern void xfs_iflush_abort(struct xfs_inode *, bool);
>  extern int xfs_inode_item_format_convert(xfs_log_iovec_t *,
>  					 xfs_inode_log_format_t *);
> -extern void xfs_log_dinode_to_icdinode(struct xfs_log_dinode *from,
> -				       struct xfs_icdinode *to);
>  
>  extern struct kmem_zone	*xfs_ili_zone;
>  
> diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c
> index 245268a..b008677 100644
> --- a/fs/xfs/xfs_iops.c
> +++ b/fs/xfs/xfs_iops.c
> @@ -517,21 +517,12 @@ xfs_setattr_time(
>  
>  	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
>  
> -	if (iattr->ia_valid & ATTR_ATIME) {
> +	if (iattr->ia_valid & ATTR_ATIME)
>  		inode->i_atime = iattr->ia_atime;
> -		ip->i_d.di_atime.t_sec = iattr->ia_atime.tv_sec;
> -		ip->i_d.di_atime.t_nsec = iattr->ia_atime.tv_nsec;
> -	}
> -	if (iattr->ia_valid & ATTR_CTIME) {
> +	if (iattr->ia_valid & ATTR_CTIME)
>  		inode->i_ctime = iattr->ia_ctime;
> -		ip->i_d.di_ctime.t_sec = iattr->ia_ctime.tv_sec;
> -		ip->i_d.di_ctime.t_nsec = iattr->ia_ctime.tv_nsec;
> -	}
> -	if (iattr->ia_valid & ATTR_MTIME) {
> +	if (iattr->ia_valid & ATTR_MTIME)
>  		inode->i_mtime = iattr->ia_mtime;
> -		ip->i_d.di_mtime.t_sec = iattr->ia_mtime.tv_sec;
> -		ip->i_d.di_mtime.t_nsec = iattr->ia_mtime.tv_nsec;
> -	}
>  }
>  
>  int
> @@ -986,21 +977,13 @@ xfs_vn_update_time(
>  	}
>  
>  	xfs_ilock(ip, XFS_ILOCK_EXCL);
> -	if (flags & S_CTIME) {
> +	if (flags & S_CTIME)
>  		inode->i_ctime = *now;
> -		ip->i_d.di_ctime.t_sec = (__int32_t)now->tv_sec;
> -		ip->i_d.di_ctime.t_nsec = (__int32_t)now->tv_nsec;
> -	}
> -	if (flags & S_MTIME) {
> +	if (flags & S_MTIME)
>  		inode->i_mtime = *now;
> -		ip->i_d.di_mtime.t_sec = (__int32_t)now->tv_sec;
> -		ip->i_d.di_mtime.t_nsec = (__int32_t)now->tv_nsec;
> -	}
> -	if (flags & S_ATIME) {
> +	if (flags & S_ATIME)
>  		inode->i_atime = *now;
> -		ip->i_d.di_atime.t_sec = (__int32_t)now->tv_sec;
> -		ip->i_d.di_atime.t_nsec = (__int32_t)now->tv_nsec;
> -	}
> +
>  	xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
>  	xfs_trans_log_inode(tp, ip, XFS_ILOG_TIMESTAMP);
>  	return xfs_trans_commit(tp);
> @@ -1247,12 +1230,6 @@ xfs_setup_inode(
>  
>  	inode->i_generation = ip->i_d.di_gen;
>  	i_size_write(inode, ip->i_d.di_size);
> -	inode->i_atime.tv_sec	= ip->i_d.di_atime.t_sec;
> -	inode->i_atime.tv_nsec	= ip->i_d.di_atime.t_nsec;
> -	inode->i_mtime.tv_sec	= ip->i_d.di_mtime.t_sec;
> -	inode->i_mtime.tv_nsec	= ip->i_d.di_mtime.t_nsec;
> -	inode->i_ctime.tv_sec	= ip->i_d.di_ctime.t_sec;
> -	inode->i_ctime.tv_nsec	= ip->i_d.di_ctime.t_nsec;
>  	xfs_diflags_to_iflags(inode, ip);
>  
>  	ip->d_ops = ip->i_mount->m_nondir_inode_ops;
> diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c
> index 930ebd8..2acda42 100644
> --- a/fs/xfs/xfs_itable.c
> +++ b/fs/xfs/xfs_itable.c
> @@ -57,6 +57,7 @@ xfs_bulkstat_one_int(
>  {
>  	struct xfs_icdinode	*dic;		/* dinode core info pointer */
>  	struct xfs_inode	*ip;		/* incore inode pointer */
> +	struct inode		*inode;
>  	struct xfs_bstat	*buf;		/* return buffer */
>  	int			error = 0;	/* error value */
>  
> @@ -77,6 +78,7 @@ xfs_bulkstat_one_int(
>  
>  	ASSERT(ip != NULL);
>  	ASSERT(ip->i_imap.im_blkno != 0);
> +	inode = VFS_I(ip);
>  
>  	dic = &ip->i_d;
>  
> @@ -91,12 +93,14 @@ xfs_bulkstat_one_int(
>  	buf->bs_uid = dic->di_uid;
>  	buf->bs_gid = dic->di_gid;
>  	buf->bs_size = dic->di_size;
> -	buf->bs_atime.tv_sec = dic->di_atime.t_sec;
> -	buf->bs_atime.tv_nsec = dic->di_atime.t_nsec;
> -	buf->bs_mtime.tv_sec = dic->di_mtime.t_sec;
> -	buf->bs_mtime.tv_nsec = dic->di_mtime.t_nsec;
> -	buf->bs_ctime.tv_sec = dic->di_ctime.t_sec;
> -	buf->bs_ctime.tv_nsec = dic->di_ctime.t_nsec;
> +
> +	buf->bs_atime.tv_sec = inode->i_atime.tv_sec;
> +	buf->bs_atime.tv_nsec = inode->i_atime.tv_nsec;
> +	buf->bs_mtime.tv_sec = inode->i_mtime.tv_sec;
> +	buf->bs_mtime.tv_nsec = inode->i_mtime.tv_nsec;
> +	buf->bs_ctime.tv_sec = inode->i_ctime.tv_sec;
> +	buf->bs_ctime.tv_nsec = inode->i_ctime.tv_nsec;
> +
>  	buf->bs_xflags = xfs_ip2xflags(ip);
>  	buf->bs_extsize = dic->di_extsize << mp->m_sb.sb_blocklog;
>  	buf->bs_extents = dic->di_nextents;
> diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
> index 3120f7b..4b79cf0 100644
> --- a/fs/xfs/xfs_log_recover.c
> +++ b/fs/xfs/xfs_log_recover.c
> @@ -2793,7 +2793,7 @@ xfs_recover_inode_owner_change(
>  		return -ENOMEM;
>  
>  	/* instantiate the inode */
> -	xfs_dinode_from_disk(&ip->i_d, dip);
> +	xfs_inode_from_disk(ip, dip);
>  	ASSERT(ip->i_d.di_version >= 3);
>  
>  	error = xfs_iformat_fork(ip, dip);
> @@ -2840,7 +2840,6 @@ xlog_recover_inode_pass2(
>  	int			attr_index;
>  	uint			fields;
>  	struct xfs_log_dinode	*ldip;
> -	struct xfs_icdinode	icic;
>  	uint			isize;
>  	int			need_free = 0;
>  
> @@ -3007,9 +3006,8 @@ xlog_recover_inode_pass2(
>  		goto out_release;
>  	}
>  
> -	/* The core is in in-core format */
> -	xfs_log_dinode_to_icdinode(ldip, &icic);
> -	xfs_dinode_to_disk(dip, &icic);
> +	/* recover the log dinode inode into the on disk inode */
> +	xfs_log_dinode_to_disk(ldip, dip);
>  
>  	/* the rest is in on-disk format */
>  	if (item->ri_buf[1].i_len > isize) {
> diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c
> index be02a68..abf4443 100644
> --- a/fs/xfs/xfs_rtalloc.c
> +++ b/fs/xfs/xfs_rtalloc.c
> @@ -1272,7 +1272,7 @@ xfs_rtpick_extent(
>  
>  	ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL));
>  
> -	seqp = (__uint64_t *)&mp->m_rbmip->i_d.di_atime;
> +	seqp = (__uint64_t *)&VFS_I(mp->m_rbmip)->i_atime;
>  	if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) {
>  		mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM;
>  		*seqp = 0;
> diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c
> index b97f1df..3f0d466 100644
> --- a/fs/xfs/xfs_trans_inode.c
> +++ b/fs/xfs/xfs_trans_inode.c
> @@ -75,18 +75,10 @@ xfs_trans_ichgtime(
>  
>  	tv = current_fs_time(inode->i_sb);
>  
> -	if ((flags & XFS_ICHGTIME_MOD) &&
> -	    !timespec_equal(&inode->i_mtime, &tv)) {
> +	if (flags & XFS_ICHGTIME_MOD)
>  		inode->i_mtime = tv;
> -		ip->i_d.di_mtime.t_sec = tv.tv_sec;
> -		ip->i_d.di_mtime.t_nsec = tv.tv_nsec;
> -	}
> -	if ((flags & XFS_ICHGTIME_CHG) &&
> -	    !timespec_equal(&inode->i_ctime, &tv)) {
> +	if (flags & XFS_ICHGTIME_CHG)
>  		inode->i_ctime = tv;
> -		ip->i_d.di_ctime.t_sec = tv.tv_sec;
> -		ip->i_d.di_ctime.t_nsec = tv.tv_nsec;
> -	}
>  }
>  
>  /*
> -- 
> 2.5.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