diff options
| author | ngkaho1234 <ngkaho1234@gmail.com> | 2015-12-25 23:27:21 +0800 |
|---|---|---|
| committer | ngkaho1234 <ngkaho1234@gmail.com> | 2015-12-25 23:28:51 +0800 |
| commit | e21fe5fe454fce1b3a555fc1268e2f77a5d35274 (patch) | |
| tree | 654a5259ef12e18a0036b42a1e19b214e0142fad | |
| parent | cb473bbcead90b2541817f81f7a030d6e8215185 (diff) | |
ext4: file data read/write now do direct io in case of unaligned io.
| -rw-r--r-- | lwext4/ext4.c | 50 |
1 files changed, 12 insertions, 38 deletions
diff --git a/lwext4/ext4.c b/lwext4/ext4.c index a55e99b..cd91034 100644 --- a/lwext4/ext4.c +++ b/lwext4/ext4.c @@ -1294,7 +1294,6 @@ int ext4_fread(ext4_file *f, void *buf, size_t size, size_t *rcnt) uint8_t *u8_buf = buf; int r; - struct ext4_block b; struct ext4_inode_ref ref; ext4_assert(f && f->mp); @@ -1361,15 +1360,11 @@ int ext4_fread(ext4_file *f, void *buf, size_t size, size_t *rcnt) /* Do we get an unwritten range? */ if (fblock != 0) { - r = ext4_block_get(f->mp->fs.bdev, &b, fblock); + uint64_t off = fblock * block_size + unalg; + r = ext4_block_readbytes(f->mp->fs.bdev, off, u8_buf, len); if (r != EOK) goto Finish; - memcpy(u8_buf, b.data + unalg, len); - - r = ext4_block_set(f->mp->fs.bdev, &b); - if (r != EOK) - goto Finish; } else { /* Yes, we do. */ memset(u8_buf, 0, len); @@ -1422,17 +1417,13 @@ int ext4_fread(ext4_file *f, void *buf, size_t size, size_t *rcnt) } if (size) { + uint64_t off; r = ext4_fs_get_inode_dblk_idx(&ref, iblock_idx, &fblock, true); if (r != EOK) goto Finish; - r = ext4_block_get(f->mp->fs.bdev, &b, fblock); - if (r != EOK) - goto Finish; - - memcpy(u8_buf, b.data, size); - - r = ext4_block_set(f->mp->fs.bdev, &b); + off = fblock * block_size; + r = ext4_block_readbytes(f->mp->fs.bdev, off, u8_buf, size); if (r != EOK) goto Finish; @@ -1460,7 +1451,6 @@ int ext4_fwrite(ext4_file *f, const void *buf, size_t size, size_t *wcnt) ext4_fsblk_t fblk; ext4_fsblk_t fblock_start; - struct ext4_block b; struct ext4_inode_ref ref; const uint8_t *u8_buf = buf; int r, rr = EOK; @@ -1499,6 +1489,7 @@ int ext4_fwrite(ext4_file *f, const void *buf, size_t size, size_t *wcnt) if (unalg) { size_t len = size; + uint64_t off; if (size > (block_size - unalg)) len = block_size - unalg; @@ -1506,14 +1497,8 @@ int ext4_fwrite(ext4_file *f, const void *buf, size_t size, size_t *wcnt) if (r != EOK) goto Finish; - r = ext4_block_get(f->mp->fs.bdev, &b, fblk); - if (r != EOK) - goto Finish; - - memcpy(b.data + unalg, u8_buf, len); - ext4_bcache_set_dirty(b.buf); - - r = ext4_block_set(f->mp->fs.bdev, &b); + off = fblk * block_size + unalg; + r = ext4_block_writebytes(f->mp->fs.bdev, off, u8_buf, len); if (r != EOK) goto Finish; @@ -1596,6 +1581,7 @@ int ext4_fwrite(ext4_file *f, const void *buf, size_t size, size_t *wcnt) goto Finish; if (size) { + uint64_t off; if (iblk_idx < ifile_blocks) { r = ext4_fs_init_inode_dblk_idx(&ref, iblk_idx, &fblk); if (r != EOK) @@ -1607,14 +1593,8 @@ int ext4_fwrite(ext4_file *f, const void *buf, size_t size, size_t *wcnt) goto out_fsize; } - r = ext4_block_get(f->mp->fs.bdev, &b, fblk); - if (r != EOK) - goto Finish; - - memcpy(b.data, u8_buf, size); - ext4_bcache_set_dirty(b.buf); - - r = ext4_block_set(f->mp->fs.bdev, &b); + off = fblk * block_size; + r = ext4_block_writebytes(f->mp->fs.bdev, off, u8_buf, size); if (r != EOK) goto Finish; @@ -1847,7 +1827,6 @@ int ext4_file_set_ctime(const char *path, uint32_t ctime) static int ext4_fsymlink_set(ext4_file *f, const void *buf, uint32_t size) { - struct ext4_block b; struct ext4_inode_ref ref; uint32_t sblock; ext4_fsblk_t fblock; @@ -1889,15 +1868,10 @@ static int ext4_fsymlink_set(ext4_file *f, const void *buf, uint32_t size) if (r != EOK) goto Finish; - r = ext4_block_get(f->mp->fs.bdev, &b, fblock); + r = ext4_block_writebytes(f->mp->fs.bdev, 0, buf, size); if (r != EOK) goto Finish; - memcpy(b.data, buf, size); - ext4_bcache_set_dirty(b.buf); - r = ext4_block_set(f->mp->fs.bdev, &b); - if (r != EOK) - goto Finish; } /*Stop write back cache mode*/ |
