diff options
author | Mateusz Guzik <mguzik@redhat.com> | 2017-10-03 12:17:40 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2017-10-05 11:22:06 -0400 |
commit | fa7c1d5080f6e7dc4428210b6eac60271f899908 (patch) | |
tree | 8177ae39bbe2a1cdfbec923403a2589e91529188 /fs | |
parent | 9e66317d3c92ddaab330c125dfe9d06eee268aff (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.c | 61 |
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 | } |
575 | EXPORT_SYMBOL(drop_super_exclusive); | 575 | EXPORT_SYMBOL(drop_super_exclusive); |
576 | 576 | ||
577 | static 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 | ||
884 | static void do_emergency_remount(struct work_struct *work) | 906 | static 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 | |
919 | static 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 | } |