Blame source/vdo/base/compressedBlock.h

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/compressedBlock.h#3 $
Packit Service 310c69
 */
Packit Service 310c69
Packit Service 310c69
#ifndef COMPRESSED_BLOCK_H
Packit Service 310c69
#define COMPRESSED_BLOCK_H
Packit Service 310c69
Packit Service 310c69
#include "blockMappingState.h"
Packit Service 310c69
#include "header.h"
Packit Service 310c69
Packit Service 310c69
/**
Packit Service 310c69
 * The header of a compressed block.
Packit Service 310c69
 **/
Packit Service 310c69
typedef union __attribute__((packed)) {
Packit Service 310c69
  struct __attribute__((packed)) {
Packit Service 310c69
    /** Unsigned 32-bit major and minor versions, in little-endian byte order */
Packit Service 310c69
    PackedVersionNumber version;
Packit Service 310c69
Packit Service 310c69
    /** List of unsigned 16-bit compressed block sizes, in little-endian order */
Packit Service 310c69
    byte sizes[MAX_COMPRESSION_SLOTS][2];
Packit Service 310c69
  } fields;
Packit Service 310c69
Packit Service 310c69
  // A raw view of the packed encoding.
Packit Service 310c69
  byte raw[4 + 4 + (2 * MAX_COMPRESSION_SLOTS)];
Packit Service 310c69
Packit Service 310c69
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
Packit Service 310c69
  // This view is only valid on little-endian machines and is only present for
Packit Service 310c69
  // ease of directly examining compressed block headers in GDB.
Packit Service 310c69
  struct __attribute__((packed)) {
Packit Service 310c69
    VersionNumber version;
Packit Service 310c69
    uint16_t      sizes[MAX_COMPRESSION_SLOTS];
Packit Service 310c69
  } littleEndian;
Packit Service 310c69
#endif
Packit Service 310c69
} CompressedBlockHeader;
Packit Service 310c69
Packit Service 310c69
/**
Packit Service 310c69
 * The compressed block overlay.
Packit Service 310c69
 **/
Packit Service 310c69
typedef struct {
Packit Service 310c69
  CompressedBlockHeader header;
Packit Service 310c69
  char                  data[];
Packit Service 310c69
} __attribute__((packed)) CompressedBlock;
Packit Service 310c69
Packit Service 310c69
/**
Packit Service 310c69
 * Initializes/resets a compressed block header.
Packit Service 310c69
 *
Packit Service 310c69
 * @param header        the header
Packit Service 310c69
 *
Packit Service 310c69
 * When done, the version number is set to the current version, and all
Packit Service 310c69
 * fragments are empty.
Packit Service 310c69
 **/
Packit Service 310c69
void resetCompressedBlockHeader(CompressedBlockHeader *header);
Packit Service 310c69
Packit Service 310c69
/**
Packit Service 310c69
 * Get a reference to a compressed fragment from a compression block.
Packit Service 310c69
 *
Packit Service 310c69
 * @param [in]  mappingState    the mapping state for the look up
Packit Service 310c69
 * @param [in]  buffer          buffer that contains compressed data
Packit Service 310c69
 * @param [in]  blockSize       size of a data block
Packit Service 310c69
 * @param [out] fragmentOffset  the offset of the fragment within a
Packit Service 310c69
 *                              compressed block
Packit Service 310c69
 * @param [out] fragmentSize    the size of the fragment
Packit Service 310c69
 *
Packit Service 310c69
 * @return If a valid compressed fragment is found, VDO_SUCCESS;
Packit Service 310c69
 *         otherwise, VDO_INVALID_FRAGMENT if the fragment is invalid.
Packit Service 310c69
 **/
Packit Service 310c69
int getCompressedBlockFragment(BlockMappingState  mappingState,
Packit Service 310c69
                               char              *buffer,
Packit Service 310c69
                               BlockSize          blockSize,
Packit Service 310c69
                               uint16_t          *fragmentOffset,
Packit Service 310c69
                               uint16_t          *fragmentSize);
Packit Service 310c69
Packit Service 310c69
/**
Packit Service 310c69
 * Copy a fragment into the compressed block.
Packit Service 310c69
 *
Packit Service 310c69
 * @param block      the compressed block
Packit Service 310c69
 * @param fragment   the number of the fragment
Packit Service 310c69
 * @param offset     the byte offset of the fragment in the data area
Packit Service 310c69
 * @param data       a pointer to the compressed data
Packit Service 310c69
 * @param size       the size of the data
Packit Service 310c69
 *
Packit Service 310c69
 * @note no bounds checking -- the data better fit without smashing other stuff
Packit Service 310c69
 **/
Packit Service 310c69
void putCompressedBlockFragment(CompressedBlock *block,
Packit Service 310c69
                                unsigned int     fragment,
Packit Service 310c69
                                uint16_t         offset,
Packit Service 310c69
                                const char      *data,
Packit Service 310c69
                                uint16_t         size);
Packit Service 310c69
Packit Service 310c69
#endif // COMPRESSED_BLOCK_H