Blame source/vdo/base/journalPoint.h

Packit Service 75d76b
/*
Packit Service 75d76b
 * Copyright (c) 2020 Red Hat, Inc.
Packit Service 75d76b
 *
Packit Service 75d76b
 * This program is free software; you can redistribute it and/or
Packit Service 75d76b
 * modify it under the terms of the GNU General Public License
Packit Service 75d76b
 * as published by the Free Software Foundation; either version 2
Packit Service 75d76b
 * of the License, or (at your option) any later version.
Packit Service 75d76b
 * 
Packit Service 75d76b
 * This program is distributed in the hope that it will be useful,
Packit Service 75d76b
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 75d76b
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 75d76b
 * GNU General Public License for more details.
Packit Service 75d76b
 * 
Packit Service 75d76b
 * You should have received a copy of the GNU General Public License
Packit Service 75d76b
 * along with this program; if not, write to the Free Software
Packit Service 75d76b
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit Service 75d76b
 * 02110-1301, USA. 
Packit Service 75d76b
 *
Packit Service 75d76b
 * $Id: //eng/vdo-releases/aluminum/src/c++/vdo/base/journalPoint.h#2 $
Packit Service 75d76b
 */
Packit Service 75d76b
Packit Service 75d76b
#ifndef JOURNAL_POINT_H
Packit Service 75d76b
#define JOURNAL_POINT_H
Packit Service 75d76b
Packit Service 75d76b
#include "numeric.h"
Packit Service 75d76b
#include "types.h"
Packit Service 75d76b
Packit Service 75d76b
typedef uint16_t JournalEntryCount;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * The absolute position of an entry in a recovery journal or slab journal.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef struct {
Packit Service 75d76b
  SequenceNumber    sequenceNumber;
Packit Service 75d76b
  JournalEntryCount entryCount;
Packit Service 75d76b
} JournalPoint;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A packed, platform-independent encoding of a JournalPoint.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef struct {
Packit Service 75d76b
  /**
Packit Service 75d76b
   * The packed representation is the little-endian 64-bit representation of
Packit Service 75d76b
   * the low-order 48 bits of the sequence number, shifted up 16 bits, or'ed
Packit Service 75d76b
   * with the 16-bit entry count.
Packit Service 75d76b
   *
Packit Service 75d76b
   * Very long-term, the top 16 bits of the sequence number may not always be
Packit Service 75d76b
   * zero, as this encoding assumes--see BZ 1523240.
Packit Service 75d76b
   **/
Packit Service 75d76b
  byte encodedPoint[8];
Packit Service 75d76b
} __attribute__((packed)) PackedJournalPoint;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Move the given journal point forward by one entry.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param point            the journal point to adjust
Packit Service 75d76b
 * @param entriesPerBlock  the number of entries in one full block
Packit Service 75d76b
 **/
Packit Service 75d76b
static inline void advanceJournalPoint(JournalPoint      *point,
Packit Service 75d76b
                                       JournalEntryCount  entriesPerBlock)
Packit Service 75d76b
{
Packit Service 75d76b
  point->entryCount++;
Packit Service 75d76b
  if (point->entryCount == entriesPerBlock) {
Packit Service 75d76b
    point->sequenceNumber++;
Packit Service 75d76b
    point->entryCount = 0;
Packit Service 75d76b
  }
Packit Service 75d76b
}
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Check whether a journal point is valid.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param point  the journal point
Packit Service 75d76b
 *
Packit Service 75d76b
 * @return true if the journal point is valid
Packit Service 75d76b
 **/
Packit Service 75d76b
static inline bool isValidJournalPoint(const JournalPoint *point)
Packit Service 75d76b
{
Packit Service 75d76b
  return ((point != NULL) && (point->sequenceNumber > 0));
Packit Service 75d76b
}
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Check whether the first point precedes the second point.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param first   the first journal point
Packit Service 75d76b
 * @param second  the second journal point
Packit Service 75d76b
Packit Service 75d76b
 *
Packit Service 75d76b
 * @return true if the first point precedes the second point.
Packit Service 75d76b
 **/
Packit Service 75d76b
static inline bool beforeJournalPoint(const JournalPoint *first,
Packit Service 75d76b
                                      const JournalPoint *second)
Packit Service 75d76b
{
Packit Service 75d76b
  return ((first->sequenceNumber < second->sequenceNumber)
Packit Service 75d76b
          || ((first->sequenceNumber == second->sequenceNumber)
Packit Service 75d76b
              && (first->entryCount < second->entryCount)));
Packit Service 75d76b
}
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Check whether the first point is the same as the second point.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param first   the first journal point
Packit Service 75d76b
 * @param second  the second journal point
Packit Service 75d76b
 *
Packit Service 75d76b
 * @return true if both points reference the same logical
Packit Service 75d76b
 *         position of an entry the journal
Packit Service 75d76b
 **/
Packit Service 75d76b
static inline bool areEquivalentJournalPoints(const JournalPoint *first,
Packit Service 75d76b
                                              const JournalPoint *second)
Packit Service 75d76b
{
Packit Service 75d76b
  return ((first->sequenceNumber == second->sequenceNumber)
Packit Service 75d76b
          && (first->entryCount  == second->entryCount));
Packit Service 75d76b
}
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Encode the journal location represented by a JournalPoint into a
Packit Service 75d76b
 * PackedJournalPoint.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param unpacked  The unpacked input point
Packit Service 75d76b
 * @param packed    The packed output point
Packit Service 75d76b
 **/
Packit Service 75d76b
static inline void packJournalPoint(const JournalPoint *unpacked,
Packit Service 75d76b
                                    PackedJournalPoint *packed)
Packit Service 75d76b
{
Packit Service 75d76b
  uint64_t native = ((unpacked->sequenceNumber << 16) | unpacked->entryCount);
Packit Service 75d76b
  storeUInt64LE(packed->encodedPoint, native);
Packit Service 75d76b
}
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Decode the journal location represented by a PackedJournalPoint into a
Packit Service 75d76b
 * JournalPoint.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param packed    The packed input point
Packit Service 75d76b
 * @param unpacked  The unpacked output point
Packit Service 75d76b
 **/
Packit Service 75d76b
static inline void unpackJournalPoint(const PackedJournalPoint *packed,
Packit Service 75d76b
                                      JournalPoint             *unpacked)
Packit Service 75d76b
{
Packit Service 75d76b
  uint64_t native          = getUInt64LE(packed->encodedPoint);
Packit Service 75d76b
  unpacked->sequenceNumber = (native >> 16);
Packit Service 75d76b
  unpacked->entryCount     = (native & 0xffff);
Packit Service 75d76b
}
Packit Service 75d76b
Packit Service 75d76b
#endif // JOURNAL_POINT_H