Blame source/uds/volumeStore.h

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 */