diff options
author | Mark Kettenis <kettenis@gnu.org> | 2001-06-05 00:59:37 +0000 |
---|---|---|
committer | Mark Kettenis <kettenis@gnu.org> | 2001-06-05 00:59:37 +0000 |
commit | f1a60268268acac56b9a245bcb9d93b0506a0e92 (patch) | |
tree | 68cae52f4e65e6c539ea087a6b1c9f9f77b2697a /mach-defpager/setup.c | |
parent | 047e386605783af924c6856d6ca58cea1dd5e614 (diff) |
* setup.c (page_read_file_direct): Fix logic to find the run that
contains the data to be read. Use size in bytes instead of blocks
when calling device_read.
(page_write_file_direct): Fix logic to find the run that contains
the data to be written. Pass SIZE_WRITTEN to device_write call
instead of &WROTE when writing a whole page. Correctly calculate
SEGSIZE.
Diffstat (limited to 'mach-defpager/setup.c')
-rw-r--r-- | mach-defpager/setup.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/mach-defpager/setup.c b/mach-defpager/setup.c index 134036ae..5060dc0a 100644 --- a/mach-defpager/setup.c +++ b/mach-defpager/setup.c @@ -115,17 +115,17 @@ page_read_file_direct (struct file_direct *fdp, assert (offset + (size >> fdp->bshift) <= fdp->fd_size); /* Find the run containing the beginning of the page. */ - for (r = fdp->runs; r->length > offset; ++r) + for (r = fdp->runs; offset > r->length; ++r) offset -= r->length; if (offset + (size >> fdp->bshift) <= r->length) /* The first run contains the whole page. */ - return device_read (fdp->device, 0, - r->start + offset, size >> fdp->bshift, - (char **) addr, size_read); + return device_read (fdp->device, 0, r->start + offset, + size, (char **) addr, size_read); /* Read the first part of the run. */ - err = device_read (fdp->device, 0, r->start + offset, r->length - offset, + err = device_read (fdp->device, 0, r->start + offset, + (r->length - offset) << fdp->bshift, (char **) addr, &nread); if (err) return err; @@ -136,12 +136,13 @@ page_read_file_direct (struct file_direct *fdp, { readloc += nread; offset += nread >> fdp->bshift; - if (r->length > offset) + if (offset > r->length) offset -= r++->length; /* We always get another out-of-line page, so we have to copy out of that page and deallocate it. */ - err = device_read (fdp->device, 0, r->start + offset, r->length - offset, + err = device_read (fdp->device, 0, r->start + offset, + (r->length - offset) << fdp->bshift, &page, &nread); if (err) { @@ -178,13 +179,13 @@ page_write_file_direct(struct file_direct *fdp, assert (offset + (size >> fdp->bshift) <= fdp->fd_size); /* Find the run containing the beginning of the page. */ - for (r = fdp->runs; r->length > offset; ++r) + for (r = fdp->runs; offset > r->length; ++r) offset -= r->length; if (offset + (size >> fdp->bshift) <= r->length) /* The first run contains the whole page. */ - return device_write (fdp->device, 0, - r->start + offset, (char *) addr, size, &wrote); + return device_write (fdp->device, 0, r->start + offset, + (char *) addr, size, size_written); /* Write the first part of the run. */ err = device_write (fdp->device, 0, @@ -201,14 +202,14 @@ page_write_file_direct(struct file_direct *fdp, addr += wrote; offset += wrote >> fdp->bshift; - if (r->length > offset) + if (offset > r->length) offset -= r++->length; - segsize = (r->length - offset) >> fdp->bshift; + segsize = (r->length - offset) << fdp->bshift; if (segsize > size) segsize = size; - err = device_write (fdp->device, 0, - r->start + offset, (char *) addr, segsize, &wrote); + err = device_write (fdp->device, 0, r->start + offset, + (char *) addr, segsize, &wrote); if (err) { vm_deallocate (mach_task_self (), |