summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2018-01-15 22:00:11 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2018-01-15 22:00:11 +0100
commitf05b6bae5cbdf3c221eba05987dea7ab14e6524f (patch)
treeda32ba2e8b4b9af7ed24b4dc547cd796bfcf89fa
parent104f3121f8005b426d4df77b2420cfe5837033d1 (diff)
Revert "libdiskfs: Shutdown pagers on startup_dosync."
This reverts commit 89a49ec8b3a847f3b770cff6a4a80b98b94ad7bf. There was a typo in diskfs_shutdown (FSYS_GOAWAY_FORCE || FSYS_GOAWAY_RECURSE) which was making it FSYS_GOAWAY_NOWAIT, and thus not actually syncing if there happens to be clients (it was then returning EBUSY). Fixing this into FSYS_GOAWAY_FORCE | FSYS_GOAWAY_RECURSE then makes it wait for clients (and NOWAIT is not supported), and there are very often some left, thus not syncing either.
-rw-r--r--libdiskfs/init-startup.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/libdiskfs/init-startup.c b/libdiskfs/init-startup.c
index 4251e0b3..a2e3638d 100644
--- a/libdiskfs/init-startup.c
+++ b/libdiskfs/init-startup.c
@@ -126,15 +126,47 @@ 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 diskfs_shutdown (FSYS_GOAWAY_FORCE || FSYS_GOAWAY_RECURSE);
+ return err;
}
/* This is called when we have an ordinary environment, complete