|
Packit Service |
310c69 |
/*
|
|
Packit Service |
310c69 |
* Copyright (c) 2020 Red Hat, Inc.
|
|
Packit Service |
310c69 |
*
|
|
Packit Service |
310c69 |
* This program is free software; you can redistribute it and/or
|
|
Packit Service |
310c69 |
* modify it under the terms of the GNU General Public License
|
|
Packit Service |
310c69 |
* as published by the Free Software Foundation; either version 2
|
|
Packit Service |
310c69 |
* of the License, or (at your option) any later version.
|
|
Packit Service |
310c69 |
*
|
|
Packit Service |
310c69 |
* This program is distributed in the hope that it will be useful,
|
|
Packit Service |
310c69 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
310c69 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
310c69 |
* GNU General Public License for more details.
|
|
Packit Service |
310c69 |
*
|
|
Packit Service |
310c69 |
* You should have received a copy of the GNU General Public License
|
|
Packit Service |
310c69 |
* along with this program; if not, write to the Free Software
|
|
Packit Service |
310c69 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
Packit Service |
310c69 |
* 02110-1301, USA.
|
|
Packit Service |
310c69 |
*
|
|
Packit Service |
310c69 |
* $Id: //eng/vdo-releases/aluminum/src/c++/vdo/base/blockMapTree.h#7 $
|
|
Packit Service |
310c69 |
*/
|
|
Packit Service |
310c69 |
|
|
Packit Service |
310c69 |
#ifndef BLOCK_MAP_TREE_H
|
|
Packit Service |
310c69 |
#define BLOCK_MAP_TREE_H
|
|
Packit Service |
310c69 |
|
|
Packit Service |
310c69 |
#include "constants.h"
|
|
Packit Service |
310c69 |
#include "types.h"
|
|
Packit Service |
310c69 |
|
|
Packit Service |
310c69 |
typedef struct treePage TreePage;
|
|
Packit Service |
310c69 |
|
|
Packit Service |
310c69 |
/**
|
|
Packit Service |
310c69 |
* Intialize a BlockMapTreeZone.
|
|
Packit Service |
310c69 |
*
|
|
Packit Service |
310c69 |
* @param zone The BlockMapZone of the tree zone to intialize
|
|
Packit Service |
310c69 |
* @param layer The physical layer
|
|
Packit Service |
310c69 |
* @param maximumAge The number of journal blocks before a dirtied page
|
|
Packit Service |
310c69 |
* is considered old and may be written out
|
|
Packit Service |
310c69 |
*
|
|
Packit Service |
310c69 |
* @return VDO_SUCCESS or an error
|
|
Packit Service |
310c69 |
**/
|
|
Packit Service |
310c69 |
int initializeTreeZone(BlockMapZone *zone,
|
|
Packit Service |
310c69 |
PhysicalLayer *layer,
|
|
Packit Service |
310c69 |
BlockCount maximumAge)
|
|
Packit Service |
310c69 |
__attribute__((warn_unused_result));
|
|
Packit Service |
310c69 |
|
|
Packit Service |
310c69 |
/**
|
|
Packit Service |
310c69 |
* Clean up a BlockMapTreeZone.
|
|
Packit Service |
310c69 |
*
|
|
Packit Service |
310c69 |
* @param treeZone The zone to clean up
|
|
Packit Service |
310c69 |
**/
|
|
Packit Service |
310c69 |
void uninitializeBlockMapTreeZone(BlockMapTreeZone *treeZone);
|
|
Packit Service |
310c69 |
|
|
Packit Service |
310c69 |
/**
|
|
Packit Service |
310c69 |
* Set the initial dirty period for a tree zone.
|
|
Packit Service |
310c69 |
*
|
|
Packit Service |
310c69 |
* @param treeZone The tree zone
|
|
Packit Service |
310c69 |
* @param period The initial dirty period to set
|
|
Packit Service |
310c69 |
**/
|
|
Packit Service |
310c69 |
void setTreeZoneInitialPeriod(BlockMapTreeZone *treeZone,
|
|
Packit Service |
310c69 |
SequenceNumber period);
|
|
Packit Service |
310c69 |
|
|
Packit Service |
310c69 |
/**
|
|
Packit Service |
310c69 |
* Check whether a tree zone is active (i.e. has any active lookups,
|
|
Packit Service |
310c69 |
* outstanding I/O, or pending I/O).
|
|
Packit Service |
310c69 |
*
|
|
Packit Service |
310c69 |
* @param zone The zone to check
|
|
Packit Service |
310c69 |
*
|
|
Packit Service |
310c69 |
* @return true if the zone is active
|
|
Packit Service |
310c69 |
**/
|
|
Packit Service |
310c69 |
bool isTreeZoneActive(BlockMapTreeZone *zone)
|
|
Packit Service |
310c69 |
__attribute__((warn_unused_result));
|
|
Packit Service |
310c69 |
|
|
Packit Service |
310c69 |
/**
|
|
Packit Service |
310c69 |
* Advance the dirty period for a tree zone.
|
|
Packit Service |
310c69 |
*
|
|
Packit Service |
310c69 |
* @param zone The BlockMapTreeZone to advance
|
|
Packit Service |
310c69 |
* @param period The new dirty period
|
|
Packit Service |
310c69 |
**/
|
|
Packit Service |
310c69 |
void advanceZoneTreePeriod(BlockMapTreeZone *zone, SequenceNumber period);
|
|
Packit Service |
310c69 |
|
|
Packit Service |
310c69 |
/**
|
|
Packit Service |
310c69 |
* Drain the zone trees, i.e. ensure that all I/O is quiesced. If required by
|
|
Packit Service |
310c69 |
* the drain type, all dirty block map trees will be written to disk. This
|
|
Packit Service |
310c69 |
* method must not be called when lookups are active.
|
|
Packit Service |
310c69 |
*
|
|
Packit Service |
310c69 |
* @param zone The BlockMapTreeZone to drain
|
|
Packit Service |
310c69 |
**/
|
|
Packit Service |
310c69 |
void drainZoneTrees(BlockMapTreeZone *zone);
|
|
Packit Service |
310c69 |
|
|
Packit Service |
310c69 |
/**
|
|
Packit Service |
310c69 |
* Look up the PBN of the block map page for a DataVIO's LBN in the arboreal
|
|
Packit Service |
310c69 |
* block map. If necessary, the block map page will be allocated. Also, the
|
|
Packit Service |
310c69 |
* ancestors of the block map page will be allocated or loaded if necessary.
|
|
Packit Service |
310c69 |
*
|
|
Packit Service |
310c69 |
* @param dataVIO The DataVIO requesting the lookup
|
|
Packit Service |
310c69 |
**/
|
|
Packit Service |
310c69 |
void lookupBlockMapPBN(DataVIO *dataVIO);
|
|
Packit Service |
310c69 |
|
|
Packit Service |
310c69 |
/**
|
|
Packit Service |
310c69 |
* Find the PBN of a leaf block map page. This method may only be used after
|
|
Packit Service |
310c69 |
* all allocated tree pages have been loaded, otherwise, it may give the wrong
|
|
Packit Service |
310c69 |
* answer (0).
|
|
Packit Service |
310c69 |
*
|
|
Packit Service |
310c69 |
* @param map The block map containing the forest
|
|
Packit Service |
310c69 |
* @param pageNumber The page number of the desired block map page
|
|
Packit Service |
310c69 |
*
|
|
Packit Service |
310c69 |
* @return The PBN of the page
|
|
Packit Service |
310c69 |
**/
|
|
Packit Service |
310c69 |
PhysicalBlockNumber findBlockMapPagePBN(BlockMap *map, PageNumber pageNumber);
|
|
Packit Service |
310c69 |
|
|
Packit Service |
310c69 |
/**
|
|
Packit Service |
310c69 |
* Write a tree page or indicate that it has been re-dirtied if it is already
|
|
Packit Service |
310c69 |
* being written. This method is used when correcting errors in the tree during
|
|
Packit Service |
310c69 |
* read-only rebuild.
|
|
Packit Service |
310c69 |
*
|
|
Packit Service |
310c69 |
* @param page The page to write
|
|
Packit Service |
310c69 |
* @param zone The tree zone managing the page
|
|
Packit Service |
310c69 |
**/
|
|
Packit Service |
310c69 |
void writeTreePage(TreePage *page, BlockMapTreeZone *zone);
|
|
Packit Service |
310c69 |
|
|
Packit Service |
310c69 |
#endif // BLOCK_MAP_TREE_H
|