| From 1e7198ac811f6416903a8f0877813da5c9e327f4 Mon Sep 17 00:00:00 2001 |
| From: Eric Sandeen <sandeen@redhat.com> |
| Date: Tue, 8 Nov 2016 11:58:55 +1100 |
| Subject: [PATCH] xfs: don't call xfs_sb_quota_from_disk twice |
| |
| commit e6fc6fcf4447c9266038c55c25e4c7c14bee110c upstream. |
| |
| Source xfsprogs commit: ee3754254e8c186c99b6cdd4d59f741759d04acb |
| |
| Kernel commit 5ef828c4 ("xfs: avoid false quotacheck after unclean |
| shutdown") made xfs_sb_from_disk() also call xfs_sb_quota_from_disk |
| by default. |
| |
| However, when this was merged to libxfs, existing separate |
| calls to libxfs_sb_quota_from_disk remained, and calling it |
| twice in a row on a V4 superblock leads to issues, because: |
| |
| if (sbp->sb_qflags & XFS_PQUOTA_ACCT) { |
| ... |
| sbp->sb_pquotino = sbp->sb_gquotino; |
| sbp->sb_gquotino = NULLFSINO; |
| |
| and after the second call, we have set both pquotino and gquotino |
| to NULLFSINO. |
| |
| Fix this by making it safe to call twice, and also remove the extra |
| calls to libxfs_sb_quota_from_disk. |
| |
| This is only spotted when running xfstests with "-m crc=0" because |
| the sb_from_disk change came about after V5 became default, and |
| the above behavior only exists on a V4 superblock. |
| |
| Reported-by: Eryu Guan <eguan@redhat.com> |
| Signed-off-by: Eric Sandeen <sandeen@redhat.com> |
| Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com> |
| Signed-off-by: Dave Chinner <david@fromorbit.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c |
| index 4aecc5fefe96..9da2071b4531 100644 |
| --- a/fs/xfs/libxfs/xfs_sb.c |
| +++ b/fs/xfs/libxfs/xfs_sb.c |
| @@ -336,13 +336,16 @@ xfs_sb_quota_from_disk(struct xfs_sb *sbp) |
| XFS_PQUOTA_CHKD : XFS_GQUOTA_CHKD; |
| sbp->sb_qflags &= ~(XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD); |
| |
| - if (sbp->sb_qflags & XFS_PQUOTA_ACCT) { |
| + if (sbp->sb_qflags & XFS_PQUOTA_ACCT && |
| + sbp->sb_gquotino != NULLFSINO) { |
| /* |
| * In older version of superblock, on-disk superblock only |
| * has sb_gquotino, and in-core superblock has both sb_gquotino |
| * and sb_pquotino. But, only one of them is supported at any |
| * point of time. So, if PQUOTA is set in disk superblock, |
| - * copy over sb_gquotino to sb_pquotino. |
| + * copy over sb_gquotino to sb_pquotino. The NULLFSINO test |
| + * above is to make sure we don't do this twice and wipe them |
| + * both out! |
| */ |
| sbp->sb_pquotino = sbp->sb_gquotino; |
| sbp->sb_gquotino = NULLFSINO; |
| -- |
| 2.10.1 |
| |