When unmounting all filesystems, it appears that large amounts of writes in flight + very slow storage may cause the umount command to fail temporarily. Even the briefest of pauses appears to let the umount succeed. In this patch, call umount as normal, but if it fails, wait a few seconds then call it again (if it fails a second time, we report the error and fail the operation). I considered using 'umount -l' instead, but that is unsafe since when using umount-all we usually want the filesystem to be unmounted and synchronized properly by the time umount-all returns. --- daemon/mount.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/daemon/mount.c b/daemon/mount.c index c5b7d89..a076305 100644 --- a/daemon/mount.c +++ b/daemon/mount.c @@ -419,13 +419,20 @@ do_umount_all (void) /* Unmount them. */ for (i = 0; i < mounts.size; ++i) { - CLEANUP_FREE char *err = NULL; - - r = command (NULL, &err, str_umount, mounts.argv[i], NULL); + /* To avoid problems caused by temporary failures, such as a udev + * operation still completing, allow a second chance for each umount. + */ + r = command (NULL, NULL, str_umount, mounts.argv[i], NULL); if (r == -1) { - reply_with_error ("umount: %s: %s", mounts.argv[i], err); - free_stringslen (mounts.argv, mounts.size); - return -1; + CLEANUP_FREE char *err = NULL; + + sleep (5); + r = command (NULL, &err, str_umount, mounts.argv[i], NULL); + if (r == -1) { + reply_with_error ("umount: %s: %s", mounts.argv[i], err); + free_stringslen (mounts.argv, mounts.size); + return -1; + } } } -- 2.4.3