It makes no sense having the emergency thaw code in fs/buffer.c when all of it's operations are one superblocks and the code it executes is all in fs/super.c. Move the code there and clean it up. Cc: linux-fsdevel@xxxxxxxxxxxxxxx Cc: Josef Bacik <jbacik@xxxxxxxxxxxx> Cc: Eric Sandeen <sandeen@xxxxxxxxxx> Cc: Christoph Hellwig <hch@xxxxxxxxxxxxx> Cc: Luiz Capitulino <lcapitulino@xxxxxxxxxx> Reviewed-by: Jan Kara <jack@xxxxxxx> Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> Signed-off-by: Fernando Luis Vazquez Cao <fernando@xxxxxxxxxxxxx> --- diff -urNp linux-3.8-rc1-orig/fs/buffer.c linux-3.8-rc1/fs/buffer.c --- linux-3.8-rc1-orig/fs/buffer.c 2012-12-25 11:43:09.116018000 +0900 +++ linux-3.8-rc1/fs/buffer.c 2012-12-25 11:47:43.372018000 +0900 @@ -510,55 +510,6 @@ repeat: return err; } -static void do_thaw_one(struct super_block *sb, void *unused) -{ - int res; - - if (sb->s_bdev) { - char b[BDEVNAME_SIZE]; - printk(KERN_WARNING "Emergency Thaw on %s.\n", - bdevname(sb->s_bdev, b)); - } - - /* - * We got here from __iterate_supers with the superblock lock taken - * so we can call the lockless version of thaw_super() safely. - */ - res = __thaw_super(sb); - if (!res) { - deactivate_locked_super(sb); - /* - * We have to re-acquire s_umount because - * iterate_supers_write() will unlock it. It still holds - * passive reference so sb cannot be freed under us. - */ - down_write(&sb->s_umount); - } -} - -static void do_thaw_all(struct work_struct *work) -{ - iterate_supers_write(do_thaw_one, NULL); - kfree(work); - 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) -{ - struct work_struct *work; - - work = kmalloc(sizeof(*work), GFP_ATOMIC); - if (work) { - INIT_WORK(work, do_thaw_all); - schedule_work(work); - } -} - /** * sync_mapping_buffers - write out & wait upon a mapping's "associated" buffers * @mapping: the mapping which wants those buffers written diff -urNp linux-3.8-rc1-orig/fs/super.c linux-3.8-rc1/fs/super.c --- linux-3.8-rc1-orig/fs/super.c 2012-12-25 11:35:55.488018000 +0900 +++ linux-3.8-rc1/fs/super.c 2012-12-25 11:47:43.372018000 +0900 @@ -574,7 +574,7 @@ void iterate_supers_read(void (*f)(struc * a superblock locked in _write_ mode and given argument. The lock * is automatically relased after the function returns. */ -void iterate_supers_write(void (*f)(struct super_block *, void *), void *arg) +static void iterate_supers_write(void (*f)(struct super_block *, void *), void *arg) { __iterate_supers(f, arg , true); } @@ -1408,7 +1408,7 @@ EXPORT_SYMBOL(freeze_super); * to protect the superblock by grabbing the s_umount semaphore in write mode * and release it again on return. See thaw_super() for an example. */ -int __thaw_super(struct super_block *sb) +static int __thaw_super(struct super_block *sb) { int error = 0; @@ -1455,3 +1455,53 @@ int thaw_super(struct super_block *sb) return res; } EXPORT_SYMBOL(thaw_super); + +static void do_thaw_one(struct super_block *sb, void *unused) +{ + int res; + + if (sb->s_bdev) { + char b[BDEVNAME_SIZE]; + printk(KERN_WARNING "Emergency Thaw on %s.\n", + bdevname(sb->s_bdev, b)); + } + + /* + * We got here from __iterate_supers with the superblock lock taken + * so we can call the lockless version of thaw_super() safely. + */ + res = __thaw_super(sb); + if (!res) { + deactivate_locked_super(sb); + /* + * We have to re-acquire s_umount because + * iterate_supers_write() will unlock it. It still holds + * passive reference so sb cannot be freed under us. + */ + down_write(&sb->s_umount); + } +} + +static void do_thaw_all(struct work_struct *work) +{ + iterate_supers_write(do_thaw_one, NULL); + kfree(work); + 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) +{ + struct work_struct *work; + + work = kmalloc(sizeof(*work), GFP_ATOMIC); + if (work) { + INIT_WORK(work, do_thaw_all); + schedule_work(work); + } +} + diff -urNp linux-3.8-rc1-orig/include/linux/fs.h linux-3.8-rc1/include/linux/fs.h --- linux-3.8-rc1-orig/include/linux/fs.h 2012-12-25 11:43:09.116018000 +0900 +++ linux-3.8-rc1/include/linux/fs.h 2012-12-25 11:47:43.376018000 +0900 @@ -1879,7 +1879,6 @@ extern int user_statfs(const char __user extern int fd_statfs(int, struct kstatfs *); extern int vfs_ustat(dev_t, struct kstatfs *); extern int freeze_super(struct super_block *super); -extern int __thaw_super(struct super_block *super); extern int thaw_super(struct super_block *super); extern void emergency_thaw_all(void); extern bool our_mnt(struct vfsmount *mnt); @@ -2496,7 +2495,6 @@ extern struct super_block *get_super_tha extern struct super_block *get_active_super(struct block_device *bdev); extern void drop_super(struct super_block *sb); extern void iterate_supers_read(void (*)(struct super_block *, void *), void *); -extern void iterate_supers_write(void (*)(struct super_block *, void *), void *); extern void iterate_supers_type(struct file_system_type *, void (*)(struct super_block *, void *), void *); -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html