xfs: Remove incore use of XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD
Remove all incore use of XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD. Instead, start using XFS_GQUOTA_.* XFS_PQUOTA_.* counterparts for GQUOTA and PQUOTA respectively. On-disk copy still uses XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD. Read and write of the superblock does the conversion from *OQUOTA* to *[PG]QUOTA*. Signed-off-by: Chandra Seetharaman <sekharan@us.ibm.com> Reviewed-by: Ben Myers <bpm@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com>
This commit is contained in:
parent
0e6436d99e
commit
83e782e1a1
7 changed files with 123 additions and 53 deletions
|
@ -336,6 +336,14 @@ xfs_mount_validate_sb(
|
|||
return XFS_ERROR(EWRONGFS);
|
||||
}
|
||||
|
||||
if ((sbp->sb_qflags & (XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD)) &&
|
||||
(sbp->sb_qflags & (XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD |
|
||||
XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD))) {
|
||||
xfs_notice(mp,
|
||||
"Super block has XFS_OQUOTA bits along with XFS_PQUOTA and/or XFS_GQUOTA bits.\n");
|
||||
return XFS_ERROR(EFSCORRUPTED);
|
||||
}
|
||||
|
||||
/*
|
||||
* Version 5 superblock feature mask validation. Reject combinations the
|
||||
* kernel cannot support up front before checking anything else. For
|
||||
|
@ -561,6 +569,18 @@ out_unwind:
|
|||
return error;
|
||||
}
|
||||
|
||||
static void
|
||||
xfs_sb_quota_from_disk(struct xfs_sb *sbp)
|
||||
{
|
||||
if (sbp->sb_qflags & XFS_OQUOTA_ENFD)
|
||||
sbp->sb_qflags |= (sbp->sb_qflags & XFS_PQUOTA_ACCT) ?
|
||||
XFS_PQUOTA_ENFD : XFS_GQUOTA_ENFD;
|
||||
if (sbp->sb_qflags & XFS_OQUOTA_CHKD)
|
||||
sbp->sb_qflags |= (sbp->sb_qflags & XFS_PQUOTA_ACCT) ?
|
||||
XFS_PQUOTA_CHKD : XFS_GQUOTA_CHKD;
|
||||
sbp->sb_qflags &= ~(XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD);
|
||||
}
|
||||
|
||||
void
|
||||
xfs_sb_from_disk(
|
||||
struct xfs_sb *to,
|
||||
|
@ -622,6 +642,35 @@ xfs_sb_from_disk(
|
|||
to->sb_lsn = be64_to_cpu(from->sb_lsn);
|
||||
}
|
||||
|
||||
static inline void
|
||||
xfs_sb_quota_to_disk(
|
||||
xfs_dsb_t *to,
|
||||
xfs_sb_t *from,
|
||||
__int64_t *fields)
|
||||
{
|
||||
__uint16_t qflags = from->sb_qflags;
|
||||
|
||||
if (*fields & XFS_SB_QFLAGS) {
|
||||
/*
|
||||
* The in-core version of sb_qflags do not have
|
||||
* XFS_OQUOTA_* flags, whereas the on-disk version
|
||||
* does. So, convert incore XFS_{PG}QUOTA_* flags
|
||||
* to on-disk XFS_OQUOTA_* flags.
|
||||
*/
|
||||
qflags &= ~(XFS_PQUOTA_ENFD | XFS_PQUOTA_CHKD |
|
||||
XFS_GQUOTA_ENFD | XFS_GQUOTA_CHKD);
|
||||
|
||||
if (from->sb_qflags &
|
||||
(XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD))
|
||||
qflags |= XFS_OQUOTA_ENFD;
|
||||
if (from->sb_qflags &
|
||||
(XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD))
|
||||
qflags |= XFS_OQUOTA_CHKD;
|
||||
to->sb_qflags = cpu_to_be16(qflags);
|
||||
*fields &= ~XFS_SB_QFLAGS;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy in core superblock to ondisk one.
|
||||
*
|
||||
|
@ -643,6 +692,7 @@ xfs_sb_to_disk(
|
|||
if (!fields)
|
||||
return;
|
||||
|
||||
xfs_sb_quota_to_disk(to, from, &fields);
|
||||
while (fields) {
|
||||
f = (xfs_sb_field_t)xfs_lowbit64((__uint64_t)fields);
|
||||
first = xfs_sb_info[f].offset;
|
||||
|
@ -835,6 +885,7 @@ reread:
|
|||
*/
|
||||
xfs_sb_from_disk(&mp->m_sb, XFS_BUF_TO_SBP(bp));
|
||||
|
||||
xfs_sb_quota_from_disk(&mp->m_sb);
|
||||
/*
|
||||
* We must be able to do sector-sized and sector-aligned IO.
|
||||
*/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue