X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=lwext4%2Fext4_bcache.h;h=e080664165ac009dee506de56d13fc0f9ef401a6;hb=c897dc5a646527c2b87e4bc0399db59b46edbb1d;hp=5a3fdbeab69050edc79b99d298969bc69aa071f8;hpb=00affc044c56435a81fe070a53729c0f6fcbdc08;p=lwext4.git diff --git a/lwext4/ext4_bcache.h b/lwext4/ext4_bcache.h index 5a3fdbe..e080664 100644 --- a/lwext4/ext4_bcache.h +++ b/lwext4/ext4_bcache.h @@ -1,147 +1,147 @@ -/* - * Copyright (c) 2013 Grzegorz Kostka (kostka.grzegorz@gmail.com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** @addtogroup lwext4 - * @{ - */ -/** - * @file ext4_bcache.h - * @brief Block cache allocator. - */ - -#ifndef EXT4_BCACHE_H_ -#define EXT4_BCACHE_H_ - -#include "ext4_config.h" - -#include -#include - -/**@brief Single block descriptor*/ -struct ext4_block { - /**@brief Dirty flag*/ - bool dirty; - - /**@brief Logical block ID*/ - uint64_t lb_id; - - /**@brief Cache id*/ - uint32_t cache_id; - - /**@brief Data buffer.*/ - uint8_t *data; -}; - -/**@brief Block cache descriptor*/ -struct ext4_bcache { - - /**@brief Item count in block cache*/ - uint32_t cnt; - - /**@brief Item size in block cache*/ - uint32_t itemsize; - - /**@brief Last recently used counter*/ - uint32_t lru_ctr; - - /**@brief Reference count table*/ - uint32_t refctr[CONFIG_BLOCK_DEV_CACHE_SIZE]; - - /**@brief Last recently used ID table*/ - uint32_t lru_id[CONFIG_BLOCK_DEV_CACHE_SIZE]; - - /**@brief Writeback free delay mode table*/ - uint8_t free_delay[CONFIG_BLOCK_DEV_CACHE_SIZE]; - - /**@brief Logical block table*/ - uint64_t lba[CONFIG_BLOCK_DEV_CACHE_SIZE]; - - /**@brief Dirty mark*/ - bool dirty[CONFIG_BLOCK_DEV_CACHE_SIZE]; - - /**@brief Cache data buffers*/ - uint8_t *data; - - /**@brief Currently referenced datablocks*/ - uint32_t ref_blocks; - - /**@brief Maximum referenced datablocks*/ - uint32_t max_ref_blocks; -}; - -/**@brief Static initializer of block cache structure.*/ -#define EXT4_BCACHE_STATIC_INSTANCE(__name, __cnt, __itemsize) \ - static uint8_t __name##_data[(__cnt) * (__itemsize)]; \ - static struct ext4_bcache __name = { \ - .cnt = __cnt, \ - .itemsize = __itemsize, \ - .lru_ctr = 0, \ - .data = __name##_data, \ - } - -/**@brief Dynamic initialization of block cache. - * @param bc block cache descriptor - * @param cnt items count in block cache - * @param itemsize single item size (in bytes) - * @return standard error code*/ -int ext4_bcache_init_dynamic(struct ext4_bcache *bc, uint32_t cnt, - uint32_t itemsize); - -/**@brief Dynamic de-initialization of block cache. - * @param bc block cache descriptor - * @return standard error code*/ -int ext4_bcache_fini_dynamic(struct ext4_bcache *bc); - -/**@brief Allocate block from block cache memory. - * Unreferenced block allocation is based on LRU - * (Last Recently Used) algorithm. - * @param bc block cache descriptor - * @param b block to alloc - * @param is_new block is new (needs to be read) - * @return standard error code*/ -int ext4_bcache_alloc(struct ext4_bcache *bc, struct ext4_block *b, - bool *is_new); - -/**@brief Free block from cache memory (decrement reference counter). - * @param bc block cache descriptor - * @param b block to free - * @param cache writeback mode - * @return standard error code*/ -int ext4_bcache_free(struct ext4_bcache *bc, struct ext4_block *b, - uint8_t free_delay); - -/**@brief Return a full status of block cache. - * @param bc block cache descriptor - * @return full status*/ -bool ext4_bcache_is_full(struct ext4_bcache *bc); - -#endif /* EXT4_BCACHE_H_ */ - -/** - * @} - */ +/* + * Copyright (c) 2013 Grzegorz Kostka (kostka.grzegorz@gmail.com) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** @addtogroup lwext4 + * @{ + */ +/** + * @file ext4_bcache.h + * @brief Block cache allocator. + */ + +#ifndef EXT4_BCACHE_H_ +#define EXT4_BCACHE_H_ + +#include "ext4_config.h" + +#include +#include + +/**@brief Single block descriptor*/ +struct ext4_block { + /**@brief Dirty flag*/ + bool dirty; + + /**@brief Logical block ID*/ + uint64_t lb_id; + + /**@brief Cache id*/ + uint32_t cache_id; + + /**@brief Data buffer.*/ + uint8_t *data; +}; + +/**@brief Block cache descriptor*/ +struct ext4_bcache { + + /**@brief Item count in block cache*/ + uint32_t cnt; + + /**@brief Item size in block cache*/ + uint32_t itemsize; + + /**@brief Last recently used counter*/ + uint32_t lru_ctr; + + /**@brief Reference count table*/ + uint32_t refctr[CONFIG_BLOCK_DEV_CACHE_SIZE]; + + /**@brief Last recently used ID table*/ + uint32_t lru_id[CONFIG_BLOCK_DEV_CACHE_SIZE]; + + /**@brief Writeback free delay mode table*/ + uint8_t free_delay[CONFIG_BLOCK_DEV_CACHE_SIZE]; + + /**@brief Logical block table*/ + uint64_t lba[CONFIG_BLOCK_DEV_CACHE_SIZE]; + + /**@brief Dirty mark*/ + bool dirty[CONFIG_BLOCK_DEV_CACHE_SIZE]; + + /**@brief Cache data buffers*/ + uint8_t *data; + + /**@brief Currently referenced datablocks*/ + uint32_t ref_blocks; + + /**@brief Maximum referenced datablocks*/ + uint32_t max_ref_blocks; +}; + +/**@brief Static initializer of block cache structure.*/ +#define EXT4_BCACHE_STATIC_INSTANCE(__name, __cnt, __itemsize) \ + static uint8_t __name##_data[(__cnt) * (__itemsize)]; \ + static struct ext4_bcache __name = { \ + .cnt = __cnt, \ + .itemsize = __itemsize, \ + .lru_ctr = 0, \ + .data = __name##_data, \ + } + +/**@brief Dynamic initialization of block cache. + * @param bc block cache descriptor + * @param cnt items count in block cache + * @param itemsize single item size (in bytes) + * @return standard error code*/ +int ext4_bcache_init_dynamic(struct ext4_bcache *bc, uint32_t cnt, + uint32_t itemsize); + +/**@brief Dynamic de-initialization of block cache. + * @param bc block cache descriptor + * @return standard error code*/ +int ext4_bcache_fini_dynamic(struct ext4_bcache *bc); + +/**@brief Allocate block from block cache memory. + * Unreferenced block allocation is based on LRU + * (Last Recently Used) algorithm. + * @param bc block cache descriptor + * @param b block to alloc + * @param is_new block is new (needs to be read) + * @return standard error code*/ +int ext4_bcache_alloc(struct ext4_bcache *bc, struct ext4_block *b, + bool *is_new); + +/**@brief Free block from cache memory (decrement reference counter). + * @param bc block cache descriptor + * @param b block to free + * @param cache writeback mode + * @return standard error code*/ +int ext4_bcache_free(struct ext4_bcache *bc, struct ext4_block *b, + uint8_t free_delay); + +/**@brief Return a full status of block cache. + * @param bc block cache descriptor + * @return full status*/ +bool ext4_bcache_is_full(struct ext4_bcache *bc); + +#endif /* EXT4_BCACHE_H_ */ + +/** + * @} + */