summaryrefslogtreecommitdiff
path: root/libdiskfs
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-01-04 21:12:49 +0000
committerRoland McGrath <roland@gnu.org>1996-01-04 21:12:49 +0000
commit4c92b3ea6ef88da50517e4fde36f3bbc05aeb740 (patch)
tree501784ea707589134b0cd19886c8f20e3bf1cd8b /libdiskfs
parente03cff5daef56e8327f6d186ee136daf8f2cec67 (diff)
(_diskfs_rdwr_internal): Rewritten using pager_memcpy.
Fix types of args: OFFSET to off_t, make AMT read/write size_t *.
Diffstat (limited to 'libdiskfs')
-rw-r--r--libdiskfs/rdwr-internal.c60
1 files changed, 11 insertions, 49 deletions
diff --git a/libdiskfs/rdwr-internal.c b/libdiskfs/rdwr-internal.c
index ecd5d8c7..a458810f 100644
--- a/libdiskfs/rdwr-internal.c
+++ b/libdiskfs/rdwr-internal.c
@@ -1,5 +1,5 @@
-/*
- Copyright (C) 1994, 1995 Free Software Foundation
+/*
+ Copyright (C) 1994, 1995, 1996 Free Software Foundation
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
@@ -18,6 +18,7 @@
#include "priv.h"
#include <string.h>
#include <fcntl.h>
+#include <hurd/pager.h>
/* Actually read or write a file. The file size must already permit
the requested access. NP is the file to read/write. DATA is a buffer
@@ -27,18 +28,14 @@
be locked. If NOTIME is set, then don't update the mtime or atime. */
error_t
_diskfs_rdwr_internal (struct node *np,
- char *volatile data,
- volatile int offset,
- volatile int amt,
+ char *data,
+ off_t offset,
+ size_t *amt,
int dir,
int notime)
{
- char *window;
- int winoff;
- volatile int cc;
memory_object_t memobj;
- volatile vm_prot_t prot
- = dir ? (VM_PROT_READ | VM_PROT_WRITE) : VM_PROT_READ;
+ vm_prot_t prot = dir ? (VM_PROT_READ | VM_PROT_WRITE) : VM_PROT_READ;
error_t err = 0;
if (dir)
@@ -51,46 +48,11 @@ _diskfs_rdwr_internal (struct node *np,
else
np->dn_set_atime = 1;
}
-
- memobj = diskfs_get_filemap (np, prot);
-
- while (amt > 0)
- {
- winoff = trunc_page (offset);
- window = 0;
- /* We map in 8 pages at a time. Where'd that come from? Well, the
- vax has a 1024 pagesize and with 8k blocks that seems like a
- reasonable number. */
- err = vm_map (mach_task_self (), (u_int *)&window, 8 * __vm_page_size,
- 0, 1, memobj, winoff, 0, prot, prot, VM_INHERIT_NONE);
- assert_perror (err);
- diskfs_register_memory_fault_area (diskfs_get_filemap_pager_struct (np),
- winoff, window, 8 * __vm_page_size);
-
- if ((offset - winoff) + amt > 8 * (off_t) __vm_page_size)
- cc = 8 * __vm_page_size - (offset - winoff);
- else
- cc = amt;
-
- if (!(err = diskfs_catch_exception ()))
- {
- if (dir)
- bcopy (data, window + (offset - winoff), cc);
- else
- bcopy (window + (offset - winoff), data, cc);
- diskfs_end_catch_exception ();
- }
+ memobj = diskfs_get_filemap (np, prot);
- vm_deallocate (mach_task_self (), (u_int) window, 8 * __vm_page_size);
- diskfs_unregister_memory_fault_area (window, 8 * __vm_page_size);
- if (err)
- break;
- amt -= cc;
- offset += cc;
- data += cc;
- }
- assert (amt == 0 || err);
+ err = pager_memcpy (diskfs_get_filemap_pager_struct (np), memobj,
+ offset, data, amt, prot);
if (!diskfs_readonly && !notime)
{
@@ -99,7 +61,7 @@ _diskfs_rdwr_internal (struct node *np,
else
np->dn_set_atime = 1;
}
-
+
mach_port_deallocate (mach_task_self (), memobj);
return err;
}