|
@@ -547,6 +547,39 @@ repeat:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+void do_thaw_all(unsigned long unused)
|
|
|
+{
|
|
|
+ struct super_block *sb;
|
|
|
+ char b[BDEVNAME_SIZE];
|
|
|
+
|
|
|
+ spin_lock(&sb_lock);
|
|
|
+restart:
|
|
|
+ list_for_each_entry(sb, &super_blocks, s_list) {
|
|
|
+ sb->s_count++;
|
|
|
+ spin_unlock(&sb_lock);
|
|
|
+ down_read(&sb->s_umount);
|
|
|
+ while (sb->s_bdev && !thaw_bdev(sb->s_bdev, sb))
|
|
|
+ printk(KERN_WARNING "Emergency Thaw on %s\n",
|
|
|
+ bdevname(sb->s_bdev, b));
|
|
|
+ up_read(&sb->s_umount);
|
|
|
+ spin_lock(&sb_lock);
|
|
|
+ if (__put_super_and_need_restart(sb))
|
|
|
+ goto restart;
|
|
|
+ }
|
|
|
+ spin_unlock(&sb_lock);
|
|
|
+ printk(KERN_WARNING "Emergency Thaw complete\n");
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * emergency_thaw_all -- forcibly thaw every frozen filesystem
|
|
|
+ *
|
|
|
+ * Used for emergency unfreeze of all filesystems via SysRq
|
|
|
+ */
|
|
|
+void emergency_thaw_all(void)
|
|
|
+{
|
|
|
+ pdflush_operation(do_thaw_all, 0);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* sync_mapping_buffers - write out & wait upon a mapping's "associated" buffers
|
|
|
* @mapping: the mapping which wants those buffers written
|