#include "ext4_debug.h"
#include "ext4_blockdev.h"
+#include "ext4_fs.h"
+#include "ext4_journal.h"
#include <string.h>
#include <stdlib.h>
return EOK;
}
-void ext4_block_set_lb_size(struct ext4_blockdev *bdev, uint64_t lb_bsize)
+void ext4_block_set_lb_size(struct ext4_blockdev *bdev, uint32_t lb_bsize)
{
/*Logical block size has to be multiply of physical */
ext4_assert(!(lb_bsize % bdev->bdif->ph_bsize));
if (bdev->bc->dont_shake)
return EOK;
+ bdev->bc->dont_shake = true;
+
while (!RB_EMPTY(&bdev->bc->lru_root) &&
ext4_bcache_is_full(bdev->bc)) {
ext4_bcache_drop_buf(bdev->bc, buf);
}
+ bdev->bc->dont_shake = false;
return r;
}
return EIO;
if (!(lba < bdev->lg_bcnt))
- return ERANGE;
+ return ENXIO;
b->lb_id = lba;
/*Aligned data*/
blen = len / bdev->bdif->ph_bsize;
- r = ext4_bdif_bwrite(bdev, p, block_idx, blen);
- if (r != EOK)
- return r;
+ if (blen != 0) {
+ r = ext4_bdif_bwrite(bdev, p, block_idx, blen);
+ if (r != EOK)
+ return r;
- p += bdev->bdif->ph_bsize * blen;
- len -= bdev->bdif->ph_bsize * blen;
+ p += bdev->bdif->ph_bsize * blen;
+ len -= bdev->bdif->ph_bsize * blen;
- block_idx += blen;
+ block_idx += blen;
+ }
/*Rest of the data*/
if (len) {
/*Aligned data*/
blen = len / bdev->bdif->ph_bsize;
- r = ext4_bdif_bread(bdev, p, block_idx, blen);
- if (r != EOK)
- return r;
+ if (blen != 0) {
+ r = ext4_bdif_bread(bdev, p, block_idx, blen);
+ if (r != EOK)
+ return r;
- p += bdev->bdif->ph_bsize * blen;
- len -= bdev->bdif->ph_bsize * blen;
+ p += bdev->bdif->ph_bsize * blen;
+ len -= bdev->bdif->ph_bsize * blen;
- block_idx += blen;
+ block_idx += blen;
+ }
/*Rest of the data*/
if (len) {