|
@@ -2839,7 +2839,8 @@ xlog_recover_inode_pass2(
|
|
int error;
|
|
int error;
|
|
int attr_index;
|
|
int attr_index;
|
|
uint fields;
|
|
uint fields;
|
|
- xfs_icdinode_t *dicp;
|
|
|
|
|
|
+ struct xfs_log_dinode *ldip;
|
|
|
|
+ struct xfs_icdinode icic;
|
|
uint isize;
|
|
uint isize;
|
|
int need_free = 0;
|
|
int need_free = 0;
|
|
|
|
|
|
@@ -2892,8 +2893,8 @@ xlog_recover_inode_pass2(
|
|
error = -EFSCORRUPTED;
|
|
error = -EFSCORRUPTED;
|
|
goto out_release;
|
|
goto out_release;
|
|
}
|
|
}
|
|
- dicp = item->ri_buf[1].i_addr;
|
|
|
|
- if (unlikely(dicp->di_magic != XFS_DINODE_MAGIC)) {
|
|
|
|
|
|
+ ldip = item->ri_buf[1].i_addr;
|
|
|
|
+ if (unlikely(ldip->di_magic != XFS_DINODE_MAGIC)) {
|
|
xfs_alert(mp,
|
|
xfs_alert(mp,
|
|
"%s: Bad inode log record, rec ptr 0x%p, ino %Ld",
|
|
"%s: Bad inode log record, rec ptr 0x%p, ino %Ld",
|
|
__func__, item, in_f->ilf_ino);
|
|
__func__, item, in_f->ilf_ino);
|
|
@@ -2929,13 +2930,13 @@ xlog_recover_inode_pass2(
|
|
* to skip replay when the on disk inode is newer than the log one
|
|
* to skip replay when the on disk inode is newer than the log one
|
|
*/
|
|
*/
|
|
if (!xfs_sb_version_hascrc(&mp->m_sb) &&
|
|
if (!xfs_sb_version_hascrc(&mp->m_sb) &&
|
|
- dicp->di_flushiter < be16_to_cpu(dip->di_flushiter)) {
|
|
|
|
|
|
+ ldip->di_flushiter < be16_to_cpu(dip->di_flushiter)) {
|
|
/*
|
|
/*
|
|
* Deal with the wrap case, DI_MAX_FLUSH is less
|
|
* Deal with the wrap case, DI_MAX_FLUSH is less
|
|
* than smaller numbers
|
|
* than smaller numbers
|
|
*/
|
|
*/
|
|
if (be16_to_cpu(dip->di_flushiter) == DI_MAX_FLUSH &&
|
|
if (be16_to_cpu(dip->di_flushiter) == DI_MAX_FLUSH &&
|
|
- dicp->di_flushiter < (DI_MAX_FLUSH >> 1)) {
|
|
|
|
|
|
+ ldip->di_flushiter < (DI_MAX_FLUSH >> 1)) {
|
|
/* do nothing */
|
|
/* do nothing */
|
|
} else {
|
|
} else {
|
|
trace_xfs_log_recover_inode_skip(log, in_f);
|
|
trace_xfs_log_recover_inode_skip(log, in_f);
|
|
@@ -2945,13 +2946,13 @@ xlog_recover_inode_pass2(
|
|
}
|
|
}
|
|
|
|
|
|
/* Take the opportunity to reset the flush iteration count */
|
|
/* Take the opportunity to reset the flush iteration count */
|
|
- dicp->di_flushiter = 0;
|
|
|
|
|
|
+ ldip->di_flushiter = 0;
|
|
|
|
|
|
- if (unlikely(S_ISREG(dicp->di_mode))) {
|
|
|
|
- if ((dicp->di_format != XFS_DINODE_FMT_EXTENTS) &&
|
|
|
|
- (dicp->di_format != XFS_DINODE_FMT_BTREE)) {
|
|
|
|
|
|
+ if (unlikely(S_ISREG(ldip->di_mode))) {
|
|
|
|
+ if ((ldip->di_format != XFS_DINODE_FMT_EXTENTS) &&
|
|
|
|
+ (ldip->di_format != XFS_DINODE_FMT_BTREE)) {
|
|
XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(3)",
|
|
XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(3)",
|
|
- XFS_ERRLEVEL_LOW, mp, dicp);
|
|
|
|
|
|
+ XFS_ERRLEVEL_LOW, mp, ldip);
|
|
xfs_alert(mp,
|
|
xfs_alert(mp,
|
|
"%s: Bad regular inode log record, rec ptr 0x%p, "
|
|
"%s: Bad regular inode log record, rec ptr 0x%p, "
|
|
"ino ptr = 0x%p, ino bp = 0x%p, ino %Ld",
|
|
"ino ptr = 0x%p, ino bp = 0x%p, ino %Ld",
|
|
@@ -2959,12 +2960,12 @@ xlog_recover_inode_pass2(
|
|
error = -EFSCORRUPTED;
|
|
error = -EFSCORRUPTED;
|
|
goto out_release;
|
|
goto out_release;
|
|
}
|
|
}
|
|
- } else if (unlikely(S_ISDIR(dicp->di_mode))) {
|
|
|
|
- if ((dicp->di_format != XFS_DINODE_FMT_EXTENTS) &&
|
|
|
|
- (dicp->di_format != XFS_DINODE_FMT_BTREE) &&
|
|
|
|
- (dicp->di_format != XFS_DINODE_FMT_LOCAL)) {
|
|
|
|
|
|
+ } else if (unlikely(S_ISDIR(ldip->di_mode))) {
|
|
|
|
+ if ((ldip->di_format != XFS_DINODE_FMT_EXTENTS) &&
|
|
|
|
+ (ldip->di_format != XFS_DINODE_FMT_BTREE) &&
|
|
|
|
+ (ldip->di_format != XFS_DINODE_FMT_LOCAL)) {
|
|
XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(4)",
|
|
XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(4)",
|
|
- XFS_ERRLEVEL_LOW, mp, dicp);
|
|
|
|
|
|
+ XFS_ERRLEVEL_LOW, mp, ldip);
|
|
xfs_alert(mp,
|
|
xfs_alert(mp,
|
|
"%s: Bad dir inode log record, rec ptr 0x%p, "
|
|
"%s: Bad dir inode log record, rec ptr 0x%p, "
|
|
"ino ptr = 0x%p, ino bp = 0x%p, ino %Ld",
|
|
"ino ptr = 0x%p, ino bp = 0x%p, ino %Ld",
|
|
@@ -2973,32 +2974,32 @@ xlog_recover_inode_pass2(
|
|
goto out_release;
|
|
goto out_release;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if (unlikely(dicp->di_nextents + dicp->di_anextents > dicp->di_nblocks)){
|
|
|
|
|
|
+ if (unlikely(ldip->di_nextents + ldip->di_anextents > ldip->di_nblocks)){
|
|
XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(5)",
|
|
XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(5)",
|
|
- XFS_ERRLEVEL_LOW, mp, dicp);
|
|
|
|
|
|
+ XFS_ERRLEVEL_LOW, mp, ldip);
|
|
xfs_alert(mp,
|
|
xfs_alert(mp,
|
|
"%s: Bad inode log record, rec ptr 0x%p, dino ptr 0x%p, "
|
|
"%s: Bad inode log record, rec ptr 0x%p, dino ptr 0x%p, "
|
|
"dino bp 0x%p, ino %Ld, total extents = %d, nblocks = %Ld",
|
|
"dino bp 0x%p, ino %Ld, total extents = %d, nblocks = %Ld",
|
|
__func__, item, dip, bp, in_f->ilf_ino,
|
|
__func__, item, dip, bp, in_f->ilf_ino,
|
|
- dicp->di_nextents + dicp->di_anextents,
|
|
|
|
- dicp->di_nblocks);
|
|
|
|
|
|
+ ldip->di_nextents + ldip->di_anextents,
|
|
|
|
+ ldip->di_nblocks);
|
|
error = -EFSCORRUPTED;
|
|
error = -EFSCORRUPTED;
|
|
goto out_release;
|
|
goto out_release;
|
|
}
|
|
}
|
|
- if (unlikely(dicp->di_forkoff > mp->m_sb.sb_inodesize)) {
|
|
|
|
|
|
+ if (unlikely(ldip->di_forkoff > mp->m_sb.sb_inodesize)) {
|
|
XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(6)",
|
|
XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(6)",
|
|
- XFS_ERRLEVEL_LOW, mp, dicp);
|
|
|
|
|
|
+ XFS_ERRLEVEL_LOW, mp, ldip);
|
|
xfs_alert(mp,
|
|
xfs_alert(mp,
|
|
"%s: Bad inode log record, rec ptr 0x%p, dino ptr 0x%p, "
|
|
"%s: Bad inode log record, rec ptr 0x%p, dino ptr 0x%p, "
|
|
"dino bp 0x%p, ino %Ld, forkoff 0x%x", __func__,
|
|
"dino bp 0x%p, ino %Ld, forkoff 0x%x", __func__,
|
|
- item, dip, bp, in_f->ilf_ino, dicp->di_forkoff);
|
|
|
|
|
|
+ item, dip, bp, in_f->ilf_ino, ldip->di_forkoff);
|
|
error = -EFSCORRUPTED;
|
|
error = -EFSCORRUPTED;
|
|
goto out_release;
|
|
goto out_release;
|
|
}
|
|
}
|
|
- isize = xfs_icdinode_size(dicp->di_version);
|
|
|
|
|
|
+ isize = xfs_log_dinode_size(ldip->di_version);
|
|
if (unlikely(item->ri_buf[1].i_len > isize)) {
|
|
if (unlikely(item->ri_buf[1].i_len > isize)) {
|
|
XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(7)",
|
|
XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(7)",
|
|
- XFS_ERRLEVEL_LOW, mp, dicp);
|
|
|
|
|
|
+ XFS_ERRLEVEL_LOW, mp, ldip);
|
|
xfs_alert(mp,
|
|
xfs_alert(mp,
|
|
"%s: Bad inode log record length %d, rec ptr 0x%p",
|
|
"%s: Bad inode log record length %d, rec ptr 0x%p",
|
|
__func__, item->ri_buf[1].i_len, item);
|
|
__func__, item->ri_buf[1].i_len, item);
|
|
@@ -3007,7 +3008,8 @@ xlog_recover_inode_pass2(
|
|
}
|
|
}
|
|
|
|
|
|
/* The core is in in-core format */
|
|
/* The core is in in-core format */
|
|
- xfs_dinode_to_disk(dip, dicp);
|
|
|
|
|
|
+ xfs_log_dinode_to_icdinode(ldip, &icic);
|
|
|
|
+ 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) {
|