ext4_blockdev: don't make zero length block read/write operations
[lwext4.git] / src / ext4_blockdev.c
index 8eebf0f1c9fa083d98668411837d7d6520ead684..205cd7a9ace9f6bfaae020842c0920259dcc4953 100644 (file)
@@ -41,6 +41,8 @@
 #include "ext4_debug.h"
 
 #include "ext4_blockdev.h"
+#include "ext4_fs.h"
+#include "ext4_journal.h"
 
 #include <string.h>
 #include <stdlib.h>
@@ -115,7 +117,7 @@ int ext4_block_bind_bcache(struct ext4_blockdev *bdev, struct ext4_bcache *bc)
        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));
@@ -188,6 +190,8 @@ int ext4_block_cache_shake(struct ext4_blockdev *bdev)
        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)) {
 
@@ -202,6 +206,7 @@ int ext4_block_cache_shake(struct ext4_blockdev *bdev)
 
                ext4_bcache_drop_buf(bdev->bc, buf);
        }
+       bdev->bc->dont_shake = false;
        return r;
 }
 
@@ -217,7 +222,7 @@ int ext4_block_get_noread(struct ext4_blockdev *bdev, struct ext4_block *b,
                return EIO;
 
        if (!(lba < bdev->lg_bcnt))
-               return ERANGE;
+               return ENXIO;
 
        b->lb_id = lba;
 
@@ -345,14 +350,16 @@ int ext4_block_writebytes(struct ext4_blockdev *bdev, uint64_t off,
 
        /*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) {
@@ -411,14 +418,16 @@ int ext4_block_readbytes(struct ext4_blockdev *bdev, uint64_t off, void *buf,
        /*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) {