summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ufs/ChangeLog13
-rw-r--r--ufs/dir.c11
-rw-r--r--ufs/pager.c7
-rw-r--r--ufs/sizes.c22
4 files changed, 47 insertions, 6 deletions
diff --git a/ufs/ChangeLog b/ufs/ChangeLog
index ca832c8e..3a225552 100644
--- a/ufs/ChangeLog
+++ b/ufs/ChangeLog
@@ -1,3 +1,16 @@
+Wed Aug 20 14:34:24 1997 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
+
+ * dir.c (diskfs_lookup_hard): Cope with error return from
+ diskfs_get_filemap.
+ * sizes.c (diskfs_grow): Likewise.
+ * dir.c (diskfs_dirempty): Cope (poorly) with error return from
+ diskfs_get_filemap.
+ * sizes.c (diskfs_truncate): Likewise.
+ (block_extended): Likewise.
+
+ * pager.c (diskfs_get_filemap): If pager_create fails, return
+ error to caller.
+
Mon Jun 30 17:38:57 1997 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
* main.c (main): If the store cannot be made writable, then set
diff --git a/ufs/dir.c b/ufs/dir.c
index 6c44932d..bdf84be6 100644
--- a/ufs/dir.c
+++ b/ufs/dir.c
@@ -1,5 +1,5 @@
/* Directory management routines
- Copyright (C) 1994, 1995, 1996 Free Software Foundation
+ Copyright (C) 1994, 1995, 1996, 1997 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
@@ -145,6 +145,10 @@ diskfs_lookup_hard (struct node *dp, char *name, enum lookup_type type,
/* Map in the directory contents. */
memobj = diskfs_get_filemap (dp, prot);
+
+ if (memobj == MACH_PORT_NULL)
+ return errno;
+
buf = 0;
/* We allow extra space in case we have to do an EXTEND. */
buflen = round_page (dp->dn_stat.st_size + DIRBLKSIZ);
@@ -727,6 +731,11 @@ diskfs_dirempty(struct node *dp,
error_t err;
memobj = diskfs_get_filemap (dp, VM_PROT_READ);
+
+ if (memobj == MACH_PORT_NULL)
+ /* XXX should reflect error properly */
+ return 0;
+
buf = 0;
err = vm_map (mach_task_self (), &buf, dp->dn_stat.st_size, 0,
diff --git a/ufs/pager.c b/ufs/pager.c
index afb34839..61695db6 100644
--- a/ufs/pager.c
+++ b/ufs/pager.c
@@ -569,6 +569,13 @@ diskfs_get_filemap (struct node *np, vm_prot_t prot)
diskfs_nref_light (np);
upi->p = pager_create (upi, pager_bucket,
MAY_CACHE, MEMORY_OBJECT_COPY_DELAY);
+ if (upi->p == 0)
+ {
+ diskfs_nrele_light (np);
+ free (upi);
+ spin_unlock (&node2pagelock);
+ return MACH_PORT_NULL;
+ }
np->dn->fileinfo = upi;
right = pager_get_port (np->dn->fileinfo->p);
ports_port_deref (np->dn->fileinfo->p);
diff --git a/ufs/sizes.c b/ufs/sizes.c
index 84c2493d..5c3d12f0 100644
--- a/ufs/sizes.c
+++ b/ufs/sizes.c
@@ -1,5 +1,5 @@
/* File growth and truncation
- Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation
+ Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation
This file is part of the GNU Hurd.
@@ -104,10 +104,14 @@ diskfs_truncate (struct node *np,
pager_change_attributes (upi->p, MAY_CACHE,
MEMORY_OBJECT_COPY_NONE, 1);
obj = diskfs_get_filemap (np, VM_PROT_READ | VM_PROT_WRITE);
- poke_pages (obj, round_page (length), round_page (np->allocsize));
- mach_port_deallocate (mach_task_self (), obj);
- pager_flush_some (upi->p, round_page (length),
- np->allocsize - length, 1);
+ if (obj != MACH_PORT_NULL)
+ {
+ /* XXX should cope with errors from diskfs_get_filemap */
+ poke_pages (obj, round_page (length), round_page (np->allocsize));
+ mach_port_deallocate (mach_task_self (), obj);
+ pager_flush_some (upi->p, round_page (length),
+ np->allocsize - length, 1);
+ }
ports_port_deref (upi->p);
}
@@ -400,6 +404,11 @@ block_extended (struct node *np,
/* Map in this part of the file */
mapobj = diskfs_get_filemap (np, VM_PROT_WRITE | VM_PROT_READ);
+
+ /* XXX Should cope with errors from diskfs_get_filemap and back
+ out the operation here. */
+ assert (mapobj);
+
err = vm_map (mach_task_self (), &mapaddr, round_page (old_size), 0, 1,
mapobj, lbn * sblock->fs_bsize, 0,
VM_PROT_READ|VM_PROT_WRITE, VM_PROT_READ|VM_PROT_WRITE, 0);
@@ -477,6 +486,9 @@ diskfs_grow (struct node *np,
/* This reference will ensure that NP->dn->fileinfo stays allocated. */
pagerpt = diskfs_get_filemap (np, VM_PROT_WRITE|VM_PROT_READ);
+ if (pagerpt == MACH_PORT_NULL)
+ return errno;
+
/* The new last block of the file. */
lbn = lblkno (sblock, end - 1);