ocf/src/ocf_data_obj_priv.h
Robert Baldyga a8e1ce8cc5 Initial commit
Signed-off-by: Robert Baldyga <robert.baldyga@intel.com>
2018-11-29 15:14:21 +01:00

116 lines
2.9 KiB
C

/*
* Copyright(c) 2012-2018 Intel Corporation
* SPDX-License-Identifier: BSD-3-Clause-Clear
*/
#ifndef __OCF_DATA_OBJ_PRIV_H__
#define __OCF_DATA_OBJ_PRIV_H__
#include "ocf_env.h"
#include "ocf_io_priv.h"
struct ocf_data_obj_type {
const struct ocf_data_obj_properties *properties;
env_allocator *allocator;
};
struct ocf_data_obj {
ocf_data_obj_type_t type;
struct ocf_data_obj_uuid uuid;
bool uuid_copy;
void *priv;
ocf_cache_t cache;
struct list_head core_pool_item;
struct {
unsigned discard_zeroes:1;
/* true if reading discarded pages returns 0 */
} features;
};
int ocf_data_obj_type_init(struct ocf_data_obj_type **type,
const struct ocf_data_obj_properties *properties);
void ocf_data_obj_type_deinit(struct ocf_data_obj_type *type);
static inline struct ocf_io *ocf_dobj_new_io(ocf_data_obj_t obj)
{
ENV_BUG_ON(!obj->type->properties->ops.new_io);
return obj->type->properties->ops.new_io(obj);
}
static inline void ocf_dobj_submit_io(struct ocf_io *io)
{
ENV_BUG_ON(!io->obj->type->properties->ops.submit_io);
io->obj->type->properties->ops.submit_io(io);
}
static inline void ocf_dobj_submit_flush(struct ocf_io *io)
{
ENV_BUG_ON(!io->obj->type->properties->ops.submit_flush);
/*
* TODO(rbaldyga): Maybe we should supply function for checking
* submit_flush availability and return -ENOTSUPP here?
*/
if (!io->obj->type->properties->ops.submit_flush)
ocf_io_end(io, 0);
else
io->obj->type->properties->ops.submit_flush(io);
}
static inline void ocf_dobj_submit_discard(struct ocf_io *io)
{
ENV_BUG_ON(!io->obj->type->properties->ops.submit_discard);
/*
* TODO(rbaldyga): Maybe we should supply function for checking
* submit_discard availability and return -ENOTSUPP here?
*/
if (!io->obj->type->properties->ops.submit_discard)
ocf_io_end(io, 0);
else
io->obj->type->properties->ops.submit_discard(io);
}
static inline void ocf_dobj_submit_metadata(struct ocf_io *io)
{
ENV_BUG_ON(!io->obj->type->properties->ops.submit_metadata);
io->obj->type->properties->ops.submit_metadata(io);
}
static inline void ocf_dobj_submit_write_zeroes(struct ocf_io *io)
{
ENV_BUG_ON(!io->obj->type->properties->ops.submit_write_zeroes);
io->obj->type->properties->ops.submit_write_zeroes(io);
}
static inline int ocf_data_obj_open(ocf_data_obj_t obj)
{
ENV_BUG_ON(!obj->type->properties->ops.open);
return obj->type->properties->ops.open(obj);
}
static inline void ocf_data_obj_close(ocf_data_obj_t obj)
{
ENV_BUG_ON(!obj->type->properties->ops.close);
obj->type->properties->ops.close(obj);
}
static inline unsigned int ocf_data_obj_get_max_io_size(ocf_data_obj_t obj)
{
ENV_BUG_ON(!obj->type->properties->ops.get_max_io_size);
return obj->type->properties->ops.get_max_io_size(obj);
}
static inline int ocf_data_obj_is_atomic(ocf_data_obj_t obj)
{
return obj->type->properties->caps.atomic_writes;
}
#endif /*__OCF_DATA_OBJ_PRIV_H__ */