|
Packit Service |
cbade1 |
/*
|
|
Packit Service |
cbade1 |
* Copyright (c) 2020 Red Hat, Inc.
|
|
Packit Service |
cbade1 |
*
|
|
Packit Service |
cbade1 |
* This program is free software; you can redistribute it and/or
|
|
Packit Service |
cbade1 |
* modify it under the terms of the GNU General Public License
|
|
Packit Service |
cbade1 |
* as published by the Free Software Foundation; either version 2
|
|
Packit Service |
cbade1 |
* of the License, or (at your option) any later version.
|
|
Packit Service |
cbade1 |
*
|
|
Packit Service |
cbade1 |
* This program is distributed in the hope that it will be useful,
|
|
Packit Service |
cbade1 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
cbade1 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
cbade1 |
* GNU General Public License for more details.
|
|
Packit Service |
cbade1 |
*
|
|
Packit Service |
cbade1 |
* You should have received a copy of the GNU General Public License
|
|
Packit Service |
cbade1 |
* along with this program; if not, write to the Free Software
|
|
Packit Service |
cbade1 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
Packit Service |
cbade1 |
* 02110-1301, USA.
|
|
Packit Service |
cbade1 |
*
|
|
Packit Service |
cbade1 |
* $Id: //eng/vdo-releases/aluminum/src/c++/vdo/base/slabDepotInternals.h#13 $
|
|
Packit Service |
cbade1 |
*/
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
#ifndef SLAB_DEPOT_INTERNALS_H
|
|
Packit Service |
cbade1 |
#define SLAB_DEPOT_INTERNALS_H
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
#include "slabDepot.h"
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
#include "atomic.h"
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
#include "actionManager.h"
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
struct slabDepot {
|
|
Packit Service |
cbade1 |
ZoneCount zoneCount;
|
|
Packit Service |
cbade1 |
ZoneCount oldZoneCount;
|
|
Packit Service |
cbade1 |
SlabConfig slabConfig;
|
|
Packit Service |
cbade1 |
SlabSummary *slabSummary;
|
|
Packit Service |
cbade1 |
ReadOnlyNotifier *readOnlyNotifier;
|
|
Packit Service |
cbade1 |
ActionManager *actionManager;
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
PhysicalBlockNumber firstBlock;
|
|
Packit Service |
cbade1 |
PhysicalBlockNumber lastBlock;
|
|
Packit Service |
cbade1 |
PhysicalBlockNumber origin;
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
/** slabSize == (1 << slabSizeShift) */
|
|
Packit Service |
cbade1 |
unsigned int slabSizeShift;
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
/** Determines how slabs should be queued during load */
|
|
Packit Service |
cbade1 |
SlabDepotLoadType loadType;
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
/** The state for notifying slab journals to release recovery journal */
|
|
Packit Service |
cbade1 |
SequenceNumber activeReleaseRequest;
|
|
Packit Service |
cbade1 |
SequenceNumber newReleaseRequest;
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
/** The completion for scrubbing */
|
|
Packit Service |
cbade1 |
VDOCompletion scrubbingCompletion;
|
|
Packit Service |
cbade1 |
Atomic32 zonesToScrub;
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
/** Cached journal pointer for slab creation */
|
|
Packit Service |
cbade1 |
RecoveryJournal *journal;
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
/** Array of pointers to individually allocated slabs */
|
|
Packit Service |
cbade1 |
Slab **slabs;
|
|
Packit Service |
cbade1 |
/** The number of slabs currently allocated and stored in 'slabs' */
|
|
Packit Service |
cbade1 |
SlabCount slabCount;
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
/** Array of pointers to a larger set of slabs (used during resize) */
|
|
Packit Service |
cbade1 |
Slab **newSlabs;
|
|
Packit Service |
cbade1 |
/** The number of slabs currently allocated and stored in 'newSlabs' */
|
|
Packit Service |
cbade1 |
SlabCount newSlabCount;
|
|
Packit Service |
cbade1 |
/** The size that 'newSlabs' was allocated for */
|
|
Packit Service |
cbade1 |
BlockCount newSize;
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
/** The last block before resize, for rollback */
|
|
Packit Service |
cbade1 |
PhysicalBlockNumber oldLastBlock;
|
|
Packit Service |
cbade1 |
/** The last block after resize, for resize */
|
|
Packit Service |
cbade1 |
PhysicalBlockNumber newLastBlock;
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
/** The block allocators for this depot */
|
|
Packit Service |
cbade1 |
BlockAllocator *allocators[];
|
|
Packit Service |
cbade1 |
};
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
/**
|
|
Packit Service |
cbade1 |
* Destroy a slab.
|
|
Packit Service |
cbade1 |
*
|
|
Packit Service |
cbade1 |
* @param slab The slab to destroy
|
|
Packit Service |
cbade1 |
**/
|
|
Packit Service |
cbade1 |
void destroySlab(Slab *slab);
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
/**
|
|
Packit Service |
cbade1 |
* Inform a slab's depot that the slab has been created.
|
|
Packit Service |
cbade1 |
*
|
|
Packit Service |
cbade1 |
* @param slab The slab to register
|
|
Packit Service |
cbade1 |
**/
|
|
Packit Service |
cbade1 |
void registerSlabWithDepot(Slab *slab);
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
/**
|
|
Packit Service |
cbade1 |
* Notify a slab depot that one of its allocators has finished scrubbing slabs.
|
|
Packit Service |
cbade1 |
* This method should only be called if the scrubbing was successful. This
|
|
Packit Service |
cbade1 |
* callback is registered by each block allocator in
|
|
Packit Service |
cbade1 |
* scrubAllUnrecoveredSlabsInZone().
|
|
Packit Service |
cbade1 |
*
|
|
Packit Service |
cbade1 |
* @param completion A completion whose parent must be a slab depot
|
|
Packit Service |
cbade1 |
**/
|
|
Packit Service |
cbade1 |
void notifyZoneFinishedScrubbing(VDOCompletion *completion);
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
/**
|
|
Packit Service |
cbade1 |
* Check whether two depots are equivalent (i.e. represent the same
|
|
Packit Service |
cbade1 |
* state and have the same reference counter). This method is used for unit
|
|
Packit Service |
cbade1 |
* testing.
|
|
Packit Service |
cbade1 |
*
|
|
Packit Service |
cbade1 |
* @param depotA The first depot to compare
|
|
Packit Service |
cbade1 |
* @param depotB The second depot to compare
|
|
Packit Service |
cbade1 |
*
|
|
Packit Service |
cbade1 |
* @return true if the two depots are equivalent
|
|
Packit Service |
cbade1 |
**/
|
|
Packit Service |
cbade1 |
bool areEquivalentDepots(SlabDepot *depotA, SlabDepot *depotB)
|
|
Packit Service |
cbade1 |
__attribute__((warn_unused_result));
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
/**
|
|
Packit Service |
cbade1 |
* Start allocating from the highest numbered slab in each zone.
|
|
Packit Service |
cbade1 |
*
|
|
Packit Service |
cbade1 |
* @param depot The depot
|
|
Packit Service |
cbade1 |
**/
|
|
Packit Service |
cbade1 |
void allocateFromLastSlab(SlabDepot *depot);
|
|
Packit Service |
cbade1 |
|
|
Packit Service |
cbade1 |
#endif /* SLAB_DEPOT_INTERNALS_H */
|