brintos

brintos / linux-shallow public Read only

0
0
Text · 162.2 KiB · 274f9cc Raw
5102 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Copyright 2023 Red Hat4 */5 6#include "slab-depot.h"7 8#include <linux/atomic.h>9#include <linux/bio.h>10#include <linux/err.h>11#include <linux/log2.h>12#include <linux/min_heap.h>13#include <linux/minmax.h>14 15#include "logger.h"16#include "memory-alloc.h"17#include "numeric.h"18#include "permassert.h"19#include "string-utils.h"20 21#include "action-manager.h"22#include "admin-state.h"23#include "completion.h"24#include "constants.h"25#include "data-vio.h"26#include "encodings.h"27#include "io-submitter.h"28#include "physical-zone.h"29#include "priority-table.h"30#include "recovery-journal.h"31#include "repair.h"32#include "status-codes.h"33#include "types.h"34#include "vdo.h"35#include "vio.h"36#include "wait-queue.h"37 38static const u64 BYTES_PER_WORD = sizeof(u64);39static const bool NORMAL_OPERATION = true;40 41/**42 * get_lock() - Get the lock object for a slab journal block by sequence number.43 * @journal: vdo_slab journal to retrieve from.44 * @sequence_number: Sequence number of the block.45 *46 * Return: The lock object for the given sequence number.47 */48static inline struct journal_lock * __must_check get_lock(struct slab_journal *journal,49							  sequence_number_t sequence_number)50{51	return &journal->locks[sequence_number % journal->size];52}53 54static bool is_slab_open(struct vdo_slab *slab)55{56	return (!vdo_is_state_quiescing(&slab->state) &&57		!vdo_is_state_quiescent(&slab->state));58}59 60/**61 * must_make_entries_to_flush() - Check whether there are entry waiters which should delay a flush.62 * @journal: The journal to check.63 *64 * Return: true if there are no entry waiters, or if the slab is unrecovered.65 */66static inline bool __must_check must_make_entries_to_flush(struct slab_journal *journal)67{68	return ((journal->slab->status != VDO_SLAB_REBUILDING) &&69		vdo_waitq_has_waiters(&journal->entry_waiters));70}71 72/**73 * is_reaping() - Check whether a reap is currently in progress.74 * @journal: The journal which may be reaping.75 *76 * Return: true if the journal is reaping.77 */78static inline bool __must_check is_reaping(struct slab_journal *journal)79{80	return (journal->head != journal->unreapable);81}82 83/**84 * initialize_tail_block() - Initialize tail block as a new block.85 * @journal: The journal whose tail block is being initialized.86 */87static void initialize_tail_block(struct slab_journal *journal)88{89	struct slab_journal_block_header *header = &journal->tail_header;90 91	header->sequence_number = journal->tail;92	header->entry_count = 0;93	header->has_block_map_increments = false;94}95 96/**97 * initialize_journal_state() - Set all journal fields appropriately to start journaling.98 * @journal: The journal to be reset, based on its tail sequence number.99 */100static void initialize_journal_state(struct slab_journal *journal)101{102	journal->unreapable = journal->head;103	journal->reap_lock = get_lock(journal, journal->unreapable);104	journal->next_commit = journal->tail;105	journal->summarized = journal->last_summarized = journal->tail;106	initialize_tail_block(journal);107}108 109/**110 * block_is_full() - Check whether a journal block is full.111 * @journal: The slab journal for the block.112 *113 * Return: true if the tail block is full.114 */115static bool __must_check block_is_full(struct slab_journal *journal)116{117	journal_entry_count_t count = journal->tail_header.entry_count;118 119	return (journal->tail_header.has_block_map_increments ?120		(journal->full_entries_per_block == count) :121		(journal->entries_per_block == count));122}123 124static void add_entries(struct slab_journal *journal);125static void update_tail_block_location(struct slab_journal *journal);126static void release_journal_locks(struct vdo_waiter *waiter, void *context);127 128/**129 * is_slab_journal_blank() - Check whether a slab's journal is blank.130 *131 * A slab journal is blank if it has never had any entries recorded in it.132 *133 * Return: true if the slab's journal has never been modified.134 */135static bool is_slab_journal_blank(const struct vdo_slab *slab)136{137	return ((slab->journal.tail == 1) &&138		(slab->journal.tail_header.entry_count == 0));139}140 141/**142 * mark_slab_journal_dirty() - Put a slab journal on the dirty ring of its allocator in the correct143 *                             order.144 * @journal: The journal to be marked dirty.145 * @lock: The recovery journal lock held by the slab journal.146 */147static void mark_slab_journal_dirty(struct slab_journal *journal, sequence_number_t lock)148{149	struct slab_journal *dirty_journal;150	struct list_head *dirty_list = &journal->slab->allocator->dirty_slab_journals;151 152	VDO_ASSERT_LOG_ONLY(journal->recovery_lock == 0, "slab journal was clean");153 154	journal->recovery_lock = lock;155	list_for_each_entry_reverse(dirty_journal, dirty_list, dirty_entry) {156		if (dirty_journal->recovery_lock <= journal->recovery_lock)157			break;158	}159 160	list_move_tail(&journal->dirty_entry, dirty_journal->dirty_entry.next);161}162 163static void mark_slab_journal_clean(struct slab_journal *journal)164{165	journal->recovery_lock = 0;166	list_del_init(&journal->dirty_entry);167}168 169static void check_if_slab_drained(struct vdo_slab *slab)170{171	bool read_only;172	struct slab_journal *journal = &slab->journal;173	const struct admin_state_code *code;174 175	if (!vdo_is_state_draining(&slab->state) ||176	    must_make_entries_to_flush(journal) ||177	    is_reaping(journal) ||178	    journal->waiting_to_commit ||179	    !list_empty(&journal->uncommitted_blocks) ||180	    journal->updating_slab_summary ||181	    (slab->active_count > 0))182		return;183 184	/* When not suspending or recovering, the slab must be clean. */185	code = vdo_get_admin_state_code(&slab->state);186	read_only = vdo_is_read_only(slab->allocator->depot->vdo);187	if (!read_only &&188	    vdo_waitq_has_waiters(&slab->dirty_blocks) &&189	    (code != VDO_ADMIN_STATE_SUSPENDING) &&190	    (code != VDO_ADMIN_STATE_RECOVERING))191		return;192 193	vdo_finish_draining_with_result(&slab->state,194					(read_only ? VDO_READ_ONLY : VDO_SUCCESS));195}196 197/* FULLNESS HINT COMPUTATION */198 199/**200 * compute_fullness_hint() - Translate a slab's free block count into a 'fullness hint' that can be201 *                           stored in a slab_summary_entry's 7 bits that are dedicated to its free202 *                           count.203 * @depot: The depot whose summary being updated.204 * @free_blocks: The number of free blocks.205 *206 * Note: the number of free blocks must be strictly less than 2^23 blocks, even though207 * theoretically slabs could contain precisely 2^23 blocks; there is an assumption that at least208 * one block is used by metadata. This assumption is necessary; otherwise, the fullness hint might209 * overflow. The fullness hint formula is roughly (fullness >> 16) & 0x7f, but (2^23 >> 16) & 0x7f210 * is 0, which would make it impossible to distinguish completely full from completely empty.211 *212 * Return: A fullness hint, which can be stored in 7 bits.213 */214static u8 __must_check compute_fullness_hint(struct slab_depot *depot,215					     block_count_t free_blocks)216{217	block_count_t hint;218 219	VDO_ASSERT_LOG_ONLY((free_blocks < (1 << 23)), "free blocks must be less than 2^23");220 221	if (free_blocks == 0)222		return 0;223 224	hint = free_blocks >> depot->hint_shift;225	return ((hint == 0) ? 1 : hint);226}227 228/**229 * check_summary_drain_complete() - Check whether an allocators summary has finished draining.230 */231static void check_summary_drain_complete(struct block_allocator *allocator)232{233	if (!vdo_is_state_draining(&allocator->summary_state) ||234	    (allocator->summary_write_count > 0))235		return;236 237	vdo_finish_operation(&allocator->summary_state,238			     (vdo_is_read_only(allocator->depot->vdo) ?239			      VDO_READ_ONLY : VDO_SUCCESS));240}241 242/**243 * notify_summary_waiters() - Wake all the waiters in a given queue.244 * @allocator: The block allocator summary which owns the queue.245 * @queue: The queue to notify.246 */247static void notify_summary_waiters(struct block_allocator *allocator,248				   struct vdo_wait_queue *queue)249{250	int result = (vdo_is_read_only(allocator->depot->vdo) ?251		      VDO_READ_ONLY : VDO_SUCCESS);252 253	vdo_waitq_notify_all_waiters(queue, NULL, &result);254}255 256static void launch_write(struct slab_summary_block *summary_block);257 258/**259 * finish_updating_slab_summary_block() - Finish processing a block which attempted to write,260 *                                        whether or not the attempt succeeded.261 * @block: The block.262 */263static void finish_updating_slab_summary_block(struct slab_summary_block *block)264{265	notify_summary_waiters(block->allocator, &block->current_update_waiters);266	block->writing = false;267	block->allocator->summary_write_count--;268	if (vdo_waitq_has_waiters(&block->next_update_waiters))269		launch_write(block);270	else271		check_summary_drain_complete(block->allocator);272}273 274/**275 * finish_update() - This is the callback for a successful summary block write.276 * @completion: The write vio.277 */278static void finish_update(struct vdo_completion *completion)279{280	struct slab_summary_block *block =281		container_of(as_vio(completion), struct slab_summary_block, vio);282 283	atomic64_inc(&block->allocator->depot->summary_statistics.blocks_written);284	finish_updating_slab_summary_block(block);285}286 287/**288 * handle_write_error() - Handle an error writing a slab summary block.289 * @completion: The write VIO.290 */291static void handle_write_error(struct vdo_completion *completion)292{293	struct slab_summary_block *block =294		container_of(as_vio(completion), struct slab_summary_block, vio);295 296	vio_record_metadata_io_error(as_vio(completion));297	vdo_enter_read_only_mode(completion->vdo, completion->result);298	finish_updating_slab_summary_block(block);299}300 301static void write_slab_summary_endio(struct bio *bio)302{303	struct vio *vio = bio->bi_private;304	struct slab_summary_block *block =305		container_of(vio, struct slab_summary_block, vio);306 307	continue_vio_after_io(vio, finish_update, block->allocator->thread_id);308}309 310/**311 * launch_write() - Write a slab summary block unless it is currently out for writing.312 * @block: The block that needs to be committed.313 */314static void launch_write(struct slab_summary_block *block)315{316	struct block_allocator *allocator = block->allocator;317	struct slab_depot *depot = allocator->depot;318	physical_block_number_t pbn;319 320	if (block->writing)321		return;322 323	allocator->summary_write_count++;324	vdo_waitq_transfer_all_waiters(&block->next_update_waiters,325				       &block->current_update_waiters);326	block->writing = true;327 328	if (vdo_is_read_only(depot->vdo)) {329		finish_updating_slab_summary_block(block);330		return;331	}332 333	memcpy(block->outgoing_entries, block->entries, VDO_BLOCK_SIZE);334 335	/*336	 * Flush before writing to ensure that the slab journal tail blocks and reference updates337	 * covered by this summary update are stable. Otherwise, a subsequent recovery could338	 * encounter a slab summary update that refers to a slab journal tail block that has not339	 * actually been written. In such cases, the slab journal referenced will be treated as340	 * empty, causing any data within the slab which predates the existing recovery journal341	 * entries to be lost.342	 */343	pbn = (depot->summary_origin +344	       (VDO_SLAB_SUMMARY_BLOCKS_PER_ZONE * allocator->zone_number) +345	       block->index);346	vdo_submit_metadata_vio(&block->vio, pbn, write_slab_summary_endio,347				handle_write_error, REQ_OP_WRITE | REQ_PREFLUSH);348}349 350/**351 * update_slab_summary_entry() - Update the entry for a slab.352 * @slab: The slab whose entry is to be updated353 * @waiter: The waiter that is updating the summary.354 * @tail_block_offset: The offset of the slab journal's tail block.355 * @load_ref_counts: Whether the reference counts must be loaded from disk on the vdo load.356 * @is_clean: Whether the slab is clean.357 * @free_blocks: The number of free blocks.358 */359static void update_slab_summary_entry(struct vdo_slab *slab, struct vdo_waiter *waiter,360				      tail_block_offset_t tail_block_offset,361				      bool load_ref_counts, bool is_clean,362				      block_count_t free_blocks)363{364	u8 index = slab->slab_number / VDO_SLAB_SUMMARY_ENTRIES_PER_BLOCK;365	struct block_allocator *allocator = slab->allocator;366	struct slab_summary_block *block = &allocator->summary_blocks[index];367	int result;368	struct slab_summary_entry *entry;369 370	if (vdo_is_read_only(block->vio.completion.vdo)) {371		result = VDO_READ_ONLY;372		waiter->callback(waiter, &result);373		return;374	}375 376	if (vdo_is_state_draining(&allocator->summary_state) ||377	    vdo_is_state_quiescent(&allocator->summary_state)) {378		result = VDO_INVALID_ADMIN_STATE;379		waiter->callback(waiter, &result);380		return;381	}382 383	entry = &allocator->summary_entries[slab->slab_number];384	*entry = (struct slab_summary_entry) {385		.tail_block_offset = tail_block_offset,386		.load_ref_counts = (entry->load_ref_counts || load_ref_counts),387		.is_dirty = !is_clean,388		.fullness_hint = compute_fullness_hint(allocator->depot, free_blocks),389	};390	vdo_waitq_enqueue_waiter(&block->next_update_waiters, waiter);391	launch_write(block);392}393 394/**395 * finish_reaping() - Actually advance the head of the journal now that any necessary flushes are396 *                    complete.397 * @journal: The journal to be reaped.398 */399static void finish_reaping(struct slab_journal *journal)400{401	journal->head = journal->unreapable;402	add_entries(journal);403	check_if_slab_drained(journal->slab);404}405 406static void reap_slab_journal(struct slab_journal *journal);407 408/**409 * complete_reaping() - Finish reaping now that we have flushed the lower layer and then try410 *                      reaping again in case we deferred reaping due to an outstanding vio.411 * @completion: The flush vio.412 */413static void complete_reaping(struct vdo_completion *completion)414{415	struct slab_journal *journal = completion->parent;416 417	return_vio_to_pool(journal->slab->allocator->vio_pool,418			   vio_as_pooled_vio(as_vio(vdo_forget(completion))));419	finish_reaping(journal);420	reap_slab_journal(journal);421}422 423/**424 * handle_flush_error() - Handle an error flushing the lower layer.425 * @completion: The flush vio.426 */427static void handle_flush_error(struct vdo_completion *completion)428{429	vio_record_metadata_io_error(as_vio(completion));430	vdo_enter_read_only_mode(completion->vdo, completion->result);431	complete_reaping(completion);432}433 434static void flush_endio(struct bio *bio)435{436	struct vio *vio = bio->bi_private;437	struct slab_journal *journal = vio->completion.parent;438 439	continue_vio_after_io(vio, complete_reaping,440			      journal->slab->allocator->thread_id);441}442 443/**444 * flush_for_reaping() - A waiter callback for getting a vio with which to flush the lower layer445 *                       prior to reaping.446 * @waiter: The journal as a flush waiter.447 * @context: The newly acquired flush vio.448 */449static void flush_for_reaping(struct vdo_waiter *waiter, void *context)450{451	struct slab_journal *journal =452		container_of(waiter, struct slab_journal, flush_waiter);453	struct pooled_vio *pooled = context;454	struct vio *vio = &pooled->vio;455 456	vio->completion.parent = journal;457	vdo_submit_flush_vio(vio, flush_endio, handle_flush_error);458}459 460/**461 * reap_slab_journal() - Conduct a reap on a slab journal to reclaim unreferenced blocks.462 * @journal: The slab journal.463 */464static void reap_slab_journal(struct slab_journal *journal)465{466	bool reaped = false;467 468	if (is_reaping(journal)) {469		/* We already have a reap in progress so wait for it to finish. */470		return;471	}472 473	if ((journal->slab->status != VDO_SLAB_REBUILT) ||474	    !vdo_is_state_normal(&journal->slab->state) ||475	    vdo_is_read_only(journal->slab->allocator->depot->vdo)) {476		/*477		 * We must not reap in the first two cases, and there's no point in read-only mode.478		 */479		return;480	}481 482	/*483	 * Start reclaiming blocks only when the journal head has no references. Then stop when a484	 * block is referenced or reap reaches the most recently written block, referenced by the485	 * slab summary, which has the sequence number just before the tail.486	 */487	while ((journal->unreapable < journal->tail) && (journal->reap_lock->count == 0)) {488		reaped = true;489		journal->unreapable++;490		journal->reap_lock++;491		if (journal->reap_lock == &journal->locks[journal->size])492			journal->reap_lock = &journal->locks[0];493	}494 495	if (!reaped)496		return;497 498	/*499	 * It is never safe to reap a slab journal block without first issuing a flush, regardless500	 * of whether a user flush has been received or not. In the absence of the flush, the501	 * reference block write which released the locks allowing the slab journal to reap may not502	 * be persisted. Although slab summary writes will eventually issue flushes, multiple slab503	 * journal block writes can be issued while previous slab summary updates have not yet been504	 * made. Even though those slab journal block writes will be ignored if the slab summary505	 * update is not persisted, they may still overwrite the to-be-reaped slab journal block506	 * resulting in a loss of reference count updates.507	 */508	journal->flush_waiter.callback = flush_for_reaping;509	acquire_vio_from_pool(journal->slab->allocator->vio_pool,510			      &journal->flush_waiter);511}512 513/**514 * adjust_slab_journal_block_reference() - Adjust the reference count for a slab journal block.515 * @journal: The slab journal.516 * @sequence_number: The journal sequence number of the referenced block.517 * @adjustment: Amount to adjust the reference counter.518 *519 * Note that when the adjustment is negative, the slab journal will be reaped.520 */521static void adjust_slab_journal_block_reference(struct slab_journal *journal,522						sequence_number_t sequence_number,523						int adjustment)524{525	struct journal_lock *lock;526 527	if (sequence_number == 0)528		return;529 530	if (journal->slab->status == VDO_SLAB_REPLAYING) {531		/* Locks should not be used during offline replay. */532		return;533	}534 535	VDO_ASSERT_LOG_ONLY((adjustment != 0), "adjustment must be non-zero");536	lock = get_lock(journal, sequence_number);537	if (adjustment < 0) {538		VDO_ASSERT_LOG_ONLY((-adjustment <= lock->count),539				    "adjustment %d of lock count %u for slab journal block %llu must not underflow",540				    adjustment, lock->count,541				    (unsigned long long) sequence_number);542	}543 544	lock->count += adjustment;545	if (lock->count == 0)546		reap_slab_journal(journal);547}548 549/**550 * release_journal_locks() - Callback invoked after a slab summary update completes.551 * @waiter: The slab summary waiter that has just been notified.552 * @context: The result code of the update.553 *554 * Registered in the constructor on behalf of update_tail_block_location().555 *556 * Implements waiter_callback_fn.557 */558static void release_journal_locks(struct vdo_waiter *waiter, void *context)559{560	sequence_number_t first, i;561	struct slab_journal *journal =562		container_of(waiter, struct slab_journal, slab_summary_waiter);563	int result = *((int *) context);564 565	if (result != VDO_SUCCESS) {566		if (result != VDO_READ_ONLY) {567			/*568			 * Don't bother logging what might be lots of errors if we are already in569			 * read-only mode.570			 */571			vdo_log_error_strerror(result, "failed slab summary update %llu",572					       (unsigned long long) journal->summarized);573		}574 575		journal->updating_slab_summary = false;576		vdo_enter_read_only_mode(journal->slab->allocator->depot->vdo, result);577		check_if_slab_drained(journal->slab);578		return;579	}580 581	if (journal->partial_write_in_progress && (journal->summarized == journal->tail)) {582		journal->partial_write_in_progress = false;583		add_entries(journal);584	}585 586	first = journal->last_summarized;587	journal->last_summarized = journal->summarized;588	for (i = journal->summarized - 1; i >= first; i--) {589		/*590		 * Release the lock the summarized block held on the recovery journal. (During591		 * replay, recovery_start will always be 0.)592		 */593		if (journal->recovery_journal != NULL) {594			zone_count_t zone_number = journal->slab->allocator->zone_number;595			struct journal_lock *lock = get_lock(journal, i);596 597			vdo_release_recovery_journal_block_reference(journal->recovery_journal,598								     lock->recovery_start,599								     VDO_ZONE_TYPE_PHYSICAL,600								     zone_number);601		}602 603		/*604		 * Release our own lock against reaping for blocks that are committed. (This605		 * function will not change locks during replay.)606		 */607		adjust_slab_journal_block_reference(journal, i, -1);608	}609 610	journal->updating_slab_summary = false;611 612	reap_slab_journal(journal);613 614	/* Check if the slab summary needs to be updated again. */615	update_tail_block_location(journal);616}617 618/**619 * update_tail_block_location() - Update the tail block location in the slab summary, if necessary.620 * @journal: The slab journal that is updating its tail block location.621 */622static void update_tail_block_location(struct slab_journal *journal)623{624	block_count_t free_block_count;625	struct vdo_slab *slab = journal->slab;626 627	if (journal->updating_slab_summary ||628	    vdo_is_read_only(journal->slab->allocator->depot->vdo) ||629	    (journal->last_summarized >= journal->next_commit)) {630		check_if_slab_drained(slab);631		return;632	}633 634	if (slab->status != VDO_SLAB_REBUILT) {635		u8 hint = slab->allocator->summary_entries[slab->slab_number].fullness_hint;636 637		free_block_count = ((block_count_t) hint) << slab->allocator->depot->hint_shift;638	} else {639		free_block_count = slab->free_blocks;640	}641 642	journal->summarized = journal->next_commit;643	journal->updating_slab_summary = true;644 645	/*646	 * Update slab summary as dirty.647	 * vdo_slab journal can only reap past sequence number 1 when all the ref counts for this648	 * slab have been written to the layer. Therefore, indicate that the ref counts must be649	 * loaded when the journal head has reaped past sequence number 1.650	 */651	update_slab_summary_entry(slab, &journal->slab_summary_waiter,652				  journal->summarized % journal->size,653				  (journal->head > 1), false, free_block_count);654}655 656/**657 * reopen_slab_journal() - Reopen a slab's journal by emptying it and then adding pending entries.658 */659static void reopen_slab_journal(struct vdo_slab *slab)660{661	struct slab_journal *journal = &slab->journal;662	sequence_number_t block;663 664	VDO_ASSERT_LOG_ONLY(journal->tail_header.entry_count == 0,665			    "vdo_slab journal's active block empty before reopening");666	journal->head = journal->tail;667	initialize_journal_state(journal);668 669	/* Ensure no locks are spuriously held on an empty journal. */670	for (block = 1; block <= journal->size; block++) {671		VDO_ASSERT_LOG_ONLY((get_lock(journal, block)->count == 0),672				    "Scrubbed journal's block %llu is not locked",673				    (unsigned long long) block);674	}675 676	add_entries(journal);677}678 679static sequence_number_t get_committing_sequence_number(const struct pooled_vio *vio)680{681	const struct packed_slab_journal_block *block =682		(const struct packed_slab_journal_block *) vio->vio.data;683 684	return __le64_to_cpu(block->header.sequence_number);685}686 687/**688 * complete_write() - Handle post-commit processing.689 * @completion: The write vio as a completion.690 *691 * This is the callback registered by write_slab_journal_block().692 */693static void complete_write(struct vdo_completion *completion)694{695	int result = completion->result;696	struct pooled_vio *pooled = vio_as_pooled_vio(as_vio(completion));697	struct slab_journal *journal = completion->parent;698	sequence_number_t committed = get_committing_sequence_number(pooled);699 700	list_del_init(&pooled->list_entry);701	return_vio_to_pool(journal->slab->allocator->vio_pool, vdo_forget(pooled));702 703	if (result != VDO_SUCCESS) {704		vio_record_metadata_io_error(as_vio(completion));705		vdo_log_error_strerror(result, "cannot write slab journal block %llu",706				       (unsigned long long) committed);707		vdo_enter_read_only_mode(journal->slab->allocator->depot->vdo, result);708		check_if_slab_drained(journal->slab);709		return;710	}711 712	WRITE_ONCE(journal->events->blocks_written, journal->events->blocks_written + 1);713 714	if (list_empty(&journal->uncommitted_blocks)) {715		/* If no blocks are outstanding, then the commit point is at the tail. */716		journal->next_commit = journal->tail;717	} else {718		/* The commit point is always the beginning of the oldest incomplete block. */719		pooled = container_of(journal->uncommitted_blocks.next,720				      struct pooled_vio, list_entry);721		journal->next_commit = get_committing_sequence_number(pooled);722	}723 724	update_tail_block_location(journal);725}726 727static void write_slab_journal_endio(struct bio *bio)728{729	struct vio *vio = bio->bi_private;730	struct slab_journal *journal = vio->completion.parent;731 732	continue_vio_after_io(vio, complete_write, journal->slab->allocator->thread_id);733}734 735/**736 * write_slab_journal_block() - Write a slab journal block.737 * @waiter: The vio pool waiter which was just notified.738 * @context: The vio pool entry for the write.739 *740 * Callback from acquire_vio_from_pool() registered in commit_tail().741 */742static void write_slab_journal_block(struct vdo_waiter *waiter, void *context)743{744	struct pooled_vio *pooled = context;745	struct vio *vio = &pooled->vio;746	struct slab_journal *journal =747		container_of(waiter, struct slab_journal, resource_waiter);748	struct slab_journal_block_header *header = &journal->tail_header;749	int unused_entries = journal->entries_per_block - header->entry_count;750	physical_block_number_t block_number;751	const struct admin_state_code *operation;752 753	header->head = journal->head;754	list_add_tail(&pooled->list_entry, &journal->uncommitted_blocks);755	vdo_pack_slab_journal_block_header(header, &journal->block->header);756 757	/* Copy the tail block into the vio. */758	memcpy(pooled->vio.data, journal->block, VDO_BLOCK_SIZE);759 760	VDO_ASSERT_LOG_ONLY(unused_entries >= 0, "vdo_slab journal block is not overfull");761	if (unused_entries > 0) {762		/*763		 * Release the per-entry locks for any unused entries in the block we are about to764		 * write.765		 */766		adjust_slab_journal_block_reference(journal, header->sequence_number,767						    -unused_entries);768		journal->partial_write_in_progress = !block_is_full(journal);769	}770 771	block_number = journal->slab->journal_origin +772		(header->sequence_number % journal->size);773	vio->completion.parent = journal;774 775	/*776	 * This block won't be read in recovery until the slab summary is updated to refer to it.777	 * The slab summary update does a flush which is sufficient to protect us from corruption778	 * due to out of order slab journal, reference block, or block map writes.779	 */780	vdo_submit_metadata_vio(vdo_forget(vio), block_number, write_slab_journal_endio,781				complete_write, REQ_OP_WRITE);782 783	/* Since the write is submitted, the tail block structure can be reused. */784	journal->tail++;785	initialize_tail_block(journal);786	journal->waiting_to_commit = false;787 788	operation = vdo_get_admin_state_code(&journal->slab->state);789	if (operation == VDO_ADMIN_STATE_WAITING_FOR_RECOVERY) {790		vdo_finish_operation(&journal->slab->state,791				     (vdo_is_read_only(journal->slab->allocator->depot->vdo) ?792				      VDO_READ_ONLY : VDO_SUCCESS));793		return;794	}795 796	add_entries(journal);797}798 799/**800 * commit_tail() - Commit the tail block of the slab journal.801 * @journal: The journal whose tail block should be committed.802 */803static void commit_tail(struct slab_journal *journal)804{805	if ((journal->tail_header.entry_count == 0) && must_make_entries_to_flush(journal)) {806		/*807		 * There are no entries at the moment, but there are some waiters, so defer808		 * initiating the flush until those entries are ready to write.809		 */810		return;811	}812 813	if (vdo_is_read_only(journal->slab->allocator->depot->vdo) ||814	    journal->waiting_to_commit ||815	    (journal->tail_header.entry_count == 0)) {816		/*817		 * There is nothing to do since the tail block is empty, or writing, or the journal818		 * is in read-only mode.819		 */820		return;821	}822 823	/*824	 * Since we are about to commit the tail block, this journal no longer needs to be on the825	 * ring of journals which the recovery journal might ask to commit.826	 */827	mark_slab_journal_clean(journal);828 829	journal->waiting_to_commit = true;830 831	journal->resource_waiter.callback = write_slab_journal_block;832	acquire_vio_from_pool(journal->slab->allocator->vio_pool,833			      &journal->resource_waiter);834}835 836/**837 * encode_slab_journal_entry() - Encode a slab journal entry.838 * @tail_header: The unpacked header for the block.839 * @payload: The journal block payload to hold the entry.840 * @sbn: The slab block number of the entry to encode.841 * @operation: The type of the entry.842 * @increment: True if this is an increment.843 *844 * Exposed for unit tests.845 */846static void encode_slab_journal_entry(struct slab_journal_block_header *tail_header,847				      slab_journal_payload *payload,848				      slab_block_number sbn,849				      enum journal_operation operation,850				      bool increment)851{852	journal_entry_count_t entry_number = tail_header->entry_count++;853 854	if (operation == VDO_JOURNAL_BLOCK_MAP_REMAPPING) {855		if (!tail_header->has_block_map_increments) {856			memset(payload->full_entries.entry_types, 0,857			       VDO_SLAB_JOURNAL_ENTRY_TYPES_SIZE);858			tail_header->has_block_map_increments = true;859		}860 861		payload->full_entries.entry_types[entry_number / 8] |=862			((u8)1 << (entry_number % 8));863	}864 865	vdo_pack_slab_journal_entry(&payload->entries[entry_number], sbn, increment);866}867 868/**869 * expand_journal_point() - Convert a recovery journal journal_point which refers to both an870 *                          increment and a decrement to a single point which refers to one or the871 *                          other.872 * @recovery_point: The journal point to convert.873 * @increment: Whether the current entry is an increment.874 *875 * Return: The expanded journal point876 *877 * Because each data_vio has but a single recovery journal point, but may need to make both878 * increment and decrement entries in the same slab journal. In order to distinguish the two879 * entries, the entry count of the expanded journal point is twice the actual recovery journal880 * entry count for increments, and one more than that for decrements.881 */882static struct journal_point expand_journal_point(struct journal_point recovery_point,883						 bool increment)884{885	recovery_point.entry_count *= 2;886	if (!increment)887		recovery_point.entry_count++;888 889	return recovery_point;890}891 892/**893 * add_entry() - Actually add an entry to the slab journal, potentially firing off a write if a894 *               block becomes full.895 * @journal: The slab journal to append to.896 * @pbn: The pbn being adjusted.897 * @operation: The type of entry to make.898 * @increment: True if this is an increment.899 * @recovery_point: The expanded recovery point.900 *901 * This function is synchronous.902 */903static void add_entry(struct slab_journal *journal, physical_block_number_t pbn,904		      enum journal_operation operation, bool increment,905		      struct journal_point recovery_point)906{907	struct packed_slab_journal_block *block = journal->block;908	int result;909 910	result = VDO_ASSERT(vdo_before_journal_point(&journal->tail_header.recovery_point,911						     &recovery_point),912			    "recovery journal point is monotonically increasing, recovery point: %llu.%u, block recovery point: %llu.%u",913			    (unsigned long long) recovery_point.sequence_number,914			    recovery_point.entry_count,915			    (unsigned long long) journal->tail_header.recovery_point.sequence_number,916			    journal->tail_header.recovery_point.entry_count);917	if (result != VDO_SUCCESS) {918		vdo_enter_read_only_mode(journal->slab->allocator->depot->vdo, result);919		return;920	}921 922	if (operation == VDO_JOURNAL_BLOCK_MAP_REMAPPING) {923		result = VDO_ASSERT((journal->tail_header.entry_count <924				     journal->full_entries_per_block),925				    "block has room for full entries");926		if (result != VDO_SUCCESS) {927			vdo_enter_read_only_mode(journal->slab->allocator->depot->vdo,928						 result);929			return;930		}931	}932 933	encode_slab_journal_entry(&journal->tail_header, &block->payload,934				  pbn - journal->slab->start, operation, increment);935	journal->tail_header.recovery_point = recovery_point;936	if (block_is_full(journal))937		commit_tail(journal);938}939 940static inline block_count_t journal_length(const struct slab_journal *journal)941{942	return journal->tail - journal->head;943}944 945/**946 * vdo_attempt_replay_into_slab() - Replay a recovery journal entry into a slab's journal.947 * @slab: The slab to play into.948 * @pbn: The PBN for the entry.949 * @operation: The type of entry to add.950 * @increment: True if this entry is an increment.951 * @recovery_point: The recovery journal point corresponding to this entry.952 * @parent: The completion to notify when there is space to add the entry if the entry could not be953 *          added immediately.954 *955 * Return: true if the entry was added immediately.956 */957bool vdo_attempt_replay_into_slab(struct vdo_slab *slab, physical_block_number_t pbn,958				  enum journal_operation operation, bool increment,959				  struct journal_point *recovery_point,960				  struct vdo_completion *parent)961{962	struct slab_journal *journal = &slab->journal;963	struct slab_journal_block_header *header = &journal->tail_header;964	struct journal_point expanded = expand_journal_point(*recovery_point, increment);965 966	/* Only accept entries after the current recovery point. */967	if (!vdo_before_journal_point(&journal->tail_header.recovery_point, &expanded))968		return true;969 970	if ((header->entry_count >= journal->full_entries_per_block) &&971	    (header->has_block_map_increments || (operation == VDO_JOURNAL_BLOCK_MAP_REMAPPING))) {972		/*973		 * The tail block does not have room for the entry we are attempting to add so974		 * commit the tail block now.975		 */976		commit_tail(journal);977	}978 979	if (journal->waiting_to_commit) {980		vdo_start_operation_with_waiter(&journal->slab->state,981						VDO_ADMIN_STATE_WAITING_FOR_RECOVERY,982						parent, NULL);983		return false;984	}985 986	if (journal_length(journal) >= journal->size) {987		/*988		 * We must have reaped the current head before the crash, since the blocked989		 * threshold keeps us from having more entries than fit in a slab journal; hence we990		 * can just advance the head (and unreapable block), as needed.991		 */992		journal->head++;993		journal->unreapable++;994	}995 996	if (journal->slab->status == VDO_SLAB_REBUILT)997		journal->slab->status = VDO_SLAB_REPLAYING;998 999	add_entry(journal, pbn, operation, increment, expanded);1000	return true;1001}1002 1003/**1004 * requires_reaping() - Check whether the journal must be reaped before adding new entries.1005 * @journal: The journal to check.1006 *1007 * Return: true if the journal must be reaped.1008 */1009static bool requires_reaping(const struct slab_journal *journal)1010{1011	return (journal_length(journal) >= journal->blocking_threshold);1012}1013 1014/** finish_summary_update() - A waiter callback that resets the writing state of a slab. */1015static void finish_summary_update(struct vdo_waiter *waiter, void *context)1016{1017	struct vdo_slab *slab = container_of(waiter, struct vdo_slab, summary_waiter);1018	int result = *((int *) context);1019 1020	slab->active_count--;1021 1022	if ((result != VDO_SUCCESS) && (result != VDO_READ_ONLY)) {1023		vdo_log_error_strerror(result, "failed to update slab summary");1024		vdo_enter_read_only_mode(slab->allocator->depot->vdo, result);1025	}1026 1027	check_if_slab_drained(slab);1028}1029 1030static void write_reference_block(struct vdo_waiter *waiter, void *context);1031 1032/**1033 * launch_reference_block_write() - Launch the write of a dirty reference block by first acquiring1034 *                                  a VIO for it from the pool.1035 * @waiter: The waiter of the block which is starting to write.1036 * @context: The parent slab of the block.1037 *1038 * This can be asynchronous since the writer will have to wait if all VIOs in the pool are1039 * currently in use.1040 */1041static void launch_reference_block_write(struct vdo_waiter *waiter, void *context)1042{1043	struct vdo_slab *slab = context;1044 1045	if (vdo_is_read_only(slab->allocator->depot->vdo))1046		return;1047 1048	slab->active_count++;1049	container_of(waiter, struct reference_block, waiter)->is_writing = true;1050	waiter->callback = write_reference_block;1051	acquire_vio_from_pool(slab->allocator->vio_pool, waiter);1052}1053 1054static void save_dirty_reference_blocks(struct vdo_slab *slab)1055{1056	vdo_waitq_notify_all_waiters(&slab->dirty_blocks,1057				     launch_reference_block_write, slab);1058	check_if_slab_drained(slab);1059}1060 1061/**1062 * finish_reference_block_write() - After a reference block has written, clean it, release its1063 *                                  locks, and return its VIO to the pool.1064 * @completion: The VIO that just finished writing.1065 */1066static void finish_reference_block_write(struct vdo_completion *completion)1067{1068	struct vio *vio = as_vio(completion);1069	struct pooled_vio *pooled = vio_as_pooled_vio(vio);1070	struct reference_block *block = completion->parent;1071	struct vdo_slab *slab = block->slab;1072	tail_block_offset_t offset;1073 1074	slab->active_count--;1075 1076	/* Release the slab journal lock. */1077	adjust_slab_journal_block_reference(&slab->journal,1078					    block->slab_journal_lock_to_release, -1);1079	return_vio_to_pool(slab->allocator->vio_pool, pooled);1080 1081	/*1082	 * We can't clear the is_writing flag earlier as releasing the slab journal lock may cause1083	 * us to be dirtied again, but we don't want to double enqueue.1084	 */1085	block->is_writing = false;1086 1087	if (vdo_is_read_only(completion->vdo)) {1088		check_if_slab_drained(slab);1089		return;1090	}1091 1092	/* Re-queue the block if it was re-dirtied while it was writing. */1093	if (block->is_dirty) {1094		vdo_waitq_enqueue_waiter(&block->slab->dirty_blocks, &block->waiter);1095		if (vdo_is_state_draining(&slab->state)) {1096			/* We must be saving, and this block will otherwise not be relaunched. */1097			save_dirty_reference_blocks(slab);1098		}1099 1100		return;1101	}1102 1103	/*1104	 * Mark the slab as clean in the slab summary if there are no dirty or writing blocks1105	 * and no summary update in progress.1106	 */1107	if ((slab->active_count > 0) || vdo_waitq_has_waiters(&slab->dirty_blocks)) {1108		check_if_slab_drained(slab);1109		return;1110	}1111 1112	offset = slab->allocator->summary_entries[slab->slab_number].tail_block_offset;1113	slab->active_count++;1114	slab->summary_waiter.callback = finish_summary_update;1115	update_slab_summary_entry(slab, &slab->summary_waiter, offset,1116				  true, true, slab->free_blocks);1117}1118 1119/**1120 * get_reference_counters_for_block() - Find the reference counters for a given block.1121 * @block: The reference_block in question.1122 *1123 * Return: A pointer to the reference counters for this block.1124 */1125static vdo_refcount_t * __must_check get_reference_counters_for_block(struct reference_block *block)1126{1127	size_t block_index = block - block->slab->reference_blocks;1128 1129	return &block->slab->counters[block_index * COUNTS_PER_BLOCK];1130}1131 1132/**1133 * pack_reference_block() - Copy data from a reference block to a buffer ready to be written out.1134 * @block: The block to copy.1135 * @buffer: The char buffer to fill with the packed block.1136 */1137static void pack_reference_block(struct reference_block *block, void *buffer)1138{1139	struct packed_reference_block *packed = buffer;1140	vdo_refcount_t *counters = get_reference_counters_for_block(block);1141	sector_count_t i;1142	struct packed_journal_point commit_point;1143 1144	vdo_pack_journal_point(&block->slab->slab_journal_point, &commit_point);1145 1146	for (i = 0; i < VDO_SECTORS_PER_BLOCK; i++) {1147		packed->sectors[i].commit_point = commit_point;1148		memcpy(packed->sectors[i].counts, counters + (i * COUNTS_PER_SECTOR),1149		       (sizeof(vdo_refcount_t) * COUNTS_PER_SECTOR));1150	}1151}1152 1153static void write_reference_block_endio(struct bio *bio)1154{1155	struct vio *vio = bio->bi_private;1156	struct reference_block *block = vio->completion.parent;1157	thread_id_t thread_id = block->slab->allocator->thread_id;1158 1159	continue_vio_after_io(vio, finish_reference_block_write, thread_id);1160}1161 1162/**1163 * handle_io_error() - Handle an I/O error reading or writing a reference count block.1164 * @completion: The VIO doing the I/O as a completion.1165 */1166static void handle_io_error(struct vdo_completion *completion)1167{1168	int result = completion->result;1169	struct vio *vio = as_vio(completion);1170	struct vdo_slab *slab = ((struct reference_block *) completion->parent)->slab;1171 1172	vio_record_metadata_io_error(vio);1173	return_vio_to_pool(slab->allocator->vio_pool, vio_as_pooled_vio(vio));1174	slab->active_count--;1175	vdo_enter_read_only_mode(slab->allocator->depot->vdo, result);1176	check_if_slab_drained(slab);1177}1178 1179/**1180 * write_reference_block() - After a dirty block waiter has gotten a VIO from the VIO pool, copy1181 *                           its counters and associated data into the VIO, and launch the write.1182 * @waiter: The waiter of the dirty block.1183 * @context: The VIO returned by the pool.1184 */1185static void write_reference_block(struct vdo_waiter *waiter, void *context)1186{1187	size_t block_offset;1188	physical_block_number_t pbn;1189	struct pooled_vio *pooled = context;1190	struct vdo_completion *completion = &pooled->vio.completion;1191	struct reference_block *block = container_of(waiter, struct reference_block,1192						     waiter);1193 1194	pack_reference_block(block, pooled->vio.data);1195	block_offset = (block - block->slab->reference_blocks);1196	pbn = (block->slab->ref_counts_origin + block_offset);1197	block->slab_journal_lock_to_release = block->slab_journal_lock;1198	completion->parent = block;1199 1200	/*1201	 * Mark the block as clean, since we won't be committing any updates that happen after this1202	 * moment. As long as VIO order is preserved, two VIOs updating this block at once will not1203	 * cause complications.1204	 */1205	block->is_dirty = false;1206 1207	/*1208	 * Flush before writing to ensure that the recovery journal and slab journal entries which1209	 * cover this reference update are stable. This prevents data corruption that can be caused1210	 * by out of order writes.1211	 */1212	WRITE_ONCE(block->slab->allocator->ref_counts_statistics.blocks_written,1213		   block->slab->allocator->ref_counts_statistics.blocks_written + 1);1214 1215	completion->callback_thread_id = ((struct block_allocator *) pooled->context)->thread_id;1216	vdo_submit_metadata_vio(&pooled->vio, pbn, write_reference_block_endio,1217				handle_io_error, REQ_OP_WRITE | REQ_PREFLUSH);1218}1219 1220static void reclaim_journal_space(struct slab_journal *journal)1221{1222	block_count_t length = journal_length(journal);1223	struct vdo_slab *slab = journal->slab;1224	block_count_t write_count = vdo_waitq_num_waiters(&slab->dirty_blocks);1225	block_count_t written;1226 1227	if ((length < journal->flushing_threshold) || (write_count == 0))1228		return;1229 1230	/* The slab journal is over the first threshold, schedule some reference block writes. */1231	WRITE_ONCE(journal->events->flush_count, journal->events->flush_count + 1);1232	if (length < journal->flushing_deadline) {1233		/* Schedule more writes the closer to the deadline we get. */1234		write_count /= journal->flushing_deadline - length + 1;1235		write_count = max_t(block_count_t, write_count, 1);1236	}1237 1238	for (written = 0; written < write_count; written++) {1239		vdo_waitq_notify_next_waiter(&slab->dirty_blocks,1240					     launch_reference_block_write, slab);1241	}1242}1243 1244/**1245 * reference_count_to_status() - Convert a reference count to a reference status.1246 * @count: The count to convert.1247 *1248 * Return: The appropriate reference status.1249 */1250static enum reference_status __must_check reference_count_to_status(vdo_refcount_t count)1251{1252	if (count == EMPTY_REFERENCE_COUNT)1253		return RS_FREE;1254	else if (count == 1)1255		return RS_SINGLE;1256	else if (count == PROVISIONAL_REFERENCE_COUNT)1257		return RS_PROVISIONAL;1258	else1259		return RS_SHARED;1260}1261 1262/**1263 * dirty_block() - Mark a reference count block as dirty, potentially adding it to the dirty queue1264 *                 if it wasn't already dirty.1265 * @block: The reference block to mark as dirty.1266 */1267static void dirty_block(struct reference_block *block)1268{1269	if (block->is_dirty)1270		return;1271 1272	block->is_dirty = true;1273	if (!block->is_writing)1274		vdo_waitq_enqueue_waiter(&block->slab->dirty_blocks, &block->waiter);1275}1276 1277/**1278 * get_reference_block() - Get the reference block that covers the given block index.1279 */1280static struct reference_block * __must_check get_reference_block(struct vdo_slab *slab,1281								 slab_block_number index)1282{1283	return &slab->reference_blocks[index / COUNTS_PER_BLOCK];1284}1285 1286/**1287 * slab_block_number_from_pbn() - Determine the index within the slab of a particular physical1288 *                                block number.1289 * @slab: The slab.1290 * @physical_block_number: The physical block number.1291 * @slab_block_number_ptr: A pointer to the slab block number.1292 *1293 * Return: VDO_SUCCESS or an error code.1294 */1295static int __must_check slab_block_number_from_pbn(struct vdo_slab *slab,1296						   physical_block_number_t pbn,1297						   slab_block_number *slab_block_number_ptr)1298{1299	u64 slab_block_number;1300 1301	if (pbn < slab->start)1302		return VDO_OUT_OF_RANGE;1303 1304	slab_block_number = pbn - slab->start;1305	if (slab_block_number >= slab->allocator->depot->slab_config.data_blocks)1306		return VDO_OUT_OF_RANGE;1307 1308	*slab_block_number_ptr = slab_block_number;1309	return VDO_SUCCESS;1310}1311 1312/**1313 * get_reference_counter() - Get the reference counter that covers the given physical block number.1314 * @slab: The slab to query.1315 * @pbn: The physical block number.1316 * @counter_ptr: A pointer to the reference counter.1317 */1318static int __must_check get_reference_counter(struct vdo_slab *slab,1319					      physical_block_number_t pbn,1320					      vdo_refcount_t **counter_ptr)1321{1322	slab_block_number index;1323	int result = slab_block_number_from_pbn(slab, pbn, &index);1324 1325	if (result != VDO_SUCCESS)1326		return result;1327 1328	*counter_ptr = &slab->counters[index];1329 1330	return VDO_SUCCESS;1331}1332 1333static unsigned int calculate_slab_priority(struct vdo_slab *slab)1334{1335	block_count_t free_blocks = slab->free_blocks;1336	unsigned int unopened_slab_priority = slab->allocator->unopened_slab_priority;1337	unsigned int priority;1338 1339	/*1340	 * Wholly full slabs must be the only ones with lowest priority, 0.1341	 *1342	 * Slabs that have never been opened (empty, newly initialized, and never been written to)1343	 * have lower priority than previously opened slabs that have a significant number of free1344	 * blocks. This ranking causes VDO to avoid writing physical blocks for the first time1345	 * unless there are very few free blocks that have been previously written to.1346	 *1347	 * Since VDO doesn't discard blocks currently, reusing previously written blocks makes VDO1348	 * a better client of any underlying storage that is thinly-provisioned (though discarding1349	 * would be better).1350	 *1351	 * For all other slabs, the priority is derived from the logarithm of the number of free1352	 * blocks. Slabs with the same order of magnitude of free blocks have the same priority.1353	 * With 2^23 blocks, the priority will range from 1 to 25. The reserved1354	 * unopened_slab_priority divides the range and is skipped by the logarithmic mapping.1355	 */1356 1357	if (free_blocks == 0)1358		return 0;1359 1360	if (is_slab_journal_blank(slab))1361		return unopened_slab_priority;1362 1363	priority = (1 + ilog2(free_blocks));1364	return ((priority < unopened_slab_priority) ? priority : priority + 1);1365}1366 1367/*1368 * Slabs are essentially prioritized by an approximation of the number of free blocks in the slab1369 * so slabs with lots of free blocks will be opened for allocation before slabs that have few free1370 * blocks.1371 */1372static void prioritize_slab(struct vdo_slab *slab)1373{1374	VDO_ASSERT_LOG_ONLY(list_empty(&slab->allocq_entry),1375			    "a slab must not already be on a ring when prioritizing");1376	slab->priority = calculate_slab_priority(slab);1377	vdo_priority_table_enqueue(slab->allocator->prioritized_slabs,1378				   slab->priority, &slab->allocq_entry);1379}1380 1381/**1382 * adjust_free_block_count() - Adjust the free block count and (if needed) reprioritize the slab.1383 * @incremented: true if the free block count went up.1384 */1385static void adjust_free_block_count(struct vdo_slab *slab, bool incremented)1386{1387	struct block_allocator *allocator = slab->allocator;1388 1389	WRITE_ONCE(allocator->allocated_blocks,1390		   allocator->allocated_blocks + (incremented ? -1 : 1));1391 1392	/* The open slab doesn't need to be reprioritized until it is closed. */1393	if (slab == allocator->open_slab)1394		return;1395 1396	/* Don't bother adjusting the priority table if unneeded. */1397	if (slab->priority == calculate_slab_priority(slab))1398		return;1399 1400	/*1401	 * Reprioritize the slab to reflect the new free block count by removing it from the table1402	 * and re-enqueuing it with the new priority.1403	 */1404	vdo_priority_table_remove(allocator->prioritized_slabs, &slab->allocq_entry);1405	prioritize_slab(slab);1406}1407 1408/**1409 * increment_for_data() - Increment the reference count for a data block.1410 * @slab: The slab which owns the block.1411 * @block: The reference block which contains the block being updated.1412 * @block_number: The block to update.1413 * @old_status: The reference status of the data block before this increment.1414 * @lock: The pbn_lock associated with this increment (may be NULL).1415 * @counter_ptr: A pointer to the count for the data block (in, out).1416 * @adjust_block_count: Whether to update the allocator's free block count.1417 *1418 * Return: VDO_SUCCESS or an error.1419 */1420static int increment_for_data(struct vdo_slab *slab, struct reference_block *block,1421			      slab_block_number block_number,1422			      enum reference_status old_status,1423			      struct pbn_lock *lock, vdo_refcount_t *counter_ptr,1424			      bool adjust_block_count)1425{1426	switch (old_status) {1427	case RS_FREE:1428		*counter_ptr = 1;1429		block->allocated_count++;1430		slab->free_blocks--;1431		if (adjust_block_count)1432			adjust_free_block_count(slab, false);1433 1434		break;1435 1436	case RS_PROVISIONAL:1437		*counter_ptr = 1;1438		break;1439 1440	default:1441		/* Single or shared */1442		if (*counter_ptr >= MAXIMUM_REFERENCE_COUNT) {1443			return vdo_log_error_strerror(VDO_REF_COUNT_INVALID,1444						      "Incrementing a block already having 254 references (slab %u, offset %u)",1445						      slab->slab_number, block_number);1446		}1447		(*counter_ptr)++;1448	}1449 1450	if (lock != NULL)1451		vdo_unassign_pbn_lock_provisional_reference(lock);1452	return VDO_SUCCESS;1453}1454 1455/**1456 * decrement_for_data() - Decrement the reference count for a data block.1457 * @slab: The slab which owns the block.1458 * @block: The reference block which contains the block being updated.1459 * @block_number: The block to update.1460 * @old_status: The reference status of the data block before this decrement.1461 * @updater: The reference updater doing this operation in case we need to look up the pbn lock.1462 * @lock: The pbn_lock associated with the block being decremented (may be NULL).1463 * @counter_ptr: A pointer to the count for the data block (in, out).1464 * @adjust_block_count: Whether to update the allocator's free block count.1465 *1466 * Return: VDO_SUCCESS or an error.1467 */1468static int decrement_for_data(struct vdo_slab *slab, struct reference_block *block,1469			      slab_block_number block_number,1470			      enum reference_status old_status,1471			      struct reference_updater *updater,1472			      vdo_refcount_t *counter_ptr, bool adjust_block_count)1473{1474	switch (old_status) {1475	case RS_FREE:1476		return vdo_log_error_strerror(VDO_REF_COUNT_INVALID,1477					      "Decrementing free block at offset %u in slab %u",1478					      block_number, slab->slab_number);1479 1480	case RS_PROVISIONAL:1481	case RS_SINGLE:1482		if (updater->zpbn.zone != NULL) {1483			struct pbn_lock *lock = vdo_get_physical_zone_pbn_lock(updater->zpbn.zone,1484									       updater->zpbn.pbn);1485 1486			if (lock != NULL) {1487				/*1488				 * There is a read lock on this block, so the block must not become1489				 * unreferenced.1490				 */1491				*counter_ptr = PROVISIONAL_REFERENCE_COUNT;1492				vdo_assign_pbn_lock_provisional_reference(lock);1493				break;1494			}1495		}1496 1497		*counter_ptr = EMPTY_REFERENCE_COUNT;1498		block->allocated_count--;1499		slab->free_blocks++;1500		if (adjust_block_count)1501			adjust_free_block_count(slab, true);1502 1503		break;1504 1505	default:1506		/* Shared */1507		(*counter_ptr)--;1508	}1509 1510	return VDO_SUCCESS;1511}1512 1513/**1514 * increment_for_block_map() - Increment the reference count for a block map page.1515 * @slab: The slab which owns the block.1516 * @block: The reference block which contains the block being updated.1517 * @block_number: The block to update.1518 * @old_status: The reference status of the block before this increment.1519 * @lock: The pbn_lock associated with this increment (may be NULL).1520 * @normal_operation: Whether we are in normal operation vs. recovery or rebuild.1521 * @counter_ptr: A pointer to the count for the block (in, out).1522 * @adjust_block_count: Whether to update the allocator's free block count.1523 *1524 * All block map increments should be from provisional to MAXIMUM_REFERENCE_COUNT. Since block map1525 * blocks never dedupe they should never be adjusted from any other state. The adjustment always1526 * results in MAXIMUM_REFERENCE_COUNT as this value is used to prevent dedupe against block map1527 * blocks.1528 *1529 * Return: VDO_SUCCESS or an error.1530 */1531static int increment_for_block_map(struct vdo_slab *slab, struct reference_block *block,1532				   slab_block_number block_number,1533				   enum reference_status old_status,1534				   struct pbn_lock *lock, bool normal_operation,1535				   vdo_refcount_t *counter_ptr, bool adjust_block_count)1536{1537	switch (old_status) {1538	case RS_FREE:1539		if (normal_operation) {1540			return vdo_log_error_strerror(VDO_REF_COUNT_INVALID,1541						      "Incrementing unallocated block map block (slab %u, offset %u)",1542						      slab->slab_number, block_number);1543		}1544 1545		*counter_ptr = MAXIMUM_REFERENCE_COUNT;1546		block->allocated_count++;1547		slab->free_blocks--;1548		if (adjust_block_count)1549			adjust_free_block_count(slab, false);1550 1551		return VDO_SUCCESS;1552 1553	case RS_PROVISIONAL:1554		if (!normal_operation)1555			return vdo_log_error_strerror(VDO_REF_COUNT_INVALID,1556						      "Block map block had provisional reference during replay (slab %u, offset %u)",1557						      slab->slab_number, block_number);1558 1559		*counter_ptr = MAXIMUM_REFERENCE_COUNT;1560		if (lock != NULL)1561			vdo_unassign_pbn_lock_provisional_reference(lock);1562		return VDO_SUCCESS;1563 1564	default:1565		return vdo_log_error_strerror(VDO_REF_COUNT_INVALID,1566					      "Incrementing a block map block which is already referenced %u times (slab %u, offset %u)",1567					      *counter_ptr, slab->slab_number,1568					      block_number);1569	}1570}1571 1572static bool __must_check is_valid_journal_point(const struct journal_point *point)1573{1574	return ((point != NULL) && (point->sequence_number > 0));1575}1576 1577/**1578 * update_reference_count() - Update the reference count of a block.1579 * @slab: The slab which owns the block.1580 * @block: The reference block which contains the block being updated.1581 * @block_number: The block to update.1582 * @slab_journal_point: The slab journal point at which this update is journaled.1583 * @updater: The reference updater.1584 * @normal_operation: Whether we are in normal operation vs. recovery or rebuild.1585 * @adjust_block_count: Whether to update the slab's free block count.1586 * @provisional_decrement_ptr: A pointer which will be set to true if this update was a decrement1587 *                             of a provisional reference.1588 *1589 * Return: VDO_SUCCESS or an error.1590 */1591static int update_reference_count(struct vdo_slab *slab, struct reference_block *block,1592				  slab_block_number block_number,1593				  const struct journal_point *slab_journal_point,1594				  struct reference_updater *updater,1595				  bool normal_operation, bool adjust_block_count,1596				  bool *provisional_decrement_ptr)1597{1598	vdo_refcount_t *counter_ptr = &slab->counters[block_number];1599	enum reference_status old_status = reference_count_to_status(*counter_ptr);1600	int result;1601 1602	if (!updater->increment) {1603		result = decrement_for_data(slab, block, block_number, old_status,1604					    updater, counter_ptr, adjust_block_count);1605		if ((result == VDO_SUCCESS) && (old_status == RS_PROVISIONAL)) {1606			if (provisional_decrement_ptr != NULL)1607				*provisional_decrement_ptr = true;1608			return VDO_SUCCESS;1609		}1610	} else if (updater->operation == VDO_JOURNAL_DATA_REMAPPING) {1611		result = increment_for_data(slab, block, block_number, old_status,1612					    updater->lock, counter_ptr, adjust_block_count);1613	} else {1614		result = increment_for_block_map(slab, block, block_number, old_status,1615						 updater->lock, normal_operation,1616						 counter_ptr, adjust_block_count);1617	}1618 1619	if (result != VDO_SUCCESS)1620		return result;1621 1622	if (is_valid_journal_point(slab_journal_point))1623		slab->slab_journal_point = *slab_journal_point;1624 1625	return VDO_SUCCESS;1626}1627 1628static int __must_check adjust_reference_count(struct vdo_slab *slab,1629					       struct reference_updater *updater,1630					       const struct journal_point *slab_journal_point)1631{1632	slab_block_number block_number;1633	int result;1634	struct reference_block *block;1635	bool provisional_decrement = false;1636 1637	if (!is_slab_open(slab))1638		return VDO_INVALID_ADMIN_STATE;1639 1640	result = slab_block_number_from_pbn(slab, updater->zpbn.pbn, &block_number);1641	if (result != VDO_SUCCESS)1642		return result;1643 1644	block = get_reference_block(slab, block_number);1645	result = update_reference_count(slab, block, block_number, slab_journal_point,1646					updater, NORMAL_OPERATION, true,1647					&provisional_decrement);1648	if ((result != VDO_SUCCESS) || provisional_decrement)1649		return result;1650 1651	if (block->is_dirty && (block->slab_journal_lock > 0)) {1652		sequence_number_t entry_lock = slab_journal_point->sequence_number;1653		/*1654		 * This block is already dirty and a slab journal entry has been made for it since1655		 * the last time it was clean. We must release the per-entry slab journal lock for1656		 * the entry associated with the update we are now doing.1657		 */1658		result = VDO_ASSERT(is_valid_journal_point(slab_journal_point),1659				    "Reference count adjustments need slab journal points.");1660		if (result != VDO_SUCCESS)1661			return result;1662 1663		adjust_slab_journal_block_reference(&slab->journal, entry_lock, -1);1664		return VDO_SUCCESS;1665	}1666 1667	/*1668	 * This may be the first time we are applying an update for which there is a slab journal1669	 * entry to this block since the block was cleaned. Therefore, we convert the per-entry1670	 * slab journal lock to an uncommitted reference block lock, if there is a per-entry lock.1671	 */1672	if (is_valid_journal_point(slab_journal_point))1673		block->slab_journal_lock = slab_journal_point->sequence_number;1674	else1675		block->slab_journal_lock = 0;1676 1677	dirty_block(block);1678	return VDO_SUCCESS;1679}1680 1681/**1682 * add_entry_from_waiter() - Add an entry to the slab journal.1683 * @waiter: The vio which should make an entry now.1684 * @context: The slab journal to make an entry in.1685 *1686 * This callback is invoked by add_entries() once it has determined that we are ready to make1687 * another entry in the slab journal. Implements waiter_callback_fn.1688 */1689static void add_entry_from_waiter(struct vdo_waiter *waiter, void *context)1690{1691	int result;1692	struct reference_updater *updater =1693		container_of(waiter, struct reference_updater, waiter);1694	struct data_vio *data_vio = data_vio_from_reference_updater(updater);1695	struct slab_journal *journal = context;1696	struct slab_journal_block_header *header = &journal->tail_header;1697	struct journal_point slab_journal_point = {1698		.sequence_number = header->sequence_number,1699		.entry_count = header->entry_count,1700	};1701	sequence_number_t recovery_block = data_vio->recovery_journal_point.sequence_number;1702 1703	if (header->entry_count == 0) {1704		/*1705		 * This is the first entry in the current tail block, so get a lock on the recovery1706		 * journal which we will hold until this tail block is committed.1707		 */1708		get_lock(journal, header->sequence_number)->recovery_start = recovery_block;1709		if (journal->recovery_journal != NULL) {1710			zone_count_t zone_number = journal->slab->allocator->zone_number;1711 1712			vdo_acquire_recovery_journal_block_reference(journal->recovery_journal,1713								     recovery_block,1714								     VDO_ZONE_TYPE_PHYSICAL,1715								     zone_number);1716		}1717 1718		mark_slab_journal_dirty(journal, recovery_block);1719		reclaim_journal_space(journal);1720	}1721 1722	add_entry(journal, updater->zpbn.pbn, updater->operation, updater->increment,1723		  expand_journal_point(data_vio->recovery_journal_point,1724				       updater->increment));1725 1726	if (journal->slab->status != VDO_SLAB_REBUILT) {1727		/*1728		 * If the slab is unrecovered, scrubbing will take care of the count since the1729		 * update is now recorded in the journal.1730		 */1731		adjust_slab_journal_block_reference(journal,1732						    slab_journal_point.sequence_number, -1);1733		result = VDO_SUCCESS;1734	} else {1735		/* Now that an entry has been made in the slab journal, update the counter. */1736		result = adjust_reference_count(journal->slab, updater,1737						&slab_journal_point);1738	}1739 1740	if (updater->increment)1741		continue_data_vio_with_error(data_vio, result);1742	else1743		vdo_continue_completion(&data_vio->decrement_completion, result);1744}1745 1746/**1747 * is_next_entry_a_block_map_increment() - Check whether the next entry to be made is a block map1748 *                                         increment.1749 * @journal: The journal.1750 *1751 * Return: true if the first entry waiter's operation is a block map increment.1752 */1753static inline bool is_next_entry_a_block_map_increment(struct slab_journal *journal)1754{1755	struct vdo_waiter *waiter = vdo_waitq_get_first_waiter(&journal->entry_waiters);1756	struct reference_updater *updater =1757		container_of(waiter, struct reference_updater, waiter);1758 1759	return (updater->operation == VDO_JOURNAL_BLOCK_MAP_REMAPPING);1760}1761 1762/**1763 * add_entries() - Add as many entries as possible from the queue of vios waiting to make entries.1764 * @journal: The journal to which entries may be added.1765 *1766 * By processing the queue in order, we ensure that slab journal entries are made in the same order1767 * as recovery journal entries for the same increment or decrement.1768 */1769static void add_entries(struct slab_journal *journal)1770{1771	if (journal->adding_entries) {1772		/* Protect against re-entrancy. */1773		return;1774	}1775 1776	journal->adding_entries = true;1777	while (vdo_waitq_has_waiters(&journal->entry_waiters)) {1778		struct slab_journal_block_header *header = &journal->tail_header;1779 1780		if (journal->partial_write_in_progress ||1781		    (journal->slab->status == VDO_SLAB_REBUILDING)) {1782			/*1783			 * Don't add entries while rebuilding or while a partial write is1784			 * outstanding, as it could result in reference count corruption.1785			 */1786			break;1787		}1788 1789		if (journal->waiting_to_commit) {1790			/*1791			 * If we are waiting for resources to write the tail block, and the tail1792			 * block is full, we can't make another entry.1793			 */1794			WRITE_ONCE(journal->events->tail_busy_count,1795				   journal->events->tail_busy_count + 1);1796			break;1797		} else if (is_next_entry_a_block_map_increment(journal) &&1798			   (header->entry_count >= journal->full_entries_per_block)) {1799			/*1800			 * The tail block does not have room for a block map increment, so commit1801			 * it now.1802			 */1803			commit_tail(journal);1804			if (journal->waiting_to_commit) {1805				WRITE_ONCE(journal->events->tail_busy_count,1806					   journal->events->tail_busy_count + 1);1807				break;1808			}1809		}1810 1811		/* If the slab is over the blocking threshold, make the vio wait. */1812		if (requires_reaping(journal)) {1813			WRITE_ONCE(journal->events->blocked_count,1814				   journal->events->blocked_count + 1);1815			save_dirty_reference_blocks(journal->slab);1816			break;1817		}1818 1819		if (header->entry_count == 0) {1820			struct journal_lock *lock =1821				get_lock(journal, header->sequence_number);1822 1823			/*1824			 * Check if the on disk slab journal is full. Because of the blocking and1825			 * scrubbing thresholds, this should never happen.1826			 */1827			if (lock->count > 0) {1828				VDO_ASSERT_LOG_ONLY((journal->head + journal->size) == journal->tail,1829						    "New block has locks, but journal is not full");1830 1831				/*1832				 * The blocking threshold must let the journal fill up if the new1833				 * block has locks; if the blocking threshold is smaller than the1834				 * journal size, the new block cannot possibly have locks already.1835				 */1836				VDO_ASSERT_LOG_ONLY((journal->blocking_threshold >= journal->size),1837						    "New block can have locks already iff blocking threshold is at the end of the journal");1838 1839				WRITE_ONCE(journal->events->disk_full_count,1840					   journal->events->disk_full_count + 1);1841				save_dirty_reference_blocks(journal->slab);1842				break;1843			}1844 1845			/*1846			 * Don't allow the new block to be reaped until all of the reference count1847			 * blocks are written and the journal block has been fully committed as1848			 * well.1849			 */1850			lock->count = journal->entries_per_block + 1;1851 1852			if (header->sequence_number == 1) {1853				struct vdo_slab *slab = journal->slab;1854				block_count_t i;1855 1856				/*1857				 * This is the first entry in this slab journal, ever. Dirty all of1858				 * the reference count blocks. Each will acquire a lock on the tail1859				 * block so that the journal won't be reaped until the reference1860				 * counts are initialized. The lock acquisition must be done by the1861				 * ref_counts since here we don't know how many reference blocks1862				 * the ref_counts has.1863				 */1864				for (i = 0; i < slab->reference_block_count; i++) {1865					slab->reference_blocks[i].slab_journal_lock = 1;1866					dirty_block(&slab->reference_blocks[i]);1867				}1868 1869				adjust_slab_journal_block_reference(journal, 1,1870								    slab->reference_block_count);1871			}1872		}1873 1874		vdo_waitq_notify_next_waiter(&journal->entry_waiters,1875					     add_entry_from_waiter, journal);1876	}1877 1878	journal->adding_entries = false;1879 1880	/* If there are no waiters, and we are flushing or saving, commit the tail block. */1881	if (vdo_is_state_draining(&journal->slab->state) &&1882	    !vdo_is_state_suspending(&journal->slab->state) &&1883	    !vdo_waitq_has_waiters(&journal->entry_waiters))1884		commit_tail(journal);1885}1886 1887/**1888 * reset_search_cursor() - Reset the free block search back to the first reference counter in the1889 *                         first reference block of a slab.1890 */1891static void reset_search_cursor(struct vdo_slab *slab)1892{1893	struct search_cursor *cursor = &slab->search_cursor;1894 1895	cursor->block = cursor->first_block;1896	cursor->index = 0;1897	/* Unit tests have slabs with only one reference block (and it's a runt). */1898	cursor->end_index = min_t(u32, COUNTS_PER_BLOCK, slab->block_count);1899}1900 1901/**1902 * advance_search_cursor() - Advance the search cursor to the start of the next reference block in1903 *                           a slab,1904 *1905 * Wraps around to the first reference block if the current block is the last reference block.1906 *1907 * Return: true unless the cursor was at the last reference block.1908 */1909static bool advance_search_cursor(struct vdo_slab *slab)1910{1911	struct search_cursor *cursor = &slab->search_cursor;1912 1913	/*1914	 * If we just finished searching the last reference block, then wrap back around to the1915	 * start of the array.1916	 */1917	if (cursor->block == cursor->last_block) {1918		reset_search_cursor(slab);1919		return false;1920	}1921 1922	/* We're not already at the end, so advance to cursor to the next block. */1923	cursor->block++;1924	cursor->index = cursor->end_index;1925 1926	if (cursor->block == cursor->last_block) {1927		/* The last reference block will usually be a runt. */1928		cursor->end_index = slab->block_count;1929	} else {1930		cursor->end_index += COUNTS_PER_BLOCK;1931	}1932 1933	return true;1934}1935 1936/**1937 * vdo_adjust_reference_count_for_rebuild() - Adjust the reference count of a block during rebuild.1938 *1939 * Return: VDO_SUCCESS or an error.1940 */1941int vdo_adjust_reference_count_for_rebuild(struct slab_depot *depot,1942					   physical_block_number_t pbn,1943					   enum journal_operation operation)1944{1945	int result;1946	slab_block_number block_number;1947	struct reference_block *block;1948	struct vdo_slab *slab = vdo_get_slab(depot, pbn);1949	struct reference_updater updater = {1950		.operation = operation,1951		.increment = true,1952	};1953 1954	result = slab_block_number_from_pbn(slab, pbn, &block_number);1955	if (result != VDO_SUCCESS)1956		return result;1957 1958	block = get_reference_block(slab, block_number);1959	result = update_reference_count(slab, block, block_number, NULL,1960					&updater, !NORMAL_OPERATION, false, NULL);1961	if (result != VDO_SUCCESS)1962		return result;1963 1964	dirty_block(block);1965	return VDO_SUCCESS;1966}1967 1968/**1969 * replay_reference_count_change() - Replay the reference count adjustment from a slab journal1970 *                                   entry into the reference count for a block.1971 * @slab: The slab.1972 * @entry_point: The slab journal point for the entry.1973 * @entry: The slab journal entry being replayed.1974 *1975 * The adjustment will be ignored if it was already recorded in the reference count.1976 *1977 * Return: VDO_SUCCESS or an error code.1978 */1979static int replay_reference_count_change(struct vdo_slab *slab,1980					 const struct journal_point *entry_point,1981					 struct slab_journal_entry entry)1982{1983	int result;1984	struct reference_block *block = get_reference_block(slab, entry.sbn);1985	sector_count_t sector = (entry.sbn % COUNTS_PER_BLOCK) / COUNTS_PER_SECTOR;1986	struct reference_updater updater = {1987		.operation = entry.operation,1988		.increment = entry.increment,1989	};1990 1991	if (!vdo_before_journal_point(&block->commit_points[sector], entry_point)) {1992		/* This entry is already reflected in the existing counts, so do nothing. */1993		return VDO_SUCCESS;1994	}1995 1996	/* This entry is not yet counted in the reference counts. */1997	result = update_reference_count(slab, block, entry.sbn, entry_point,1998					&updater, !NORMAL_OPERATION, false, NULL);1999	if (result != VDO_SUCCESS)2000		return result;2001 2002	dirty_block(block);2003	return VDO_SUCCESS;2004}2005 2006/**2007 * find_zero_byte_in_word() - Find the array index of the first zero byte in word-sized range of2008 *                            reference counters.2009 * @word_ptr: A pointer to the eight counter bytes to check.2010 * @start_index: The array index corresponding to word_ptr[0].2011 * @fail_index: The array index to return if no zero byte is found.2012 *2013 * The search does no bounds checking; the function relies on the array being sufficiently padded.2014 *2015 * Return: The array index of the first zero byte in the word, or the value passed as fail_index if2016 *         no zero byte was found.2017 */2018static inline slab_block_number find_zero_byte_in_word(const u8 *word_ptr,2019						       slab_block_number start_index,2020						       slab_block_number fail_index)2021{2022	u64 word = get_unaligned_le64(word_ptr);2023 2024	/* This looks like a loop, but GCC will unroll the eight iterations for us. */2025	unsigned int offset;2026 2027	for (offset = 0; offset < BYTES_PER_WORD; offset++) {2028		/* Assumes little-endian byte order, which we have on X86. */2029		if ((word & 0xFF) == 0)2030			return (start_index + offset);2031		word >>= 8;2032	}2033 2034	return fail_index;2035}2036 2037/**2038 * find_free_block() - Find the first block with a reference count of zero in the specified2039 *                     range of reference counter indexes.2040 * @slab: The slab counters to scan.2041 * @index_ptr: A pointer to hold the array index of the free block.2042 *2043 * Exposed for unit testing.2044 *2045 * Return: true if a free block was found in the specified range.2046 */2047static bool find_free_block(const struct vdo_slab *slab, slab_block_number *index_ptr)2048{2049	slab_block_number zero_index;2050	slab_block_number next_index = slab->search_cursor.index;2051	slab_block_number end_index = slab->search_cursor.end_index;2052	u8 *next_counter = &slab->counters[next_index];2053	u8 *end_counter = &slab->counters[end_index];2054 2055	/*2056	 * Search every byte of the first unaligned word. (Array is padded so reading past end is2057	 * safe.)2058	 */2059	zero_index = find_zero_byte_in_word(next_counter, next_index, end_index);2060	if (zero_index < end_index) {2061		*index_ptr = zero_index;2062		return true;2063	}2064 2065	/*2066	 * On architectures where unaligned word access is expensive, this would be a good place to2067	 * advance to an alignment boundary.2068	 */2069	next_index += BYTES_PER_WORD;2070	next_counter += BYTES_PER_WORD;2071 2072	/*2073	 * Now we're word-aligned; check an word at a time until we find a word containing a zero.2074	 * (Array is padded so reading past end is safe.)2075	 */2076	while (next_counter < end_counter) {2077		/*2078		 * The following code is currently an exact copy of the code preceding the loop,2079		 * but if you try to merge them by using a do loop, it runs slower because a jump2080		 * instruction gets added at the start of the iteration.2081		 */2082		zero_index = find_zero_byte_in_word(next_counter, next_index, end_index);2083		if (zero_index < end_index) {2084			*index_ptr = zero_index;2085			return true;2086		}2087 2088		next_index += BYTES_PER_WORD;2089		next_counter += BYTES_PER_WORD;2090	}2091 2092	return false;2093}2094 2095/**2096 * search_current_reference_block() - Search the reference block currently saved in the search2097 *                                    cursor for a reference count of zero, starting at the saved2098 *                                    counter index.2099 * @slab: The slab to search.2100 * @free_index_ptr: A pointer to receive the array index of the zero reference count.2101 *2102 * Return: true if an unreferenced counter was found.2103 */2104static bool search_current_reference_block(const struct vdo_slab *slab,2105					   slab_block_number *free_index_ptr)2106{2107	/* Don't bother searching if the current block is known to be full. */2108	return ((slab->search_cursor.block->allocated_count < COUNTS_PER_BLOCK) &&2109		find_free_block(slab, free_index_ptr));2110}2111 2112/**2113 * search_reference_blocks() - Search each reference block for a reference count of zero.2114 * @slab: The slab to search.2115 * @free_index_ptr: A pointer to receive the array index of the zero reference count.2116 *2117 * Searches each reference block for a reference count of zero, starting at the reference block and2118 * counter index saved in the search cursor and searching up to the end of the last reference2119 * block. The search does not wrap.2120 *2121 * Return: true if an unreferenced counter was found.2122 */2123static bool search_reference_blocks(struct vdo_slab *slab,2124				    slab_block_number *free_index_ptr)2125{2126	/* Start searching at the saved search position in the current block. */2127	if (search_current_reference_block(slab, free_index_ptr))2128		return true;2129 2130	/* Search each reference block up to the end of the slab. */2131	while (advance_search_cursor(slab)) {2132		if (search_current_reference_block(slab, free_index_ptr))2133			return true;2134	}2135 2136	return false;2137}2138 2139/**2140 * make_provisional_reference() - Do the bookkeeping for making a provisional reference.2141 */2142static void make_provisional_reference(struct vdo_slab *slab,2143				       slab_block_number block_number)2144{2145	struct reference_block *block = get_reference_block(slab, block_number);2146 2147	/*2148	 * Make the initial transition from an unreferenced block to a2149	 * provisionally allocated block.2150	 */2151	slab->counters[block_number] = PROVISIONAL_REFERENCE_COUNT;2152 2153	/* Account for the allocation. */2154	block->allocated_count++;2155	slab->free_blocks--;2156}2157 2158/**2159 * dirty_all_reference_blocks() - Mark all reference count blocks in a slab as dirty.2160 */2161static void dirty_all_reference_blocks(struct vdo_slab *slab)2162{2163	block_count_t i;2164 2165	for (i = 0; i < slab->reference_block_count; i++)2166		dirty_block(&slab->reference_blocks[i]);2167}2168 2169/**2170 * clear_provisional_references() - Clear the provisional reference counts from a reference block.2171 * @block: The block to clear.2172 */2173static void clear_provisional_references(struct reference_block *block)2174{2175	vdo_refcount_t *counters = get_reference_counters_for_block(block);2176	block_count_t j;2177 2178	for (j = 0; j < COUNTS_PER_BLOCK; j++) {2179		if (counters[j] == PROVISIONAL_REFERENCE_COUNT) {2180			counters[j] = EMPTY_REFERENCE_COUNT;2181			block->allocated_count--;2182		}2183	}2184}2185 2186static inline bool journal_points_equal(struct journal_point first,2187					struct journal_point second)2188{2189	return ((first.sequence_number == second.sequence_number) &&2190		(first.entry_count == second.entry_count));2191}2192 2193/**2194 * unpack_reference_block() - Unpack reference counts blocks into the internal memory structure.2195 * @packed: The written reference block to be unpacked.2196 * @block: The internal reference block to be loaded.2197 */2198static void unpack_reference_block(struct packed_reference_block *packed,2199				   struct reference_block *block)2200{2201	block_count_t index;2202	sector_count_t i;2203	struct vdo_slab *slab = block->slab;2204	vdo_refcount_t *counters = get_reference_counters_for_block(block);2205 2206	for (i = 0; i < VDO_SECTORS_PER_BLOCK; i++) {2207		struct packed_reference_sector *sector = &packed->sectors[i];2208 2209		vdo_unpack_journal_point(&sector->commit_point, &block->commit_points[i]);2210		memcpy(counters + (i * COUNTS_PER_SECTOR), sector->counts,2211		       (sizeof(vdo_refcount_t) * COUNTS_PER_SECTOR));2212		/* The slab_journal_point must be the latest point found in any sector. */2213		if (vdo_before_journal_point(&slab->slab_journal_point,2214					     &block->commit_points[i]))2215			slab->slab_journal_point = block->commit_points[i];2216 2217		if ((i > 0) &&2218		    !journal_points_equal(block->commit_points[0],2219					  block->commit_points[i])) {2220			size_t block_index = block - block->slab->reference_blocks;2221 2222			vdo_log_warning("Torn write detected in sector %u of reference block %zu of slab %u",2223					i, block_index, block->slab->slab_number);2224		}2225	}2226 2227	block->allocated_count = 0;2228	for (index = 0; index < COUNTS_PER_BLOCK; index++) {2229		if (counters[index] != EMPTY_REFERENCE_COUNT)2230			block->allocated_count++;2231	}2232}2233 2234/**2235 * finish_reference_block_load() - After a reference block has been read, unpack it.2236 * @completion: The VIO that just finished reading.2237 */2238static void finish_reference_block_load(struct vdo_completion *completion)2239{2240	struct vio *vio = as_vio(completion);2241	struct pooled_vio *pooled = vio_as_pooled_vio(vio);2242	struct reference_block *block = completion->parent;2243	struct vdo_slab *slab = block->slab;2244 2245	unpack_reference_block((struct packed_reference_block *) vio->data, block);2246	return_vio_to_pool(slab->allocator->vio_pool, pooled);2247	slab->active_count--;2248	clear_provisional_references(block);2249 2250	slab->free_blocks -= block->allocated_count;2251	check_if_slab_drained(slab);2252}2253 2254static void load_reference_block_endio(struct bio *bio)2255{2256	struct vio *vio = bio->bi_private;2257	struct reference_block *block = vio->completion.parent;2258 2259	continue_vio_after_io(vio, finish_reference_block_load,2260			      block->slab->allocator->thread_id);2261}2262 2263/**2264 * load_reference_block() - After a block waiter has gotten a VIO from the VIO pool, load the2265 *                          block.2266 * @waiter: The waiter of the block to load.2267 * @context: The VIO returned by the pool.2268 */2269static void load_reference_block(struct vdo_waiter *waiter, void *context)2270{2271	struct pooled_vio *pooled = context;2272	struct vio *vio = &pooled->vio;2273	struct reference_block *block =2274		container_of(waiter, struct reference_block, waiter);2275	size_t block_offset = (block - block->slab->reference_blocks);2276 2277	vio->completion.parent = block;2278	vdo_submit_metadata_vio(vio, block->slab->ref_counts_origin + block_offset,2279				load_reference_block_endio, handle_io_error,2280				REQ_OP_READ);2281}2282 2283/**2284 * load_reference_blocks() - Load a slab's reference blocks from the underlying storage into a2285 *                           pre-allocated reference counter.2286 */2287static void load_reference_blocks(struct vdo_slab *slab)2288{2289	block_count_t i;2290 2291	slab->free_blocks = slab->block_count;2292	slab->active_count = slab->reference_block_count;2293	for (i = 0; i < slab->reference_block_count; i++) {2294		struct vdo_waiter *waiter = &slab->reference_blocks[i].waiter;2295 2296		waiter->callback = load_reference_block;2297		acquire_vio_from_pool(slab->allocator->vio_pool, waiter);2298	}2299}2300 2301/**2302 * drain_slab() - Drain all reference count I/O.2303 *2304 * Depending upon the type of drain being performed (as recorded in the ref_count's vdo_slab), the2305 * reference blocks may be loaded from disk or dirty reference blocks may be written out.2306 */2307static void drain_slab(struct vdo_slab *slab)2308{2309	bool save;2310	bool load;2311	const struct admin_state_code *state = vdo_get_admin_state_code(&slab->state);2312 2313	if (state == VDO_ADMIN_STATE_SUSPENDING)2314		return;2315 2316	if ((state != VDO_ADMIN_STATE_REBUILDING) &&2317	    (state != VDO_ADMIN_STATE_SAVE_FOR_SCRUBBING))2318		commit_tail(&slab->journal);2319 2320	if ((state == VDO_ADMIN_STATE_RECOVERING) || (slab->counters == NULL))2321		return;2322 2323	save = false;2324	load = slab->allocator->summary_entries[slab->slab_number].load_ref_counts;2325	if (state == VDO_ADMIN_STATE_SCRUBBING) {2326		if (load) {2327			load_reference_blocks(slab);2328			return;2329		}2330	} else if (state == VDO_ADMIN_STATE_SAVE_FOR_SCRUBBING) {2331		if (!load) {2332			/* These reference counts were never written, so mark them all dirty. */2333			dirty_all_reference_blocks(slab);2334		}2335		save = true;2336	} else if (state == VDO_ADMIN_STATE_REBUILDING) {2337		/*2338		 * Write out the counters if the slab has written them before, or it has any2339		 * non-zero reference counts, or there are any slab journal blocks.2340		 */2341		block_count_t data_blocks = slab->allocator->depot->slab_config.data_blocks;2342 2343		if (load || (slab->free_blocks != data_blocks) ||2344		    !is_slab_journal_blank(slab)) {2345			dirty_all_reference_blocks(slab);2346			save = true;2347		}2348	} else if (state == VDO_ADMIN_STATE_SAVING) {2349		save = (slab->status == VDO_SLAB_REBUILT);2350	} else {2351		vdo_finish_draining_with_result(&slab->state, VDO_SUCCESS);2352		return;2353	}2354 2355	if (save)2356		save_dirty_reference_blocks(slab);2357}2358 2359static int allocate_slab_counters(struct vdo_slab *slab)2360{2361	int result;2362	size_t index, bytes;2363 2364	result = VDO_ASSERT(slab->reference_blocks == NULL,2365			    "vdo_slab %u doesn't allocate refcounts twice",2366			    slab->slab_number);2367	if (result != VDO_SUCCESS)2368		return result;2369 2370	result = vdo_allocate(slab->reference_block_count, struct reference_block,2371			      __func__, &slab->reference_blocks);2372	if (result != VDO_SUCCESS)2373		return result;2374 2375	/*2376	 * Allocate such that the runt slab has a full-length memory array, plus a little padding2377	 * so we can word-search even at the very end.2378	 */2379	bytes = (slab->reference_block_count * COUNTS_PER_BLOCK) + (2 * BYTES_PER_WORD);2380	result = vdo_allocate(bytes, vdo_refcount_t, "ref counts array",2381			      &slab->counters);2382	if (result != VDO_SUCCESS) {2383		vdo_free(vdo_forget(slab->reference_blocks));2384		return result;2385	}2386 2387	slab->search_cursor.first_block = slab->reference_blocks;2388	slab->search_cursor.last_block = &slab->reference_blocks[slab->reference_block_count - 1];2389	reset_search_cursor(slab);2390 2391	for (index = 0; index < slab->reference_block_count; index++) {2392		slab->reference_blocks[index] = (struct reference_block) {2393			.slab = slab,2394		};2395	}2396 2397	return VDO_SUCCESS;2398}2399 2400static int allocate_counters_if_clean(struct vdo_slab *slab)2401{2402	if (vdo_is_state_clean_load(&slab->state))2403		return allocate_slab_counters(slab);2404 2405	return VDO_SUCCESS;2406}2407 2408static void finish_loading_journal(struct vdo_completion *completion)2409{2410	struct vio *vio = as_vio(completion);2411	struct slab_journal *journal = completion->parent;2412	struct vdo_slab *slab = journal->slab;2413	struct packed_slab_journal_block *block = (struct packed_slab_journal_block *) vio->data;2414	struct slab_journal_block_header header;2415 2416	vdo_unpack_slab_journal_block_header(&block->header, &header);2417 2418	/* FIXME: should it be an error if the following conditional fails? */2419	if ((header.metadata_type == VDO_METADATA_SLAB_JOURNAL) &&2420	    (header.nonce == slab->allocator->nonce)) {2421		journal->tail = header.sequence_number + 1;2422 2423		/*2424		 * If the slab is clean, this implies the slab journal is empty, so advance the2425		 * head appropriately.2426		 */2427		journal->head = (slab->allocator->summary_entries[slab->slab_number].is_dirty ?2428				 header.head : journal->tail);2429		journal->tail_header = header;2430		initialize_journal_state(journal);2431	}2432 2433	return_vio_to_pool(slab->allocator->vio_pool, vio_as_pooled_vio(vio));2434	vdo_finish_loading_with_result(&slab->state, allocate_counters_if_clean(slab));2435}2436 2437static void read_slab_journal_tail_endio(struct bio *bio)2438{2439	struct vio *vio = bio->bi_private;2440	struct slab_journal *journal = vio->completion.parent;2441 2442	continue_vio_after_io(vio, finish_loading_journal,2443			      journal->slab->allocator->thread_id);2444}2445 2446static void handle_load_error(struct vdo_completion *completion)2447{2448	int result = completion->result;2449	struct slab_journal *journal = completion->parent;2450	struct vio *vio = as_vio(completion);2451 2452	vio_record_metadata_io_error(vio);2453	return_vio_to_pool(journal->slab->allocator->vio_pool, vio_as_pooled_vio(vio));2454	vdo_finish_loading_with_result(&journal->slab->state, result);2455}2456 2457/**2458 * read_slab_journal_tail() - Read the slab journal tail block by using a vio acquired from the vio2459 *                            pool.2460 * @waiter: The vio pool waiter which has just been notified.2461 * @context: The vio pool entry given to the waiter.2462 *2463 * This is the success callback from acquire_vio_from_pool() when loading a slab journal.2464 */2465static void read_slab_journal_tail(struct vdo_waiter *waiter, void *context)2466{2467	struct slab_journal *journal =2468		container_of(waiter, struct slab_journal, resource_waiter);2469	struct vdo_slab *slab = journal->slab;2470	struct pooled_vio *pooled = context;2471	struct vio *vio = &pooled->vio;2472	tail_block_offset_t last_commit_point =2473		slab->allocator->summary_entries[slab->slab_number].tail_block_offset;2474 2475	/*2476	 * Slab summary keeps the commit point offset, so the tail block is the block before that.2477	 * Calculation supports small journals in unit tests.2478	 */2479	tail_block_offset_t tail_block = ((last_commit_point == 0) ?2480					  (tail_block_offset_t)(journal->size - 1) :2481					  (last_commit_point - 1));2482 2483	vio->completion.parent = journal;2484	vio->completion.callback_thread_id = slab->allocator->thread_id;2485	vdo_submit_metadata_vio(vio, slab->journal_origin + tail_block,2486				read_slab_journal_tail_endio, handle_load_error,2487				REQ_OP_READ);2488}2489 2490/**2491 * load_slab_journal() - Load a slab's journal by reading the journal's tail.2492 */2493static void load_slab_journal(struct vdo_slab *slab)2494{2495	struct slab_journal *journal = &slab->journal;2496	tail_block_offset_t last_commit_point;2497 2498	last_commit_point = slab->allocator->summary_entries[slab->slab_number].tail_block_offset;2499	if ((last_commit_point == 0) &&2500	    !slab->allocator->summary_entries[slab->slab_number].load_ref_counts) {2501		/*2502		 * This slab claims that it has a tail block at (journal->size - 1), but a head of2503		 * 1. This is impossible, due to the scrubbing threshold, on a real system, so2504		 * don't bother reading the (bogus) data off disk.2505		 */2506		VDO_ASSERT_LOG_ONLY(((journal->size < 16) ||2507				     (journal->scrubbing_threshold < (journal->size - 1))),2508				    "Scrubbing threshold protects against reads of unwritten slab journal blocks");2509		vdo_finish_loading_with_result(&slab->state,2510					       allocate_counters_if_clean(slab));2511		return;2512	}2513 2514	journal->resource_waiter.callback = read_slab_journal_tail;2515	acquire_vio_from_pool(slab->allocator->vio_pool, &journal->resource_waiter);2516}2517 2518static void register_slab_for_scrubbing(struct vdo_slab *slab, bool high_priority)2519{2520	struct slab_scrubber *scrubber = &slab->allocator->scrubber;2521 2522	VDO_ASSERT_LOG_ONLY((slab->status != VDO_SLAB_REBUILT),2523			    "slab to be scrubbed is unrecovered");2524 2525	if (slab->status != VDO_SLAB_REQUIRES_SCRUBBING)2526		return;2527 2528	list_del_init(&slab->allocq_entry);2529	if (!slab->was_queued_for_scrubbing) {2530		WRITE_ONCE(scrubber->slab_count, scrubber->slab_count + 1);2531		slab->was_queued_for_scrubbing = true;2532	}2533 2534	if (high_priority) {2535		slab->status = VDO_SLAB_REQUIRES_HIGH_PRIORITY_SCRUBBING;2536		list_add_tail(&slab->allocq_entry, &scrubber->high_priority_slabs);2537		return;2538	}2539 2540	list_add_tail(&slab->allocq_entry, &scrubber->slabs);2541}2542 2543/* Queue a slab for allocation or scrubbing. */2544static void queue_slab(struct vdo_slab *slab)2545{2546	struct block_allocator *allocator = slab->allocator;2547	block_count_t free_blocks;2548	int result;2549 2550	VDO_ASSERT_LOG_ONLY(list_empty(&slab->allocq_entry),2551			"a requeued slab must not already be on a ring");2552 2553	if (vdo_is_read_only(allocator->depot->vdo))2554		return;2555 2556	free_blocks = slab->free_blocks;2557	result = VDO_ASSERT((free_blocks <= allocator->depot->slab_config.data_blocks),2558			    "rebuilt slab %u must have a valid free block count (has %llu, expected maximum %llu)",2559			    slab->slab_number, (unsigned long long) free_blocks,2560			    (unsigned long long) allocator->depot->slab_config.data_blocks);2561	if (result != VDO_SUCCESS) {2562		vdo_enter_read_only_mode(allocator->depot->vdo, result);2563		return;2564	}2565 2566	if (slab->status != VDO_SLAB_REBUILT) {2567		register_slab_for_scrubbing(slab, false);2568		return;2569	}2570 2571	if (!vdo_is_state_resuming(&slab->state)) {2572		/*2573		 * If the slab is resuming, we've already accounted for it here, so don't do it2574		 * again.2575		 * FIXME: under what situation would the slab be resuming here?2576		 */2577		WRITE_ONCE(allocator->allocated_blocks,2578			   allocator->allocated_blocks - free_blocks);2579		if (!is_slab_journal_blank(slab)) {2580			WRITE_ONCE(allocator->statistics.slabs_opened,2581				   allocator->statistics.slabs_opened + 1);2582		}2583	}2584 2585	if (allocator->depot->vdo->suspend_type == VDO_ADMIN_STATE_SAVING)2586		reopen_slab_journal(slab);2587 2588	prioritize_slab(slab);2589}2590 2591/**2592 * initiate_slab_action() - Initiate a slab action.2593 *2594 * Implements vdo_admin_initiator_fn.2595 */2596static void initiate_slab_action(struct admin_state *state)2597{2598	struct vdo_slab *slab = container_of(state, struct vdo_slab, state);2599 2600	if (vdo_is_state_draining(state)) {2601		const struct admin_state_code *operation = vdo_get_admin_state_code(state);2602 2603		if (operation == VDO_ADMIN_STATE_SCRUBBING)2604			slab->status = VDO_SLAB_REBUILDING;2605 2606		drain_slab(slab);2607		check_if_slab_drained(slab);2608		return;2609	}2610 2611	if (vdo_is_state_loading(state)) {2612		load_slab_journal(slab);2613		return;2614	}2615 2616	if (vdo_is_state_resuming(state)) {2617		queue_slab(slab);2618		vdo_finish_resuming(state);2619		return;2620	}2621 2622	vdo_finish_operation(state, VDO_INVALID_ADMIN_STATE);2623}2624 2625/**2626 * get_next_slab() - Get the next slab to scrub.2627 * @scrubber: The slab scrubber.2628 *2629 * Return: The next slab to scrub or NULL if there are none.2630 */2631static struct vdo_slab *get_next_slab(struct slab_scrubber *scrubber)2632{2633	struct vdo_slab *slab;2634 2635	slab = list_first_entry_or_null(&scrubber->high_priority_slabs,2636					struct vdo_slab, allocq_entry);2637	if (slab != NULL)2638		return slab;2639 2640	return list_first_entry_or_null(&scrubber->slabs, struct vdo_slab,2641					allocq_entry);2642}2643 2644/**2645 * has_slabs_to_scrub() - Check whether a scrubber has slabs to scrub.2646 * @scrubber: The scrubber to check.2647 *2648 * Return: true if the scrubber has slabs to scrub.2649 */2650static inline bool __must_check has_slabs_to_scrub(struct slab_scrubber *scrubber)2651{2652	return (get_next_slab(scrubber) != NULL);2653}2654 2655/**2656 * uninitialize_scrubber_vio() - Clean up the slab_scrubber's vio.2657 * @scrubber: The scrubber.2658 */2659static void uninitialize_scrubber_vio(struct slab_scrubber *scrubber)2660{2661	vdo_free(vdo_forget(scrubber->vio.data));2662	free_vio_components(&scrubber->vio);2663}2664 2665/**2666 * finish_scrubbing() - Stop scrubbing, either because there are no more slabs to scrub or because2667 *                      there's been an error.2668 * @scrubber: The scrubber.2669 */2670static void finish_scrubbing(struct slab_scrubber *scrubber, int result)2671{2672	bool notify = vdo_waitq_has_waiters(&scrubber->waiters);2673	bool done = !has_slabs_to_scrub(scrubber);2674	struct block_allocator *allocator =2675		container_of(scrubber, struct block_allocator, scrubber);2676 2677	if (done)2678		uninitialize_scrubber_vio(scrubber);2679 2680	if (scrubber->high_priority_only) {2681		scrubber->high_priority_only = false;2682		vdo_fail_completion(vdo_forget(scrubber->vio.completion.parent), result);2683	} else if (done && (atomic_add_return(-1, &allocator->depot->zones_to_scrub) == 0)) {2684		/* All of our slabs were scrubbed, and we're the last allocator to finish. */2685		enum vdo_state prior_state =2686			atomic_cmpxchg(&allocator->depot->vdo->state, VDO_RECOVERING,2687				       VDO_DIRTY);2688 2689		/*2690		 * To be safe, even if the CAS failed, ensure anything that follows is ordered with2691		 * respect to whatever state change did happen.2692		 */2693		smp_mb__after_atomic();2694 2695		/*2696		 * We must check the VDO state here and not the depot's read_only_notifier since2697		 * the compare-swap-above could have failed due to a read-only entry which our own2698		 * thread does not yet know about.2699		 */2700		if (prior_state == VDO_DIRTY)2701			vdo_log_info("VDO commencing normal operation");2702		else if (prior_state == VDO_RECOVERING)2703			vdo_log_info("Exiting recovery mode");2704	}2705 2706	/*2707	 * Note that the scrubber has stopped, and inform anyone who might be waiting for that to2708	 * happen.2709	 */2710	if (!vdo_finish_draining(&scrubber->admin_state))2711		WRITE_ONCE(scrubber->admin_state.current_state,2712			   VDO_ADMIN_STATE_SUSPENDED);2713 2714	/*2715	 * We can't notify waiters until after we've finished draining or they'll just requeue.2716	 * Fortunately if there were waiters, we can't have been freed yet.2717	 */2718	if (notify)2719		vdo_waitq_notify_all_waiters(&scrubber->waiters, NULL, NULL);2720}2721 2722static void scrub_next_slab(struct slab_scrubber *scrubber);2723 2724/**2725 * slab_scrubbed() - Notify the scrubber that a slab has been scrubbed.2726 * @completion: The slab rebuild completion.2727 *2728 * This callback is registered in apply_journal_entries().2729 */2730static void slab_scrubbed(struct vdo_completion *completion)2731{2732	struct slab_scrubber *scrubber =2733		container_of(as_vio(completion), struct slab_scrubber, vio);2734	struct vdo_slab *slab = scrubber->slab;2735 2736	slab->status = VDO_SLAB_REBUILT;2737	queue_slab(slab);2738	reopen_slab_journal(slab);2739	WRITE_ONCE(scrubber->slab_count, scrubber->slab_count - 1);2740	scrub_next_slab(scrubber);2741}2742 2743/**2744 * abort_scrubbing() - Abort scrubbing due to an error.2745 * @scrubber: The slab scrubber.2746 * @result: The error.2747 */2748static void abort_scrubbing(struct slab_scrubber *scrubber, int result)2749{2750	vdo_enter_read_only_mode(scrubber->vio.completion.vdo, result);2751	finish_scrubbing(scrubber, result);2752}2753 2754/**2755 * handle_scrubber_error() - Handle errors while rebuilding a slab.2756 * @completion: The slab rebuild completion.2757 */2758static void handle_scrubber_error(struct vdo_completion *completion)2759{2760	struct vio *vio = as_vio(completion);2761 2762	vio_record_metadata_io_error(vio);2763	abort_scrubbing(container_of(vio, struct slab_scrubber, vio),2764			completion->result);2765}2766 2767/**2768 * apply_block_entries() - Apply all the entries in a block to the reference counts.2769 * @block: A block with entries to apply.2770 * @entry_count: The number of entries to apply.2771 * @block_number: The sequence number of the block.2772 * @slab: The slab to apply the entries to.2773 *2774 * Return: VDO_SUCCESS or an error code.2775 */2776static int apply_block_entries(struct packed_slab_journal_block *block,2777			       journal_entry_count_t entry_count,2778			       sequence_number_t block_number, struct vdo_slab *slab)2779{2780	struct journal_point entry_point = {2781		.sequence_number = block_number,2782		.entry_count = 0,2783	};2784	int result;2785	slab_block_number max_sbn = slab->end - slab->start;2786 2787	while (entry_point.entry_count < entry_count) {2788		struct slab_journal_entry entry =2789			vdo_decode_slab_journal_entry(block, entry_point.entry_count);2790 2791		if (entry.sbn > max_sbn) {2792			/* This entry is out of bounds. */2793			return vdo_log_error_strerror(VDO_CORRUPT_JOURNAL,2794						      "vdo_slab journal entry (%llu, %u) had invalid offset %u in slab (size %u blocks)",2795						      (unsigned long long) block_number,2796						      entry_point.entry_count,2797						      entry.sbn, max_sbn);2798		}2799 2800		result = replay_reference_count_change(slab, &entry_point, entry);2801		if (result != VDO_SUCCESS) {2802			vdo_log_error_strerror(result,2803					       "vdo_slab journal entry (%llu, %u) (%s of offset %u) could not be applied in slab %u",2804					       (unsigned long long) block_number,2805					       entry_point.entry_count,2806					       vdo_get_journal_operation_name(entry.operation),2807					       entry.sbn, slab->slab_number);2808			return result;2809		}2810		entry_point.entry_count++;2811	}2812 2813	return VDO_SUCCESS;2814}2815 2816/**2817 * apply_journal_entries() - Find the relevant vio of the slab journal and apply all valid entries.2818 * @completion: The metadata read vio completion.2819 *2820 * This is a callback registered in start_scrubbing().2821 */2822static void apply_journal_entries(struct vdo_completion *completion)2823{2824	int result;2825	struct slab_scrubber *scrubber =2826		container_of(as_vio(completion), struct slab_scrubber, vio);2827	struct vdo_slab *slab = scrubber->slab;2828	struct slab_journal *journal = &slab->journal;2829 2830	/* Find the boundaries of the useful part of the journal. */2831	sequence_number_t tail = journal->tail;2832	tail_block_offset_t end_index = (tail - 1) % journal->size;2833	char *end_data = scrubber->vio.data + (end_index * VDO_BLOCK_SIZE);2834	struct packed_slab_journal_block *end_block =2835		(struct packed_slab_journal_block *) end_data;2836 2837	sequence_number_t head = __le64_to_cpu(end_block->header.head);2838	tail_block_offset_t head_index = head % journal->size;2839	block_count_t index = head_index;2840 2841	struct journal_point ref_counts_point = slab->slab_journal_point;2842	struct journal_point last_entry_applied = ref_counts_point;2843	sequence_number_t sequence;2844 2845	for (sequence = head; sequence < tail; sequence++) {2846		char *block_data = scrubber->vio.data + (index * VDO_BLOCK_SIZE);2847		struct packed_slab_journal_block *block =2848			(struct packed_slab_journal_block *) block_data;2849		struct slab_journal_block_header header;2850 2851		vdo_unpack_slab_journal_block_header(&block->header, &header);2852 2853		if ((header.nonce != slab->allocator->nonce) ||2854		    (header.metadata_type != VDO_METADATA_SLAB_JOURNAL) ||2855		    (header.sequence_number != sequence) ||2856		    (header.entry_count > journal->entries_per_block) ||2857		    (header.has_block_map_increments &&2858		     (header.entry_count > journal->full_entries_per_block))) {2859			/* The block is not what we expect it to be. */2860			vdo_log_error("vdo_slab journal block for slab %u was invalid",2861				      slab->slab_number);2862			abort_scrubbing(scrubber, VDO_CORRUPT_JOURNAL);2863			return;2864		}2865 2866		result = apply_block_entries(block, header.entry_count, sequence, slab);2867		if (result != VDO_SUCCESS) {2868			abort_scrubbing(scrubber, result);2869			return;2870		}2871 2872		last_entry_applied.sequence_number = sequence;2873		last_entry_applied.entry_count = header.entry_count - 1;2874		index++;2875		if (index == journal->size)2876			index = 0;2877	}2878 2879	/*2880	 * At the end of rebuild, the reference counters should be accurate to the end of the2881	 * journal we just applied.2882	 */2883	result = VDO_ASSERT(!vdo_before_journal_point(&last_entry_applied,2884						      &ref_counts_point),2885			    "Refcounts are not more accurate than the slab journal");2886	if (result != VDO_SUCCESS) {2887		abort_scrubbing(scrubber, result);2888		return;2889	}2890 2891	/* Save out the rebuilt reference blocks. */2892	vdo_prepare_completion(completion, slab_scrubbed, handle_scrubber_error,2893			       slab->allocator->thread_id, completion->parent);2894	vdo_start_operation_with_waiter(&slab->state,2895					VDO_ADMIN_STATE_SAVE_FOR_SCRUBBING,2896					completion, initiate_slab_action);2897}2898 2899static void read_slab_journal_endio(struct bio *bio)2900{2901	struct vio *vio = bio->bi_private;2902	struct slab_scrubber *scrubber = container_of(vio, struct slab_scrubber, vio);2903 2904	continue_vio_after_io(bio->bi_private, apply_journal_entries,2905			      scrubber->slab->allocator->thread_id);2906}2907 2908/**2909 * start_scrubbing() - Read the current slab's journal from disk now that it has been flushed.2910 * @completion: The scrubber's vio completion.2911 *2912 * This callback is registered in scrub_next_slab().2913 */2914static void start_scrubbing(struct vdo_completion *completion)2915{2916	struct slab_scrubber *scrubber =2917		container_of(as_vio(completion), struct slab_scrubber, vio);2918	struct vdo_slab *slab = scrubber->slab;2919 2920	if (!slab->allocator->summary_entries[slab->slab_number].is_dirty) {2921		slab_scrubbed(completion);2922		return;2923	}2924 2925	vdo_submit_metadata_vio(&scrubber->vio, slab->journal_origin,2926				read_slab_journal_endio, handle_scrubber_error,2927				REQ_OP_READ);2928}2929 2930/**2931 * scrub_next_slab() - Scrub the next slab if there is one.2932 * @scrubber: The scrubber.2933 */2934static void scrub_next_slab(struct slab_scrubber *scrubber)2935{2936	struct vdo_completion *completion = &scrubber->vio.completion;2937	struct vdo_slab *slab;2938 2939	/*2940	 * Note: this notify call is always safe only because scrubbing can only be started when2941	 * the VDO is quiescent.2942	 */2943	vdo_waitq_notify_all_waiters(&scrubber->waiters, NULL, NULL);2944 2945	if (vdo_is_read_only(completion->vdo)) {2946		finish_scrubbing(scrubber, VDO_READ_ONLY);2947		return;2948	}2949 2950	slab = get_next_slab(scrubber);2951	if ((slab == NULL) ||2952	    (scrubber->high_priority_only && list_empty(&scrubber->high_priority_slabs))) {2953		finish_scrubbing(scrubber, VDO_SUCCESS);2954		return;2955	}2956 2957	if (vdo_finish_draining(&scrubber->admin_state))2958		return;2959 2960	list_del_init(&slab->allocq_entry);2961	scrubber->slab = slab;2962	vdo_prepare_completion(completion, start_scrubbing, handle_scrubber_error,2963			       slab->allocator->thread_id, completion->parent);2964	vdo_start_operation_with_waiter(&slab->state, VDO_ADMIN_STATE_SCRUBBING,2965					completion, initiate_slab_action);2966}2967 2968/**2969 * scrub_slabs() - Scrub all of an allocator's slabs that are eligible for scrubbing.2970 * @allocator: The block_allocator to scrub.2971 * @parent: The completion to notify when scrubbing is done, implies high_priority, may be NULL.2972 */2973static void scrub_slabs(struct block_allocator *allocator, struct vdo_completion *parent)2974{2975	struct slab_scrubber *scrubber = &allocator->scrubber;2976 2977	scrubber->vio.completion.parent = parent;2978	scrubber->high_priority_only = (parent != NULL);2979	if (!has_slabs_to_scrub(scrubber)) {2980		finish_scrubbing(scrubber, VDO_SUCCESS);2981		return;2982	}2983 2984	if (scrubber->high_priority_only &&2985	    vdo_is_priority_table_empty(allocator->prioritized_slabs) &&2986	    list_empty(&scrubber->high_priority_slabs))2987		register_slab_for_scrubbing(get_next_slab(scrubber), true);2988 2989	vdo_resume_if_quiescent(&scrubber->admin_state);2990	scrub_next_slab(scrubber);2991}2992 2993static inline void assert_on_allocator_thread(thread_id_t thread_id,2994					      const char *function_name)2995{2996	VDO_ASSERT_LOG_ONLY((vdo_get_callback_thread_id() == thread_id),2997			    "%s called on correct thread", function_name);2998}2999 3000static void register_slab_with_allocator(struct block_allocator *allocator,3001					 struct vdo_slab *slab)3002{3003	allocator->slab_count++;3004	allocator->last_slab = slab->slab_number;3005}3006 3007/**3008 * get_depot_slab_iterator() - Return a slab_iterator over the slabs in a slab_depot.3009 * @depot: The depot over which to iterate.3010 * @start: The number of the slab to start iterating from.3011 * @end: The number of the last slab which may be returned.3012 * @stride: The difference in slab number between successive slabs.3013 *3014 * Iteration always occurs from higher to lower numbered slabs.3015 *3016 * Return: An initialized iterator structure.3017 */3018static struct slab_iterator get_depot_slab_iterator(struct slab_depot *depot,3019						    slab_count_t start, slab_count_t end,3020						    slab_count_t stride)3021{3022	struct vdo_slab **slabs = depot->slabs;3023 3024	return (struct slab_iterator) {3025		.slabs = slabs,3026		.next = (((slabs == NULL) || (start < end)) ? NULL : slabs[start]),3027		.end = end,3028		.stride = stride,3029	};3030}3031 3032static struct slab_iterator get_slab_iterator(const struct block_allocator *allocator)3033{3034	return get_depot_slab_iterator(allocator->depot, allocator->last_slab,3035				       allocator->zone_number,3036				       allocator->depot->zone_count);3037}3038 3039/**3040 * next_slab() - Get the next slab from a slab_iterator and advance the iterator3041 * @iterator: The slab_iterator.3042 *3043 * Return: The next slab or NULL if the iterator is exhausted.3044 */3045static struct vdo_slab *next_slab(struct slab_iterator *iterator)3046{3047	struct vdo_slab *slab = iterator->next;3048 3049	if ((slab == NULL) || (slab->slab_number < iterator->end + iterator->stride))3050		iterator->next = NULL;3051	else3052		iterator->next = iterator->slabs[slab->slab_number - iterator->stride];3053 3054	return slab;3055}3056 3057/**3058 * abort_waiter() - Abort vios waiting to make journal entries when read-only.3059 *3060 * This callback is invoked on all vios waiting to make slab journal entries after the VDO has gone3061 * into read-only mode. Implements waiter_callback_fn.3062 */3063static void abort_waiter(struct vdo_waiter *waiter, void *context __always_unused)3064{3065	struct reference_updater *updater =3066		container_of(waiter, struct reference_updater, waiter);3067	struct data_vio *data_vio = data_vio_from_reference_updater(updater);3068 3069	if (updater->increment) {3070		continue_data_vio_with_error(data_vio, VDO_READ_ONLY);3071		return;3072	}3073 3074	vdo_continue_completion(&data_vio->decrement_completion, VDO_READ_ONLY);3075}3076 3077/* Implements vdo_read_only_notification_fn. */3078static void notify_block_allocator_of_read_only_mode(void *listener,3079						     struct vdo_completion *parent)3080{3081	struct block_allocator *allocator = listener;3082	struct slab_iterator iterator;3083 3084	assert_on_allocator_thread(allocator->thread_id, __func__);3085	iterator = get_slab_iterator(allocator);3086	while (iterator.next != NULL) {3087		struct vdo_slab *slab = next_slab(&iterator);3088 3089		vdo_waitq_notify_all_waiters(&slab->journal.entry_waiters,3090					     abort_waiter, &slab->journal);3091		check_if_slab_drained(slab);3092	}3093 3094	vdo_finish_completion(parent);3095}3096 3097/**3098 * vdo_acquire_provisional_reference() - Acquire a provisional reference on behalf of a PBN lock if3099 *                                       the block it locks is unreferenced.3100 * @slab: The slab which contains the block.3101 * @pbn: The physical block to reference.3102 * @lock: The lock.3103 *3104 * Return: VDO_SUCCESS or an error.3105 */3106int vdo_acquire_provisional_reference(struct vdo_slab *slab, physical_block_number_t pbn,3107				      struct pbn_lock *lock)3108{3109	slab_block_number block_number;3110	int result;3111 3112	if (vdo_pbn_lock_has_provisional_reference(lock))3113		return VDO_SUCCESS;3114 3115	if (!is_slab_open(slab))3116		return VDO_INVALID_ADMIN_STATE;3117 3118	result = slab_block_number_from_pbn(slab, pbn, &block_number);3119	if (result != VDO_SUCCESS)3120		return result;3121 3122	if (slab->counters[block_number] == EMPTY_REFERENCE_COUNT) {3123		make_provisional_reference(slab, block_number);3124		if (lock != NULL)3125			vdo_assign_pbn_lock_provisional_reference(lock);3126	}3127 3128	if (vdo_pbn_lock_has_provisional_reference(lock))3129		adjust_free_block_count(slab, false);3130 3131	return VDO_SUCCESS;3132}3133 3134static int __must_check allocate_slab_block(struct vdo_slab *slab,3135					    physical_block_number_t *block_number_ptr)3136{3137	slab_block_number free_index;3138 3139	if (!is_slab_open(slab))3140		return VDO_INVALID_ADMIN_STATE;3141 3142	if (!search_reference_blocks(slab, &free_index))3143		return VDO_NO_SPACE;3144 3145	VDO_ASSERT_LOG_ONLY((slab->counters[free_index] == EMPTY_REFERENCE_COUNT),3146			    "free block must have ref count of zero");3147	make_provisional_reference(slab, free_index);3148	adjust_free_block_count(slab, false);3149 3150	/*3151	 * Update the search hint so the next search will start at the array index just past the3152	 * free block we just found.3153	 */3154	slab->search_cursor.index = (free_index + 1);3155 3156	*block_number_ptr = slab->start + free_index;3157	return VDO_SUCCESS;3158}3159 3160/**3161 * open_slab() - Prepare a slab to be allocated from.3162 * @slab: The slab.3163 */3164static void open_slab(struct vdo_slab *slab)3165{3166	reset_search_cursor(slab);3167	if (is_slab_journal_blank(slab)) {3168		WRITE_ONCE(slab->allocator->statistics.slabs_opened,3169			   slab->allocator->statistics.slabs_opened + 1);3170		dirty_all_reference_blocks(slab);3171	} else {3172		WRITE_ONCE(slab->allocator->statistics.slabs_reopened,3173			   slab->allocator->statistics.slabs_reopened + 1);3174	}3175 3176	slab->allocator->open_slab = slab;3177}3178 3179 3180/*3181 * The block allocated will have a provisional reference and the reference must be either confirmed3182 * with a subsequent increment or vacated with a subsequent decrement via3183 * vdo_release_block_reference().3184 */3185int vdo_allocate_block(struct block_allocator *allocator,3186		       physical_block_number_t *block_number_ptr)3187{3188	int result;3189 3190	if (allocator->open_slab != NULL) {3191		/* Try to allocate the next block in the currently open slab. */3192		result = allocate_slab_block(allocator->open_slab, block_number_ptr);3193		if ((result == VDO_SUCCESS) || (result != VDO_NO_SPACE))3194			return result;3195 3196		/* Put the exhausted open slab back into the priority table. */3197		prioritize_slab(allocator->open_slab);3198	}3199 3200	/* Remove the highest priority slab from the priority table and make it the open slab. */3201	open_slab(list_entry(vdo_priority_table_dequeue(allocator->prioritized_slabs),3202			     struct vdo_slab, allocq_entry));3203 3204	/*3205	 * Try allocating again. If we're out of space immediately after opening a slab, then every3206	 * slab must be fully allocated.3207	 */3208	return allocate_slab_block(allocator->open_slab, block_number_ptr);3209}3210 3211/**3212 * vdo_enqueue_clean_slab_waiter() - Wait for a clean slab.3213 * @allocator: The block_allocator on which to wait.3214 * @waiter: The waiter.3215 *3216 * Return: VDO_SUCCESS if the waiter was queued, VDO_NO_SPACE if there are no slabs to scrub, and3217 *         some other error otherwise.3218 */3219int vdo_enqueue_clean_slab_waiter(struct block_allocator *allocator,3220				  struct vdo_waiter *waiter)3221{3222	if (vdo_is_read_only(allocator->depot->vdo))3223		return VDO_READ_ONLY;3224 3225	if (vdo_is_state_quiescent(&allocator->scrubber.admin_state))3226		return VDO_NO_SPACE;3227 3228	vdo_waitq_enqueue_waiter(&allocator->scrubber.waiters, waiter);3229	return VDO_SUCCESS;3230}3231 3232/**3233 * vdo_modify_reference_count() - Modify the reference count of a block by first making a slab3234 *                                journal entry and then updating the reference counter.3235 *3236 * @data_vio: The data_vio for which to add the entry.3237 * @updater: Which of the data_vio's reference updaters is being submitted.3238 */3239void vdo_modify_reference_count(struct vdo_completion *completion,3240				struct reference_updater *updater)3241{3242	struct vdo_slab *slab = vdo_get_slab(completion->vdo->depot, updater->zpbn.pbn);3243 3244	if (!is_slab_open(slab)) {3245		vdo_continue_completion(completion, VDO_INVALID_ADMIN_STATE);3246		return;3247	}3248 3249	if (vdo_is_read_only(completion->vdo)) {3250		vdo_continue_completion(completion, VDO_READ_ONLY);3251		return;3252	}3253 3254	vdo_waitq_enqueue_waiter(&slab->journal.entry_waiters, &updater->waiter);3255	if ((slab->status != VDO_SLAB_REBUILT) && requires_reaping(&slab->journal))3256		register_slab_for_scrubbing(slab, true);3257 3258	add_entries(&slab->journal);3259}3260 3261/* Release an unused provisional reference. */3262int vdo_release_block_reference(struct block_allocator *allocator,3263				physical_block_number_t pbn)3264{3265	struct reference_updater updater;3266 3267	if (pbn == VDO_ZERO_BLOCK)3268		return VDO_SUCCESS;3269 3270	updater = (struct reference_updater) {3271		.operation = VDO_JOURNAL_DATA_REMAPPING,3272		.increment = false,3273		.zpbn = {3274			.pbn = pbn,3275		},3276	};3277 3278	return adjust_reference_count(vdo_get_slab(allocator->depot, pbn),3279				      &updater, NULL);3280}3281 3282/*3283 * This is a min_heap callback function orders slab_status structures using the 'is_clean' field as3284 * the primary key and the 'emptiness' field as the secondary key.3285 *3286 * Slabs need to be pushed onto the rings in the same order they are to be popped off. Popping3287 * should always get the most empty first, so pushing should be from most empty to least empty.3288 * Thus, the ordering is reversed from the usual sense since min_heap returns smaller elements3289 * before larger ones.3290 */3291static bool slab_status_is_less_than(const void *item1, const void *item2,3292					void __always_unused *args)3293{3294	const struct slab_status *info1 = item1;3295	const struct slab_status *info2 = item2;3296 3297	if (info1->is_clean != info2->is_clean)3298		return info1->is_clean;3299	if (info1->emptiness != info2->emptiness)3300		return info1->emptiness > info2->emptiness;3301	return info1->slab_number < info2->slab_number;3302}3303 3304static void swap_slab_statuses(void *item1, void *item2, void __always_unused *args)3305{3306	struct slab_status *info1 = item1;3307	struct slab_status *info2 = item2;3308 3309	swap(*info1, *info2);3310}3311 3312static const struct min_heap_callbacks slab_status_min_heap = {3313	.less = slab_status_is_less_than,3314	.swp = swap_slab_statuses,3315};3316 3317/* Inform the slab actor that a action has finished on some slab; used by apply_to_slabs(). */3318static void slab_action_callback(struct vdo_completion *completion)3319{3320	struct block_allocator *allocator = vdo_as_block_allocator(completion);3321	struct slab_actor *actor = &allocator->slab_actor;3322 3323	if (--actor->slab_action_count == 0) {3324		actor->callback(completion);3325		return;3326	}3327 3328	vdo_reset_completion(completion);3329}3330 3331/* Preserve the error from part of an action and continue. */3332static void handle_operation_error(struct vdo_completion *completion)3333{3334	struct block_allocator *allocator = vdo_as_block_allocator(completion);3335 3336	if (allocator->state.waiter != NULL)3337		vdo_set_completion_result(allocator->state.waiter, completion->result);3338	completion->callback(completion);3339}3340 3341/* Perform an action on each of an allocator's slabs in parallel. */3342static void apply_to_slabs(struct block_allocator *allocator, vdo_action_fn callback)3343{3344	struct slab_iterator iterator;3345 3346	vdo_prepare_completion(&allocator->completion, slab_action_callback,3347			       handle_operation_error, allocator->thread_id, NULL);3348	allocator->completion.requeue = false;3349 3350	/*3351	 * Since we are going to dequeue all of the slabs, the open slab will become invalid, so3352	 * clear it.3353	 */3354	allocator->open_slab = NULL;3355 3356	/* Ensure that we don't finish before we're done starting. */3357	allocator->slab_actor = (struct slab_actor) {3358		.slab_action_count = 1,3359		.callback = callback,3360	};3361 3362	iterator = get_slab_iterator(allocator);3363	while (iterator.next != NULL) {3364		const struct admin_state_code *operation =3365			vdo_get_admin_state_code(&allocator->state);3366		struct vdo_slab *slab = next_slab(&iterator);3367 3368		list_del_init(&slab->allocq_entry);3369		allocator->slab_actor.slab_action_count++;3370		vdo_start_operation_with_waiter(&slab->state, operation,3371						&allocator->completion,3372						initiate_slab_action);3373	}3374 3375	slab_action_callback(&allocator->completion);3376}3377 3378static void finish_loading_allocator(struct vdo_completion *completion)3379{3380	struct block_allocator *allocator = vdo_as_block_allocator(completion);3381	const struct admin_state_code *operation =3382		vdo_get_admin_state_code(&allocator->state);3383 3384	if (allocator->eraser != NULL)3385		dm_kcopyd_client_destroy(vdo_forget(allocator->eraser));3386 3387	if (operation == VDO_ADMIN_STATE_LOADING_FOR_RECOVERY) {3388		void *context =3389			vdo_get_current_action_context(allocator->depot->action_manager);3390 3391		vdo_replay_into_slab_journals(allocator, context);3392		return;3393	}3394 3395	vdo_finish_loading(&allocator->state);3396}3397 3398static void erase_next_slab_journal(struct block_allocator *allocator);3399 3400static void copy_callback(int read_err, unsigned long write_err, void *context)3401{3402	struct block_allocator *allocator = context;3403	int result = (((read_err == 0) && (write_err == 0)) ? VDO_SUCCESS : -EIO);3404 3405	if (result != VDO_SUCCESS) {3406		vdo_fail_completion(&allocator->completion, result);3407		return;3408	}3409 3410	erase_next_slab_journal(allocator);3411}3412 3413/* erase_next_slab_journal() - Erase the next slab journal. */3414static void erase_next_slab_journal(struct block_allocator *allocator)3415{3416	struct vdo_slab *slab;3417	physical_block_number_t pbn;3418	struct dm_io_region regions[1];3419	struct slab_depot *depot = allocator->depot;3420	block_count_t blocks = depot->slab_config.slab_journal_blocks;3421 3422	if (allocator->slabs_to_erase.next == NULL) {3423		vdo_finish_completion(&allocator->completion);3424		return;3425	}3426 3427	slab = next_slab(&allocator->slabs_to_erase);3428	pbn = slab->journal_origin - depot->vdo->geometry.bio_offset;3429	regions[0] = (struct dm_io_region) {3430		.bdev = vdo_get_backing_device(depot->vdo),3431		.sector = pbn * VDO_SECTORS_PER_BLOCK,3432		.count = blocks * VDO_SECTORS_PER_BLOCK,3433	};3434	dm_kcopyd_zero(allocator->eraser, 1, regions, 0, copy_callback, allocator);3435}3436 3437/* Implements vdo_admin_initiator_fn. */3438static void initiate_load(struct admin_state *state)3439{3440	struct block_allocator *allocator =3441		container_of(state, struct block_allocator, state);3442	const struct admin_state_code *operation = vdo_get_admin_state_code(state);3443 3444	if (operation == VDO_ADMIN_STATE_LOADING_FOR_REBUILD) {3445		/*3446		 * Must requeue because the kcopyd client cannot be freed in the same stack frame3447		 * as the kcopyd callback, lest it deadlock.3448		 */3449		vdo_prepare_completion_for_requeue(&allocator->completion,3450						   finish_loading_allocator,3451						   handle_operation_error,3452						   allocator->thread_id, NULL);3453		allocator->eraser = dm_kcopyd_client_create(NULL);3454		if (IS_ERR(allocator->eraser)) {3455			vdo_fail_completion(&allocator->completion,3456					    PTR_ERR(allocator->eraser));3457			allocator->eraser = NULL;3458			return;3459		}3460		allocator->slabs_to_erase = get_slab_iterator(allocator);3461 3462		erase_next_slab_journal(allocator);3463		return;3464	}3465 3466	apply_to_slabs(allocator, finish_loading_allocator);3467}3468 3469/**3470 * vdo_notify_slab_journals_are_recovered() - Inform a block allocator that its slab journals have3471 *                                            been recovered from the recovery journal.3472 * @completion The allocator completion3473 */3474void vdo_notify_slab_journals_are_recovered(struct vdo_completion *completion)3475{3476	struct block_allocator *allocator = vdo_as_block_allocator(completion);3477 3478	vdo_finish_loading_with_result(&allocator->state, completion->result);3479}3480 3481static int get_slab_statuses(struct block_allocator *allocator,3482			     struct slab_status **statuses_ptr)3483{3484	int result;3485	struct slab_status *statuses;3486	struct slab_iterator iterator = get_slab_iterator(allocator);3487 3488	result = vdo_allocate(allocator->slab_count, struct slab_status, __func__,3489			      &statuses);3490	if (result != VDO_SUCCESS)3491		return result;3492 3493	*statuses_ptr = statuses;3494 3495	while (iterator.next != NULL)  {3496		slab_count_t slab_number = next_slab(&iterator)->slab_number;3497 3498		*statuses++ = (struct slab_status) {3499			.slab_number = slab_number,3500			.is_clean = !allocator->summary_entries[slab_number].is_dirty,3501			.emptiness = allocator->summary_entries[slab_number].fullness_hint,3502		};3503	}3504 3505	return VDO_SUCCESS;3506}3507 3508/* Prepare slabs for allocation or scrubbing. */3509static int __must_check vdo_prepare_slabs_for_allocation(struct block_allocator *allocator)3510{3511	struct slab_status current_slab_status;3512	DEFINE_MIN_HEAP(struct slab_status, heap) heap;3513	int result;3514	struct slab_status *slab_statuses;3515	struct slab_depot *depot = allocator->depot;3516 3517	WRITE_ONCE(allocator->allocated_blocks,3518		   allocator->slab_count * depot->slab_config.data_blocks);3519	result = get_slab_statuses(allocator, &slab_statuses);3520	if (result != VDO_SUCCESS)3521		return result;3522 3523	/* Sort the slabs by cleanliness, then by emptiness hint. */3524	heap = (struct heap) {3525		.data = slab_statuses,3526		.nr = allocator->slab_count,3527		.size = allocator->slab_count,3528	};3529	min_heapify_all(&heap, &slab_status_min_heap, NULL);3530 3531	while (heap.nr > 0) {3532		bool high_priority;3533		struct vdo_slab *slab;3534		struct slab_journal *journal;3535 3536		current_slab_status = slab_statuses[0];3537		min_heap_pop(&heap, &slab_status_min_heap, NULL);3538		slab = depot->slabs[current_slab_status.slab_number];3539 3540		if ((depot->load_type == VDO_SLAB_DEPOT_REBUILD_LOAD) ||3541		    (!allocator->summary_entries[slab->slab_number].load_ref_counts &&3542		     current_slab_status.is_clean)) {3543			queue_slab(slab);3544			continue;3545		}3546 3547		slab->status = VDO_SLAB_REQUIRES_SCRUBBING;3548		journal = &slab->journal;3549		high_priority = ((current_slab_status.is_clean &&3550				 (depot->load_type == VDO_SLAB_DEPOT_NORMAL_LOAD)) ||3551				 (journal_length(journal) >= journal->scrubbing_threshold));3552		register_slab_for_scrubbing(slab, high_priority);3553	}3554 3555	vdo_free(slab_statuses);3556	return VDO_SUCCESS;3557}3558 3559static const char *status_to_string(enum slab_rebuild_status status)3560{3561	switch (status) {3562	case VDO_SLAB_REBUILT:3563		return "REBUILT";3564	case VDO_SLAB_REQUIRES_SCRUBBING:3565		return "SCRUBBING";3566	case VDO_SLAB_REQUIRES_HIGH_PRIORITY_SCRUBBING:3567		return "PRIORITY_SCRUBBING";3568	case VDO_SLAB_REBUILDING:3569		return "REBUILDING";3570	case VDO_SLAB_REPLAYING:3571		return "REPLAYING";3572	default:3573		return "UNKNOWN";3574	}3575}3576 3577void vdo_dump_block_allocator(const struct block_allocator *allocator)3578{3579	unsigned int pause_counter = 0;3580	struct slab_iterator iterator = get_slab_iterator(allocator);3581	const struct slab_scrubber *scrubber = &allocator->scrubber;3582 3583	vdo_log_info("block_allocator zone %u", allocator->zone_number);3584	while (iterator.next != NULL) {3585		struct vdo_slab *slab = next_slab(&iterator);3586		struct slab_journal *journal = &slab->journal;3587 3588		if (slab->reference_blocks != NULL) {3589			/* Terse because there are a lot of slabs to dump and syslog is lossy. */3590			vdo_log_info("slab %u: P%u, %llu free", slab->slab_number,3591				     slab->priority,3592				     (unsigned long long) slab->free_blocks);3593		} else {3594			vdo_log_info("slab %u: status %s", slab->slab_number,3595				     status_to_string(slab->status));3596		}3597 3598		vdo_log_info("  slab journal: entry_waiters=%zu waiting_to_commit=%s updating_slab_summary=%s head=%llu unreapable=%llu tail=%llu next_commit=%llu summarized=%llu last_summarized=%llu recovery_lock=%llu dirty=%s",3599			     vdo_waitq_num_waiters(&journal->entry_waiters),3600			     vdo_bool_to_string(journal->waiting_to_commit),3601			     vdo_bool_to_string(journal->updating_slab_summary),3602			     (unsigned long long) journal->head,3603			     (unsigned long long) journal->unreapable,3604			     (unsigned long long) journal->tail,3605			     (unsigned long long) journal->next_commit,3606			     (unsigned long long) journal->summarized,3607			     (unsigned long long) journal->last_summarized,3608			     (unsigned long long) journal->recovery_lock,3609			     vdo_bool_to_string(journal->recovery_lock != 0));3610		/*3611		 * Given the frequency with which the locks are just a tiny bit off, it might be3612		 * worth dumping all the locks, but that might be too much logging.3613		 */3614 3615		if (slab->counters != NULL) {3616			/* Terse because there are a lot of slabs to dump and syslog is lossy. */3617			vdo_log_info("  slab: free=%u/%u blocks=%u dirty=%zu active=%zu journal@(%llu,%u)",3618				     slab->free_blocks, slab->block_count,3619				     slab->reference_block_count,3620				     vdo_waitq_num_waiters(&slab->dirty_blocks),3621				     slab->active_count,3622				     (unsigned long long) slab->slab_journal_point.sequence_number,3623				     slab->slab_journal_point.entry_count);3624		} else {3625			vdo_log_info("  no counters");3626		}3627 3628		/*3629		 * Wait for a while after each batch of 32 slabs dumped, an arbitrary number,3630		 * allowing the kernel log a chance to be flushed instead of being overrun.3631		 */3632		if (pause_counter++ == 31) {3633			pause_counter = 0;3634			vdo_pause_for_logger();3635		}3636	}3637 3638	vdo_log_info("slab_scrubber slab_count %u waiters %zu %s%s",3639		     READ_ONCE(scrubber->slab_count),3640		     vdo_waitq_num_waiters(&scrubber->waiters),3641		     vdo_get_admin_state_code(&scrubber->admin_state)->name,3642		     scrubber->high_priority_only ? ", high_priority_only " : "");3643}3644 3645static void free_slab(struct vdo_slab *slab)3646{3647	if (slab == NULL)3648		return;3649 3650	list_del(&slab->allocq_entry);3651	vdo_free(vdo_forget(slab->journal.block));3652	vdo_free(vdo_forget(slab->journal.locks));3653	vdo_free(vdo_forget(slab->counters));3654	vdo_free(vdo_forget(slab->reference_blocks));3655	vdo_free(slab);3656}3657 3658static int initialize_slab_journal(struct vdo_slab *slab)3659{3660	struct slab_journal *journal = &slab->journal;3661	const struct slab_config *slab_config = &slab->allocator->depot->slab_config;3662	int result;3663 3664	result = vdo_allocate(slab_config->slab_journal_blocks, struct journal_lock,3665			      __func__, &journal->locks);3666	if (result != VDO_SUCCESS)3667		return result;3668 3669	result = vdo_allocate(VDO_BLOCK_SIZE, char, "struct packed_slab_journal_block",3670			      (char **) &journal->block);3671	if (result != VDO_SUCCESS)3672		return result;3673 3674	journal->slab = slab;3675	journal->size = slab_config->slab_journal_blocks;3676	journal->flushing_threshold = slab_config->slab_journal_flushing_threshold;3677	journal->blocking_threshold = slab_config->slab_journal_blocking_threshold;3678	journal->scrubbing_threshold = slab_config->slab_journal_scrubbing_threshold;3679	journal->entries_per_block = VDO_SLAB_JOURNAL_ENTRIES_PER_BLOCK;3680	journal->full_entries_per_block = VDO_SLAB_JOURNAL_FULL_ENTRIES_PER_BLOCK;3681	journal->events = &slab->allocator->slab_journal_statistics;3682	journal->recovery_journal = slab->allocator->depot->vdo->recovery_journal;3683	journal->tail = 1;3684	journal->head = 1;3685 3686	journal->flushing_deadline = journal->flushing_threshold;3687	/*3688	 * Set there to be some time between the deadline and the blocking threshold, so that3689	 * hopefully all are done before blocking.3690	 */3691	if ((journal->blocking_threshold - journal->flushing_threshold) > 5)3692		journal->flushing_deadline = journal->blocking_threshold - 5;3693 3694	journal->slab_summary_waiter.callback = release_journal_locks;3695 3696	INIT_LIST_HEAD(&journal->dirty_entry);3697	INIT_LIST_HEAD(&journal->uncommitted_blocks);3698 3699	journal->tail_header.nonce = slab->allocator->nonce;3700	journal->tail_header.metadata_type = VDO_METADATA_SLAB_JOURNAL;3701	initialize_journal_state(journal);3702	return VDO_SUCCESS;3703}3704 3705/**3706 * make_slab() - Construct a new, empty slab.3707 * @slab_origin: The physical block number within the block allocator partition of the first block3708 *               in the slab.3709 * @allocator: The block allocator to which the slab belongs.3710 * @slab_number: The slab number of the slab.3711 * @is_new: true if this slab is being allocated as part of a resize.3712 * @slab_ptr: A pointer to receive the new slab.3713 *3714 * Return: VDO_SUCCESS or an error code.3715 */3716static int __must_check make_slab(physical_block_number_t slab_origin,3717				  struct block_allocator *allocator,3718				  slab_count_t slab_number, bool is_new,3719				  struct vdo_slab **slab_ptr)3720{3721	const struct slab_config *slab_config = &allocator->depot->slab_config;3722	struct vdo_slab *slab;3723	int result;3724 3725	result = vdo_allocate(1, struct vdo_slab, __func__, &slab);3726	if (result != VDO_SUCCESS)3727		return result;3728 3729	*slab = (struct vdo_slab) {3730		.allocator = allocator,3731		.start = slab_origin,3732		.end = slab_origin + slab_config->slab_blocks,3733		.slab_number = slab_number,3734		.ref_counts_origin = slab_origin + slab_config->data_blocks,3735		.journal_origin =3736			vdo_get_slab_journal_start_block(slab_config, slab_origin),3737		.block_count = slab_config->data_blocks,3738		.free_blocks = slab_config->data_blocks,3739		.reference_block_count =3740			vdo_get_saved_reference_count_size(slab_config->data_blocks),3741	};3742	INIT_LIST_HEAD(&slab->allocq_entry);3743 3744	result = initialize_slab_journal(slab);3745	if (result != VDO_SUCCESS) {3746		free_slab(slab);3747		return result;3748	}3749 3750	if (is_new) {3751		vdo_set_admin_state_code(&slab->state, VDO_ADMIN_STATE_NEW);3752		result = allocate_slab_counters(slab);3753		if (result != VDO_SUCCESS) {3754			free_slab(slab);3755			return result;3756		}3757	} else {3758		vdo_set_admin_state_code(&slab->state, VDO_ADMIN_STATE_NORMAL_OPERATION);3759	}3760 3761	*slab_ptr = slab;3762	return VDO_SUCCESS;3763}3764 3765/**3766 * allocate_slabs() - Allocate a new slab pointer array.3767 * @depot: The depot.3768 * @slab_count: The number of slabs the depot should have in the new array.3769 *3770 * Any existing slab pointers will be copied into the new array, and slabs will be allocated as3771 * needed. The newly allocated slabs will not be distributed for use by the block allocators.3772 *3773 * Return: VDO_SUCCESS or an error code.3774 */3775static int allocate_slabs(struct slab_depot *depot, slab_count_t slab_count)3776{3777	block_count_t slab_size;3778	bool resizing = false;3779	physical_block_number_t slab_origin;3780	int result;3781 3782	result = vdo_allocate(slab_count, struct vdo_slab *,3783			      "slab pointer array", &depot->new_slabs);3784	if (result != VDO_SUCCESS)3785		return result;3786 3787	if (depot->slabs != NULL) {3788		memcpy(depot->new_slabs, depot->slabs,3789		       depot->slab_count * sizeof(struct vdo_slab *));3790		resizing = true;3791	}3792 3793	slab_size = depot->slab_config.slab_blocks;3794	slab_origin = depot->first_block + (depot->slab_count * slab_size);3795 3796	for (depot->new_slab_count = depot->slab_count;3797	     depot->new_slab_count < slab_count;3798	     depot->new_slab_count++, slab_origin += slab_size) {3799		struct block_allocator *allocator =3800			&depot->allocators[depot->new_slab_count % depot->zone_count];3801		struct vdo_slab **slab_ptr = &depot->new_slabs[depot->new_slab_count];3802 3803		result = make_slab(slab_origin, allocator, depot->new_slab_count,3804				   resizing, slab_ptr);3805		if (result != VDO_SUCCESS)3806			return result;3807	}3808 3809	return VDO_SUCCESS;3810}3811 3812/**3813 * vdo_abandon_new_slabs() - Abandon any new slabs in this depot, freeing them as needed.3814 * @depot: The depot.3815 */3816void vdo_abandon_new_slabs(struct slab_depot *depot)3817{3818	slab_count_t i;3819 3820	if (depot->new_slabs == NULL)3821		return;3822 3823	for (i = depot->slab_count; i < depot->new_slab_count; i++)3824		free_slab(vdo_forget(depot->new_slabs[i]));3825	depot->new_slab_count = 0;3826	depot->new_size = 0;3827	vdo_free(vdo_forget(depot->new_slabs));3828}3829 3830/**3831 * get_allocator_thread_id() - Get the ID of the thread on which a given allocator operates.3832 *3833 * Implements vdo_zone_thread_getter_fn.3834 */3835static thread_id_t get_allocator_thread_id(void *context, zone_count_t zone_number)3836{3837	return ((struct slab_depot *) context)->allocators[zone_number].thread_id;3838}3839 3840/**3841 * release_recovery_journal_lock() - Request the slab journal to release the recovery journal lock3842 *                                   it may hold on a specified recovery journal block.3843 * @journal: The slab journal.3844 * @recovery_lock: The sequence number of the recovery journal block whose locks should be3845 *                 released.3846 *3847 * Return: true if the journal does hold a lock on the specified block (which it will release).3848 */3849static bool __must_check release_recovery_journal_lock(struct slab_journal *journal,3850						       sequence_number_t recovery_lock)3851{3852	if (recovery_lock > journal->recovery_lock) {3853		VDO_ASSERT_LOG_ONLY((recovery_lock < journal->recovery_lock),3854				    "slab journal recovery lock is not older than the recovery journal head");3855		return false;3856	}3857 3858	if ((recovery_lock < journal->recovery_lock) ||3859	    vdo_is_read_only(journal->slab->allocator->depot->vdo))3860		return false;3861 3862	/* All locks are held by the block which is in progress; write it. */3863	commit_tail(journal);3864	return true;3865}3866 3867/*3868 * Request a commit of all dirty tail blocks which are locking the recovery journal block the depot3869 * is seeking to release.3870 *3871 * Implements vdo_zone_action_fn.3872 */3873static void release_tail_block_locks(void *context, zone_count_t zone_number,3874				     struct vdo_completion *parent)3875{3876	struct slab_journal *journal, *tmp;3877	struct slab_depot *depot = context;3878	struct list_head *list = &depot->allocators[zone_number].dirty_slab_journals;3879 3880	list_for_each_entry_safe(journal, tmp, list, dirty_entry) {3881		if (!release_recovery_journal_lock(journal,3882						   depot->active_release_request))3883			break;3884	}3885 3886	vdo_finish_completion(parent);3887}3888 3889/**3890 * prepare_for_tail_block_commit() - Prepare to commit oldest tail blocks.3891 *3892 * Implements vdo_action_preamble_fn.3893 */3894static void prepare_for_tail_block_commit(void *context, struct vdo_completion *parent)3895{3896	struct slab_depot *depot = context;3897 3898	depot->active_release_request = depot->new_release_request;3899	vdo_finish_completion(parent);3900}3901 3902/**3903 * schedule_tail_block_commit() - Schedule a tail block commit if necessary.3904 *3905 * This method should not be called directly. Rather, call vdo_schedule_default_action() on the3906 * depot's action manager.3907 *3908 * Implements vdo_action_scheduler_fn.3909 */3910static bool schedule_tail_block_commit(void *context)3911{3912	struct slab_depot *depot = context;3913 3914	if (depot->new_release_request == depot->active_release_request)3915		return false;3916 3917	return vdo_schedule_action(depot->action_manager,3918				   prepare_for_tail_block_commit,3919				   release_tail_block_locks,3920				   NULL, NULL);3921}3922 3923/**3924 * initialize_slab_scrubber() - Initialize an allocator's slab scrubber.3925 * @allocator: The allocator being initialized3926 *3927 * Return: VDO_SUCCESS or an error.3928 */3929static int initialize_slab_scrubber(struct block_allocator *allocator)3930{3931	struct slab_scrubber *scrubber = &allocator->scrubber;3932	block_count_t slab_journal_size =3933		allocator->depot->slab_config.slab_journal_blocks;3934	char *journal_data;3935	int result;3936 3937	result = vdo_allocate(VDO_BLOCK_SIZE * slab_journal_size,3938			      char, __func__, &journal_data);3939	if (result != VDO_SUCCESS)3940		return result;3941 3942	result = allocate_vio_components(allocator->completion.vdo,3943					 VIO_TYPE_SLAB_JOURNAL,3944					 VIO_PRIORITY_METADATA,3945					 allocator, slab_journal_size,3946					 journal_data, &scrubber->vio);3947	if (result != VDO_SUCCESS) {3948		vdo_free(journal_data);3949		return result;3950	}3951 3952	INIT_LIST_HEAD(&scrubber->high_priority_slabs);3953	INIT_LIST_HEAD(&scrubber->slabs);3954	vdo_set_admin_state_code(&scrubber->admin_state, VDO_ADMIN_STATE_SUSPENDED);3955	return VDO_SUCCESS;3956}3957 3958/**3959 * initialize_slab_summary_block() - Initialize a slab_summary_block.3960 * @allocator: The allocator which owns the block.3961 * @index: The index of this block in its zone's summary.3962 *3963 * Return: VDO_SUCCESS or an error.3964 */3965static int __must_check initialize_slab_summary_block(struct block_allocator *allocator,3966						      block_count_t index)3967{3968	struct slab_summary_block *block = &allocator->summary_blocks[index];3969	int result;3970 3971	result = vdo_allocate(VDO_BLOCK_SIZE, char, __func__, &block->outgoing_entries);3972	if (result != VDO_SUCCESS)3973		return result;3974 3975	result = allocate_vio_components(allocator->depot->vdo, VIO_TYPE_SLAB_SUMMARY,3976					 VIO_PRIORITY_METADATA, NULL, 1,3977					 block->outgoing_entries, &block->vio);3978	if (result != VDO_SUCCESS)3979		return result;3980 3981	block->allocator = allocator;3982	block->entries = &allocator->summary_entries[VDO_SLAB_SUMMARY_ENTRIES_PER_BLOCK * index];3983	block->index = index;3984	return VDO_SUCCESS;3985}3986 3987static int __must_check initialize_block_allocator(struct slab_depot *depot,3988						   zone_count_t zone)3989{3990	int result;3991	block_count_t i;3992	struct block_allocator *allocator = &depot->allocators[zone];3993	struct vdo *vdo = depot->vdo;3994	block_count_t max_free_blocks = depot->slab_config.data_blocks;3995	unsigned int max_priority = (2 + ilog2(max_free_blocks));3996 3997	*allocator = (struct block_allocator) {3998		.depot = depot,3999		.zone_number = zone,4000		.thread_id = vdo->thread_config.physical_threads[zone],4001		.nonce = vdo->states.vdo.nonce,4002	};4003 4004	INIT_LIST_HEAD(&allocator->dirty_slab_journals);4005	vdo_set_admin_state_code(&allocator->state, VDO_ADMIN_STATE_NORMAL_OPERATION);4006	result = vdo_register_read_only_listener(vdo, allocator,4007						 notify_block_allocator_of_read_only_mode,4008						 allocator->thread_id);4009	if (result != VDO_SUCCESS)4010		return result;4011 4012	vdo_initialize_completion(&allocator->completion, vdo, VDO_BLOCK_ALLOCATOR_COMPLETION);4013	result = make_vio_pool(vdo, BLOCK_ALLOCATOR_VIO_POOL_SIZE, allocator->thread_id,4014			       VIO_TYPE_SLAB_JOURNAL, VIO_PRIORITY_METADATA,4015			       allocator, &allocator->vio_pool);4016	if (result != VDO_SUCCESS)4017		return result;4018 4019	result = initialize_slab_scrubber(allocator);4020	if (result != VDO_SUCCESS)4021		return result;4022 4023	result = vdo_make_priority_table(max_priority, &allocator->prioritized_slabs);4024	if (result != VDO_SUCCESS)4025		return result;4026 4027	result = vdo_allocate(VDO_SLAB_SUMMARY_BLOCKS_PER_ZONE,4028			      struct slab_summary_block, __func__,4029			      &allocator->summary_blocks);4030	if (result != VDO_SUCCESS)4031		return result;4032 4033	vdo_set_admin_state_code(&allocator->summary_state,4034				 VDO_ADMIN_STATE_NORMAL_OPERATION);4035	allocator->summary_entries = depot->summary_entries + (MAX_VDO_SLABS * zone);4036 4037	/* Initialize each summary block. */4038	for (i = 0; i < VDO_SLAB_SUMMARY_BLOCKS_PER_ZONE; i++) {4039		result = initialize_slab_summary_block(allocator, i);4040		if (result != VDO_SUCCESS)4041			return result;4042	}4043 4044	/*4045	 * Performing well atop thin provisioned storage requires either that VDO discards freed4046	 * blocks, or that the block allocator try to use slabs that already have allocated blocks4047	 * in preference to slabs that have never been opened. For reasons we have not been able to4048	 * fully understand, some SSD machines have been have been very sensitive (50% reduction in4049	 * test throughput) to very slight differences in the timing and locality of block4050	 * allocation. Assigning a low priority to unopened slabs (max_priority/2, say) would be4051	 * ideal for the story, but anything less than a very high threshold (max_priority - 1)4052	 * hurts on these machines.4053	 *4054	 * This sets the free block threshold for preferring to open an unopened slab to the binary4055	 * floor of 3/4ths the total number of data blocks in a slab, which will generally evaluate4056	 * to about half the slab size.4057	 */4058	allocator->unopened_slab_priority = (1 + ilog2((max_free_blocks * 3) / 4));4059 4060	return VDO_SUCCESS;4061}4062 4063static int allocate_components(struct slab_depot *depot,4064			       struct partition *summary_partition)4065{4066	int result;4067	zone_count_t zone;4068	slab_count_t slab_count;4069	u8 hint;4070	u32 i;4071	const struct thread_config *thread_config = &depot->vdo->thread_config;4072 4073	result = vdo_make_action_manager(depot->zone_count, get_allocator_thread_id,4074					 thread_config->journal_thread, depot,4075					 schedule_tail_block_commit,4076					 depot->vdo, &depot->action_manager);4077	if (result != VDO_SUCCESS)4078		return result;4079 4080	depot->origin = depot->first_block;4081 4082	/* block size must be a multiple of entry size */4083	BUILD_BUG_ON((VDO_BLOCK_SIZE % sizeof(struct slab_summary_entry)) != 0);4084 4085	depot->summary_origin = summary_partition->offset;4086	depot->hint_shift = vdo_get_slab_summary_hint_shift(depot->slab_size_shift);4087	result = vdo_allocate(MAXIMUM_VDO_SLAB_SUMMARY_ENTRIES,4088			      struct slab_summary_entry, __func__,4089			      &depot->summary_entries);4090	if (result != VDO_SUCCESS)4091		return result;4092 4093 4094	/* Initialize all the entries. */4095	hint = compute_fullness_hint(depot, depot->slab_config.data_blocks);4096	for (i = 0; i < MAXIMUM_VDO_SLAB_SUMMARY_ENTRIES; i++) {4097		/*4098		 * This default tail block offset must be reflected in4099		 * slabJournal.c::read_slab_journal_tail().4100		 */4101		depot->summary_entries[i] = (struct slab_summary_entry) {4102			.tail_block_offset = 0,4103			.fullness_hint = hint,4104			.load_ref_counts = false,4105			.is_dirty = false,4106		};4107	}4108 4109	slab_count = vdo_compute_slab_count(depot->first_block, depot->last_block,4110					    depot->slab_size_shift);4111	if (thread_config->physical_zone_count > slab_count) {4112		return vdo_log_error_strerror(VDO_BAD_CONFIGURATION,4113					      "%u physical zones exceeds slab count %u",4114					      thread_config->physical_zone_count,4115					      slab_count);4116	}4117 4118	/* Initialize the block allocators. */4119	for (zone = 0; zone < depot->zone_count; zone++) {4120		result = initialize_block_allocator(depot, zone);4121		if (result != VDO_SUCCESS)4122			return result;4123	}4124 4125	/* Allocate slabs. */4126	result = allocate_slabs(depot, slab_count);4127	if (result != VDO_SUCCESS)4128		return result;4129 4130	/* Use the new slabs. */4131	for (i = depot->slab_count; i < depot->new_slab_count; i++) {4132		struct vdo_slab *slab = depot->new_slabs[i];4133 4134		register_slab_with_allocator(slab->allocator, slab);4135		WRITE_ONCE(depot->slab_count, depot->slab_count + 1);4136	}4137 4138	depot->slabs = depot->new_slabs;4139	depot->new_slabs = NULL;4140	depot->new_slab_count = 0;4141 4142	return VDO_SUCCESS;4143}4144 4145/**4146 * vdo_decode_slab_depot() - Make a slab depot and configure it with the state read from the super4147 *                           block.4148 * @state: The slab depot state from the super block.4149 * @vdo: The VDO which will own the depot.4150 * @summary_partition: The partition which holds the slab summary.4151 * @depot_ptr: A pointer to hold the depot.4152 *4153 * Return: A success or error code.4154 */4155int vdo_decode_slab_depot(struct slab_depot_state_2_0 state, struct vdo *vdo,4156			  struct partition *summary_partition,4157			  struct slab_depot **depot_ptr)4158{4159	unsigned int slab_size_shift;4160	struct slab_depot *depot;4161	int result;4162 4163	/*4164	 * Calculate the bit shift for efficiently mapping block numbers to slabs. Using a shift4165	 * requires that the slab size be a power of two.4166	 */4167	block_count_t slab_size = state.slab_config.slab_blocks;4168 4169	if (!is_power_of_2(slab_size)) {4170		return vdo_log_error_strerror(UDS_INVALID_ARGUMENT,4171					      "slab size must be a power of two");4172	}4173	slab_size_shift = ilog2(slab_size);4174 4175	result = vdo_allocate_extended(struct slab_depot,4176				       vdo->thread_config.physical_zone_count,4177				       struct block_allocator, __func__, &depot);4178	if (result != VDO_SUCCESS)4179		return result;4180 4181	depot->vdo = vdo;4182	depot->old_zone_count = state.zone_count;4183	depot->zone_count = vdo->thread_config.physical_zone_count;4184	depot->slab_config = state.slab_config;4185	depot->first_block = state.first_block;4186	depot->last_block = state.last_block;4187	depot->slab_size_shift = slab_size_shift;4188 4189	result = allocate_components(depot, summary_partition);4190	if (result != VDO_SUCCESS) {4191		vdo_free_slab_depot(depot);4192		return result;4193	}4194 4195	*depot_ptr = depot;4196	return VDO_SUCCESS;4197}4198 4199static void uninitialize_allocator_summary(struct block_allocator *allocator)4200{4201	block_count_t i;4202 4203	if (allocator->summary_blocks == NULL)4204		return;4205 4206	for (i = 0; i < VDO_SLAB_SUMMARY_BLOCKS_PER_ZONE; i++) {4207		free_vio_components(&allocator->summary_blocks[i].vio);4208		vdo_free(vdo_forget(allocator->summary_blocks[i].outgoing_entries));4209	}4210 4211	vdo_free(vdo_forget(allocator->summary_blocks));4212}4213 4214/**4215 * vdo_free_slab_depot() - Destroy a slab depot.4216 * @depot: The depot to destroy.4217 */4218void vdo_free_slab_depot(struct slab_depot *depot)4219{4220	zone_count_t zone = 0;4221 4222	if (depot == NULL)4223		return;4224 4225	vdo_abandon_new_slabs(depot);4226 4227	for (zone = 0; zone < depot->zone_count; zone++) {4228		struct block_allocator *allocator = &depot->allocators[zone];4229 4230		if (allocator->eraser != NULL)4231			dm_kcopyd_client_destroy(vdo_forget(allocator->eraser));4232 4233		uninitialize_allocator_summary(allocator);4234		uninitialize_scrubber_vio(&allocator->scrubber);4235		free_vio_pool(vdo_forget(allocator->vio_pool));4236		vdo_free_priority_table(vdo_forget(allocator->prioritized_slabs));4237	}4238 4239	if (depot->slabs != NULL) {4240		slab_count_t i;4241 4242		for (i = 0; i < depot->slab_count; i++)4243			free_slab(vdo_forget(depot->slabs[i]));4244	}4245 4246	vdo_free(vdo_forget(depot->slabs));4247	vdo_free(vdo_forget(depot->action_manager));4248	vdo_free(vdo_forget(depot->summary_entries));4249	vdo_free(depot);4250}4251 4252/**4253 * vdo_record_slab_depot() - Record the state of a slab depot for encoding into the super block.4254 * @depot: The depot to encode.4255 *4256 * Return: The depot state.4257 */4258struct slab_depot_state_2_0 vdo_record_slab_depot(const struct slab_depot *depot)4259{4260	/*4261	 * If this depot is currently using 0 zones, it must have been synchronously loaded by a4262	 * tool and is now being saved. We did not load and combine the slab summary, so we still4263	 * need to do that next time we load with the old zone count rather than 0.4264	 */4265	struct slab_depot_state_2_0 state;4266	zone_count_t zones_to_record = depot->zone_count;4267 4268	if (depot->zone_count == 0)4269		zones_to_record = depot->old_zone_count;4270 4271	state = (struct slab_depot_state_2_0) {4272		.slab_config = depot->slab_config,4273		.first_block = depot->first_block,4274		.last_block = depot->last_block,4275		.zone_count = zones_to_record,4276	};4277 4278	return state;4279}4280 4281/**4282 * vdo_allocate_reference_counters() - Allocate the reference counters for all slabs in the depot.4283 *4284 * Context: This method may be called only before entering normal operation from the load thread.4285 *4286 * Return: VDO_SUCCESS or an error.4287 */4288int vdo_allocate_reference_counters(struct slab_depot *depot)4289{4290	struct slab_iterator iterator =4291		get_depot_slab_iterator(depot, depot->slab_count - 1, 0, 1);4292 4293	while (iterator.next != NULL) {4294		int result = allocate_slab_counters(next_slab(&iterator));4295 4296		if (result != VDO_SUCCESS)4297			return result;4298	}4299 4300	return VDO_SUCCESS;4301}4302 4303/**4304 * get_slab_number() - Get the number of the slab that contains a specified block.4305 * @depot: The slab depot.4306 * @pbn: The physical block number.4307 * @slab_number_ptr: A pointer to hold the slab number.4308 *4309 * Return: VDO_SUCCESS or an error.4310 */4311static int __must_check get_slab_number(const struct slab_depot *depot,4312					physical_block_number_t pbn,4313					slab_count_t *slab_number_ptr)4314{4315	slab_count_t slab_number;4316 4317	if (pbn < depot->first_block)4318		return VDO_OUT_OF_RANGE;4319 4320	slab_number = (pbn - depot->first_block) >> depot->slab_size_shift;4321	if (slab_number >= depot->slab_count)4322		return VDO_OUT_OF_RANGE;4323 4324	*slab_number_ptr = slab_number;4325	return VDO_SUCCESS;4326}4327 4328/**4329 * vdo_get_slab() - Get the slab object for the slab that contains a specified block.4330 * @depot: The slab depot.4331 * @pbn: The physical block number.4332 *4333 * Will put the VDO in read-only mode if the PBN is not a valid data block nor the zero block.4334 *4335 * Return: The slab containing the block, or NULL if the block number is the zero block or4336 * otherwise out of range.4337 */4338struct vdo_slab *vdo_get_slab(const struct slab_depot *depot,4339			      physical_block_number_t pbn)4340{4341	slab_count_t slab_number;4342	int result;4343 4344	if (pbn == VDO_ZERO_BLOCK)4345		return NULL;4346 4347	result = get_slab_number(depot, pbn, &slab_number);4348	if (result != VDO_SUCCESS) {4349		vdo_enter_read_only_mode(depot->vdo, result);4350		return NULL;4351	}4352 4353	return depot->slabs[slab_number];4354}4355 4356/**4357 * vdo_get_increment_limit() - Determine how many new references a block can acquire.4358 * @depot: The slab depot.4359 * @pbn: The physical block number that is being queried.4360 *4361 * Context: This method must be called from the physical zone thread of the PBN.4362 *4363 * Return: The number of available references.4364 */4365u8 vdo_get_increment_limit(struct slab_depot *depot, physical_block_number_t pbn)4366{4367	struct vdo_slab *slab = vdo_get_slab(depot, pbn);4368	vdo_refcount_t *counter_ptr = NULL;4369	int result;4370 4371	if ((slab == NULL) || (slab->status != VDO_SLAB_REBUILT))4372		return 0;4373 4374	result = get_reference_counter(slab, pbn, &counter_ptr);4375	if (result != VDO_SUCCESS)4376		return 0;4377 4378	if (*counter_ptr == PROVISIONAL_REFERENCE_COUNT)4379		return (MAXIMUM_REFERENCE_COUNT - 1);4380 4381	return (MAXIMUM_REFERENCE_COUNT - *counter_ptr);4382}4383 4384/**4385 * vdo_is_physical_data_block() - Determine whether the given PBN refers to a data block.4386 * @depot: The depot.4387 * @pbn: The physical block number to ask about.4388 *4389 * Return: True if the PBN corresponds to a data block.4390 */4391bool vdo_is_physical_data_block(const struct slab_depot *depot,4392				physical_block_number_t pbn)4393{4394	slab_count_t slab_number;4395	slab_block_number sbn;4396 4397	return ((pbn == VDO_ZERO_BLOCK) ||4398		((get_slab_number(depot, pbn, &slab_number) == VDO_SUCCESS) &&4399		 (slab_block_number_from_pbn(depot->slabs[slab_number], pbn, &sbn) ==4400		  VDO_SUCCESS)));4401}4402 4403/**4404 * vdo_get_slab_depot_allocated_blocks() - Get the total number of data blocks allocated across all4405 * the slabs in the depot.4406 * @depot: The slab depot.4407 *4408 * This is the total number of blocks with a non-zero reference count.4409 *4410 * Context: This may be called from any thread.4411 *4412 * Return: The total number of blocks with a non-zero reference count.4413 */4414block_count_t vdo_get_slab_depot_allocated_blocks(const struct slab_depot *depot)4415{4416	block_count_t total = 0;4417	zone_count_t zone;4418 4419	for (zone = 0; zone < depot->zone_count; zone++) {4420		/* The allocators are responsible for thread safety. */4421		total += READ_ONCE(depot->allocators[zone].allocated_blocks);4422	}4423 4424	return total;4425}4426 4427/**4428 * vdo_get_slab_depot_data_blocks() - Get the total number of data blocks in all the slabs in the4429 *                                    depot.4430 * @depot: The slab depot.4431 *4432 * Context: This may be called from any thread.4433 *4434 * Return: The total number of data blocks in all slabs.4435 */4436block_count_t vdo_get_slab_depot_data_blocks(const struct slab_depot *depot)4437{4438	return (READ_ONCE(depot->slab_count) * depot->slab_config.data_blocks);4439}4440 4441/**4442 * finish_combining_zones() - Clean up after saving out the combined slab summary.4443 * @completion: The vio which was used to write the summary data.4444 */4445static void finish_combining_zones(struct vdo_completion *completion)4446{4447	int result = completion->result;4448	struct vdo_completion *parent = completion->parent;4449 4450	free_vio(as_vio(vdo_forget(completion)));4451	vdo_fail_completion(parent, result);4452}4453 4454static void handle_combining_error(struct vdo_completion *completion)4455{4456	vio_record_metadata_io_error(as_vio(completion));4457	finish_combining_zones(completion);4458}4459 4460static void write_summary_endio(struct bio *bio)4461{4462	struct vio *vio = bio->bi_private;4463	struct vdo *vdo = vio->completion.vdo;4464 4465	continue_vio_after_io(vio, finish_combining_zones,4466			      vdo->thread_config.admin_thread);4467}4468 4469/**4470 * combine_summaries() - Treating the current entries buffer as the on-disk value of all zones,4471 *                       update every zone to the correct values for every slab.4472 * @depot: The depot whose summary entries should be combined.4473 */4474static void combine_summaries(struct slab_depot *depot)4475{4476	/*4477	 * Combine all the old summary data into the portion of the buffer corresponding to the4478	 * first zone.4479	 */4480	zone_count_t zone = 0;4481	struct slab_summary_entry *entries = depot->summary_entries;4482 4483	if (depot->old_zone_count > 1) {4484		slab_count_t entry_number;4485 4486		for (entry_number = 0; entry_number < MAX_VDO_SLABS; entry_number++) {4487			if (zone != 0) {4488				memcpy(entries + entry_number,4489				       entries + (zone * MAX_VDO_SLABS) + entry_number,4490				       sizeof(struct slab_summary_entry));4491			}4492 4493			zone++;4494			if (zone == depot->old_zone_count)4495				zone = 0;4496		}4497	}4498 4499	/* Copy the combined data to each zones's region of the buffer. */4500	for (zone = 1; zone < MAX_VDO_PHYSICAL_ZONES; zone++) {4501		memcpy(entries + (zone * MAX_VDO_SLABS), entries,4502		       MAX_VDO_SLABS * sizeof(struct slab_summary_entry));4503	}4504}4505 4506/**4507 * finish_loading_summary() - Finish loading slab summary data.4508 * @completion: The vio which was used to read the summary data.4509 *4510 * Combines the slab summary data from all the previously written zones and copies the combined4511 * summary to each partition's data region. Then writes the combined summary back out to disk. This4512 * callback is registered in load_summary_endio().4513 */4514static void finish_loading_summary(struct vdo_completion *completion)4515{4516	struct slab_depot *depot = completion->vdo->depot;4517 4518	/* Combine the summary from each zone so each zone is correct for all slabs. */4519	combine_summaries(depot);4520 4521	/* Write the combined summary back out. */4522	vdo_submit_metadata_vio(as_vio(completion), depot->summary_origin,4523				write_summary_endio, handle_combining_error,4524				REQ_OP_WRITE);4525}4526 4527static void load_summary_endio(struct bio *bio)4528{4529	struct vio *vio = bio->bi_private;4530	struct vdo *vdo = vio->completion.vdo;4531 4532	continue_vio_after_io(vio, finish_loading_summary,4533			      vdo->thread_config.admin_thread);4534}4535 4536/**4537 * load_slab_summary() - The preamble of a load operation.4538 *4539 * Implements vdo_action_preamble_fn.4540 */4541static void load_slab_summary(void *context, struct vdo_completion *parent)4542{4543	int result;4544	struct vio *vio;4545	struct slab_depot *depot = context;4546	const struct admin_state_code *operation =4547		vdo_get_current_manager_operation(depot->action_manager);4548 4549	result = create_multi_block_metadata_vio(depot->vdo, VIO_TYPE_SLAB_SUMMARY,4550						 VIO_PRIORITY_METADATA, parent,4551						 VDO_SLAB_SUMMARY_BLOCKS,4552						 (char *) depot->summary_entries, &vio);4553	if (result != VDO_SUCCESS) {4554		vdo_fail_completion(parent, result);4555		return;4556	}4557 4558	if ((operation == VDO_ADMIN_STATE_FORMATTING) ||4559	    (operation == VDO_ADMIN_STATE_LOADING_FOR_REBUILD)) {4560		finish_loading_summary(&vio->completion);4561		return;4562	}4563 4564	vdo_submit_metadata_vio(vio, depot->summary_origin, load_summary_endio,4565				handle_combining_error, REQ_OP_READ);4566}4567 4568/* Implements vdo_zone_action_fn. */4569static void load_allocator(void *context, zone_count_t zone_number,4570			   struct vdo_completion *parent)4571{4572	struct slab_depot *depot = context;4573 4574	vdo_start_loading(&depot->allocators[zone_number].state,4575			  vdo_get_current_manager_operation(depot->action_manager),4576			  parent, initiate_load);4577}4578 4579/**4580 * vdo_load_slab_depot() - Asynchronously load any slab depot state that isn't included in the4581 *                         super_block component.4582 * @depot: The depot to load.4583 * @operation: The type of load to perform.4584 * @parent: The completion to notify when the load is complete.4585 * @context: Additional context for the load operation; may be NULL.4586 *4587 * This method may be called only before entering normal operation from the load thread.4588 */4589void vdo_load_slab_depot(struct slab_depot *depot,4590			 const struct admin_state_code *operation,4591			 struct vdo_completion *parent, void *context)4592{4593	if (!vdo_assert_load_operation(operation, parent))4594		return;4595 4596	vdo_schedule_operation_with_context(depot->action_manager, operation,4597					    load_slab_summary, load_allocator,4598					    NULL, context, parent);4599}4600 4601/* Implements vdo_zone_action_fn. */4602static void prepare_to_allocate(void *context, zone_count_t zone_number,4603				struct vdo_completion *parent)4604{4605	struct slab_depot *depot = context;4606	struct block_allocator *allocator = &depot->allocators[zone_number];4607	int result;4608 4609	result = vdo_prepare_slabs_for_allocation(allocator);4610	if (result != VDO_SUCCESS) {4611		vdo_fail_completion(parent, result);4612		return;4613	}4614 4615	scrub_slabs(allocator, parent);4616}4617 4618/**4619 * vdo_prepare_slab_depot_to_allocate() - Prepare the slab depot to come online and start4620 *                                        allocating blocks.4621 * @depot: The depot to prepare.4622 * @load_type: The load type.4623 * @parent: The completion to notify when the operation is complete.4624 *4625 * This method may be called only before entering normal operation from the load thread. It must be4626 * called before allocation may proceed.4627 */4628void vdo_prepare_slab_depot_to_allocate(struct slab_depot *depot,4629					enum slab_depot_load_type load_type,4630					struct vdo_completion *parent)4631{4632	depot->load_type = load_type;4633	atomic_set(&depot->zones_to_scrub, depot->zone_count);4634	vdo_schedule_action(depot->action_manager, NULL,4635			    prepare_to_allocate, NULL, parent);4636}4637 4638/**4639 * vdo_update_slab_depot_size() - Update the slab depot to reflect its new size in memory.4640 * @depot: The depot to update.4641 *4642 * This size is saved to disk as part of the super block.4643 */4644void vdo_update_slab_depot_size(struct slab_depot *depot)4645{4646	depot->last_block = depot->new_last_block;4647}4648 4649/**4650 * vdo_prepare_to_grow_slab_depot() - Allocate new memory needed for a resize of a slab depot to4651 *                                    the given size.4652 * @depot: The depot to prepare to resize.4653 * @partition: The new depot partition4654 *4655 * Return: VDO_SUCCESS or an error.4656 */4657int vdo_prepare_to_grow_slab_depot(struct slab_depot *depot,4658				   const struct partition *partition)4659{4660	struct slab_depot_state_2_0 new_state;4661	int result;4662	slab_count_t new_slab_count;4663 4664	if ((partition->count >> depot->slab_size_shift) <= depot->slab_count)4665		return VDO_INCREMENT_TOO_SMALL;4666 4667	/* Generate the depot configuration for the new block count. */4668	VDO_ASSERT_LOG_ONLY(depot->first_block == partition->offset,4669			    "New slab depot partition doesn't change origin");4670	result = vdo_configure_slab_depot(partition, depot->slab_config,4671					  depot->zone_count, &new_state);4672	if (result != VDO_SUCCESS)4673		return result;4674 4675	new_slab_count = vdo_compute_slab_count(depot->first_block,4676						new_state.last_block,4677						depot->slab_size_shift);4678	if (new_slab_count <= depot->slab_count)4679		return vdo_log_error_strerror(VDO_INCREMENT_TOO_SMALL,4680					      "Depot can only grow");4681	if (new_slab_count == depot->new_slab_count) {4682		/* Check it out, we've already got all the new slabs allocated! */4683		return VDO_SUCCESS;4684	}4685 4686	vdo_abandon_new_slabs(depot);4687	result = allocate_slabs(depot, new_slab_count);4688	if (result != VDO_SUCCESS) {4689		vdo_abandon_new_slabs(depot);4690		return result;4691	}4692 4693	depot->new_size = partition->count;4694	depot->old_last_block = depot->last_block;4695	depot->new_last_block = new_state.last_block;4696 4697	return VDO_SUCCESS;4698}4699 4700/**4701 * finish_registration() - Finish registering new slabs now that all of the allocators have4702 *                         received their new slabs.4703 *4704 * Implements vdo_action_conclusion_fn.4705 */4706static int finish_registration(void *context)4707{4708	struct slab_depot *depot = context;4709 4710	WRITE_ONCE(depot->slab_count, depot->new_slab_count);4711	vdo_free(depot->slabs);4712	depot->slabs = depot->new_slabs;4713	depot->new_slabs = NULL;4714	depot->new_slab_count = 0;4715	return VDO_SUCCESS;4716}4717 4718/* Implements vdo_zone_action_fn. */4719static void register_new_slabs(void *context, zone_count_t zone_number,4720			       struct vdo_completion *parent)4721{4722	struct slab_depot *depot = context;4723	struct block_allocator *allocator = &depot->allocators[zone_number];4724	slab_count_t i;4725 4726	for (i = depot->slab_count; i < depot->new_slab_count; i++) {4727		struct vdo_slab *slab = depot->new_slabs[i];4728 4729		if (slab->allocator == allocator)4730			register_slab_with_allocator(allocator, slab);4731	}4732 4733	vdo_finish_completion(parent);4734}4735 4736/**4737 * vdo_use_new_slabs() - Use the new slabs allocated for resize.4738 * @depot: The depot.4739 * @parent: The object to notify when complete.4740 */4741void vdo_use_new_slabs(struct slab_depot *depot, struct vdo_completion *parent)4742{4743	VDO_ASSERT_LOG_ONLY(depot->new_slabs != NULL, "Must have new slabs to use");4744	vdo_schedule_operation(depot->action_manager,4745			       VDO_ADMIN_STATE_SUSPENDED_OPERATION,4746			       NULL, register_new_slabs,4747			       finish_registration, parent);4748}4749 4750/**4751 * stop_scrubbing() - Tell the scrubber to stop scrubbing after it finishes the slab it is4752 *                    currently working on.4753 * @scrubber: The scrubber to stop.4754 * @parent: The completion to notify when scrubbing has stopped.4755 */4756static void stop_scrubbing(struct block_allocator *allocator)4757{4758	struct slab_scrubber *scrubber = &allocator->scrubber;4759 4760	if (vdo_is_state_quiescent(&scrubber->admin_state)) {4761		vdo_finish_completion(&allocator->completion);4762	} else {4763		vdo_start_draining(&scrubber->admin_state,4764				   VDO_ADMIN_STATE_SUSPENDING,4765				   &allocator->completion, NULL);4766	}4767}4768 4769/* Implements vdo_admin_initiator_fn. */4770static void initiate_summary_drain(struct admin_state *state)4771{4772	check_summary_drain_complete(container_of(state, struct block_allocator,4773						  summary_state));4774}4775 4776static void do_drain_step(struct vdo_completion *completion)4777{4778	struct block_allocator *allocator = vdo_as_block_allocator(completion);4779 4780	vdo_prepare_completion_for_requeue(&allocator->completion, do_drain_step,4781					   handle_operation_error, allocator->thread_id,4782					   NULL);4783	switch (++allocator->drain_step) {4784	case VDO_DRAIN_ALLOCATOR_STEP_SCRUBBER:4785		stop_scrubbing(allocator);4786		return;4787 4788	case VDO_DRAIN_ALLOCATOR_STEP_SLABS:4789		apply_to_slabs(allocator, do_drain_step);4790		return;4791 4792	case VDO_DRAIN_ALLOCATOR_STEP_SUMMARY:4793		vdo_start_draining(&allocator->summary_state,4794				   vdo_get_admin_state_code(&allocator->state),4795				   completion, initiate_summary_drain);4796		return;4797 4798	case VDO_DRAIN_ALLOCATOR_STEP_FINISHED:4799		VDO_ASSERT_LOG_ONLY(!is_vio_pool_busy(allocator->vio_pool),4800				    "vio pool not busy");4801		vdo_finish_draining_with_result(&allocator->state, completion->result);4802		return;4803 4804	default:4805		vdo_finish_draining_with_result(&allocator->state, UDS_BAD_STATE);4806	}4807}4808 4809/* Implements vdo_admin_initiator_fn. */4810static void initiate_drain(struct admin_state *state)4811{4812	struct block_allocator *allocator =4813		container_of(state, struct block_allocator, state);4814 4815	allocator->drain_step = VDO_DRAIN_ALLOCATOR_START;4816	do_drain_step(&allocator->completion);4817}4818 4819/*4820 * Drain all allocator I/O. Depending upon the type of drain, some or all dirty metadata may be4821 * written to disk. The type of drain will be determined from the state of the allocator's depot.4822 *4823 * Implements vdo_zone_action_fn.4824 */4825static void drain_allocator(void *context, zone_count_t zone_number,4826			    struct vdo_completion *parent)4827{4828	struct slab_depot *depot = context;4829 4830	vdo_start_draining(&depot->allocators[zone_number].state,4831			   vdo_get_current_manager_operation(depot->action_manager),4832			   parent, initiate_drain);4833}4834 4835/**4836 * vdo_drain_slab_depot() - Drain all slab depot I/O.4837 * @depot: The depot to drain.4838 * @operation: The drain operation (flush, rebuild, suspend, or save).4839 * @parent: The completion to finish when the drain is complete.4840 *4841 * If saving, or flushing, all dirty depot metadata will be written out. If saving or suspending,4842 * the depot will be left in a suspended state.4843 */4844void vdo_drain_slab_depot(struct slab_depot *depot,4845			  const struct admin_state_code *operation,4846			  struct vdo_completion *parent)4847{4848	vdo_schedule_operation(depot->action_manager, operation,4849			       NULL, drain_allocator, NULL, parent);4850}4851 4852/**4853 * resume_scrubbing() - Tell the scrubber to resume scrubbing if it has been stopped.4854 * @allocator: The allocator being resumed.4855 */4856static void resume_scrubbing(struct block_allocator *allocator)4857{4858	int result;4859	struct slab_scrubber *scrubber = &allocator->scrubber;4860 4861	if (!has_slabs_to_scrub(scrubber)) {4862		vdo_finish_completion(&allocator->completion);4863		return;4864	}4865 4866	result = vdo_resume_if_quiescent(&scrubber->admin_state);4867	if (result != VDO_SUCCESS) {4868		vdo_fail_completion(&allocator->completion, result);4869		return;4870	}4871 4872	scrub_next_slab(scrubber);4873	vdo_finish_completion(&allocator->completion);4874}4875 4876static void do_resume_step(struct vdo_completion *completion)4877{4878	struct block_allocator *allocator = vdo_as_block_allocator(completion);4879 4880	vdo_prepare_completion_for_requeue(&allocator->completion, do_resume_step,4881					   handle_operation_error,4882					   allocator->thread_id, NULL);4883	switch (--allocator->drain_step) {4884	case VDO_DRAIN_ALLOCATOR_STEP_SUMMARY:4885		vdo_fail_completion(completion,4886				    vdo_resume_if_quiescent(&allocator->summary_state));4887		return;4888 4889	case VDO_DRAIN_ALLOCATOR_STEP_SLABS:4890		apply_to_slabs(allocator, do_resume_step);4891		return;4892 4893	case VDO_DRAIN_ALLOCATOR_STEP_SCRUBBER:4894		resume_scrubbing(allocator);4895		return;4896 4897	case VDO_DRAIN_ALLOCATOR_START:4898		vdo_finish_resuming_with_result(&allocator->state, completion->result);4899		return;4900 4901	default:4902		vdo_finish_resuming_with_result(&allocator->state, UDS_BAD_STATE);4903	}4904}4905 4906/* Implements vdo_admin_initiator_fn. */4907static void initiate_resume(struct admin_state *state)4908{4909	struct block_allocator *allocator =4910		container_of(state, struct block_allocator, state);4911 4912	allocator->drain_step = VDO_DRAIN_ALLOCATOR_STEP_FINISHED;4913	do_resume_step(&allocator->completion);4914}4915 4916/* Implements vdo_zone_action_fn. */4917static void resume_allocator(void *context, zone_count_t zone_number,4918			     struct vdo_completion *parent)4919{4920	struct slab_depot *depot = context;4921 4922	vdo_start_resuming(&depot->allocators[zone_number].state,4923			   vdo_get_current_manager_operation(depot->action_manager),4924			   parent, initiate_resume);4925}4926 4927/**4928 * vdo_resume_slab_depot() - Resume a suspended slab depot.4929 * @depot: The depot to resume.4930 * @parent: The completion to finish when the depot has resumed.4931 */4932void vdo_resume_slab_depot(struct slab_depot *depot, struct vdo_completion *parent)4933{4934	if (vdo_is_read_only(depot->vdo)) {4935		vdo_continue_completion(parent, VDO_READ_ONLY);4936		return;4937	}4938 4939	vdo_schedule_operation(depot->action_manager, VDO_ADMIN_STATE_RESUMING,4940			       NULL, resume_allocator, NULL, parent);4941}4942 4943/**4944 * vdo_commit_oldest_slab_journal_tail_blocks() - Commit all dirty tail blocks which are locking a4945 *                                                given recovery journal block.4946 * @depot: The depot.4947 * @recovery_block_number: The sequence number of the recovery journal block whose locks should be4948 *                         released.4949 *4950 * Context: This method must be called from the journal zone thread.4951 */4952void vdo_commit_oldest_slab_journal_tail_blocks(struct slab_depot *depot,4953						sequence_number_t recovery_block_number)4954{4955	if (depot == NULL)4956		return;4957 4958	depot->new_release_request = recovery_block_number;4959	vdo_schedule_default_action(depot->action_manager);4960}4961 4962/* Implements vdo_zone_action_fn. */4963static void scrub_all_unrecovered_slabs(void *context, zone_count_t zone_number,4964					struct vdo_completion *parent)4965{4966	struct slab_depot *depot = context;4967 4968	scrub_slabs(&depot->allocators[zone_number], NULL);4969	vdo_launch_completion(parent);4970}4971 4972/**4973 * vdo_scrub_all_unrecovered_slabs() - Scrub all unrecovered slabs.4974 * @depot: The depot to scrub.4975 * @parent: The object to notify when scrubbing has been launched for all zones.4976 */4977void vdo_scrub_all_unrecovered_slabs(struct slab_depot *depot,4978				     struct vdo_completion *parent)4979{4980	vdo_schedule_action(depot->action_manager, NULL,4981			    scrub_all_unrecovered_slabs,4982			    NULL, parent);4983}4984 4985/**4986 * get_block_allocator_statistics() - Get the total of the statistics from all the block allocators4987 *                                    in the depot.4988 * @depot: The slab depot.4989 *4990 * Return: The statistics from all block allocators in the depot.4991 */4992static struct block_allocator_statistics __must_check4993get_block_allocator_statistics(const struct slab_depot *depot)4994{4995	struct block_allocator_statistics totals;4996	zone_count_t zone;4997 4998	memset(&totals, 0, sizeof(totals));4999 5000	for (zone = 0; zone < depot->zone_count; zone++) {5001		const struct block_allocator *allocator = &depot->allocators[zone];5002		const struct block_allocator_statistics *stats = &allocator->statistics;5003 5004		totals.slab_count += allocator->slab_count;5005		totals.slabs_opened += READ_ONCE(stats->slabs_opened);5006		totals.slabs_reopened += READ_ONCE(stats->slabs_reopened);5007	}5008 5009	return totals;5010}5011 5012/**5013 * get_ref_counts_statistics() - Get the cumulative ref_counts statistics for the depot.5014 * @depot: The slab depot.5015 *5016 * Return: The cumulative statistics for all ref_counts in the depot.5017 */5018static struct ref_counts_statistics __must_check5019get_ref_counts_statistics(const struct slab_depot *depot)5020{5021	struct ref_counts_statistics totals;5022	zone_count_t zone;5023 5024	memset(&totals, 0, sizeof(totals));5025 5026	for (zone = 0; zone < depot->zone_count; zone++) {5027		totals.blocks_written +=5028			READ_ONCE(depot->allocators[zone].ref_counts_statistics.blocks_written);5029	}5030 5031	return totals;5032}5033 5034/**5035 * get_slab_journal_statistics() - Get the aggregated slab journal statistics for the depot.5036 * @depot: The slab depot.5037 *5038 * Return: The aggregated statistics for all slab journals in the depot.5039 */5040static struct slab_journal_statistics __must_check5041get_slab_journal_statistics(const struct slab_depot *depot)5042{5043	struct slab_journal_statistics totals;5044	zone_count_t zone;5045 5046	memset(&totals, 0, sizeof(totals));5047 5048	for (zone = 0; zone < depot->zone_count; zone++) {5049		const struct slab_journal_statistics *stats =5050			&depot->allocators[zone].slab_journal_statistics;5051 5052		totals.disk_full_count += READ_ONCE(stats->disk_full_count);5053		totals.flush_count += READ_ONCE(stats->flush_count);5054		totals.blocked_count += READ_ONCE(stats->blocked_count);5055		totals.blocks_written += READ_ONCE(stats->blocks_written);5056		totals.tail_busy_count += READ_ONCE(stats->tail_busy_count);5057	}5058 5059	return totals;5060}5061 5062/**5063 * vdo_get_slab_depot_statistics() - Get all the vdo_statistics fields that are properties of the5064 *                                   slab depot.5065 * @depot: The slab depot.5066 * @stats: The vdo statistics structure to partially fill.5067 */5068void vdo_get_slab_depot_statistics(const struct slab_depot *depot,5069				   struct vdo_statistics *stats)5070{5071	slab_count_t slab_count = READ_ONCE(depot->slab_count);5072	slab_count_t unrecovered = 0;5073	zone_count_t zone;5074 5075	for (zone = 0; zone < depot->zone_count; zone++) {5076		/* The allocators are responsible for thread safety. */5077		unrecovered += READ_ONCE(depot->allocators[zone].scrubber.slab_count);5078	}5079 5080	stats->recovery_percentage = (slab_count - unrecovered) * 100 / slab_count;5081	stats->allocator = get_block_allocator_statistics(depot);5082	stats->ref_counts = get_ref_counts_statistics(depot);5083	stats->slab_journal = get_slab_journal_statistics(depot);5084	stats->slab_summary = (struct slab_summary_statistics) {5085		.blocks_written = atomic64_read(&depot->summary_statistics.blocks_written),5086	};5087}5088 5089/**5090 * vdo_dump_slab_depot() - Dump the slab depot, in a thread-unsafe fashion.5091 * @depot: The slab depot.5092 */5093void vdo_dump_slab_depot(const struct slab_depot *depot)5094{5095	vdo_log_info("vdo slab depot");5096	vdo_log_info("  zone_count=%u old_zone_count=%u slabCount=%u active_release_request=%llu new_release_request=%llu",5097		     (unsigned int) depot->zone_count,5098		     (unsigned int) depot->old_zone_count, READ_ONCE(depot->slab_count),5099		     (unsigned long long) depot->active_release_request,5100		     (unsigned long long) depot->new_release_request);5101}5102