Change ph_flags to ph_refctr in block device interface
authorgkostka <kostka.grzegorz@gmail.com>
Tue, 8 Dec 2015 15:43:19 +0000 (16:43 +0100)
committergkostka <kostka.grzegorz@gmail.com>
Tue, 8 Dec 2015 15:43:19 +0000 (16:43 +0100)
lwext4/ext4_blockdev.c
lwext4/ext4_blockdev.h

index 03d15eb5d8422fd8d90449dfd3b1ae2cd9401410..bbc2fef97dfdd7e8b61d317cc72c565bd3c7a4ef 100644 (file)
@@ -46,19 +46,23 @@ int ext4_block_init(struct ext4_blockdev *bdev)
 {
        int rc;
        ext4_assert(bdev);
-
+       ext4_assert(bdev->bdif);
        ext4_assert(bdev->bdif->open &&
                   bdev->bdif->close &&
                   bdev->bdif->bread &&
                   bdev->bdif->bwrite);
 
+       if (bdev->bdif->ph_refctr) {
+               bdev->bdif->ph_refctr++;
+               return EOK;
+       }
+
        /*Low level block init*/
        rc = bdev->bdif->open(bdev);
        if (rc != EOK)
                return rc;
 
-       bdev->bdif->ph_flags |= EXT4_BDEV_INITIALIZED;
-
+       bdev->bdif->ph_refctr = 1;
        return EOK;
 }
 
@@ -83,7 +87,12 @@ int ext4_block_fini(struct ext4_blockdev *bdev)
 {
        ext4_assert(bdev);
 
-       bdev->bdif->ph_flags &= ~(EXT4_BDEV_INITIALIZED);
+       if (!bdev->bdif->ph_refctr)
+               return EOK;
+
+       bdev->bdif->ph_refctr--;
+       if (bdev->bdif->ph_refctr)
+               return EOK;
 
        /*Low level block fini*/
        return bdev->bdif->close(bdev);
@@ -143,7 +152,7 @@ int ext4_block_get_noread(struct ext4_blockdev *bdev, struct ext4_block *b,
 
        ext4_assert(bdev && b);
 
-       if (!(bdev->bdif->ph_flags & EXT4_BDEV_INITIALIZED))
+       if (!bdev->bdif->ph_refctr)
                return EIO;
 
        if (!(lba < bdev->lg_bcnt))
@@ -197,7 +206,7 @@ int ext4_block_set(struct ext4_blockdev *bdev, struct ext4_block *b)
        ext4_assert(bdev && b);
        ext4_assert(b->buf);
 
-       if (!(bdev->bdif->ph_flags & EXT4_BDEV_INITIALIZED))
+       if (!bdev->bdif->ph_refctr)
                return EIO;
 
        return ext4_bcache_free(bdev->bc, b);
@@ -249,7 +258,7 @@ int ext4_block_writebytes(struct ext4_blockdev *bdev, uint64_t off,
 
        ext4_assert(bdev && buf);
 
-       if (!(bdev->bdif->ph_flags & EXT4_BDEV_INITIALIZED))
+       if (!bdev->bdif->ph_refctr)
                return EIO;
 
        block_idx = (off / bdev->bdif->ph_bsize) + bdev->ph_blk_offset;
@@ -321,7 +330,7 @@ int ext4_block_readbytes(struct ext4_blockdev *bdev, uint64_t off, void *buf,
 
        ext4_assert(bdev && buf);
 
-       if (!(bdev->bdif->ph_flags & EXT4_BDEV_INITIALIZED))
+       if (!bdev->bdif->ph_refctr)
                return EIO;
 
        block_idx = (off / bdev->bdif->ph_bsize) + bdev->ph_blk_offset;
index e55f42e46e104a2de8810f571177455a9180575c..51e4335067e4fc4d69332795628fabffadcade23 100644 (file)
@@ -47,9 +47,6 @@ extern "C" {
 #include <stdbool.h>
 #include <stdint.h>
 
-/**@brief   Initialization status flag*/
-#define EXT4_BDEV_INITIALIZED (1 << 0)
-
 struct ext4_blockdev_iface {
        /**@brief   Open device function
         * @param   bdev block device.*/
@@ -83,8 +80,8 @@ struct ext4_blockdev_iface {
        /**@brief   Block size buffer: physical*/
        uint8_t *ph_bbuf;
 
-       /**@brief   Flags of block device*/
-       uint32_t ph_flags;
+       /**@brief   Reference counter to block device interface*/
+       uint32_t ph_refctr;
 };
 
 /**@brief   Definition of the simple block device.*/