X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=lwext4%2Fext4_blockdev.h;h=e55f42e46e104a2de8810f571177455a9180575c;hb=9e8466622a31fed8113e9a01969f01a850f92cea;hp=558a382b3fc42511a0cd92aafe10b2da6d9e5e39;hpb=eddcd695d0c06c5e2dbef7c23c4998405857df59;p=lwext4.git diff --git a/lwext4/ext4_blockdev.h b/lwext4/ext4_blockdev.h index 558a382..e55f42e 100644 --- a/lwext4/ext4_blockdev.h +++ b/lwext4/ext4_blockdev.h @@ -25,9 +25,6 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef EXT4_BLOCKDEV_H_ -#define EXT4_BLOCKDEV_H_ - /** @addtogroup lwext4 * @{ */ @@ -36,6 +33,13 @@ * @brief Block device module. */ +#ifndef EXT4_BLOCKDEV_H_ +#define EXT4_BLOCKDEV_H_ + +#ifdef __cplusplus +extern "C" { +#endif + #include "ext4_config.h" #include "ext4_bcache.h" #include "ext4_debug.h" @@ -46,76 +50,86 @@ /**@brief Initialization status flag*/ #define EXT4_BDEV_INITIALIZED (1 << 0) -/**@brief Definiton of the simple block device.*/ -struct ext4_blockdev { - - /**@brief Open device function - * @param bdev block device.*/ - int (*open)(struct ext4_blockdev *bdev); - - /**@brief Block read function. - * @param bdev block device - * @param buf output buffer - * @param blk_id block id - * @param blk_cnt block count*/ - int (*bread)(struct ext4_blockdev *bdev, void *buf, uint64_t blk_id, - uint32_t blk_cnt); - - /**@brief Block write function. - * @param buf input buffer - * @param blk_id block id - * @param blk_cnt block count*/ - int (*bwrite)(struct ext4_blockdev *bdev, const void *buf, uint64_t blk_id, - uint32_t blk_cnt); - - /**@brief Close device function. - * @param bdev block device.*/ - int (*close)(struct ext4_blockdev *bdev); - - /**@brief Block cache.*/ - struct ext4_bcache *bc; - - /**@brief Block size (bytes): physical*/ - uint32_t ph_bsize; +struct ext4_blockdev_iface { + /**@brief Open device function + * @param bdev block device.*/ + int (*open)(struct ext4_blockdev *bdev); + + /**@brief Block read function. + * @param bdev block device + * @param buf output buffer + * @param blk_id block id + * @param blk_cnt block count*/ + int (*bread)(struct ext4_blockdev *bdev, void *buf, uint64_t blk_id, + uint32_t blk_cnt); + + /**@brief Block write function. + * @param buf input buffer + * @param blk_id block id + * @param blk_cnt block count*/ + int (*bwrite)(struct ext4_blockdev *bdev, const void *buf, + uint64_t blk_id, uint32_t blk_cnt); + + /**@brief Close device function. + * @param bdev block device.*/ + int (*close)(struct ext4_blockdev *bdev); + + /**@brief Block size (bytes): physical*/ + uint32_t ph_bsize; + + /**@brief Block count: physical*/ + uint64_t ph_bcnt; + + /**@brief Block size buffer: physical*/ + uint8_t *ph_bbuf; + + /**@brief Flags of block device*/ + uint32_t ph_flags; +}; - /**@brief Block count: physical.*/ - uint64_t ph_bcnt; +/**@brief Definition of the simple block device.*/ +struct ext4_blockdev { + /**@brief Block device interface*/ + struct ext4_blockdev_iface *bdif; - /**@brief Block size buffer: physical.*/ - uint8_t *ph_bbuf; + /**@brief Offset in bdif. For multi partition mode.*/ + uint64_t ph_blk_offset; - /**@brief Block size (bytes) logical*/ - uint32_t lg_bsize; + /**@brief Block cache.*/ + struct ext4_bcache *bc; - /**@brief Block count: phisical.*/ - uint64_t lg_bcnt; + /**@brief Block size (bytes) logical*/ + uint32_t lg_bsize; - /**@brief Flags of te block device.*/ - uint32_t flags; + /**@brief Block count: logical*/ + uint64_t lg_bcnt; - /**@brief Cache write back mode refference counter.*/ - uint32_t cache_write_back; + /**@brief Cache write back mode reference counter*/ + uint32_t cache_write_back; - /**@brief Physical read counter*/ - uint32_t bread_ctr; + /**@brief Physical read counter*/ + uint32_t bread_ctr; - /**@brief Physical write counter*/ - uint32_t bwrite_ctr; + /**@brief Physical write counter*/ + uint32_t bwrite_ctr; }; -/**@brief Static initialization fo the block device.*/ +/**@brief Static initialization of the block device.*/ #define EXT4_BLOCKDEV_STATIC_INSTANCE(__name, __bsize, __bcnt, __open, \ - __bread, __bwrite, __close) \ - static uint8_t __name##_ph_bbuf[(__bsize)]; \ - static struct ext4_blockdev __name = { \ - .open = __open, \ - .bread = __bread, \ - .bwrite = __bwrite, \ - .close = __close, \ - .ph_bsize = __bsize, \ - .ph_bcnt = __bcnt, \ - .ph_bbuf = __name##_ph_bbuf, \ - } + __bread, __bwrite, __close) \ + static uint8_t __name##_ph_bbuf[(__bsize)]; \ + static struct ext4_blockdev_iface __name##_iface = { \ + .open = __open, \ + .bread = __bread, \ + .bwrite = __bwrite, \ + .close = __close, \ + .ph_bsize = __bsize, \ + .ph_bcnt = __bcnt, \ + .ph_bbuf = __name##_ph_bbuf, \ + }; \ + static struct ext4_blockdev __name = { \ + .bdif = &__name##_iface, \ + } /**@brief Block device initialization. * @param bdev block device descriptor @@ -135,19 +149,33 @@ int ext4_block_bind_bcache(struct ext4_blockdev *bdev, struct ext4_bcache *bc); * @return standard error code*/ int ext4_block_fini(struct ext4_blockdev *bdev); +/**@brief Flush data in given buffer to disk. + * @param bdev block device descriptor + * @param buf buffer + * @return standard error code*/ +int ext4_block_flush_buf(struct ext4_blockdev *bdev, struct ext4_buf *buf); + /**@brief Set logical block size in block device. * @param bdev block device descriptor - * @param lb_size ligical block size (in bytes) + * @param lb_size logical block size (in bytes) * @return standard error code*/ void ext4_block_set_lb_size(struct ext4_blockdev *bdev, uint64_t lb_bsize); +/**@brief Block get function (through cache, don't read). + * @param bdev block device descriptor + * @param b block descriptor + * @param lba logical block address + * @return standard error code*/ +int ext4_block_get_noread(struct ext4_blockdev *bdev, struct ext4_block *b, + uint64_t lba); + /**@brief Block get function (through cache). * @param bdev block device descriptor * @param b block descriptor * @param lba logical block address * @return standard error code*/ int ext4_block_get(struct ext4_blockdev *bdev, struct ext4_block *b, - uint64_t lba); + uint64_t lba); /**@brief Block set procedure (through cache). * @param bdev block device descriptor @@ -158,10 +186,10 @@ int ext4_block_set(struct ext4_blockdev *bdev, struct ext4_block *b); /**@brief Block read procedure (without cache) * @param bdev block device descriptor * @param buf output buffer - * @param lba logical block adderss + * @param lba logical block address * @return standard error code*/ int ext4_blocks_get_direct(struct ext4_blockdev *bdev, void *buf, uint64_t lba, - uint32_t cnt); + uint32_t cnt); /**@brief Block write procedure (without cache) * @param bdev block device descriptor @@ -169,25 +197,25 @@ int ext4_blocks_get_direct(struct ext4_blockdev *bdev, void *buf, uint64_t lba, * @param lba logical block address * @return standard error code*/ int ext4_blocks_set_direct(struct ext4_blockdev *bdev, const void *buf, - uint64_t lba, uint32_t cnt); + uint64_t lba, uint32_t cnt); -/**@brief Write to block device (by direct adress). +/**@brief Write to block device (by direct address). * @param bdev block device descriptor * @param off byte offset in block device * @param buf input buffer - * @param len length of the write nuffer - * @return EOK when sucess*/ + * @param len length of the write buffer + * @return standard error code*/ int ext4_block_writebytes(struct ext4_blockdev *bdev, uint64_t off, - const void *buf, uint32_t len); + const void *buf, uint32_t len); -/**@brief Read freom block device (by direct adress). +/**@brief Read freom block device (by direct address). * @param bdev block device descriptor * @param off byte offset in block device * @param buf input buffer - * @param len length of the write nuffer - * @return EOK when sucess*/ + * @param len length of the write buffer + * @return standard error code*/ int ext4_block_readbytes(struct ext4_blockdev *bdev, uint64_t off, void *buf, - uint32_t len); + uint32_t len); /**@brief Enable/disable write back cache mode * @param bdev block device descriptor @@ -197,6 +225,10 @@ int ext4_block_readbytes(struct ext4_blockdev *bdev, uint64_t off, void *buf, * @return standard error code*/ int ext4_block_cache_write_back(struct ext4_blockdev *bdev, uint8_t on_off); +#ifdef __cplusplus +} +#endif + #endif /* EXT4_BLOCKDEV_H_ */ /**