git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Support to multi-threading and pthread interface (POSIX.1-2008) (#23)
[lunaix-os.git]
/
lunaix-os
/
kernel
/
fs
/
pcache.c
diff --git
a/lunaix-os/kernel/fs/pcache.c
b/lunaix-os/kernel/fs/pcache.c
index f1969bd524473f225a9beffa0c3b6d411f8053ea..4c6f69cdbe284953e3e011ebcb84a2157802aff3 100644
(file)
--- a/
lunaix-os/kernel/fs/pcache.c
+++ b/
lunaix-os/kernel/fs/pcache.c
@@
-23,21
+23,21
@@
static void
pcache_free_page(void* va)
{
ptr_t pa = vmm_del_mapping(VMS_SELF, (ptr_t)va);
pcache_free_page(void* va)
{
ptr_t pa = vmm_del_mapping(VMS_SELF, (ptr_t)va);
- pmm_free_page(
KERNEL_PID,
pa);
+ pmm_free_page(pa);
}
static void*
pcache_alloc_page()
{
int i = 0;
}
static void*
pcache_alloc_page()
{
int i = 0;
- ptr_t pp = pmm_alloc_page(
KERNEL_PID,
0), va = 0;
+ ptr_t pp = pmm_alloc_page(0), va = 0;
if (!pp) {
return NULL;
}
if (!(va = (ptr_t)vmap(pp, PG_SIZE, PG_PREM_RW, 0))) {
if (!pp) {
return NULL;
}
if (!(va = (ptr_t)vmap(pp, PG_SIZE, PG_PREM_RW, 0))) {
- pmm_free_page(
KERNEL_PID,
pp);
+ pmm_free_page(pp);
return NULL;
}
return NULL;
}
@@
-133,23
+133,31
@@
pcache_write(struct v_inode* inode, void* data, u32_t len, u32_t fpos)
struct pcache* pcache = inode->pg_cache;
struct pcache_pg* pg;
struct pcache* pcache = inode->pg_cache;
struct pcache_pg* pg;
- while (buf_off < len) {
+ while (buf_off < len
&& errno >= 0
) {
u32_t wr_bytes = MIN(PG_SIZE - pg_off, len - buf_off);
u32_t wr_bytes = MIN(PG_SIZE - pg_off, len - buf_off);
- pcache_get_page(pcache, fpos, &pg_off, &pg);
+ int new_page = pcache_get_page(pcache, fpos, &pg_off, &pg);
+
+ if (new_page) {
+ // Filling up the page
+ errno = inode->default_fops->read_page(inode, pg->pg, pg->fpos);
- if (!pg) {
- errno = inode->default_fops->write(inode, data, wr_bytes, fpos);
if (errno < 0) {
break;
}
if (errno < 0) {
break;
}
- } else {
- memcpy(pg->pg + pg_off, (data + buf_off), wr_bytes);
- pcache_set_dirty(pcache, pg);
-
- pg->len = pg_off + wr_bytes;
+ if (errno < PG_SIZE) {
+ // EOF
+ len = MIN(len, buf_off + errno);
+ }
+ } else if (!pg) {
+ errno = inode->default_fops->write(inode, data, wr_bytes, fpos);
+ continue;
}
}
+ memcpy(pg->pg + pg_off, (data + buf_off), wr_bytes);
+ pcache_set_dirty(pcache, pg);
+
+ pg->len = pg_off + wr_bytes;
buf_off += wr_bytes;
fpos += wr_bytes;
}
buf_off += wr_bytes;
fpos += wr_bytes;
}
@@
-169,8
+177,7
@@
pcache_read(struct v_inode* inode, void* data, u32_t len, u32_t fpos)
int new_page = pcache_get_page(pcache, fpos, &pg_off, &pg);
if (new_page) {
// Filling up the page
int new_page = pcache_get_page(pcache, fpos, &pg_off, &pg);
if (new_page) {
// Filling up the page
- errno =
- inode->default_fops->read_page(inode, pg->pg, PG_SIZE, pg->fpos);
+ errno = inode->default_fops->read_page(inode, pg->pg, pg->fpos);
if (errno < 0) {
break;
if (errno < 0) {
break;
@@
-182,7
+189,7
@@
pcache_read(struct v_inode* inode, void* data, u32_t len, u32_t fpos)
pg->len = errno;
} else if (!pg) {
pg->len = errno;
} else if (!pg) {
- errno = inode->default_fops->read
_page
(
+ errno = inode->default_fops->read(
inode, (data + buf_off), len - buf_off, pg->fpos);
buf_off = len;
break;
inode, (data + buf_off), len - buf_off, pg->fpos);
buf_off = len;
break;
@@
-222,8
+229,7
@@
pcache_commit(struct v_inode* inode, struct pcache_pg* page)
return 0;
}
return 0;
}
- int errno =
- inode->default_fops->write_page(inode, page->pg, PG_SIZE, page->fpos);
+ int errno = inode->default_fops->write_page(inode, page->pg, page->fpos);
if (!errno) {
page->flags &= ~PCACHE_DIRTY;
if (!errno) {
page->flags &= ~PCACHE_DIRTY;