projects
/
lwext4.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ext4_blockdev: don't make zero length block read/write operations
[lwext4.git]
/
src
/
ext4_blockdev.c
diff --git
a/src/ext4_blockdev.c
b/src/ext4_blockdev.c
index 8eebf0f1c9fa083d98668411837d7d6520ead684..205cd7a9ace9f6bfaae020842c0920259dcc4953 100644
(file)
--- a/
src/ext4_blockdev.c
+++ b/
src/ext4_blockdev.c
@@
-41,6
+41,8
@@
#include "ext4_debug.h"
#include "ext4_blockdev.h"
#include "ext4_debug.h"
#include "ext4_blockdev.h"
+#include "ext4_fs.h"
+#include "ext4_journal.h"
#include <string.h>
#include <stdlib.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;
}
return EOK;
}
-void ext4_block_set_lb_size(struct ext4_blockdev *bdev, uint
64
_t lb_bsize)
+void ext4_block_set_lb_size(struct ext4_blockdev *bdev, uint
32
_t lb_bsize)
{
/*Logical block size has to be multiply of physical */
ext4_assert(!(lb_bsize % bdev->bdif->ph_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;
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)) {
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);
}
ext4_bcache_drop_buf(bdev->bc, buf);
}
+ bdev->bc->dont_shake = false;
return r;
}
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 EIO;
if (!(lba < bdev->lg_bcnt))
- return E
RANGE
;
+ return E
NXIO
;
b->lb_id = lba;
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;
/*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) {
/*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;
/*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) {
/*Rest of the data*/
if (len) {