mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-01 10:42:11 +00:00
Code changes for 6.7-rc2:
* Validate quota records recovered from the log before writing them to the disk. Signed-off-by: Chandan Babu R <chandanbabu@kernel.org> -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQQjMC4mbgVeU7MxEIYH7y4RirJu9AUCZV5ElQAKCRAH7y4RirJu 9DCnAP0bth5eVyCxq9teNsql8sDnWzYtgdp3Sgo6LGjKcbUigAEAldS0EW86fva6 X60DComoQfxT4zMKR6K6h7VvhcF3dwc= =PQ3p -----END PGP SIGNATURE----- Merge tag 'xfs-6.7-fixes-3' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux Pull xfs fix from Chandan Babu: - Validate quota records recovered from the log before writing them to the disk. * tag 'xfs-6.7-fixes-3' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux: xfs: dquot recovery does not validate the recovered dquot xfs: clean up dqblk extraction
This commit is contained in:
commit
b46ae77f67
@ -562,7 +562,8 @@ xfs_dquot_from_disk(
|
||||
struct xfs_dquot *dqp,
|
||||
struct xfs_buf *bp)
|
||||
{
|
||||
struct xfs_disk_dquot *ddqp = bp->b_addr + dqp->q_bufoffset;
|
||||
struct xfs_dqblk *dqb = xfs_buf_offset(bp, dqp->q_bufoffset);
|
||||
struct xfs_disk_dquot *ddqp = &dqb->dd_diskdq;
|
||||
|
||||
/*
|
||||
* Ensure that we got the type and ID we were looking for.
|
||||
@ -1250,7 +1251,7 @@ xfs_qm_dqflush(
|
||||
}
|
||||
|
||||
/* Flush the incore dquot to the ondisk buffer. */
|
||||
dqblk = bp->b_addr + dqp->q_bufoffset;
|
||||
dqblk = xfs_buf_offset(bp, dqp->q_bufoffset);
|
||||
xfs_dquot_to_disk(&dqblk->dd_diskdq, dqp);
|
||||
|
||||
/*
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include "xfs_log.h"
|
||||
#include "xfs_log_priv.h"
|
||||
#include "xfs_log_recover.h"
|
||||
#include "xfs_error.h"
|
||||
|
||||
STATIC void
|
||||
xlog_recover_dquot_ra_pass2(
|
||||
@ -65,6 +66,7 @@ xlog_recover_dquot_commit_pass2(
|
||||
{
|
||||
struct xfs_mount *mp = log->l_mp;
|
||||
struct xfs_buf *bp;
|
||||
struct xfs_dqblk *dqb;
|
||||
struct xfs_disk_dquot *ddq, *recddq;
|
||||
struct xfs_dq_logformat *dq_f;
|
||||
xfs_failaddr_t fa;
|
||||
@ -130,14 +132,14 @@ xlog_recover_dquot_commit_pass2(
|
||||
return error;
|
||||
|
||||
ASSERT(bp);
|
||||
ddq = xfs_buf_offset(bp, dq_f->qlf_boffset);
|
||||
dqb = xfs_buf_offset(bp, dq_f->qlf_boffset);
|
||||
ddq = &dqb->dd_diskdq;
|
||||
|
||||
/*
|
||||
* 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)) {
|
||||
struct xfs_dqblk *dqb = (struct xfs_dqblk *)ddq;
|
||||
xfs_lsn_t lsn = be64_to_cpu(dqb->dd_lsn);
|
||||
|
||||
if (lsn && lsn != -1 && XFS_LSN_CMP(lsn, current_lsn) >= 0) {
|
||||
@ -147,10 +149,23 @@ xlog_recover_dquot_commit_pass2(
|
||||
|
||||
memcpy(ddq, recddq, item->ri_buf[1].i_len);
|
||||
if (xfs_has_crc(mp)) {
|
||||
xfs_update_cksum((char *)ddq, sizeof(struct xfs_dqblk),
|
||||
xfs_update_cksum((char *)dqb, sizeof(struct xfs_dqblk),
|
||||
XFS_DQUOT_CRC_OFF);
|
||||
}
|
||||
|
||||
/* Validate the recovered dquot. */
|
||||
fa = xfs_dqblk_verify(log->l_mp, dqb, dq_f->qlf_id);
|
||||
if (fa) {
|
||||
XFS_CORRUPTION_ERROR("Bad dquot after recovery",
|
||||
XFS_ERRLEVEL_LOW, mp, dqb,
|
||||
sizeof(struct xfs_dqblk));
|
||||
xfs_alert(mp,
|
||||
"Metadata corruption detected at %pS, dquot 0x%x",
|
||||
fa, dq_f->qlf_id);
|
||||
error = -EFSCORRUPTED;
|
||||
goto out_release;
|
||||
}
|
||||
|
||||
ASSERT(dq_f->qlf_size == 2);
|
||||
ASSERT(bp->b_mount == mp);
|
||||
bp->b_flags |= _XBF_LOGRECOVERY;
|
||||
|
Loading…
Reference in New Issue
Block a user