--- fs/xfs/xfs_log_recover.c_1.322 2007-08-27 17:45:45.000000000 +1000 +++ fs/xfs/xfs_log_recover.c 2007-08-30 11:50:44.000000000 +1000 @@ -1866,6 +1866,27 @@ xlog_recover_do_inode_buffer( } /* + * Check if we need to recover an inode from a buffer + */ +int +xfs_recover_inode( + char *dest, + char *src) +{ + xfs_dinode_t *dip = (xfs_dinode_t *)dest; + xfs_dinode_t *dilp = (xfs_dinode_t*)src; + + if ((be16_to_cpu(dip->di_core.di_magic) == XFS_DINODE_MAGIC) && + (be16_to_cpu(dilp->di_core.di_magic) == XFS_DINODE_MAGIC) && + (be16_to_cpu(dilp->di_core.di_flushiter) < + be16_to_cpu(dip->di_core.di_flushiter))) { + return 1; + } + + return 0; +} + +/* * Perform a 'normal' buffer recovery. Each logged region of the * buffer should be copied over the corresponding region in the * given buffer. The bitmap in the buf log format structure indicates @@ -1917,6 +1938,13 @@ xlog_recover_do_reg_buffer( -1, 0, XFS_QMOPT_DOWARN, "dquot_buf_recover"); } + /* + * Sanity check if this is an inode buffer. + */ + if (!error) + error = xfs_recover_inode(xfs_buf_offset(bp, + (uint)bit << XFS_BLI_SHIFT), + item->ri_buf[i].i_addr); if (!error) memcpy(xfs_buf_offset(bp, (uint)bit << XFS_BLI_SHIFT), /* dest */