From 3cd879a2e4f99268cd014b35335796cacb46bc39 Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Mon, 4 Aug 2014 19:29:32 +0300 Subject: [PATCH] sysrq: Emergency Remount R/O in reverse order This change fixes a problem where reboot on Android panics the kernel almost every time when file systems are mounted over loop devices. Android reboot command does: - sync - echo u > /proc/sysrq-trigger - syscall_reboot The problem is with sysrq emergency remount R/O trying to remount-ro in wrong order. since /data is re-mounted ro before loop devices, loop device remount-ro fails to flush the journal and panics the kernel: EXT4-fs (loop0): Remounting filesystem read-only EXT4-fs (loop0): previous I/O error to superblock detected loop: Write error at byte offset 0, length 4096. Buffer I/O error on device loop0, logical block 0 lost page write due to I/O error on loop0 Kernel panic - not syncing: EXT4-fs panic from previous error The fix is quite simple. In do_emergency_remount(), use list_for_each_entry_reverse() on sb list instead of list_for_each_entry(). It makes a lot of sense to umount the file systems in reverse order in which they were added to sb list. Change-Id: I4370e39b5873bd16ade5d5f9ddb2704beb02a2bb Signed-off-by: Amir Goldstein Acked-by: Oren Laadan (cherry picked from commit 334cc257d864f112b64fb885be908e6cdd644c08) --- fs/super.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/super.c b/fs/super.c index 97280e76179c..11afd67925bb 100644 --- a/fs/super.c +++ b/fs/super.c @@ -753,7 +753,7 @@ static void do_emergency_remount(struct work_struct *work) struct super_block *sb, *p = NULL; spin_lock(&sb_lock); - list_for_each_entry(sb, &super_blocks, s_list) { + list_for_each_entry_reverse(sb, &super_blocks, s_list) { if (hlist_unhashed(&sb->s_instances)) continue; sb->s_count++; -- 2.34.1