From: Arkadiusz Miƛkiewicz Date: Fri, 7 Nov 2014 16:03:06 +0000 (+0100) Subject: - up to 3.14.23; xfs: avoid false quotacheck after unclean shutdown X-Git-Tag: auto/th/kernel-3.14-3.14.23-1 X-Git-Url: http://git.pld-linux.org/?p=packages%2Fkernel.git;a=commitdiff_plain;h=20104926b235e84814e5b1da1b0f410842a5aaf1 - up to 3.14.23; xfs: avoid false quotacheck after unclean shutdown --- diff --git a/kernel-small_fixes.patch b/kernel-small_fixes.patch index 5c0de9dc..e40d6e56 100644 --- a/kernel-small_fixes.patch +++ b/kernel-small_fixes.patch @@ -112,3 +112,95 @@ index 4e565c8..732648b 100644 spin_lock_init(&group->fanotify_data.access_lock); -- cgit v0.10.1 +commit 5ef828c4152726f56751c78ea844f08d2b2a4fa3 +Author: Eric Sandeen +Date: Mon Aug 4 11:35:44 2014 +1000 + + xfs: avoid false quotacheck after unclean shutdown + + The commit + + 83e782e xfs: Remove incore use of XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD + + added a new function xfs_sb_quota_from_disk() which swaps + on-disk XFS_OQUOTA_* flags for in-core XFS_GQUOTA_* and XFS_PQUOTA_* + flags after the superblock is read. + + However, if log recovery is required, the superblock is read again, + and the modified in-core flags are re-read from disk, so we have + XFS_OQUOTA_* flags in memory again. This causes the + XFS_QM_NEED_QUOTACHECK() test to be true, because the XFS_OQUOTA_CHKD + is still set, and not XFS_GQUOTA_CHKD or XFS_PQUOTA_CHKD. + + Change xfs_sb_from_disk to call xfs_sb_quota_from disk and always + convert the disk flags to in-memory flags. + + Add a lower-level function which can be called with "false" to + not convert the flags, so that the sb verifier can verify + exactly what was on disk, per Brian Foster's suggestion. + + Reported-by: Cyril B. + Signed-off-by: Eric Sandeen + +diff --git a/fs/xfs/xfs_sb.c b/fs/xfs/xfs_sb.c +index f5ca028..8db9e92 100644 +--- a/fs/xfs/xfs_sb.c ++++ b/fs/xfs//xfs_sb.c +@@ -386,10 +386,11 @@ xfs_sb_quota_from_disk(struct xfs_sb *sbp) + } + } + +-void +-xfs_sb_from_disk( ++static void ++__xfs_sb_from_disk( + struct xfs_sb *to, +- xfs_dsb_t *from) ++ xfs_dsb_t *from, ++ bool convert_xquota) + { + to->sb_magicnum = be32_to_cpu(from->sb_magicnum); + to->sb_blocksize = be32_to_cpu(from->sb_blocksize); +@@ -445,6 +446,17 @@ xfs_sb_from_disk( + to->sb_pad = 0; + to->sb_pquotino = be64_to_cpu(from->sb_pquotino); + to->sb_lsn = be64_to_cpu(from->sb_lsn); ++ /* Convert on-disk flags to in-memory flags? */ ++ if (convert_xquota) ++ xfs_sb_quota_from_disk(to); ++} ++ ++void ++xfs_sb_from_disk( ++ struct xfs_sb *to, ++ xfs_dsb_t *from) ++{ ++ __xfs_sb_from_disk(to, from, true); + } + + static inline void +@@ -560,7 +572,11 @@ xfs_sb_verify( + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_sb sb; + +- xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); ++ /* ++ * Use call variant which doesn't convert quota flags from disk ++ * format, because xfs_mount_validate_sb checks the on-disk flags. ++ */ ++ __xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp), false); + + /* + * Only check the in progress field for the primary superblock as +diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c +index d5c44a6..5612aa8 100644 +--- a/fs/xfs/xfs_mount.c ++++ b/fs/xfs/xfs_mount.c +@@ -324,7 +324,6 @@ reread: + * Initialize the mount structure from the superblock. + */ + xfs_sb_from_disk(sbp, XFS_BUF_TO_SBP(bp)); +- xfs_sb_quota_from_disk(sbp); + + /* + * If we haven't validated the superblock, do so now before we try diff --git a/kernel.spec b/kernel.spec index d955c075..6b49ad9b 100644 --- a/kernel.spec +++ b/kernel.spec @@ -70,7 +70,7 @@ %define rel 1 %define basever 3.14 -%define postver .22 +%define postver .23 %define versuffix -%{basever} @@ -115,7 +115,7 @@ Source0: http://www.kernel.org/pub/linux/kernel/v3.x/linux-%{basever}.tar.xz # Source0-md5: b621207b3f6ecbb67db18b13258f8ea8 %if "%{postver}" != ".0" Patch0: http://www.kernel.org/pub/linux/kernel/v3.x/patch-%{version}.xz -# Patch0-md5: 6634fc5051468ef7ff96187edc108825 +# Patch0-md5: 45a2b9fbe6c9075093fb015f818b4e37 %endif Source1: kernel.sysconfig