summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorngkaho1234 <ngkaho1234@gmail.com>2015-12-26 02:18:09 +0800
committerngkaho1234 <ngkaho1234@gmail.com>2015-12-26 02:27:41 +0800
commit46c3c339d15e69ac633e122b95861151d6af1c62 (patch)
tree858e8aeeb3533d6a481f3f1feedb6f7725ce4f48
parent01423f78d01581812e8e1c018902af4a323d4c41 (diff)
ext4: make sure blocks are not contaminated with data in block cache.
-rw-r--r--lwext4/ext4.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/lwext4/ext4.c b/lwext4/ext4.c
index cd91034..54fe245 100644
--- a/lwext4/ext4.c
+++ b/lwext4/ext4.c
@@ -1497,6 +1497,10 @@ int ext4_fwrite(ext4_file *f, const void *buf, size_t size, size_t *wcnt)
if (r != EOK)
goto Finish;
+ r = ext4_block_flush_lba(f->mp->fs.bdev, fblk);
+ if (r != EOK)
+ goto Finish;
+
off = fblk * block_size + unalg;
r = ext4_block_writebytes(f->mp->fs.bdev, off, u8_buf, len);
if (r != EOK)
@@ -1521,6 +1525,8 @@ int ext4_fwrite(ext4_file *f, const void *buf, size_t size, size_t *wcnt)
fblock_count = 0;
while (size >= block_size) {
+ uint32_t i;
+
while (iblk_idx < iblock_last) {
if (iblk_idx < ifile_blocks) {
r = ext4_fs_init_inode_dblk_idx(&ref, iblk_idx,
@@ -1550,6 +1556,13 @@ int ext4_fwrite(ext4_file *f, const void *buf, size_t size, size_t *wcnt)
fblock_count++;
}
+ for (i = 0;i < fblock_count;i++) {
+ r = ext4_block_flush_lba(f->mp->fs.bdev, fblock_start + i);
+ if (r != EOK)
+ goto Finish;
+
+ }
+
r = ext4_blocks_set_direct(f->mp->fs.bdev, u8_buf, fblock_start,
fblock_count);
if (r != EOK)
@@ -1593,6 +1606,10 @@ int ext4_fwrite(ext4_file *f, const void *buf, size_t size, size_t *wcnt)
goto out_fsize;
}
+ r = ext4_block_flush_lba(f->mp->fs.bdev, fblk);
+ if (r != EOK)
+ goto Finish;
+
off = fblk * block_size;
r = ext4_block_writebytes(f->mp->fs.bdev, off, u8_buf, size);
if (r != EOK)