|
Packit |
b55c50 |
/*
|
|
Packit |
b55c50 |
* Copyright (c) 2020 Red Hat, Inc.
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* This program is free software; you can redistribute it and/or
|
|
Packit |
b55c50 |
* modify it under the terms of the GNU General Public License
|
|
Packit |
b55c50 |
* as published by the Free Software Foundation; either version 2
|
|
Packit |
b55c50 |
* of the License, or (at your option) any later version.
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
b55c50 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
b55c50 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
b55c50 |
* GNU General Public License for more details.
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
b55c50 |
* along with this program; if not, write to the Free Software
|
|
Packit |
b55c50 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
Packit |
b55c50 |
* 02110-1301, USA.
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* $Id: //eng/uds-releases/jasper/src/uds/volumeStore.h#2 $
|
|
Packit |
b55c50 |
*/
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
#ifndef VOLUME_STORE_H
|
|
Packit |
b55c50 |
#define VOLUME_STORE_H
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
#include "common.h"
|
|
Packit |
b55c50 |
#include "compiler.h"
|
|
Packit |
b55c50 |
#include "memoryAlloc.h"
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
#ifdef __KERNEL__
|
|
Packit |
b55c50 |
#include <linux/dm-bufio.h>
|
|
Packit |
b55c50 |
#else
|
|
Packit |
b55c50 |
#include "ioRegion.h"
|
|
Packit |
b55c50 |
#endif
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
struct geometry;
|
|
Packit |
b55c50 |
struct indexLayout;
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
struct volume_store {
|
|
Packit |
b55c50 |
#ifdef __KERNEL__
|
|
Packit |
b55c50 |
struct dm_bufio_client *vs_client;
|
|
Packit |
b55c50 |
#else
|
|
Packit |
b55c50 |
IORegion *vs_region;
|
|
Packit |
b55c50 |
size_t vs_bytesPerPage;
|
|
Packit |
b55c50 |
#endif
|
|
Packit |
b55c50 |
};
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
struct volume_page {
|
|
Packit |
b55c50 |
#ifdef __KERNEL__
|
|
Packit |
b55c50 |
struct dm_buffer *vp_buffer;
|
|
Packit |
b55c50 |
#else
|
|
Packit |
b55c50 |
byte *vp_data;
|
|
Packit |
b55c50 |
#endif
|
|
Packit |
b55c50 |
};
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
/**
|
|
Packit |
b55c50 |
* Close a volume store.
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* @param volumeStore The volume store
|
|
Packit |
b55c50 |
**/
|
|
Packit |
b55c50 |
void closeVolumeStore(struct volume_store *volumeStore);
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
/**
|
|
Packit |
b55c50 |
* Uninitialize a volume page buffer.
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* @param volumePage The volume page buffer
|
|
Packit |
b55c50 |
**/
|
|
Packit |
b55c50 |
void destroyVolumePage(struct volume_page *volumePage);
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
/**
|
|
Packit |
b55c50 |
* Get a pointer to the data contained in a volume page buffer.
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* @param volumePage The volume page buffer
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* @return the address of the data
|
|
Packit |
b55c50 |
**/
|
|
Packit |
b55c50 |
__attribute__((warn_unused_result))
|
|
Packit |
b55c50 |
static INLINE byte *getPageData(const struct volume_page *volumePage)
|
|
Packit |
b55c50 |
{
|
|
Packit |
b55c50 |
#ifdef __KERNEL__
|
|
Packit |
b55c50 |
return dm_bufio_get_block_data(volumePage->vp_buffer);
|
|
Packit |
b55c50 |
#else
|
|
Packit |
b55c50 |
return volumePage->vp_data;
|
|
Packit |
b55c50 |
#endif
|
|
Packit |
b55c50 |
}
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
/**
|
|
Packit |
b55c50 |
* Initialize a volume page buffer.
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* @param geometry The volume geometry
|
|
Packit |
b55c50 |
* @param volumePage The volume page buffer
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* @return UDS_SUCCESS or an error status
|
|
Packit |
b55c50 |
**/
|
|
Packit |
b55c50 |
int initializeVolumePage(const struct geometry *geometry,
|
|
Packit |
b55c50 |
struct volume_page *volumePage)
|
|
Packit |
b55c50 |
__attribute__((warn_unused_result));
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
/**
|
|
Packit |
b55c50 |
* Open a volume store.
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* @param volumeStore The volume store
|
|
Packit |
b55c50 |
* @param layout The index layout
|
|
Packit |
b55c50 |
* @param reservedBuffers The number of buffers that can be reserved
|
|
Packit |
b55c50 |
* @param bytesPerPage The number of bytes in a volume page
|
|
Packit |
b55c50 |
**/
|
|
Packit |
b55c50 |
int openVolumeStore(struct volume_store *volumeStore,
|
|
Packit |
b55c50 |
struct indexLayout *layout,
|
|
Packit |
b55c50 |
unsigned int reservedBuffers,
|
|
Packit |
b55c50 |
size_t bytesPerPage)
|
|
Packit |
b55c50 |
__attribute__((warn_unused_result));
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
/**
|
|
Packit |
b55c50 |
* Prefetch volume pages into memory.
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* @param volumeStore The volume store
|
|
Packit |
b55c50 |
* @param physicalPage The volume page number of the first desired page
|
|
Packit |
b55c50 |
* @param pageCount The number of volume pages to prefetch
|
|
Packit |
b55c50 |
**/
|
|
Packit |
b55c50 |
void prefetchVolumePages(const struct volume_store *volumeStore,
|
|
Packit |
b55c50 |
unsigned int physicalPage,
|
|
Packit |
b55c50 |
unsigned int pageCount);
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
/**
|
|
Packit |
b55c50 |
* Prepare a buffer to write a page to the volume.
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* @param volumeStore The volume store
|
|
Packit |
b55c50 |
* @param physicalPage The volume page number of the desired page
|
|
Packit |
b55c50 |
* @param volumePage The volume page buffer
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* @return UDS_SUCCESS or an error code
|
|
Packit |
b55c50 |
**/
|
|
Packit |
b55c50 |
int prepareToWriteVolumePage(const struct volume_store *volumeStore,
|
|
Packit |
b55c50 |
unsigned int physicalPage,
|
|
Packit |
b55c50 |
struct volume_page *volumePage)
|
|
Packit |
b55c50 |
__attribute__((warn_unused_result));
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
/**
|
|
Packit |
b55c50 |
* Read a page from a volume store.
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* @param volumeStore The volume store
|
|
Packit |
b55c50 |
* @param physicalPage The volume page number of the desired page
|
|
Packit |
b55c50 |
* @param volumePage The volume page buffer
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* @return UDS_SUCCESS or an error code
|
|
Packit |
b55c50 |
**/
|
|
Packit |
b55c50 |
int readVolumePage(const struct volume_store *volumeStore,
|
|
Packit |
b55c50 |
unsigned int physicalPage,
|
|
Packit |
b55c50 |
struct volume_page *volumePage)
|
|
Packit |
b55c50 |
__attribute__((warn_unused_result));
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
/**
|
|
Packit |
b55c50 |
* Release a volume page buffer, because it will no longer be accessed before a
|
|
Packit |
b55c50 |
* call to readVolumePage or prepareToWriteVolumePage.
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* @param volumePage The volume page buffer
|
|
Packit |
b55c50 |
**/
|
|
Packit |
b55c50 |
void releaseVolumePage(struct volume_page *volumePage);
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
/**
|
|
Packit |
b55c50 |
* Swap volume pages. This is used to put the contents of a newly written
|
|
Packit |
b55c50 |
* index page (in the scratch page) into the page cache.
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* @param volumePage1 The volume page buffer
|
|
Packit |
b55c50 |
* @param volumePage2 The volume page buffer
|
|
Packit |
b55c50 |
**/
|
|
Packit |
b55c50 |
void swapVolumePages(struct volume_page *volumePage1,
|
|
Packit |
b55c50 |
struct volume_page *volumePage2);
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
/**
|
|
Packit |
b55c50 |
* Sync the volume store to storage.
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* @param volumeStore The volume store
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* @return UDS_SUCCESS or an error code
|
|
Packit |
b55c50 |
**/
|
|
Packit |
b55c50 |
int syncVolumeStore(const struct volume_store *volumeStore)
|
|
Packit |
b55c50 |
__attribute__((warn_unused_result));
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
/**
|
|
Packit |
b55c50 |
* Write a page to a volume store.
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* @param volumeStore The volume store
|
|
Packit |
b55c50 |
* @param physicalPage The volume page number of the desired page
|
|
Packit |
b55c50 |
* @param volumePage The volume page buffer
|
|
Packit |
b55c50 |
*
|
|
Packit |
b55c50 |
* @return UDS_SUCCESS or an error code
|
|
Packit |
b55c50 |
**/
|
|
Packit |
b55c50 |
int writeVolumePage(const struct volume_store *volumeStore,
|
|
Packit |
b55c50 |
unsigned int physicalPage,
|
|
Packit |
b55c50 |
struct volume_page *volumePage)
|
|
Packit |
b55c50 |
__attribute__((warn_unused_result));
|
|
Packit |
b55c50 |
|
|
Packit |
b55c50 |
#endif /* VOLUME_STORE_H */
|