diff -rup busybox-1.11.1.before/init/init.c busybox-1.11.1/init/init.c
--- busybox-1.11.1.before/init/init.c	2008-06-25 13:51:31.000000000 +0100
+++ busybox-1.11.1/init/init.c	2008-11-07 11:46:08.261894993 +0000
@@ -13,6 +13,7 @@
 #include <syslog.h>
 #include <paths.h>
 #include <sys/reboot.h>
+#include <mntent.h>
 
 #define COMMAND_SIZE 256
 #define CONSOLE_NAME_SIZE 32
@@ -569,12 +570,89 @@ static void kill_all_processes(void)
 	sleep(1);
 }
 
+static void ensure_all_unmounted(void)
+{
+	int doForce = 0;
+	char path[2*PATH_MAX];
+	struct mntent me;
+	FILE *fp;
+	struct mtab_list {
+		char *dir;
+		char *device;
+		struct mtab_list *next;
+	} *mtl, *m;
+
+	mtl = m = NULL;
+
+	if (!(fp = setmntent(bb_path_mtab_file, "r"))) {
+		message(L_CONSOLE, "Couldn't open %s\n", bb_path_mtab_file);
+		if (!(fp = setmntent("/proc/mounts", "r")))
+		{
+			message("Cannot open /proc/mounts\n", bb_path_mtab_file);
+			return;
+		}
+	} else while (getmntent_r(fp,&me,path,sizeof(path))) {
+		m = xmalloc(sizeof(struct mtab_list));
+		m->next = mtl;
+		m->device = xstrdup(me.mnt_fsname);
+		m->dir = xstrdup(me.mnt_dir);
+		mtl = m;
+	}
+	endmntent(fp);
+
+	// Loop through everything we're supposed to umount, and do so.
+	while (m) {
+		int curstat;
+		char *zapit = NULL;
+
+		safe_strncpy(path, m->dir, PATH_MAX);
+		zapit = m->dir;
+
+		// Let's ask the thing nicely to unmount.
+		curstat = umount(zapit);
+
+		// Force the unmount, if necessary.
+		if (curstat && doForce) {
+			curstat = umount2(zapit, doForce);
+			if (curstat)
+				bb_error_msg_and_die("forced umount of %s failed!", zapit);
+		}
+
+		// If still can't umount, maybe remount read-only?
+		if (curstat && errno == EBUSY && m) {
+			curstat = mount(m->device, zapit, NULL, MS_REMOUNT|MS_RDONLY, NULL);
+			bb_error_msg(curstat ? "Cannot remount %s read-only" :
+						 "%s busy - remounted read-only", m->device);
+		}
+
+		if (curstat) {
+			bb_perror_msg("Couldn't umount %s", zapit);
+		} else {
+			message(L_CONSOLE, "Unmounted %s", zapit);
+			
+			/* De-allocate the loop device.  This ioctl should be ignored on
+			 * any non-loop block devices. */
+			if (ENABLE_FEATURE_MOUNT_LOOP && m)
+				del_loop(m->device);
+		}
+
+		// Find next matching mtab entry for -a or umount /dev
+		// Note this means that "umount /dev/blah" will unmount all instances
+		// of /dev/blah, not just the most recent.
+
+		m = m->next;
+	}
+
+	message(L_CONSOLE, "All filesystems are now unmounted");
+}
+
 static void halt_reboot_pwoff(int sig)
 {
 	const char *m;
 	int rb;
 
 	kill_all_processes();
+	ensure_all_unmounted();
 
 	m = "halt";
 	rb = RB_HALT_SYSTEM;
