Gotta find a way to pass on updated file size before write_file_pages.

This commit is contained in:
Bahadir Balban
2008-04-26 01:03:11 +01:00
parent f183b3c15e
commit 0557fa8910
3 changed files with 56 additions and 25 deletions

View File

@@ -260,7 +260,8 @@ struct vnode *memfs_vnode_mknod(struct vnode *v, const char *dirname,
memfsd->name[MEMFS_DNAME_MAX - 1] = '\0';
/* Write the updated directory buffer back to disk block */
v->fops.write(v, 0, 1, v->dirbuf.buffer);
if ((err = v->fops.write(v, 0, 1, v->dirbuf.buffer)) < 0)
return PTR_ERR(err); /* FIXME: free all you allocated so far */
/* Update parent vnode size */
v->size += sizeof(*memfsd);

View File

@@ -230,22 +230,32 @@ int pager_sys_read(l4id_t sender, unsigned long vnum, unsigned long f_offset,
unsigned long npages, void *pagebuf)
{
struct vnode *v;
int err;
int err, retval = 0;
if (sender != PAGER_TID)
return -EINVAL;
if (sender != PAGER_TID) {
retval = -EINVAL;
goto out;
}
/* Lookup vnode */
if (!(v = vfs_lookup_byvnum(vfs_root.pivot->sb, vnum)))
return -EINVAL; /* No such vnode */
if (!(v = vfs_lookup_byvnum(vfs_root.pivot->sb, vnum))) {
retval = -EINVAL; /* No such vnode */
goto out;
}
/* Ensure vnode is not a directory */
if (vfs_isdir(v))
return -EISDIR;
if (vfs_isdir(v)) {
retval = -EISDIR;
goto out;
}
if ((err = v->fops.read(v, f_offset, npages, pagebuf)) < 0)
return err;
if ((err = v->fops.read(v, f_offset, npages, pagebuf)) < 0) {
retval = err;
goto out;
}
out:
l4_ipc_return(retval);
return 0;
}
@@ -260,22 +270,39 @@ int pager_sys_write(l4id_t sender, unsigned long vnum, unsigned long f_offset,
unsigned long npages, void *pagebuf)
{
struct vnode *v;
int err;
int err, retval = 0;
int bytes = 0;
if (sender != PAGER_TID)
return -EINVAL;
if (sender != PAGER_TID) {
retval = -EINVAL;
goto out;
}
/* Lookup vnode */
if (!(v = vfs_lookup_byvnum(vfs_root.pivot->sb, vnum)))
return -EINVAL; /* No such vnode */
if (!(v = vfs_lookup_byvnum(vfs_root.pivot->sb, vnum))) {
retval = -EINVAL; /* No such vnode */
goto out;
}
/* Ensure vnode is not a directory */
if (vfs_isdir(v))
return -EISDIR;
if (vfs_isdir(v)) {
retval = -EISDIR;
goto out;
}
if ((err = v->fops.write(v, f_offset, npages, pagebuf)) < 0)
return err;
/* If the file is extended, write automatically extends it */
if ((err = v->fops.write(v, f_offset, npages, pagebuf)) < 0) {
retval = err;
goto out;
}
/* FIXME: Find a way to properly update new bytes */
BUG();
v->size += bytes;
v->sb->ops->write_vnode(v->sb, v);
out:
l4_ipc_return(retval);
return 0;
}

View File

@@ -238,18 +238,18 @@ int vfs_write(unsigned long vnum, unsigned long file_offset,
}
/* Writes pages in cache back to their file */
int write_file_pages(struct vm_file *vmfile, unsigned long pfn_start,
int write_file_pages(struct vm_file *f, unsigned long pfn_start,
unsigned long pfn_end)
{
int err;
BUG_ON(pfn_end != __pfn(page_align_up(f->length)));
for (int f_offset = pfn_start; f_offset < pfn_end; f_offset++) {
err = vmfile->vm_obj.pager->ops.page_out(&vmfile->vm_obj,
f_offset);
err = f->vm_obj.pager->ops.page_out(&f->vm_obj, f_offset);
if (err < 0) {
printf("%s: %s:Could not write page %d "
"to file with vnum: 0x%x\n", __TASKNAME__,
__FUNCTION__, f_offset, vm_file_to_vnum(vmfile));
__FUNCTION__, f_offset, vm_file_to_vnum(f));
return err;
}
}
@@ -257,9 +257,11 @@ int write_file_pages(struct vm_file *vmfile, unsigned long pfn_start,
return 0;
}
int flush_file_pages(struct vm_file *vmfile)
int flush_file_pages(struct vm_file *f)
{
write_file_pages(f, 0, __pfn(page_align_up(f->length)));
return 0;
}
int sys_close(l4id_t sender, int fd)
@@ -289,8 +291,9 @@ out:
return 0;
}
int sys_flush(void)
int sys_fsync(int fd)
{
return 0;
}
/* FIXME: Add error handling to this */