summaryrefslogtreecommitdiff
path: root/ufs
diff options
context:
space:
mode:
Diffstat (limited to 'ufs')
-rw-r--r--ufs/ChangeLog11
-rw-r--r--ufs/devio.c70
-rw-r--r--ufs/hyper.c25
-rw-r--r--ufs/inode.c4
4 files changed, 29 insertions, 81 deletions
diff --git a/ufs/ChangeLog b/ufs/ChangeLog
index c541523e..2b964cf9 100644
--- a/ufs/ChangeLog
+++ b/ufs/ChangeLog
@@ -1,5 +1,16 @@
+Mon Aug 12 13:43:46 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
+
+ * hyper.c (diskfs_set_hypermetadata): Bother to return 0 at end of
+ function.
+
Wed Aug 7 13:00:30 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
+ * inode.c (diskfs_set_statfs): Compute st->f_blocks correctly; set
+ bsize to be fs_fsize, not fs_bsize.
+
+ * hyper.c (diskfs_set_hypermetadata): Return an error as
+ appropriate.
+
* inode.c (struct ufs_fhandle): Layout filehandle more like Unixy
NFSD.
(diskfs_S_file_getfh): Bother to clear unused parts of a
diff --git a/ufs/devio.c b/ufs/devio.c
deleted file mode 100644
index 2e5cc332..00000000
--- a/ufs/devio.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Device input and output
- Copyright (C) 1992, 1993, 1994 Free Software Foundation
-
-This file is part of the GNU Hurd.
-
-The GNU Hurd is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-The GNU Hurd is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with the GNU Hurd; see the file COPYING. If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-
-/* Written by Michael I. Bushnell. */
-
-#include "ufs.h"
-#include <device/device.h>
-#include <device/device_request.h>
-
-/* Write disk block ADDR with DATA of LEN bytes, waiting for completion. */
-error_t
-dev_write_sync (daddr_t addr,
- vm_address_t data,
- long len)
-{
- int foo;
- assert (!diskfs_readonly);
- if (device_write (ufs_device, 0, addr, (io_buf_ptr_t) data, len, &foo)
- || foo != len)
- return EIO;
- return 0;
-}
-
-/* Write diskblock ADDR with DATA of LEN bytes; don't bother waiting
- for completion. */
-error_t
-dev_write (daddr_t addr,
- vm_address_t data,
- long len)
-{
- assert (!diskfs_readonly);
- if (device_write_request (ufs_device, MACH_PORT_NULL, 0, addr,
- (io_buf_ptr_t) data, len))
- return EIO;
- return 0;
-}
-
-static int deverr;
-
-/* Read disk block ADDR; put the address of the data in DATA; read LEN
- bytes. Always *DATA should be a full page no matter what. */
-error_t
-dev_read_sync (daddr_t addr,
- vm_address_t *data,
- long len)
-{
- int foo;
- deverr = device_read (ufs_device, 0, addr, len, (io_buf_ptr_t *)data,
- (u_int *)&foo);
- if (deverr || foo != len)
- return EIO;
- return 0;
-}
-
diff --git a/ufs/hyper.c b/ufs/hyper.c
index e4f58249..cb644797 100644
--- a/ufs/hyper.c
+++ b/ufs/hyper.c
@@ -276,7 +276,7 @@ get_hypermetadata (void)
taken from ordinary data blocks and might not be an even number
of pages; in that case writing it through the pager would nuke whatever
pages came after it on the disk and were backed by file pagers. */
-void
+error_t
diskfs_set_hypermetadata (int wait, int clean)
{
vm_address_t buf;
@@ -294,16 +294,22 @@ diskfs_set_hypermetadata (int wait, int clean)
err = diskfs_device_read_sync (fsbtodb (sblock, sblock->fs_csaddr),
&buf, bufsize);
- if (!err)
+ if (err)
+ return err;
+
+ bcopy (csum, (void *) buf, sblock->fs_cssize);
+ if (swab_disk)
+ swab_csums ((struct csum *)buf);
+ err = diskfs_device_write_sync (fsbtodb (sblock, sblock->fs_csaddr),
+ buf, bufsize);
+ vm_deallocate (mach_task_self (), buf, bufsize);
+
+ if (err)
{
- bcopy (csum, (void *) buf, sblock->fs_cssize);
- if (swab_disk)
- swab_csums ((struct csum *)buf);
- diskfs_device_write_sync (fsbtodb (sblock, sblock->fs_csaddr),
- buf, bufsize);
- csum_dirty = 0;
- vm_deallocate (mach_task_self (), buf, bufsize);
+ spin_unlock (&alloclock);
+ return err;
}
+ csum_dirty = 0;
}
if (clean && ufs_clean && !sblock->fs_clean)
@@ -326,6 +332,7 @@ diskfs_set_hypermetadata (int wait, int clean)
copy_sblock ();
sync_disk (wait);
+ return 0;
}
/* Copy the sblock into the disk */
diff --git a/ufs/inode.c b/ufs/inode.c
index 27f7c3bb..ae323a8c 100644
--- a/ufs/inode.c
+++ b/ufs/inode.c
@@ -498,8 +498,8 @@ error_t
diskfs_set_statfs (struct statfs *st)
{
st->f_type = FSTYPE_UFS;
- st->f_bsize = sblock->fs_bsize;
- st->f_blocks = sblock->fs_dsize * sblock->fs_frag;
+ st->f_bsize = sblock->fs_fsize;
+ st->f_blocks = sblock->fs_dsize;
st->f_bfree = (sblock->fs_cstotal.cs_nbfree * sblock->fs_frag
+ sblock->fs_cstotal.cs_nffree);
st->f_bavail = ((sblock->fs_dsize * (100 - sblock->fs_minfree) / 100)