Blame vdo/kernel/kernelVDO.h

Packit Service 693862
/*
Packit Service 693862
 * Copyright (c) 2020 Red Hat, Inc.
Packit Service 693862
 *
Packit Service 693862
 * This program is free software; you can redistribute it and/or
Packit Service 693862
 * modify it under the terms of the GNU General Public License
Packit Service 693862
 * as published by the Free Software Foundation; either version 2
Packit Service 693862
 * of the License, or (at your option) any later version.
Packit Service 693862
 * 
Packit Service 693862
 * This program is distributed in the hope that it will be useful,
Packit Service 693862
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 693862
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 693862
 * GNU General Public License for more details.
Packit Service 693862
 * 
Packit Service 693862
 * You should have received a copy of the GNU General Public License
Packit Service 693862
 * along with this program; if not, write to the Free Software
Packit Service 693862
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit Service 693862
 * 02110-1301, USA. 
Packit Service 693862
 *
Packit Service 693862
 * $Id: //eng/vdo-releases/aluminum/src/c++/vdo/kernel/kernelVDO.h#4 $
Packit Service 693862
 */
Packit Service 693862
Packit Service 693862
#ifndef KERNEL_VDO_H
Packit Service 693862
#define KERNEL_VDO_H
Packit Service 693862
Packit Service 693862
#include "completion.h"
Packit Service 693862
#include "kernelTypes.h"
Packit Service 693862
#include "threadRegistry.h"
Packit Service 693862
#include "workQueue.h"
Packit Service 693862
Packit Service 693862
typedef struct {
Packit Service 693862
  KVDO              *kvdo;
Packit Service 693862
  ThreadID           threadID;
Packit Service 693862
  KvdoWorkQueue     *requestQueue;
Packit Service 693862
  RegisteredThread   allocatingThread;
Packit Service 693862
} KVDOThread;
Packit Service 693862
Packit Service 693862
struct kvdo {
Packit Service 693862
  KVDOThread        *threads;
Packit Service 693862
  ThreadID           initializedThreadCount;
Packit Service 693862
  KvdoWorkItem       workItem;
Packit Service 693862
  VDOAction         *action;
Packit Service 693862
  VDOCompletion     *completion;
Packit Service 693862
  // Base-code device info
Packit Service 693862
  VDO               *vdo;
Packit Service 693862
};
Packit Service 693862
Packit Service 693862
typedef enum reqQAction {
Packit Service 693862
  REQ_Q_ACTION_COMPLETION,
Packit Service 693862
  REQ_Q_ACTION_FLUSH,
Packit Service 693862
  REQ_Q_ACTION_MAP_BIO,
Packit Service 693862
  REQ_Q_ACTION_SYNC,
Packit Service 693862
  REQ_Q_ACTION_VIO_CALLBACK
Packit Service 693862
} ReqQAction;
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Initialize the base code interface.
Packit Service 693862
 *
Packit Service 693862
 * @param [in]  kvdo          The KVDO to be initialized
Packit Service 693862
 * @param [in]  threadConfig  The base-code thread configuration
Packit Service 693862
 * @param [out] reason        The reason for failure
Packit Service 693862
 *
Packit Service 693862
 * @return  VDO_SUCCESS or an error code
Packit Service 693862
 **/
Packit Service 693862
int initializeKVDO(KVDO                *kvdo,
Packit Service 693862
                   const ThreadConfig  *threadConfig,
Packit Service 693862
                   char               **reason);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Load the VDO state from disk but don't alter the on-disk state. This method
Packit Service 693862
 * is ultimately called from the constructor for devices which have not been
Packit Service 693862
 * resumed.
Packit Service 693862
 *
Packit Service 693862
 * @param [in]  kvdo                  The KVDO to be started
Packit Service 693862
 * @param [in]  common                The physical layer pointer
Packit Service 693862
 * @param [in]  loadConfig            Load-time parameters for the VDO
Packit Service 693862
 * @param [in]  vioTraceRecording     Debug flag to store
Packit Service 693862
 * @param [out] reason                The reason for failure
Packit Service 693862
 **/
Packit Service 693862
int preloadKVDO(KVDO                 *kvdo,
Packit Service 693862
                PhysicalLayer        *common,
Packit Service 693862
                const VDOLoadConfig  *loadConfig,
Packit Service 693862
                bool                  vioTraceRecording,
Packit Service 693862
                char                **reason);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Starts the base VDO instance associated with the kernel layer. This method
Packit Service 693862
 * is ultimately called from preresume the first time an instance is resumed.
