Indroduce split ext4_blockdev to two separate structures
[lwext4.git] / lwext4 / ext4_blockdev.h
index 5cebd709b896fe8328591d8300a92cafcfa0a9a7..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.
  */
 
-#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
@@ -127,26 +138,36 @@ struct ext4_blockdev  {
  * @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
@@ -154,7 +175,7 @@ void ext4_block_set_lb_size(struct ext4_blockdev *bdev,
  * @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
@@ -162,15 +183,13 @@ int ext4_block_get(struct ext4_blockdev *bdev, struct ext4_block *b,
  * @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
@@ -178,35 +197,37 @@ int ext4_blocks_get_direct(struct   ext4_blockdev *bdev, void *buf,
  * @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_ */