summaryrefslogtreecommitdiff
path: root/libdiskfs
diff options
context:
space:
mode:
authorJustus Winter <justus@gnupg.org>2017-08-10 23:26:25 +0200
committerJustus Winter <justus@gnupg.org>2017-09-12 12:23:46 +0200
commit89a49ec8b3a847f3b770cff6a4a80b98b94ad7bf (patch)
tree1b0a22717e14702e7db94d83252e43927fbffd65 /libdiskfs
parent86ecc3fc9aa88091ac77ec35688d08634567d169 (diff)
libdiskfs: Shutdown pagers on startup_dosync.
* libdiskfs/init-startup.c (diskfs_S_startup_dosync): Simplify the code by just using 'diskfs_shutdown' with the force flag. This also shuts down pagers, which potentially affects other tasks, but getting rid of the pagers allows us to commit a clean and consistent state to the disk before shutting down. Crashing other tasks just before the system powers down seems like a small price to pay.
Diffstat (limited to 'libdiskfs')
-rw-r--r--libdiskfs/init-startup.c34
1 files changed, 1 insertions, 33 deletions
diff --git a/libdiskfs/init-startup.c b/libdiskfs/init-startup.c
index a2e3638d..4251e0b3 100644
--- a/libdiskfs/init-startup.c
+++ b/libdiskfs/init-startup.c
@@ -126,47 +126,15 @@ diskfs_startup_diskfs (mach_port_t bootstrap, int flags)
error_t
diskfs_S_startup_dosync (mach_port_t handle)
{
- error_t err = 0;
struct port_info *pi
= ports_lookup_port (diskfs_port_bucket, handle,
diskfs_shutdown_notification_class);
if (!pi)
return EOPNOTSUPP;
-
- if (! diskfs_readonly)
- {
- /* First start a sync so that if something goes wrong
- we at least get this much done. */
- diskfs_sync_everything (0);
- diskfs_set_hypermetadata (0, 0);
-
- pthread_rwlock_wrlock (&diskfs_fsys_lock);
-
- /* Permit all the current RPC's to finish, and then suspend new ones */
- err = ports_inhibit_class_rpcs (diskfs_protid_class);
- if (! err)
- {
- diskfs_sync_everything (1);
- diskfs_set_hypermetadata (1, 1);
- _diskfs_diskdirty = 0;
-
- /* XXX: if some application writes something after that, we will
- * crash. That is still better than creating pending writes before
- * poweroff, and thus fsck on next reboot.
- */
- diskfs_readonly = 1;
- diskfs_readonly_changed (1);
-
- ports_resume_class_rpcs (diskfs_protid_class);
- }
-
- pthread_rwlock_unlock (&diskfs_fsys_lock);
- }
-
ports_port_deref (pi);
- return err;
+ return diskfs_shutdown (FSYS_GOAWAY_FORCE || FSYS_GOAWAY_RECURSE);
}
/* This is called when we have an ordinary environment, complete