summaryrefslogtreecommitdiff
path: root/drivers/md/dm-vdo/slab-depot.c
diff options
context:
space:
mode:
authorSusan LeGendre-McGhee <slegendr@redhat.com>2024-02-15 11:35:15 -0500
committerMike Snitzer <snitzer@kernel.org>2024-03-04 15:07:55 -0500
commitdcd1332bb5ff996bc92a63948ba32bceae40507c (patch)
treec18f88b315dea3ce993daf3aed62998d91b903e5 /drivers/md/dm-vdo/slab-depot.c
parent6a87a8a258ed5a6ba8939e88cdca1ed42d4eeebc (diff)
dm vdo: remove internal ticket references
Signed-off-by: Susan LeGendre-McGhee <slegendr@redhat.com> Signed-off-by: Matthew Sakai <msakai@redhat.com> Signed-off-by: Mike Snitzer <snitzer@kernel.org>
Diffstat (limited to 'drivers/md/dm-vdo/slab-depot.c')
-rw-r--r--drivers/md/dm-vdo/slab-depot.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/md/dm-vdo/slab-depot.c b/drivers/md/dm-vdo/slab-depot.c
index 42126bd60242..5fa7e0838b32 100644
--- a/drivers/md/dm-vdo/slab-depot.c
+++ b/drivers/md/dm-vdo/slab-depot.c
@@ -334,7 +334,11 @@ static void launch_write(struct slab_summary_block *block)
/*
* Flush before writing to ensure that the slab journal tail blocks and reference updates
- * covered by this summary update are stable (VDO-2332).
+ * covered by this summary update are stable. Otherwise, a subsequent recovery could
+ * encounter a slab summary update that refers to a slab journal tail block that has not
+ * actually been written. In such cases, the slab journal referenced will be treated as
+ * empty, causing any data within the slab which predates the existing recovery journal
+ * entries to be lost.
*/
pbn = (depot->summary_origin +
(VDO_SLAB_SUMMARY_BLOCKS_PER_ZONE * allocator->zone_number) +
@@ -499,7 +503,7 @@ static void reap_slab_journal(struct slab_journal *journal)
* journal block writes can be issued while previous slab summary updates have not yet been
* made. Even though those slab journal block writes will be ignored if the slab summary
* update is not persisted, they may still overwrite the to-be-reaped slab journal block
- * resulting in a loss of reference count updates (VDO-2912).
+ * resulting in a loss of reference count updates.
*/
journal->flush_waiter.callback = flush_for_reaping;
acquire_vio_from_pool(journal->slab->allocator->vio_pool,
@@ -770,7 +774,8 @@ static void write_slab_journal_block(struct vdo_waiter *waiter, void *context)
/*
* This block won't be read in recovery until the slab summary is updated to refer to it.
- * The slab summary update does a flush which is sufficient to protect us from VDO-2331.
+ * The slab summary update does a flush which is sufficient to protect us from corruption
+ * due to out of order slab journal, reference block, or block map writes.
*/
vdo_submit_metadata_vio(uds_forget(vio), block_number, write_slab_journal_endio,
complete_write, REQ_OP_WRITE);
@@ -1201,7 +1206,8 @@ static void write_reference_block(struct vdo_waiter *waiter, void *context)
/*
* Flush before writing to ensure that the recovery journal and slab journal entries which
- * cover this reference update are stable (VDO-2331).
+ * cover this reference update are stable. This prevents data corruption that can be caused
+ * by out of order writes.
*/
WRITE_ONCE(block->slab->allocator->ref_counts_statistics.blocks_written,
block->slab->allocator->ref_counts_statistics.blocks_written + 1);
@@ -1775,7 +1781,7 @@ static void add_entries(struct slab_journal *journal)
(journal->slab->status == VDO_SLAB_REBUILDING)) {
/*
* Don't add entries while rebuilding or while a partial write is
- * outstanding (VDO-2399).
+ * outstanding, as it could result in reference count corruption.
*/
break;
}