xfs: remove timestamps from incore inode
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@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
parent
f8d55aa052
commit
3987848c7c
|
@ -195,10 +195,13 @@ xfs_imap_to_bp(
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
xfs_dinode_from_disk(
|
xfs_inode_from_disk(
|
||||||
struct xfs_icdinode *to,
|
struct xfs_inode *ip,
|
||||||
struct xfs_dinode *from)
|
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_magic = be16_to_cpu(from->di_magic);
|
||||||
to->di_mode = be16_to_cpu(from->di_mode);
|
to->di_mode = be16_to_cpu(from->di_mode);
|
||||||
to->di_version = from ->di_version;
|
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);
|
to->di_projid_hi = be16_to_cpu(from->di_projid_hi);
|
||||||
memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad));
|
memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad));
|
||||||
to->di_flushiter = be16_to_cpu(from->di_flushiter);
|
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);
|
* Time is signed, so need to convert to signed 32 bit before
|
||||||
to->di_mtime.t_nsec = be32_to_cpu(from->di_mtime.t_nsec);
|
* storing in inode timestamp which may be 64 bit. Otherwise
|
||||||
to->di_ctime.t_sec = be32_to_cpu(from->di_ctime.t_sec);
|
* a time before epoch is converted to a time long after epoch
|
||||||
to->di_ctime.t_nsec = be32_to_cpu(from->di_ctime.t_nsec);
|
* 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_size = be64_to_cpu(from->di_size);
|
||||||
to->di_nblocks = be64_to_cpu(from->di_nblocks);
|
to->di_nblocks = be64_to_cpu(from->di_nblocks);
|
||||||
to->di_extsize = be32_to_cpu(from->di_extsize);
|
to->di_extsize = be32_to_cpu(from->di_extsize);
|
||||||
|
@ -242,9 +253,63 @@ xfs_dinode_from_disk(
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
xfs_dinode_to_disk(
|
xfs_inode_to_disk(
|
||||||
struct xfs_dinode *to,
|
struct xfs_inode *ip,
|
||||||
struct xfs_icdinode *from)
|
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_magic = cpu_to_be16(from->di_magic);
|
||||||
to->di_mode = cpu_to_be16(from->di_mode);
|
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_lo = cpu_to_be16(from->di_projid_lo);
|
||||||
to->di_projid_hi = cpu_to_be16(from->di_projid_hi);
|
to->di_projid_hi = cpu_to_be16(from->di_projid_hi);
|
||||||
memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad));
|
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_sec = cpu_to_be32(from->di_atime.t_sec);
|
||||||
to->di_atime.t_nsec = cpu_to_be32(from->di_atime.t_nsec);
|
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_sec = cpu_to_be32(from->di_mtime.t_sec);
|
||||||
to->di_mtime.t_nsec = cpu_to_be32(from->di_mtime.t_nsec);
|
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_sec = cpu_to_be32(from->di_ctime.t_sec);
|
||||||
to->di_ctime.t_nsec = cpu_to_be32(from->di_ctime.t_nsec);
|
to->di_ctime.t_nsec = cpu_to_be32(from->di_ctime.t_nsec);
|
||||||
|
|
||||||
to->di_size = cpu_to_be64(from->di_size);
|
to->di_size = cpu_to_be64(from->di_size);
|
||||||
to->di_nblocks = cpu_to_be64(from->di_nblocks);
|
to->di_nblocks = cpu_to_be64(from->di_nblocks);
|
||||||
to->di_extsize = cpu_to_be32(from->di_extsize);
|
to->di_extsize = cpu_to_be32(from->di_extsize);
|
||||||
|
@ -403,7 +470,7 @@ xfs_iread(
|
||||||
* Otherwise, just get the truly permanent information.
|
* Otherwise, just get the truly permanent information.
|
||||||
*/
|
*/
|
||||||
if (dip->di_mode) {
|
if (dip->di_mode) {
|
||||||
xfs_dinode_from_disk(&ip->i_d, dip);
|
xfs_inode_from_disk(ip, dip);
|
||||||
error = xfs_iformat_fork(ip, dip);
|
error = xfs_iformat_fork(ip, dip);
|
||||||
if (error) {
|
if (error) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
|
|
@ -40,9 +40,6 @@ struct xfs_icdinode {
|
||||||
__uint16_t di_projid_hi; /* higher part of owner's project id */
|
__uint16_t di_projid_hi; /* higher part of owner's project id */
|
||||||
__uint8_t di_pad[6]; /* unused, zeroed space */
|
__uint8_t di_pad[6]; /* unused, zeroed space */
|
||||||
__uint16_t di_flushiter; /* incremented on flush */
|
__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_fsize_t di_size; /* number of bytes in file */
|
||||||
xfs_rfsblock_t di_nblocks; /* # of direct & btree blocks used */
|
xfs_rfsblock_t di_nblocks; /* # of direct & btree blocks used */
|
||||||
xfs_extlen_t di_extsize; /* basic/minimum extent size for file */
|
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 *,
|
int xfs_iread(struct xfs_mount *, struct xfs_trans *,
|
||||||
struct xfs_inode *, uint);
|
struct xfs_inode *, uint);
|
||||||
void xfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *);
|
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_inode_to_disk(struct xfs_inode *ip, struct xfs_dinode *to);
|
||||||
void xfs_dinode_from_disk(struct xfs_icdinode *to, struct xfs_dinode *from);
|
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)
|
#if defined(DEBUG)
|
||||||
void xfs_inobp_check(struct xfs_mount *, struct xfs_buf *);
|
void xfs_inobp_check(struct xfs_mount *, struct xfs_buf *);
|
||||||
|
|
|
@ -983,7 +983,7 @@ xfs_rtfree_extent(
|
||||||
mp->m_sb.sb_rextents) {
|
mp->m_sb.sb_rextents) {
|
||||||
if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM))
|
if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM))
|
||||||
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);
|
xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -766,6 +766,7 @@ xfs_ialloc(
|
||||||
uint flags;
|
uint flags;
|
||||||
int error;
|
int error;
|
||||||
struct timespec tv;
|
struct timespec tv;
|
||||||
|
struct inode *inode;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Call the space management code to pick
|
* Call the space management code to pick
|
||||||
|
@ -791,6 +792,7 @@ xfs_ialloc(
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
ASSERT(ip != NULL);
|
ASSERT(ip != NULL);
|
||||||
|
inode = VFS_I(ip);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We always convert v1 inodes to v2 now - we only support filesystems
|
* We always convert v1 inodes to v2 now - we only support filesystems
|
||||||
|
@ -832,10 +834,9 @@ xfs_ialloc(
|
||||||
ASSERT(ip->i_d.di_nblocks == 0);
|
ASSERT(ip->i_d.di_nblocks == 0);
|
||||||
|
|
||||||
tv = current_fs_time(mp->m_super);
|
tv = current_fs_time(mp->m_super);
|
||||||
ip->i_d.di_mtime.t_sec = (__int32_t)tv.tv_sec;
|
inode->i_mtime = tv;
|
||||||
ip->i_d.di_mtime.t_nsec = (__int32_t)tv.tv_nsec;
|
inode->i_atime = tv;
|
||||||
ip->i_d.di_atime = ip->i_d.di_mtime;
|
inode->i_ctime = tv;
|
||||||
ip->i_d.di_ctime = ip->i_d.di_mtime;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* di_gen will have been taken care of in xfs_iread.
|
* di_gen will have been taken care of in xfs_iread.
|
||||||
|
@ -853,7 +854,8 @@ xfs_ialloc(
|
||||||
ip->i_d.di_lsn = 0;
|
ip->i_d.di_lsn = 0;
|
||||||
ip->i_d.di_flags2 = 0;
|
ip->i_d.di_flags2 = 0;
|
||||||
memset(&(ip->i_d.di_pad2[0]), 0, sizeof(ip->i_d.di_pad2));
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3523,12 +3525,11 @@ xfs_iflush_int(
|
||||||
ip->i_d.di_flushiter++;
|
ip->i_d.di_flushiter++;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copy the dirty parts of the inode into the on-disk
|
* Copy the dirty parts of the inode into the on-disk inode. We always
|
||||||
* inode. We always copy out the core of the inode,
|
* copy out the core of the inode, because if the inode is dirty at all
|
||||||
* because if the inode is dirty at all the core must
|
* the core must be.
|
||||||
* 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 */
|
/* Wrap, we never let the log put out DI_MAX_FLUSH */
|
||||||
if (ip->i_d.di_flushiter == DI_MAX_FLUSH)
|
if (ip->i_d.di_flushiter == DI_MAX_FLUSH)
|
||||||
|
|
|
@ -323,10 +323,13 @@ xfs_inode_item_format_attr_fork(
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
xfs_icdinode_to_log_dinode(
|
xfs_inode_to_log_dinode(
|
||||||
struct xfs_icdinode *from,
|
struct xfs_inode *ip,
|
||||||
struct xfs_log_dinode *to)
|
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_magic = from->di_magic;
|
||||||
to->di_mode = from->di_mode;
|
to->di_mode = from->di_mode;
|
||||||
to->di_version = from->di_version;
|
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_lo = from->di_projid_lo;
|
||||||
to->di_projid_hi = from->di_projid_hi;
|
to->di_projid_hi = from->di_projid_hi;
|
||||||
memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad));
|
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_atime.t_sec = inode->i_atime.tv_sec;
|
||||||
to->di_changecount = from->di_changecount;
|
to->di_atime.t_nsec = inode->i_atime.tv_nsec;
|
||||||
to->di_crtime.t_sec = from->di_crtime.t_sec;
|
to->di_mtime.t_sec = inode->i_mtime.tv_sec;
|
||||||
to->di_crtime.t_nsec = from->di_crtime.t_nsec;
|
to->di_mtime.t_nsec = inode->i_mtime.tv_nsec;
|
||||||
to->di_flags2 = from->di_flags2;
|
to->di_ctime.t_sec = inode->i_ctime.tv_sec;
|
||||||
to->di_ino = from->di_ino;
|
to->di_ctime.t_nsec = inode->i_ctime.tv_nsec;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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_size = from->di_size;
|
||||||
to->di_nblocks = from->di_nblocks;
|
to->di_nblocks = from->di_nblocks;
|
||||||
to->di_extsize = from->di_extsize;
|
to->di_extsize = from->di_extsize;
|
||||||
|
@ -439,7 +390,7 @@ xfs_inode_item_format_core(
|
||||||
struct xfs_log_dinode *dic;
|
struct xfs_log_dinode *dic;
|
||||||
|
|
||||||
dic = xlog_prepare_iovec(lv, vecp, XLOG_REG_TYPE_ICORE);
|
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));
|
xlog_finish_iovec(lv, *vecp, xfs_log_dinode_size(ip->i_d.di_version));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 void xfs_iflush_abort(struct xfs_inode *, bool);
|
||||||
extern int xfs_inode_item_format_convert(xfs_log_iovec_t *,
|
extern int xfs_inode_item_format_convert(xfs_log_iovec_t *,
|
||||||
xfs_inode_log_format_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;
|
extern struct kmem_zone *xfs_ili_zone;
|
||||||
|
|
||||||
|
|
|
@ -522,21 +522,12 @@ xfs_setattr_time(
|
||||||
|
|
||||||
ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
|
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;
|
inode->i_atime = iattr->ia_atime;
|
||||||
ip->i_d.di_atime.t_sec = iattr->ia_atime.tv_sec;
|
if (iattr->ia_valid & ATTR_CTIME)
|
||||||
ip->i_d.di_atime.t_nsec = iattr->ia_atime.tv_nsec;
|
|
||||||
}
|
|
||||||
if (iattr->ia_valid & ATTR_CTIME) {
|
|
||||||
inode->i_ctime = iattr->ia_ctime;
|
inode->i_ctime = iattr->ia_ctime;
|
||||||
ip->i_d.di_ctime.t_sec = iattr->ia_ctime.tv_sec;
|
if (iattr->ia_valid & ATTR_MTIME)
|
||||||
ip->i_d.di_ctime.t_nsec = iattr->ia_ctime.tv_nsec;
|
|
||||||
}
|
|
||||||
if (iattr->ia_valid & ATTR_MTIME) {
|
|
||||||
inode->i_mtime = iattr->ia_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
|
int
|
||||||
|
@ -991,21 +982,13 @@ xfs_vn_update_time(
|
||||||
}
|
}
|
||||||
|
|
||||||
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
||||||
if (flags & S_CTIME) {
|
if (flags & S_CTIME)
|
||||||
inode->i_ctime = *now;
|
inode->i_ctime = *now;
|
||||||
ip->i_d.di_ctime.t_sec = (__int32_t)now->tv_sec;
|
if (flags & S_MTIME)
|
||||||
ip->i_d.di_ctime.t_nsec = (__int32_t)now->tv_nsec;
|
|
||||||
}
|
|
||||||
if (flags & S_MTIME) {
|
|
||||||
inode->i_mtime = *now;
|
inode->i_mtime = *now;
|
||||||
ip->i_d.di_mtime.t_sec = (__int32_t)now->tv_sec;
|
if (flags & S_ATIME)
|
||||||
ip->i_d.di_mtime.t_nsec = (__int32_t)now->tv_nsec;
|
|
||||||
}
|
|
||||||
if (flags & S_ATIME) {
|
|
||||||
inode->i_atime = *now;
|
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_ijoin(tp, ip, XFS_ILOCK_EXCL);
|
||||||
xfs_trans_log_inode(tp, ip, XFS_ILOG_TIMESTAMP);
|
xfs_trans_log_inode(tp, ip, XFS_ILOG_TIMESTAMP);
|
||||||
return xfs_trans_commit(tp);
|
return xfs_trans_commit(tp);
|
||||||
|
@ -1251,12 +1234,6 @@ xfs_setup_inode(
|
||||||
|
|
||||||
inode->i_generation = ip->i_d.di_gen;
|
inode->i_generation = ip->i_d.di_gen;
|
||||||
i_size_write(inode, ip->i_d.di_size);
|
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);
|
xfs_diflags_to_iflags(inode, ip);
|
||||||
|
|
||||||
ip->d_ops = ip->i_mount->m_nondir_inode_ops;
|
ip->d_ops = ip->i_mount->m_nondir_inode_ops;
|
||||||
|
|
|
@ -57,6 +57,7 @@ xfs_bulkstat_one_int(
|
||||||
{
|
{
|
||||||
struct xfs_icdinode *dic; /* dinode core info pointer */
|
struct xfs_icdinode *dic; /* dinode core info pointer */
|
||||||
struct xfs_inode *ip; /* incore inode pointer */
|
struct xfs_inode *ip; /* incore inode pointer */
|
||||||
|
struct inode *inode;
|
||||||
struct xfs_bstat *buf; /* return buffer */
|
struct xfs_bstat *buf; /* return buffer */
|
||||||
int error = 0; /* error value */
|
int error = 0; /* error value */
|
||||||
|
|
||||||
|
@ -77,6 +78,7 @@ xfs_bulkstat_one_int(
|
||||||
|
|
||||||
ASSERT(ip != NULL);
|
ASSERT(ip != NULL);
|
||||||
ASSERT(ip->i_imap.im_blkno != 0);
|
ASSERT(ip->i_imap.im_blkno != 0);
|
||||||
|
inode = VFS_I(ip);
|
||||||
|
|
||||||
dic = &ip->i_d;
|
dic = &ip->i_d;
|
||||||
|
|
||||||
|
@ -91,12 +93,14 @@ xfs_bulkstat_one_int(
|
||||||
buf->bs_uid = dic->di_uid;
|
buf->bs_uid = dic->di_uid;
|
||||||
buf->bs_gid = dic->di_gid;
|
buf->bs_gid = dic->di_gid;
|
||||||
buf->bs_size = dic->di_size;
|
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_atime.tv_sec = inode->i_atime.tv_sec;
|
||||||
buf->bs_mtime.tv_sec = dic->di_mtime.t_sec;
|
buf->bs_atime.tv_nsec = inode->i_atime.tv_nsec;
|
||||||
buf->bs_mtime.tv_nsec = dic->di_mtime.t_nsec;
|
buf->bs_mtime.tv_sec = inode->i_mtime.tv_sec;
|
||||||
buf->bs_ctime.tv_sec = dic->di_ctime.t_sec;
|
buf->bs_mtime.tv_nsec = inode->i_mtime.tv_nsec;
|
||||||
buf->bs_ctime.tv_nsec = dic->di_ctime.t_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_xflags = xfs_ip2xflags(ip);
|
||||||
buf->bs_extsize = dic->di_extsize << mp->m_sb.sb_blocklog;
|
buf->bs_extsize = dic->di_extsize << mp->m_sb.sb_blocklog;
|
||||||
buf->bs_extents = dic->di_nextents;
|
buf->bs_extents = dic->di_nextents;
|
||||||
|
|
|
@ -2793,7 +2793,7 @@ xfs_recover_inode_owner_change(
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
/* instantiate the inode */
|
/* instantiate the inode */
|
||||||
xfs_dinode_from_disk(&ip->i_d, dip);
|
xfs_inode_from_disk(ip, dip);
|
||||||
ASSERT(ip->i_d.di_version >= 3);
|
ASSERT(ip->i_d.di_version >= 3);
|
||||||
|
|
||||||
error = xfs_iformat_fork(ip, dip);
|
error = xfs_iformat_fork(ip, dip);
|
||||||
|
@ -2840,7 +2840,6 @@ xlog_recover_inode_pass2(
|
||||||
int attr_index;
|
int attr_index;
|
||||||
uint fields;
|
uint fields;
|
||||||
struct xfs_log_dinode *ldip;
|
struct xfs_log_dinode *ldip;
|
||||||
struct xfs_icdinode icic;
|
|
||||||
uint isize;
|
uint isize;
|
||||||
int need_free = 0;
|
int need_free = 0;
|
||||||
|
|
||||||
|
@ -3007,9 +3006,8 @@ xlog_recover_inode_pass2(
|
||||||
goto out_release;
|
goto out_release;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The core is in in-core format */
|
/* recover the log dinode inode into the on disk inode */
|
||||||
xfs_log_dinode_to_icdinode(ldip, &icic);
|
xfs_log_dinode_to_disk(ldip, dip);
|
||||||
xfs_dinode_to_disk(dip, &icic);
|
|
||||||
|
|
||||||
/* the rest is in on-disk format */
|
/* the rest is in on-disk format */
|
||||||
if (item->ri_buf[1].i_len > isize) {
|
if (item->ri_buf[1].i_len > isize) {
|
||||||
|
|
|
@ -1272,7 +1272,7 @@ xfs_rtpick_extent(
|
||||||
|
|
||||||
ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL));
|
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)) {
|
if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) {
|
||||||
mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM;
|
mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM;
|
||||||
*seqp = 0;
|
*seqp = 0;
|
||||||
|
|
|
@ -75,18 +75,10 @@ xfs_trans_ichgtime(
|
||||||
|
|
||||||
tv = current_fs_time(inode->i_sb);
|
tv = current_fs_time(inode->i_sb);
|
||||||
|
|
||||||
if ((flags & XFS_ICHGTIME_MOD) &&
|
if (flags & XFS_ICHGTIME_MOD)
|
||||||
!timespec_equal(&inode->i_mtime, &tv)) {
|
|
||||||
inode->i_mtime = tv;
|
inode->i_mtime = tv;
|
||||||
ip->i_d.di_mtime.t_sec = tv.tv_sec;
|
if (flags & XFS_ICHGTIME_CHG)
|
||||||
ip->i_d.di_mtime.t_nsec = tv.tv_nsec;
|
|
||||||
}
|
|
||||||
if ((flags & XFS_ICHGTIME_CHG) &&
|
|
||||||
!timespec_equal(&inode->i_ctime, &tv)) {
|
|
||||||
inode->i_ctime = tv;
|
inode->i_ctime = tv;
|
||||||
ip->i_d.di_ctime.t_sec = tv.tv_sec;
|
|
||||||
ip->i_d.di_ctime.t_nsec = tv.tv_nsec;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue