diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2018-01-15 22:00:11 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2018-01-15 22:00:11 +0100 |
commit | f05b6bae5cbdf3c221eba05987dea7ab14e6524f (patch) | |
tree | da32ba2e8b4b9af7ed24b4dc547cd796bfcf89fa | |
parent | 104f3121f8005b426d4df77b2420cfe5837033d1 (diff) | |
download | hurd-f05b6bae5cbdf3c221eba05987dea7ab14e6524f.tar.gz hurd-f05b6bae5cbdf3c221eba05987dea7ab14e6524f.tar.bz2 hurd-f05b6bae5cbdf3c221eba05987dea7ab14e6524f.zip |
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.c | 34 |
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 |