/*Bind block cache to block device*/
r = ext4_block_bind_bcache(bd, bc);
if (r != EOK) {
+ ext4_bcache_cleanup(bc);
ext4_block_fini(bd);
if (mp->cache_dynamic) {
ext4_bcache_fini_dynamic(bc);
mp->mounted = 0;
+ ext4_bcache_cleanup(mp->fs.bdev->bc);
if (mp->cache_dynamic) {
ext4_bcache_fini_dynamic(mp->fs.bdev->bc);
free(mp->fs.bdev->bc);
return EOK;
}
+void ext4_bcache_cleanup(struct ext4_bcache *bc)
+{
+ struct ext4_buf *buf, *tmp;
+ RB_FOREACH_SAFE(buf, ext4_buf_lba, &bc->lba_root, tmp) {
+ ext4_block_flush_buf(bc->bdev, buf);
+ ext4_bcache_drop_buf(bc, buf);
+ }
+}
+
int ext4_bcache_fini_dynamic(struct ext4_bcache *bc)
{
memset(bc, 0, sizeof(struct ext4_bcache));
int ext4_bcache_init_dynamic(struct ext4_bcache *bc, uint32_t cnt,
uint32_t itemsize);
+/**@brief Do cleanup works on block cache.
+ * @param bc block cache descriptor.*/
+void ext4_bcache_cleanup(struct ext4_bcache *bc);
+
/**@brief Dynamic de-initialization of block cache.
* @param bc block cache descriptor
* @return standard error code*/