]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commit - fs/xfs/xfs_qm.c
xfs: rework dquot CRCs
authorDave Chinner <dchinner@redhat.com>
Mon, 3 Jun 2013 05:28:46 +0000 (15:28 +1000)
committerBen Myers <bpm@sgi.com>
Tue, 4 Jun 2013 22:35:51 +0000 (17:35 -0500)
commit6fcdc59de28817d1fbf1bd58cc01f4f3fac858fb
treea006da6d17f126e1b5819e488987a09c6e5ea384
parent5ae6e6a401957698f2bd8c9f4a86d86d02199fea
xfs: rework dquot CRCs

Calculating dquot CRCs when the backing buffer is written back just
doesn't work reliably. There are several places which manipulate
dquots directly in the buffers, and they don't calculate CRCs
appropriately, nor do they always set the buffer up to calculate
CRCs appropriately.

Firstly, if we log a dquot buffer (e.g. during allocation) it gets
logged without valid CRC, and so on recovery we end up with a dquot
that is not valid.

Secondly, if we recover/repair a dquot, we don't have a verifier
attached to the buffer and hence CRCs are not calculated on the way
down to disk.

Thirdly, calculating the CRC after we've changed the contents means
that if we re-read the dquot from the buffer, we cannot verify the
contents of the dquot are valid, as the CRC is invalid.

So, to avoid all the dquot CRC errors that are being detected by the
read verifier, change to using the same model as for inodes. That
is, dquot CRCs are calculated and written to the backing buffer at
the time the dquot is flushed to the backing buffer. If we modify
the dquot directly in the backing buffer, calculate the CRC
immediately after the modification is complete. Hence the dquot in
the on-disk buffer should always have a valid CRC.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Ben Myers <bpm@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
fs/xfs/xfs_dquot.c
fs/xfs/xfs_log_recover.c
fs/xfs/xfs_qm.c
fs/xfs/xfs_quota.h