xfs
[Top] [All Lists]

[PATCH] v3 inodes are only valid on crc-enabled filesystems.

To: xfs@xxxxxxxxxxx
Subject: [PATCH] v3 inodes are only valid on crc-enabled filesystems.
From: Roger Willcocks <roger@xxxxxxxxxxxxxxxx>
Date: Sun, 16 Aug 2015 01:14:55 +0100
Cc: Dave Chinner <david@xxxxxxxxxxxxx>
Delivered-to: xfs@xxxxxxxxxxx
Fix an xfs_repair regression reported by Leslie Rhorer where a bad
(v3) inode version number was not reset.

Signed-off-by: Roger Willcocks <roger@xxxxxxxxxxxxxxxx>
---
db/check.c             | 2 +-
include/xfs_dinode.h   | 3 ++-
libxfs/xfs_inode_buf.c | 2 +-
repair/dinode.c        | 7 +++----
repair/prefetch.c      | 2 +-
5 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/db/check.c b/db/check.c
index c4c972f..810fa55 100644
--- a/db/check.c
+++ b/db/check.c
@@ -2637,7 +2637,7 @@ process_inode(
                error++;
                return;
        }
-       if (!XFS_DINODE_GOOD_VERSION(idic.di_version)) {
+       if (!XFS_DINODE_GOOD_VERSION(&mp->m_sb, idic.di_version)) {
                if (isfree || v)
                        dbprintf(_("bad version number %#x for inode %lld\n"),
                                idic.di_version, ino);
diff --git a/include/xfs_dinode.h b/include/xfs_dinode.h
index 623bbe8..40700e6 100644
--- a/include/xfs_dinode.h
+++ b/include/xfs_dinode.h
@@ -19,7 +19,8 @@
#define __XFS_DINODE_H__

#define XFS_DINODE_MAGIC                0x494e  /* 'IN' */
-#define XFS_DINODE_GOOD_VERSION(v)     ((v) >= 1 && (v) <= 3)
+#define XFS_DINODE_GOOD_VERSION(sb, v) \
+       (xfs_sb_version_hascrc(sb) ? ((v) == 3) : ((v) == 1 || (v) == 2))

typedef struct xfs_timestamp {
        __be32          t_sec;          /* timestamp seconds */
diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c
index de16ed9..e9cc74c 100644
--- a/libxfs/xfs_inode_buf.c
+++ b/libxfs/xfs_inode_buf.c
@@ -78,7 +78,7 @@ xfs_inode_buf_verify(
                dip = (struct xfs_dinode *)xfs_buf_offset(bp,
                                        (i << mp->m_sb.sb_inodelog));
                di_ok = dip->di_magic == cpu_to_be16(XFS_DINODE_MAGIC) &&
-                           XFS_DINODE_GOOD_VERSION(dip->di_version);
+                       XFS_DINODE_GOOD_VERSION(&mp->m_sb, dip->di_version);
                if (unlikely(XFS_TEST_ERROR(!di_ok, mp,
                                                XFS_ERRTAG_ITOBP_INOTOBP,
                                                XFS_RANDOM_ITOBP_INOTOBP))) {
diff --git a/repair/dinode.c b/repair/dinode.c
index 035212c..29a7a19 100644
--- a/repair/dinode.c
+++ b/repair/dinode.c
@@ -129,7 +129,7 @@ clear_dinode_core(struct xfs_mount *mp, xfs_dinode_t 
*dinoc, xfs_ino_t ino_num)
                dinoc->di_magic = cpu_to_be16(XFS_DINODE_MAGIC);
        }

-       if (!XFS_DINODE_GOOD_VERSION(dinoc->di_version) ||
+       if (!XFS_DINODE_GOOD_VERSION(&mp->m_sb, dinoc->di_version) ||
            (!fs_inode_nlink && dinoc->di_version > 1))  {
                __dirty_no_modify_ret(dirty);
                if (xfs_sb_version_hascrc(&mp->m_sb))
@@ -2331,9 +2331,8 @@ process_dinode_int(xfs_mount_t *mp,
                }
        }

-       if (!XFS_DINODE_GOOD_VERSION(dino->di_version) ||
-           (!fs_inode_nlink && dino->di_version > 1) ||
-           (xfs_sb_version_hascrc(&mp->m_sb) && dino->di_version < 3) )  {
+       if (!XFS_DINODE_GOOD_VERSION(&mp->m_sb, dino->di_version) ||
+           (!fs_inode_nlink && dino->di_version > 1) ) {
                retval = 1;
                if (!uncertain)
                        do_warn(_("bad version number 0x%x on inode %" PRIu64 
"%c"),
diff --git a/repair/prefetch.c b/repair/prefetch.c
index 7ea0d36..ad7082c 100644
--- a/repair/prefetch.c
+++ b/repair/prefetch.c
@@ -419,7 +419,7 @@ pf_read_inode_dirs(
                if (be16_to_cpu(dino->di_magic) != XFS_DINODE_MAGIC)
                        continue;

-               if (!XFS_DINODE_GOOD_VERSION(dino->di_version) ||
+               if (!XFS_DINODE_GOOD_VERSION(&mp->m_sb, dino->di_version) ||
                                (!fs_inode_nlink && dino->di_version > 1))
                        continue;

-- 
2.5.0.rc0

<Prev in Thread] Current Thread [Next in Thread>