2013-03-02 02:45:51 +04:00
/*
* Copyright ( C ) 2012 Red Hat . All rights reserved .
*
* This file is released under the GPL .
*/
# ifndef DM_CACHE_POLICY_INTERNAL_H
# define DM_CACHE_POLICY_INTERNAL_H
2015-05-15 17:22:02 +03:00
# include <linux/vmalloc.h>
2013-03-02 02:45:51 +04:00
# include "dm-cache-policy.h"
/*----------------------------------------------------------------*/
2016-12-15 12:57:31 +03:00
static inline int policy_lookup ( struct dm_cache_policy * p , dm_oblock_t oblock , dm_cblock_t * cblock ,
int data_dir , bool fast_copy , bool * background_queued )
2013-03-02 02:45:51 +04:00
{
2016-12-15 12:57:31 +03:00
return p - > lookup ( p , oblock , cblock , data_dir , fast_copy , background_queued ) ;
2013-03-02 02:45:51 +04:00
}
2016-12-15 12:57:31 +03:00
static inline int policy_lookup_with_work ( struct dm_cache_policy * p ,
dm_oblock_t oblock , dm_cblock_t * cblock ,
int data_dir , bool fast_copy ,
struct policy_work * * work )
2013-03-02 02:45:51 +04:00
{
2016-12-15 12:57:31 +03:00
if ( ! p - > lookup_with_work ) {
* work = NULL ;
return p - > lookup ( p , oblock , cblock , data_dir , fast_copy , NULL ) ;
}
2013-03-02 02:45:51 +04:00
2016-12-15 12:57:31 +03:00
return p - > lookup_with_work ( p , oblock , cblock , data_dir , fast_copy , work ) ;
2013-03-02 02:45:51 +04:00
}
2016-12-15 12:57:31 +03:00
static inline int policy_get_background_work ( struct dm_cache_policy * p ,
bool idle , struct policy_work * * result )
2013-03-02 02:45:51 +04:00
{
2016-12-15 12:57:31 +03:00
return p - > get_background_work ( p , idle , result ) ;
2013-03-02 02:45:51 +04:00
}
2016-12-15 12:57:31 +03:00
static inline void policy_complete_background_work ( struct dm_cache_policy * p ,
struct policy_work * work ,
bool success )
2013-03-02 02:45:51 +04:00
{
2016-12-15 12:57:31 +03:00
return p - > complete_background_work ( p , work , success ) ;
2013-03-02 02:45:51 +04:00
}
2016-12-15 12:57:31 +03:00
static inline void policy_set_dirty ( struct dm_cache_policy * p , dm_cblock_t cblock )
2013-03-02 02:45:51 +04:00
{
2016-12-15 12:57:31 +03:00
p - > set_dirty ( p , cblock ) ;
2013-03-02 02:45:51 +04:00
}
2016-12-15 12:57:31 +03:00
static inline void policy_clear_dirty ( struct dm_cache_policy * p , dm_cblock_t cblock )
2013-03-02 02:45:51 +04:00
{
2016-12-15 12:57:31 +03:00
p - > clear_dirty ( p , cblock ) ;
2013-03-02 02:45:51 +04:00
}
2016-12-15 12:57:31 +03:00
static inline int policy_load_mapping ( struct dm_cache_policy * p ,
dm_oblock_t oblock , dm_cblock_t cblock ,
bool dirty , uint32_t hint , bool hint_valid )
2013-03-02 02:45:51 +04:00
{
2016-12-15 12:57:31 +03:00
return p - > load_mapping ( p , oblock , cblock , dirty , hint , hint_valid ) ;
2013-03-02 02:45:51 +04:00
}
2016-12-15 12:57:31 +03:00
static inline int policy_invalidate_mapping ( struct dm_cache_policy * p ,
dm_cblock_t cblock )
2013-11-08 20:36:17 +04:00
{
2016-12-15 12:57:31 +03:00
return p - > invalidate_mapping ( p , cblock ) ;
2013-11-08 20:36:17 +04:00
}
2016-12-15 12:57:31 +03:00
static inline uint32_t policy_get_hint ( struct dm_cache_policy * p ,
dm_cblock_t cblock )
2013-03-02 02:45:51 +04:00
{
2016-12-15 12:57:31 +03:00
return p - > get_hint ? p - > get_hint ( p , cblock ) : 0 ;
2013-03-02 02:45:51 +04:00
}
static inline dm_cblock_t policy_residency ( struct dm_cache_policy * p )
{
return p - > residency ( p ) ;
}
2015-05-29 12:20:56 +03:00
static inline void policy_tick ( struct dm_cache_policy * p , bool can_block )
2013-03-02 02:45:51 +04:00
{
if ( p - > tick )
2015-05-29 12:20:56 +03:00
return p - > tick ( p , can_block ) ;
2013-03-02 02:45:51 +04:00
}
2015-04-22 23:42:35 +03:00
static inline int policy_emit_config_values ( struct dm_cache_policy * p , char * result ,
unsigned maxlen , ssize_t * sz_ptr )
2013-03-02 02:45:51 +04:00
{
2015-04-22 23:42:35 +03:00
ssize_t sz = * sz_ptr ;
2013-03-02 02:45:51 +04:00
if ( p - > emit_config_values )
2015-04-22 23:42:35 +03:00
return p - > emit_config_values ( p , result , maxlen , sz_ptr ) ;
2013-03-02 02:45:51 +04:00
2015-04-22 23:42:35 +03:00
DMEMIT ( " 0 " ) ;
* sz_ptr = sz ;
2013-03-02 02:45:51 +04:00
return 0 ;
}
static inline int policy_set_config_value ( struct dm_cache_policy * p ,
const char * key , const char * value )
{
return p - > set_config_value ? p - > set_config_value ( p , key , value ) : - EINVAL ;
}
2016-12-15 12:57:31 +03:00
static inline void policy_allow_migrations ( struct dm_cache_policy * p , bool allow )
{
return p - > allow_migrations ( p , allow ) ;
}
2013-03-02 02:45:51 +04:00
/*----------------------------------------------------------------*/
2015-05-15 17:22:02 +03:00
/*
* Some utility functions commonly used by policies and the core target .
*/
static inline size_t bitset_size_in_bytes ( unsigned nr_entries )
{
return sizeof ( unsigned long ) * dm_div_up ( nr_entries , BITS_PER_LONG ) ;
}
static inline unsigned long * alloc_bitset ( unsigned nr_entries )
{
size_t s = bitset_size_in_bytes ( nr_entries ) ;
return vzalloc ( s ) ;
}
static inline void clear_bitset ( void * bitset , unsigned nr_entries )
{
size_t s = bitset_size_in_bytes ( nr_entries ) ;
memset ( bitset , 0 , s ) ;
}
static inline void free_bitset ( unsigned long * bits )
{
vfree ( bits ) ;
}
/*----------------------------------------------------------------*/
2013-03-02 02:45:51 +04:00
/*
* Creates a new cache policy given a policy name , a cache size , an origin size and the block size .
*/
struct dm_cache_policy * dm_cache_policy_create ( const char * name , dm_cblock_t cache_size ,
sector_t origin_size , sector_t block_size ) ;
/*
* Destroys the policy . This drops references to the policy module as well
* as calling it ' s destroy method . So always use this rather than calling
* the policy - > destroy method directly .
*/
void dm_cache_policy_destroy ( struct dm_cache_policy * p ) ;
/*
* In case we ' ve forgotten .
*/
const char * dm_cache_policy_get_name ( struct dm_cache_policy * p ) ;
2013-03-20 21:21:27 +04:00
const unsigned * dm_cache_policy_get_version ( struct dm_cache_policy * p ) ;
2013-03-02 02:45:51 +04:00
size_t dm_cache_policy_get_hint_size ( struct dm_cache_policy * p ) ;
/*----------------------------------------------------------------*/
# endif /* DM_CACHE_POLICY_INTERNAL_H */