summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorMateusz Guzik <mguzik@redhat.com>2017-10-03 12:17:40 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2017-10-05 11:22:06 -0400
commitfa7c1d5080f6e7dc4428210b6eac60271f899908 (patch)
tree8177ae39bbe2a1cdfbec923403a2589e91529188 /fs
parent9e66317d3c92ddaab330c125dfe9d06eee268aff (diff)
vfs: factor sb iteration out of do_emergency_remount
The intent is to reduce code duplication with other code iterating the list. No functional changes. Signed-off-by: Mateusz Guzik <mguzik@redhat.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r--fs/super.c61
1 files changed, 36 insertions, 25 deletions
diff --git a/fs/super.c b/fs/super.c
index 166c4ee0d0ed..fd9c02f543eb 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -574,6 +574,28 @@ void drop_super_exclusive(struct super_block *sb)
574} 574}
575EXPORT_SYMBOL(drop_super_exclusive); 575EXPORT_SYMBOL(drop_super_exclusive);
576 576
577static void __iterate_supers(void (*f)(struct super_block *))
578{
579 struct super_block *sb, *p = NULL;
580
581 spin_lock(&sb_lock);
582 list_for_each_entry(sb, &super_blocks, s_list) {
583 if (hlist_unhashed(&sb->s_instances))
584 continue;
585 sb->s_count++;
586 spin_unlock(&sb_lock);
587
588 f(sb);
589
590 spin_lock(&sb_lock);
591 if (p)
592 __put_super(p);
593 p = sb;
594 }
595 if (p)
596 __put_super(p);
597 spin_unlock(&sb_lock);
598}
577/** 599/**
578 * iterate_supers - call function for all active superblocks 600 * iterate_supers - call function for all active superblocks
579 * @f: function to call 601 * @f: function to call
@@ -881,33 +903,22 @@ cancel_readonly:
881 return retval; 903 return retval;
882} 904}
883 905
884static void do_emergency_remount(struct work_struct *work) 906static void do_emergency_remount_callback(struct super_block *sb)
885{ 907{
886 struct super_block *sb, *p = NULL; 908 down_write(&sb->s_umount);
887 909 if (sb->s_root && sb->s_bdev && (sb->s_flags & SB_BORN) &&
888 spin_lock(&sb_lock); 910 !sb_rdonly(sb)) {
889 list_for_each_entry(sb, &super_blocks, s_list) { 911 /*
890 if (hlist_unhashed(&sb->s_instances)) 912 * What lock protects sb->s_flags??
891 continue; 913 */
892 sb->s_count++; 914 do_remount_sb(sb, SB_RDONLY, NULL, 1);
893 spin_unlock(&sb_lock);
894 down_write(&sb->s_umount);
895 if (sb->s_root && sb->s_bdev && (sb->s_flags & SB_BORN) &&
896 !sb_rdonly(sb)) {
897 /*
898 * What lock protects sb->s_flags??
899 */
900 do_remount_sb(sb, SB_RDONLY, NULL, 1);
901 }
902 up_write(&sb->s_umount);
903 spin_lock(&sb_lock);
904 if (p)
905 __put_super(p);
906 p = sb;
907 } 915 }
908 if (p) 916 up_write(&sb->s_umount);
909 __put_super(p); 917}
910 spin_unlock(&sb_lock); 918
919static void do_emergency_remount(struct work_struct *work)
920{
921 __iterate_supers(do_emergency_remount_callback);
911 kfree(work); 922 kfree(work);
912 printk("Emergency Remount complete\n"); 923 printk("Emergency Remount complete\n");
913} 924}