Packit Service 693862
 *
Packit Service 693862
 * @param [in]  kvdo                  The KVDO to be started
Packit Service 693862
 * @param [in]  common                The physical layer pointer
Packit Service 693862
 * @param [out] reason                The reason for failure
Packit Service 693862
 *
Packit Service 693862
 * @return VDO_SUCCESS if started, otherwise error
Packit Service 693862
 */
Packit Service 693862
int startKVDO(KVDO *kvdo, PhysicalLayer *common, char **reason);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Suspend the base VDO instance associated with the kernel layer.
Packit Service 693862
 *
Packit Service 693862
 * @param kvdo  The KVDO to be suspended
Packit Service 693862
 *
Packit Service 693862
 * @return VDO_SUCCESS if stopped, otherwise error
Packit Service 693862
 **/
Packit Service 693862
int suspendKVDO(KVDO *kvdo);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Resume the base VDO instance associated with the kernel layer.
Packit Service 693862
 *
Packit Service 693862
 * @param kvdo  The KVDO to be resumed
Packit Service 693862
 *
Packit Service 693862
 * @return VDO_SUCCESS or an error
Packit Service 693862
 **/
Packit Service 693862
int resumeKVDO(KVDO *kvdo);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Shut down the base code interface. The kvdo object must first be
Packit Service 693862
 * stopped.
Packit Service 693862
 *
Packit Service 693862
 * @param kvdo         The KVDO to be shut down
Packit Service 693862
 **/
Packit Service 693862
void finishKVDO(KVDO *kvdo);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Free up storage of the base code interface. The KVDO object must
Packit Service 693862
 * first have been "finished".
Packit Service 693862
 *
Packit Service 693862
 * @param kvdo         The KVDO object to be destroyed
Packit Service 693862
 **/
Packit Service 693862
void destroyKVDO(KVDO *kvdo);
Packit Service 693862
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Dump to the kernel log any work-queue info associated with the base
Packit Service 693862
 * code.
Packit Service 693862
 *
Packit Service 693862
 * @param kvdo     The KVDO object to be examined
Packit Service 693862
 **/
Packit Service 693862
void dumpKVDOWorkQueue(KVDO *kvdo);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Get the VDO pointer for a kvdo object
Packit Service 693862
 *
Packit Service 693862
 * @param kvdo          The KVDO object
Packit Service 693862
 *
Packit Service 693862
 * @return the VDO pointer
Packit Service 693862
 */
Packit Service 693862
static inline VDO *getVDO(KVDO *kvdo)
Packit Service 693862
{
Packit Service 693862
  return kvdo->vdo;
Packit Service 693862
}
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Set whether compression is enabled.
Packit Service 693862
 *
Packit Service 693862
 * @param kvdo               The KVDO object
Packit Service 693862
 * @param enableCompression  The new compression mode
Packit Service 693862
 *
Packit Service 693862
 * @return state of compression before new value is set
Packit Service 693862
 **/
Packit Service 693862
bool setKVDOCompressing(KVDO *kvdo, bool enableCompression);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Get the current compression mode
Packit Service 693862
 *
Packit Service 693862
 * @param kvdo          The KVDO object to be queried
Packit Service 693862
 *
Packit Service 693862
 * @return whether compression is currently enabled
Packit Service 693862
 */
Packit Service 693862
bool getKVDOCompressing(KVDO *kvdo);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Gets the latest statistics gathered by the base code.
Packit Service 693862
 *
Packit Service 693862
 * @param kvdo  the KVDO object
Packit Service 693862
 * @param stats the statistics struct to fill in
Packit Service 693862
 */
Packit Service 693862
void getKVDOStatistics(KVDO *kvdo, VDOStatistics *stats);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Get the current write policy
Packit Service 693862
 *
Packit Service 693862
 * @param kvdo          The KVDO to be queried
Packit Service 693862
 *
Packit Service 693862
 * @return  the write policy in effect
Packit Service 693862
 */
Packit Service 693862
WritePolicy getKVDOWritePolicy(KVDO *kvdo);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Dump base code status information to the kernel log for debugging.
Packit Service 693862
 *
Packit Service 693862
 * @param kvdo          The KVDO to be examined
Packit Service 693862
 */
Packit Service 693862
void dumpKVDOStatus(KVDO *kvdo);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Request the base code prepare to grow the physical space.
Packit Service 693862
 *
Packit Service 693862
 * @param kvdo           The KVDO to be updated
Packit Service 693862
 * @param physicalCount  The new size
Packit Service 693862
 *
Packit Service 693862
 * @return VDO_SUCCESS or error
Packit Service 693862
 */
Packit Service 693862
int kvdoPrepareToGrowPhysical(KVDO *kvdo, BlockCount physicalCount);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Notify the base code of resized physical storage.
Packit Service 693862
 *
Packit Service 693862
 * @param kvdo           The KVDO to be updated
Packit Service 693862
 * @param physicalCount  The new size
Packit Service 693862
 *
Packit Service 693862
 * @return VDO_SUCCESS or error
Packit Service 693862
 */
Packit Service 693862
int kvdoResizePhysical(KVDO *kvdo, BlockCount physicalCount);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Request the base code prepare to grow the logical space.
Packit Service 693862
 *
Packit Service 693862
 * @param kvdo          The KVDO to be updated
Packit Service 693862
 * @param logicalCount  The new size
Packit Service 693862
 *
Packit Service 693862
 * @return VDO_SUCCESS or error
Packit Service 693862
 */
Packit Service 693862
int kvdoPrepareToGrowLogical(KVDO *kvdo, BlockCount logicalCount);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Request the base code grow the logical space.
Packit Service 693862
 *
Packit Service 693862
 * @param kvdo          The KVDO to be updated
Packit Service 693862
 * @param logicalCount  The new size
Packit Service 693862
 *
Packit Service 693862
 * @return VDO_SUCCESS or error
Packit Service 693862
 */
Packit Service 693862
int kvdoResizeLogical(KVDO *kvdo, BlockCount logicalCount);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Request the base code go read-only.
Packit Service 693862
 *
Packit Service 693862
 * @param kvdo          The KVDO to be updated
Packit Service 693862
 * @param result        The error code causing the read only
Packit Service 693862
 */
Packit Service 693862
void setKVDOReadOnly(KVDO *kvdo, int result);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Perform an extended base-code command
Packit Service 693862
 *
Packit Service 693862
 * @param kvdo          The KVDO upon which to perform the operation.
Packit Service 693862
 * @param argc          The number of arguments to the command.
Packit Service 693862
 * @param argv          The command arguments. Note that all extended
Packit Service 693862
 *                        command argv[0] strings start with "x-".
Packit Service 693862
 *
Packit Service 693862
 * @return VDO_SUCCESS or an error code
Packit Service 693862
 **/
Packit Service 693862
int performKVDOExtendedCommand(KVDO *kvdo, int argc, char **argv);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Enqueue a work item to be processed in the base code context.
Packit Service 693862
 *
Packit Service 693862
 * @param kvdo         The KVDO object in which to run the work item
Packit Service 693862
 * @param item         The work item to be run
Packit Service 693862
 * @param threadID     The thread on which to run the work item
Packit Service 693862
 **/
Packit Service 693862
void enqueueKVDOWork(KVDO *kvdo, KvdoWorkItem *item, ThreadID threadID);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Set up and enqueue a VIO's work item to be processed in the base code
Packit Service 693862
 * context.
Packit Service 693862
 *
Packit Service 693862
 * @param kvio           The VIO with the work item to be run
Packit Service 693862
 * @param work           The function pointer to execute
Packit Service 693862
 * @param statsFunction  A function pointer to record for stats, or NULL
Packit Service 693862
 * @param action         Action code, mapping to a relative priority
Packit Service 693862
 **/
Packit Service 693862
void enqueueKVIO(KVIO             *kvio,
Packit Service 693862
                 KvdoWorkFunction  work,
Packit Service 693862
                 void             *statsFunction,
Packit Service 693862
                 unsigned int      action);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Enqueue an arbitrary completion for execution on its indicated
Packit Service 693862
 * thread.
Packit Service 693862
 *
Packit Service 693862
 * @param enqueueable  The Enqueueable object containing the completion pointer
Packit Service 693862
 **/
Packit Service 693862
void kvdoEnqueue(Enqueueable *enqueueable);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Get the base-code thread index for the current execution context.
Packit Service 693862
 *
Packit Service 693862
 * @return    The thread ID, or (ThreadID)-1 if the current thread is
Packit Service 693862
 *            not a base-code thread, or in an interrupt context.
Packit Service 693862
 **/
Packit Service 693862
ThreadID kvdoGetCurrentThreadID(void);
Packit Service 693862
Packit Service 693862
/**
Packit Service 693862
 * Do one-time initialization of kernelVDO interface.
Packit Service 693862
 **/
Packit Service 693862
void initKernelVDOOnce(void);
Packit Service 693862
Packit Service 693862
#endif // KERNEL_VDO_H