{
struct super_block *sb, *p = NULL;
int ret;
printk("==>do_emergency_remount\n");
spin_lock(&sb_lock);
list_for_each_entry(sb, &super_blocks, s_list) {
printk("poll id=%s bdev=%s root=%s mtd=%s\n",
sb->s_id,
sb->s_bdev ? "yes" : "no",
sb->s_root ? "yes" : "no",
sb->s_mtd ? "yes" : "null");
if (list_empty(&sb->s_instances))
continue;
sb->s_count++;
spin_unlock(&sb_lock);
down_write(&sb->s_umount);
if (sb->s_root && sb->s_bdev && !(sb->s_flags & MS_RDONLY)) {
/*
* What lock protects sb->s_flags??
*/
ret = do_remount_sb(sb, MS_RDONLY, NULL, 1);
//printk("do_remount_sb(%s) return %d", sb->s_root->d_iname, ret);
}
up_write(&sb->s_umount);
spin_lock(&sb_lock);
if (p)
__put_super(p);
p = sb;
}
if (p)
__put_super(p);
spin_unlock(&sb_lock);
kfree(work);
printk("Emergency Remount complete\n");
}
以上函数第一个红色部分是我添加的调试信息,通过函数分析,只读superblock的s_bdev (应该是块设备属性)不为空时,才有可能执行真正的Remount操作
但通过打印信息显示,所有的superblock的s_bdev都为空,所以其实系统什么也没有做。