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