Commit 6471e9c5 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Darrick J. Wong

xfs: remove the di_version field from struct icdinode

We know the version is 3 if on a v5 file system.   For earlier file
systems formats we always upgrade the remaining v1 inodes to v2 and
thus only use v2 inodes.  Use the xfs_sb_version_has_large_dinode
helper to check if we deal with small or large dinodes, and thus
remove the need for the di_version field in struct icdinode.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarChandan Rajendra <chandanrlinux@gmail.com>
Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
parent 5e28aafe
...@@ -194,16 +194,14 @@ xfs_inode_from_disk( ...@@ -194,16 +194,14 @@ xfs_inode_from_disk(
struct xfs_icdinode *to = &ip->i_d; struct xfs_icdinode *to = &ip->i_d;
struct inode *inode = VFS_I(ip); struct inode *inode = VFS_I(ip);
/* /*
* Convert v1 inodes immediately to v2 inode format as this is the * Convert v1 inodes immediately to v2 inode format as this is the
* minimum inode version format we support in the rest of the code. * minimum inode version format we support in the rest of the code.
* They will also be unconditionally written back to disk as v2 inodes.
*/ */
to->di_version = from->di_version; if (unlikely(from->di_version == 1)) {
if (to->di_version == 1) {
set_nlink(inode, be16_to_cpu(from->di_onlink)); set_nlink(inode, be16_to_cpu(from->di_onlink));
to->di_projid = 0; to->di_projid = 0;
to->di_version = 2;
} else { } else {
set_nlink(inode, be32_to_cpu(from->di_nlink)); set_nlink(inode, be32_to_cpu(from->di_nlink));
to->di_projid = (prid_t)be16_to_cpu(from->di_projid_hi) << 16 | to->di_projid = (prid_t)be16_to_cpu(from->di_projid_hi) << 16 |
...@@ -241,7 +239,7 @@ xfs_inode_from_disk( ...@@ -241,7 +239,7 @@ xfs_inode_from_disk(
to->di_dmstate = be16_to_cpu(from->di_dmstate); to->di_dmstate = be16_to_cpu(from->di_dmstate);
to->di_flags = be16_to_cpu(from->di_flags); to->di_flags = be16_to_cpu(from->di_flags);
if (to->di_version == 3) { if (xfs_sb_version_has_v3inode(&ip->i_mount->m_sb)) {
inode_set_iversion_queried(inode, inode_set_iversion_queried(inode,
be64_to_cpu(from->di_changecount)); be64_to_cpu(from->di_changecount));
to->di_crtime.tv_sec = be32_to_cpu(from->di_crtime.t_sec); to->di_crtime.tv_sec = be32_to_cpu(from->di_crtime.t_sec);
...@@ -263,7 +261,6 @@ xfs_inode_to_disk( ...@@ -263,7 +261,6 @@ xfs_inode_to_disk(
to->di_magic = cpu_to_be16(XFS_DINODE_MAGIC); to->di_magic = cpu_to_be16(XFS_DINODE_MAGIC);
to->di_onlink = 0; to->di_onlink = 0;
to->di_version = from->di_version;
to->di_format = from->di_format; to->di_format = from->di_format;
to->di_uid = cpu_to_be32(i_uid_read(inode)); to->di_uid = cpu_to_be32(i_uid_read(inode));
to->di_gid = cpu_to_be32(i_gid_read(inode)); to->di_gid = cpu_to_be32(i_gid_read(inode));
...@@ -292,7 +289,8 @@ xfs_inode_to_disk( ...@@ -292,7 +289,8 @@ xfs_inode_to_disk(
to->di_dmstate = cpu_to_be16(from->di_dmstate); to->di_dmstate = cpu_to_be16(from->di_dmstate);
to->di_flags = cpu_to_be16(from->di_flags); to->di_flags = cpu_to_be16(from->di_flags);
if (from->di_version == 3) { if (xfs_sb_version_has_v3inode(&ip->i_mount->m_sb)) {
to->di_version = 3;
to->di_changecount = cpu_to_be64(inode_peek_iversion(inode)); to->di_changecount = cpu_to_be64(inode_peek_iversion(inode));
to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.tv_sec); to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.tv_sec);
to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.tv_nsec); to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.tv_nsec);
...@@ -304,6 +302,7 @@ xfs_inode_to_disk( ...@@ -304,6 +302,7 @@ xfs_inode_to_disk(
uuid_copy(&to->di_uuid, &ip->i_mount->m_sb.sb_meta_uuid); uuid_copy(&to->di_uuid, &ip->i_mount->m_sb.sb_meta_uuid);
to->di_flushiter = 0; to->di_flushiter = 0;
} else { } else {
to->di_version = 2;
to->di_flushiter = cpu_to_be16(from->di_flushiter); to->di_flushiter = cpu_to_be16(from->di_flushiter);
} }
} }
...@@ -621,7 +620,6 @@ xfs_iread( ...@@ -621,7 +620,6 @@ xfs_iread(
xfs_sb_version_has_v3inode(&mp->m_sb) && xfs_sb_version_has_v3inode(&mp->m_sb) &&
!(mp->m_flags & XFS_MOUNT_IKEEP)) { !(mp->m_flags & XFS_MOUNT_IKEEP)) {
VFS_I(ip)->i_generation = prandom_u32(); VFS_I(ip)->i_generation = prandom_u32();
ip->i_d.di_version = 3;
return 0; return 0;
} }
...@@ -663,7 +661,6 @@ xfs_iread( ...@@ -663,7 +661,6 @@ xfs_iread(
* Partial initialisation of the in-core inode. Just the bits * Partial initialisation of the in-core inode. Just the bits
* that xfs_ialloc won't overwrite or relies on being correct. * that xfs_ialloc won't overwrite or relies on being correct.
*/ */
ip->i_d.di_version = dip->di_version;
VFS_I(ip)->i_generation = be32_to_cpu(dip->di_gen); VFS_I(ip)->i_generation = be32_to_cpu(dip->di_gen);
ip->i_d.di_flushiter = be16_to_cpu(dip->di_flushiter); ip->i_d.di_flushiter = be16_to_cpu(dip->di_flushiter);
...@@ -677,7 +674,6 @@ xfs_iread( ...@@ -677,7 +674,6 @@ xfs_iread(
VFS_I(ip)->i_mode = 0; VFS_I(ip)->i_mode = 0;
} }
ASSERT(ip->i_d.di_version >= 2);
ip->i_delayed_blks = 0; ip->i_delayed_blks = 0;
/* /*
......
...@@ -16,7 +16,6 @@ struct xfs_dinode; ...@@ -16,7 +16,6 @@ struct xfs_dinode;
* format specific structures at the appropriate time. * format specific structures at the appropriate time.
*/ */
struct xfs_icdinode { struct xfs_icdinode {
int8_t di_version; /* inode version */
int8_t di_format; /* format of di_c data */ int8_t di_format; /* format of di_c data */
uint16_t di_flushiter; /* incremented on flush */ uint16_t di_flushiter; /* incremented on flush */
uint32_t di_projid; /* owner's project id */ uint32_t di_projid; /* owner's project id */
......
...@@ -1449,12 +1449,12 @@ xfs_swap_extent_forks( ...@@ -1449,12 +1449,12 @@ xfs_swap_extent_forks(
* event of a crash. Set the owner change log flags now and leave the * event of a crash. Set the owner change log flags now and leave the
* bmbt scan as the last step. * bmbt scan as the last step.
*/ */
if (ip->i_d.di_version == 3 && if (xfs_sb_version_has_v3inode(&ip->i_mount->m_sb)) {
ip->i_d.di_format == XFS_DINODE_FMT_BTREE) if (ip->i_d.di_format == XFS_DINODE_FMT_BTREE)
(*target_log_flags) |= XFS_ILOG_DOWNER; (*target_log_flags) |= XFS_ILOG_DOWNER;
if (tip->i_d.di_version == 3 && if (tip->i_d.di_format == XFS_DINODE_FMT_BTREE)
tip->i_d.di_format == XFS_DINODE_FMT_BTREE) (*src_log_flags) |= XFS_ILOG_DOWNER;
(*src_log_flags) |= XFS_ILOG_DOWNER; }
/* /*
* Swap the data forks of the inodes * Swap the data forks of the inodes
...@@ -1489,7 +1489,7 @@ xfs_swap_extent_forks( ...@@ -1489,7 +1489,7 @@ xfs_swap_extent_forks(
(*src_log_flags) |= XFS_ILOG_DEXT; (*src_log_flags) |= XFS_ILOG_DEXT;
break; break;
case XFS_DINODE_FMT_BTREE: case XFS_DINODE_FMT_BTREE:
ASSERT(ip->i_d.di_version < 3 || ASSERT(!xfs_sb_version_has_v3inode(&ip->i_mount->m_sb) ||
(*src_log_flags & XFS_ILOG_DOWNER)); (*src_log_flags & XFS_ILOG_DOWNER));
(*src_log_flags) |= XFS_ILOG_DBROOT; (*src_log_flags) |= XFS_ILOG_DBROOT;
break; break;
...@@ -1501,7 +1501,7 @@ xfs_swap_extent_forks( ...@@ -1501,7 +1501,7 @@ xfs_swap_extent_forks(
break; break;
case XFS_DINODE_FMT_BTREE: case XFS_DINODE_FMT_BTREE:
(*target_log_flags) |= XFS_ILOG_DBROOT; (*target_log_flags) |= XFS_ILOG_DBROOT;
ASSERT(tip->i_d.di_version < 3 || ASSERT(!xfs_sb_version_has_v3inode(&ip->i_mount->m_sb) ||
(*target_log_flags & XFS_ILOG_DOWNER)); (*target_log_flags & XFS_ILOG_DOWNER));
break; break;
} }
......
...@@ -801,15 +801,6 @@ xfs_ialloc( ...@@ -801,15 +801,6 @@ xfs_ialloc(
return error; return error;
ASSERT(ip != NULL); ASSERT(ip != NULL);
inode = VFS_I(ip); inode = VFS_I(ip);
/*
* We always convert v1 inodes to v2 now - we only support filesystems
* with >= v2 inode capability, so there is no reason for ever leaving
* an inode in v1 format.
*/
if (ip->i_d.di_version == 1)
ip->i_d.di_version = 2;
inode->i_mode = mode; inode->i_mode = mode;
set_nlink(inode, nlink); set_nlink(inode, nlink);
inode->i_uid = current_fsuid(); inode->i_uid = current_fsuid();
...@@ -847,14 +838,13 @@ xfs_ialloc( ...@@ -847,14 +838,13 @@ xfs_ialloc(
ip->i_d.di_dmstate = 0; ip->i_d.di_dmstate = 0;
ip->i_d.di_flags = 0; ip->i_d.di_flags = 0;
if (ip->i_d.di_version == 3) { if (xfs_sb_version_has_v3inode(&mp->m_sb)) {
inode_set_iversion(inode, 1); inode_set_iversion(inode, 1);
ip->i_d.di_flags2 = 0; ip->i_d.di_flags2 = 0;
ip->i_d.di_cowextsize = 0; ip->i_d.di_cowextsize = 0;
ip->i_d.di_crtime = tv; ip->i_d.di_crtime = tv;
} }
flags = XFS_ILOG_CORE; flags = XFS_ILOG_CORE;
switch (mode & S_IFMT) { switch (mode & S_IFMT) {
case S_IFIFO: case S_IFIFO:
...@@ -1115,7 +1105,6 @@ xfs_bumplink( ...@@ -1115,7 +1105,6 @@ xfs_bumplink(
{ {
xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG); xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG);
ASSERT(ip->i_d.di_version > 1);
inc_nlink(VFS_I(ip)); inc_nlink(VFS_I(ip));
xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
} }
...@@ -3798,7 +3787,6 @@ xfs_iflush_int( ...@@ -3798,7 +3787,6 @@ xfs_iflush_int(
ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE || ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE ||
ip->i_d.di_nextents > XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK)); ip->i_d.di_nextents > XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK));
ASSERT(iip != NULL && iip->ili_fields != 0); ASSERT(iip != NULL && iip->ili_fields != 0);
ASSERT(ip->i_d.di_version > 1);
/* set *dip = inode's place in the buffer */ /* set *dip = inode's place in the buffer */
dip = xfs_buf_offset(bp, ip->i_imap.im_boffset); dip = xfs_buf_offset(bp, ip->i_imap.im_boffset);
...@@ -3859,7 +3847,7 @@ xfs_iflush_int( ...@@ -3859,7 +3847,7 @@ xfs_iflush_int(
* backwards compatibility with old kernels that predate logging all * backwards compatibility with old kernels that predate logging all
* inode changes. * inode changes.
*/ */
if (ip->i_d.di_version < 3) if (!xfs_sb_version_has_v3inode(&mp->m_sb))
ip->i_d.di_flushiter++; ip->i_d.di_flushiter++;
/* Check the inline fork data before we write out. */ /* Check the inline fork data before we write out. */
......
...@@ -305,8 +305,6 @@ xfs_inode_to_log_dinode( ...@@ -305,8 +305,6 @@ xfs_inode_to_log_dinode(
struct inode *inode = VFS_I(ip); struct inode *inode = VFS_I(ip);
to->di_magic = XFS_DINODE_MAGIC; to->di_magic = XFS_DINODE_MAGIC;
to->di_version = from->di_version;
to->di_format = from->di_format; to->di_format = from->di_format;
to->di_uid = i_uid_read(inode); to->di_uid = i_uid_read(inode);
to->di_gid = i_gid_read(inode); to->di_gid = i_gid_read(inode);
...@@ -339,7 +337,8 @@ xfs_inode_to_log_dinode( ...@@ -339,7 +337,8 @@ xfs_inode_to_log_dinode(
/* log a dummy value to ensure log structure is fully initialised */ /* log a dummy value to ensure log structure is fully initialised */
to->di_next_unlinked = NULLAGINO; to->di_next_unlinked = NULLAGINO;
if (from->di_version == 3) { if (xfs_sb_version_has_v3inode(&ip->i_mount->m_sb)) {
to->di_version = 3;
to->di_changecount = inode_peek_iversion(inode); to->di_changecount = inode_peek_iversion(inode);
to->di_crtime.t_sec = from->di_crtime.tv_sec; to->di_crtime.t_sec = from->di_crtime.tv_sec;
to->di_crtime.t_nsec = from->di_crtime.tv_nsec; to->di_crtime.t_nsec = from->di_crtime.tv_nsec;
...@@ -351,6 +350,7 @@ xfs_inode_to_log_dinode( ...@@ -351,6 +350,7 @@ xfs_inode_to_log_dinode(
uuid_copy(&to->di_uuid, &ip->i_mount->m_sb.sb_meta_uuid); uuid_copy(&to->di_uuid, &ip->i_mount->m_sb.sb_meta_uuid);
to->di_flushiter = 0; to->di_flushiter = 0;
} else { } else {
to->di_version = 2;
to->di_flushiter = from->di_flushiter; to->di_flushiter = from->di_flushiter;
} }
} }
...@@ -395,8 +395,6 @@ xfs_inode_item_format( ...@@ -395,8 +395,6 @@ xfs_inode_item_format(
struct xfs_log_iovec *vecp = NULL; struct xfs_log_iovec *vecp = NULL;
struct xfs_inode_log_format *ilf; struct xfs_inode_log_format *ilf;
ASSERT(ip->i_d.di_version > 1);
ilf = xlog_prepare_iovec(lv, &vecp, XLOG_REG_TYPE_IFORMAT); ilf = xlog_prepare_iovec(lv, &vecp, XLOG_REG_TYPE_IFORMAT);
ilf->ilf_type = XFS_LI_INODE; ilf->ilf_type = XFS_LI_INODE;
ilf->ilf_ino = ip->i_ino; ilf->ilf_ino = ip->i_ino;
......
...@@ -1263,7 +1263,7 @@ xfs_ioctl_setattr_xflags( ...@@ -1263,7 +1263,7 @@ xfs_ioctl_setattr_xflags(
/* diflags2 only valid for v3 inodes. */ /* diflags2 only valid for v3 inodes. */
di_flags2 = xfs_flags2diflags2(ip, fa->fsx_xflags); di_flags2 = xfs_flags2diflags2(ip, fa->fsx_xflags);
if (di_flags2 && ip->i_d.di_version < 3) if (di_flags2 && !xfs_sb_version_has_v3inode(&mp->m_sb))
return -EINVAL; return -EINVAL;
ip->i_d.di_flags = xfs_flags2diflags(ip, fa->fsx_xflags); ip->i_d.di_flags = xfs_flags2diflags(ip, fa->fsx_xflags);
...@@ -1601,7 +1601,6 @@ xfs_ioctl_setattr( ...@@ -1601,7 +1601,6 @@ xfs_ioctl_setattr(
olddquot = xfs_qm_vop_chown(tp, ip, olddquot = xfs_qm_vop_chown(tp, ip,
&ip->i_pdquot, pdqp); &ip->i_pdquot, pdqp);
} }
ASSERT(ip->i_d.di_version > 1);
ip->i_d.di_projid = fa->fsx_projid; ip->i_d.di_projid = fa->fsx_projid;
} }
...@@ -1614,7 +1613,7 @@ xfs_ioctl_setattr( ...@@ -1614,7 +1613,7 @@ xfs_ioctl_setattr(
ip->i_d.di_extsize = fa->fsx_extsize >> mp->m_sb.sb_blocklog; ip->i_d.di_extsize = fa->fsx_extsize >> mp->m_sb.sb_blocklog;
else else
ip->i_d.di_extsize = 0; ip->i_d.di_extsize = 0;
if (ip->i_d.di_version == 3 && if (xfs_sb_version_has_v3inode(&mp->m_sb) &&
(ip->i_d.di_flags2 & XFS_DIFLAG2_COWEXTSIZE)) (ip->i_d.di_flags2 & XFS_DIFLAG2_COWEXTSIZE))
ip->i_d.di_cowextsize = fa->fsx_cowextsize >> ip->i_d.di_cowextsize = fa->fsx_cowextsize >>
mp->m_sb.sb_blocklog; mp->m_sb.sb_blocklog;
......
...@@ -557,7 +557,7 @@ xfs_vn_getattr( ...@@ -557,7 +557,7 @@ xfs_vn_getattr(
stat->blocks = stat->blocks =
XFS_FSB_TO_BB(mp, ip->i_d.di_nblocks + ip->i_delayed_blks); XFS_FSB_TO_BB(mp, ip->i_d.di_nblocks + ip->i_delayed_blks);
if (ip->i_d.di_version == 3) { if (xfs_sb_version_has_v3inode(&mp->m_sb)) {
if (request_mask & STATX_BTIME) { if (request_mask & STATX_BTIME) {
stat->result_mask |= STATX_BTIME; stat->result_mask |= STATX_BTIME;
stat->btime = ip->i_d.di_crtime; stat->btime = ip->i_d.di_crtime;
......
...@@ -110,7 +110,7 @@ xfs_bulkstat_one_int( ...@@ -110,7 +110,7 @@ xfs_bulkstat_one_int(
buf->bs_forkoff = XFS_IFORK_BOFF(ip); buf->bs_forkoff = XFS_IFORK_BOFF(ip);
buf->bs_version = XFS_BULKSTAT_VERSION_V5; buf->bs_version = XFS_BULKSTAT_VERSION_V5;
if (dic->di_version == 3) { if (xfs_sb_version_has_v3inode(&mp->m_sb)) {
if (dic->di_flags2 & XFS_DIFLAG2_COWEXTSIZE) if (dic->di_flags2 & XFS_DIFLAG2_COWEXTSIZE)
buf->bs_cowextsize_blks = dic->di_cowextsize; buf->bs_cowextsize_blks = dic->di_cowextsize;
} }
......
...@@ -2869,8 +2869,8 @@ xfs_recover_inode_owner_change( ...@@ -2869,8 +2869,8 @@ xfs_recover_inode_owner_change(
return -ENOMEM; return -ENOMEM;
/* instantiate the inode */ /* instantiate the inode */
ASSERT(dip->di_version >= 3);
xfs_inode_from_disk(ip, dip); xfs_inode_from_disk(ip, dip);
ASSERT(ip->i_d.di_version >= 3);
error = xfs_iformat_fork(ip, dip); error = xfs_iformat_fork(ip, dip);
if (error) if (error)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment