/* * Filesystems are required to send in quota flags at mount time.
*/ if (mp->m_qflags == 0) return 0;
recddq = item->ri_buf[1].iov_base; if (recddq == NULL) {
xfs_alert(log->l_mp, "NULL dquot in %s.", __func__); return -EFSCORRUPTED;
} if (item->ri_buf[1].iov_len < sizeof(struct xfs_disk_dquot)) {
xfs_alert(log->l_mp, "dquot too small (%zd) in %s.",
item->ri_buf[1].iov_len, __func__); return -EFSCORRUPTED;
}
/* * This type of quotas was turned off, so ignore this record.
*/
type = recddq->d_type & XFS_DQTYPE_REC_MASK;
ASSERT(type); if (log->l_quotaoffs_flag & type) return 0;
/* * At this point we know that quota was _not_ turned off. * Since the mount flags are not indicating to us otherwise, this * must mean that quota is on, and the dquot needs to be replayed. * Remember that we may not have fully recovered the superblock yet, * so we can't do the usual trick of looking at the SB quota bits. * * The other possibility, of course, is that the quota subsystem was * removed since the last mount - ENOSYS.
*/
dq_f = item->ri_buf[0].iov_base;
ASSERT(dq_f);
fa = xfs_dquot_verify(mp, recddq, dq_f->qlf_id); if (fa) {
xfs_alert(mp, "corrupt dquot ID 0x%x in log at %pS",
dq_f->qlf_id, fa); return -EFSCORRUPTED;
}
ASSERT(dq_f->qlf_len == 1);
/* * At this point we are assuming that the dquots have been allocated * and hence the buffer has valid dquots stamped in it. It should, * therefore, pass verifier validation. If the dquot is bad, then the * we'll return an error here, so we don't need to specifically check * the dquot in the buffer after the verifier has run.
*/
error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, dq_f->qlf_blkno,
XFS_FSB_TO_BB(mp, dq_f->qlf_len), 0, &bp,
&xfs_dquot_buf_ops); if (error) return error;
/* * If the dquot has an LSN in it, recover the dquot only if it's less * than the lsn of the transaction we are replaying.
*/ if (xfs_has_crc(mp)) {
xfs_lsn_t lsn = be64_to_cpu(dqb->dd_lsn);
/* * Recover QUOTAOFF records. We simply make a note of it in the xlog * structure, so that we know not to do any dquot item or dquot buffer recovery, * of that type.
*/ STATICint
xlog_recover_quotaoff_commit_pass1( struct xlog *log, struct xlog_recover_item *item)
{ struct xfs_qoff_logformat *qoff_f = item->ri_buf[0].iov_base;
ASSERT(qoff_f);
/* * The logitem format's flag tells us if this was user quotaoff, * group/project quotaoff or both.
*/ if (qoff_f->qf_flags & XFS_UQUOTA_ACCT)
log->l_quotaoffs_flag |= XFS_DQTYPE_USER; if (qoff_f->qf_flags & XFS_PQUOTA_ACCT)
log->l_quotaoffs_flag |= XFS_DQTYPE_PROJ; if (qoff_f->qf_flags & XFS_GQUOTA_ACCT)
log->l_quotaoffs_flag |= XFS_DQTYPE_GROUP;
return 0;
}
conststruct xlog_recover_item_ops xlog_quotaoff_item_ops = {
.item_type = XFS_LI_QUOTAOFF,
.commit_pass1 = xlog_recover_quotaoff_commit_pass1, /* nothing to commit in pass2 */
};
Messung V0.5
¤ Dauer der Verarbeitung: 0.0 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.