Indroduce split ext4_blockdev to two separate structures
[lwext4.git] / lwext4 / ext4_blockdev.h
index 558a382b3fc42511a0cd92aafe10b2da6d9e5e39..e55f42e46e104a2de8810f571177455a9180575c 100644 (file)
@@ -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
  * @{
  */
  * @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"
 /**@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_ */
 
 /**