{
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;
}
{
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);
ext4_assert(bdev && b);
- if (!(bdev->bdif->ph_flags & EXT4_BDEV_INITIALIZED))
+ if (!bdev->bdif->ph_refctr)
return EIO;
if (!(lba < bdev->lg_bcnt))
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);
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;
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;
#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.*/
/**@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.*/