diff options
author | Jan Kara <jack@suse.cz> | 2014-12-23 17:48:35 -0500 |
---|---|---|
committer | Dave Chinner <david@fromorbit.com> | 2014-12-23 17:48:35 -0500 |
commit | 1a43ec03ddd40793db00dbc7340685f5accf6fc3 (patch) | |
tree | bf2e114db19c9d90b49d93943ec6ddfd526bcf76 | |
parent | 77af574eef78c404ea630f7955a5ed0c926a63fe (diff) |
xfs: Keep sb_bad_features2 consistent with sb_features2
Currently when we modify sb_features2, we store the same value also in
sb_bad_features2. However in most places we forget to mark field
sb_bad_features2 for logging and thus it can happen that a change to it
is lost. This results in an inconsistent sb_features2 and
sb_bad_features2 fields e.g. after xfstests test xfs/187.
Fix the problem by changing XFS_SB_FEATURES2 to actually mean both
sb_features2 and sb_bad_features2 fields since this is always what we
want to log. This isn't ideal because the fact that XFS_SB_FEATURES2
means two fields could cause some problem in future however the code is
hopefully less error prone that it is now.
Signed-off-by: Jan Kara <jack@suse.cz>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
-rw-r--r-- | fs/xfs/libxfs/xfs_format.h | 10 | ||||
-rw-r--r-- | fs/xfs/xfs_mount.c | 5 |
2 files changed, 7 insertions, 8 deletions
diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index fbd6da263571..476273287aaf 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h | |||
@@ -304,8 +304,8 @@ typedef enum { | |||
304 | #define XFS_SB_ICOUNT XFS_SB_MVAL(ICOUNT) | 304 | #define XFS_SB_ICOUNT XFS_SB_MVAL(ICOUNT) |
305 | #define XFS_SB_IFREE XFS_SB_MVAL(IFREE) | 305 | #define XFS_SB_IFREE XFS_SB_MVAL(IFREE) |
306 | #define XFS_SB_FDBLOCKS XFS_SB_MVAL(FDBLOCKS) | 306 | #define XFS_SB_FDBLOCKS XFS_SB_MVAL(FDBLOCKS) |
307 | #define XFS_SB_FEATURES2 XFS_SB_MVAL(FEATURES2) | 307 | #define XFS_SB_FEATURES2 (XFS_SB_MVAL(FEATURES2) | \ |
308 | #define XFS_SB_BAD_FEATURES2 XFS_SB_MVAL(BAD_FEATURES2) | 308 | XFS_SB_MVAL(BAD_FEATURES2)) |
309 | #define XFS_SB_FEATURES_COMPAT XFS_SB_MVAL(FEATURES_COMPAT) | 309 | #define XFS_SB_FEATURES_COMPAT XFS_SB_MVAL(FEATURES_COMPAT) |
310 | #define XFS_SB_FEATURES_RO_COMPAT XFS_SB_MVAL(FEATURES_RO_COMPAT) | 310 | #define XFS_SB_FEATURES_RO_COMPAT XFS_SB_MVAL(FEATURES_RO_COMPAT) |
311 | #define XFS_SB_FEATURES_INCOMPAT XFS_SB_MVAL(FEATURES_INCOMPAT) | 311 | #define XFS_SB_FEATURES_INCOMPAT XFS_SB_MVAL(FEATURES_INCOMPAT) |
@@ -319,9 +319,9 @@ typedef enum { | |||
319 | XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | XFS_SB_GQUOTINO | \ | 319 | XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | XFS_SB_GQUOTINO | \ |
320 | XFS_SB_QFLAGS | XFS_SB_SHARED_VN | XFS_SB_UNIT | XFS_SB_WIDTH | \ | 320 | XFS_SB_QFLAGS | XFS_SB_SHARED_VN | XFS_SB_UNIT | XFS_SB_WIDTH | \ |
321 | XFS_SB_ICOUNT | XFS_SB_IFREE | XFS_SB_FDBLOCKS | XFS_SB_FEATURES2 | \ | 321 | XFS_SB_ICOUNT | XFS_SB_IFREE | XFS_SB_FDBLOCKS | XFS_SB_FEATURES2 | \ |
322 | XFS_SB_BAD_FEATURES2 | XFS_SB_FEATURES_COMPAT | \ | 322 | XFS_SB_FEATURES_COMPAT | XFS_SB_FEATURES_RO_COMPAT | \ |
323 | XFS_SB_FEATURES_RO_COMPAT | XFS_SB_FEATURES_INCOMPAT | \ | 323 | XFS_SB_FEATURES_INCOMPAT | XFS_SB_FEATURES_LOG_INCOMPAT | \ |
324 | XFS_SB_FEATURES_LOG_INCOMPAT | XFS_SB_PQUOTINO) | 324 | XFS_SB_PQUOTINO) |
325 | 325 | ||
326 | 326 | ||
327 | /* | 327 | /* |
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index d3d38836f87f..71d2c97cf58a 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c | |||
@@ -678,7 +678,7 @@ xfs_mountfs( | |||
678 | xfs_warn(mp, "correcting sb_features alignment problem"); | 678 | xfs_warn(mp, "correcting sb_features alignment problem"); |
679 | sbp->sb_features2 |= sbp->sb_bad_features2; | 679 | sbp->sb_features2 |= sbp->sb_bad_features2; |
680 | sbp->sb_bad_features2 = sbp->sb_features2; | 680 | sbp->sb_bad_features2 = sbp->sb_features2; |
681 | mp->m_update_flags |= XFS_SB_FEATURES2 | XFS_SB_BAD_FEATURES2; | 681 | mp->m_update_flags |= XFS_SB_FEATURES2; |
682 | 682 | ||
683 | /* | 683 | /* |
684 | * Re-check for ATTR2 in case it was found in bad_features2 | 684 | * Re-check for ATTR2 in case it was found in bad_features2 |
@@ -1436,8 +1436,7 @@ xfs_mount_log_sb( | |||
1436 | int error; | 1436 | int error; |
1437 | 1437 | ||
1438 | ASSERT(fields & (XFS_SB_UNIT | XFS_SB_WIDTH | XFS_SB_UUID | | 1438 | ASSERT(fields & (XFS_SB_UNIT | XFS_SB_WIDTH | XFS_SB_UUID | |
1439 | XFS_SB_FEATURES2 | XFS_SB_BAD_FEATURES2 | | 1439 | XFS_SB_FEATURES2 | XFS_SB_VERSIONNUM)); |
1440 | XFS_SB_VERSIONNUM)); | ||
1441 | 1440 | ||
1442 | tp = xfs_trans_alloc(mp, XFS_TRANS_SB_UNIT); | 1441 | tp = xfs_trans_alloc(mp, XFS_TRANS_SB_UNIT); |
1443 | error = xfs_trans_reserve(tp, &M_RES(mp)->tr_sb, 0, 0); | 1442 | error = xfs_trans_reserve(tp, &M_RES(mp)->tr_sb, 0, 0); |