* (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
* @{
*/
* @brief Block device module.
*/
-#include <ext4_config.h>
-#include <ext4_bcache.h>
-#include <ext4_debug.h>
+#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"
#include <stdbool.h>
#include <stdint.h>
/**@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;
+#define EXT4_BDEV_INITIALIZED (1 << 0)
+
+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.*/
- uint8_t flags;
+ /**@brief Block count: logical*/
+ uint64_t lg_bcnt;
- /**@brief Cache flush delay mode flag.*/
- uint8_t cache_flush_delay;
+ /**@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.*/
-#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, \
- }
+/**@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_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
* @return standard error code*/
int ext4_block_init(struct ext4_blockdev *bdev);
-
/**@brief Binds a bcache to block device.
* @param bdev block device descriptor
* @param bc block cache descriptor
* @return standard error code*/
-int ext4_block_bind_bcache(struct ext4_blockdev *bdev,
- struct ext4_bcache *bc);
+int ext4_block_bind_bcache(struct ext4_blockdev *bdev, struct ext4_bcache *bc);
/**@brief Close block device
* @param bdev block device descriptor
* @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*/
-void ext4_block_set_lb_size(struct ext4_blockdev *bdev,
- uint64_t lb_bsize);
+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 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
* @return standard error code*/
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);
-
+int ext4_blocks_get_direct(struct ext4_blockdev *bdev, void *buf, uint64_t lba,
+ uint32_t cnt);
/**@brief Block write procedure (without cache)
* @param bdev block device descriptor
* @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*/
-int ext4_block_readbytes(struct ext4_blockdev *bdev, uint64_t off,
- void *buf, uint32_t len);
+ * @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);
-/**@brief Enable/disable delayed cache flush mode.
+/**@brief Enable/disable write back cache mode
* @param bdev block device descriptor
* @param on_off
* !0 - ENABLE
* 0 - DISABLE (all delayed cache buffers will be flushed)
* @return standard error code*/
-int ext4_block_delay_cache_flush(struct ext4_blockdev *bdev, uint8_t on_off);
+int ext4_block_cache_write_back(struct ext4_blockdev *bdev, uint8_t on_off);
+
+#ifdef __cplusplus
+}
+#endif
#endif /* EXT4_BLOCKDEV_H_ */