[Top] [All Lists]

[3.12, 3.14 STABLE]: xfs: avoid false quotacheck after unclean shutdown

To: stable@xxxxxxxxxxxxxxx
Subject: [3.12, 3.14 STABLE]: xfs: avoid false quotacheck after unclean shutdown
From: Arkadiusz MiÅkiewicz <arekm@xxxxxxxx>
Date: Fri, 7 Nov 2014 20:04:25 +0100
Cc: "Greg Kroah-Hartman" <gregkh@xxxxxxxxxxxxxxxxxxx>, Eric Sandeen <sandeen@xxxxxxxxxxx>, xfs@xxxxxxxxxxx
Delivered-to: xfs@xxxxxxxxxxx
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=maven.pl; s=maven; h=from:to:subject:date:user-agent:cc:mime-version:content-type :content-transfer-encoding:message-id; bh=k8rQgUttULP8WzuJbsAMa1b24+cElHiJs/0jN/EJE+I=; b=pqWs3CfIAhMUYcNDqhgbkPe9arXmvo5Xu1wSf2KJYIeXM1VFgmNBv9LzwMRkIceirX Q6znzXMnO44gxtd4qwPkJ0RDSuGcpd0fwbrmGXIaZJ3iIqjQjtDX17dtYJ3pQ1Nz8Gac L+O9d+NlIhntGcQBBae8fDIToZ6QILVZ/cpaM=
User-agent: KMail/1.13.7 (Linux/3.18.0-rc3-00068-g20f3963-dirty; KDE/4.14.2; x86_64; ; )

Please apply. Broken in 3.11, fixed in 3.17, so 3.12 and 3.14 material (as 
othes trees seem
to be unmaintained according to kernel.org)

The only difference between 3.17 fix and attached one is dropping "libxfs" part 
from paths
(fs/xfs/libxfs/xfs_sb.c -> fs/xfs/xfs_sb.c)

ps. cc gregkh@ directly, too because vger.kernel doesn't like my domain and 
likely this mail
won't be delivered to stable@. Unsolved mystery and no one capable/willing to 
solve it.

commit 5ef828c4152726f56751c78ea844f08d2b2a4fa3
Author: Eric Sandeen <sandeen@xxxxxxxxxxx>
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. <cbay@xxxxxxxxxxxxx>
    Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx>

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)
+static void
        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);
+       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

Arkadiusz MiÅkiewicz, arekm / ( maven.pl | pld-linux.org )

<Prev in Thread] Current Thread [Next in Thread>
  • [3.12, 3.14 STABLE]: xfs: avoid false quotacheck after unclean shutdown, Arkadiusz MiÅkiewicz <=