diff options
author | Michael I. Bushnell <mib@gnu.org> | 1994-02-16 19:04:25 +0000 |
---|---|---|
committer | Michael I. Bushnell <mib@gnu.org> | 1994-02-16 19:04:25 +0000 |
commit | 56ca716479768c53243f27503e27274b6cb9ea39 (patch) | |
tree | f0888f7c9ba1a405e4a9ec3dc79a7d44ff95ded9 /libdiskfs/shutdown.c | |
parent | 9f085a9949d94e4e5cc37da34f5d3bda887949d2 (diff) |
Initial revision
Diffstat (limited to 'libdiskfs/shutdown.c')
-rw-r--r-- | libdiskfs/shutdown.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/libdiskfs/shutdown.c b/libdiskfs/shutdown.c new file mode 100644 index 00000000..440ce11f --- /dev/null +++ b/libdiskfs/shutdown.c @@ -0,0 +1,48 @@ +/* + Copyright (C) 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 "priv.h" + +/* Shutdown the filesystem; flags are as for fsys_goaway. */ +error_t +diskfs_shutdown (int flags) +{ + void sync_trans (struct trans_link *trans, void *arg) + { + fsys_goaway (trans->control, (int) arg); + } + + if (flags & FSYS_GOAWAY_RECURSE) + fshelp_translator_iterate (sync_trans, (void *)flags); + + if ((flags & FSYS_GOAWAY_UNLINK) + && S_ISDIR (diskfs_root_node->dn_stat.st_mode)) + return EBUSY; + + /* XXX doesn't handle GOAWAY_FORCE yet */ + + if (!(flags & FSYS_GOAWAY_NOSYNC)) + { + diskfs_shutdown_pager (); + diskfs_set_hypermetadata (1, 1); + } + return 0; +} |