@@ -887,21 +887,46 @@ void drop_super_exclusive(struct super_block *sb)
887
887
}
888
888
EXPORT_SYMBOL (drop_super_exclusive );
889
889
890
- void __iterate_supers (void (* f )(struct super_block * , void * ), void * arg , bool excl )
890
+ enum super_iter_flags_t {
891
+ SUPER_ITER_EXCL = (1U << 0 ),
892
+ SUPER_ITER_UNLOCKED = (1U << 1 ),
893
+ SUPER_ITER_REVERSE = (1U << 2 ),
894
+ };
895
+
896
+ static inline struct super_block * first_super (enum super_iter_flags_t flags )
897
+ {
898
+ if (flags & SUPER_ITER_REVERSE )
899
+ return list_last_entry (& super_blocks , struct super_block , s_list );
900
+ return list_first_entry (& super_blocks , struct super_block , s_list );
901
+ }
902
+
903
+ static inline struct super_block * next_super (struct super_block * sb ,
904
+ enum super_iter_flags_t flags )
905
+ {
906
+ if (flags & SUPER_ITER_REVERSE )
907
+ return list_prev_entry (sb , s_list );
908
+ return list_next_entry (sb , s_list );
909
+ }
910
+
911
+ static void __iterate_supers (void (* f )(struct super_block * , void * ), void * arg ,
912
+ enum super_iter_flags_t flags )
891
913
{
892
914
struct super_block * sb , * p = NULL ;
915
+ bool excl = flags & SUPER_ITER_EXCL ;
893
916
894
- spin_lock (& sb_lock );
895
- list_for_each_entry (sb , & super_blocks , s_list ) {
896
- bool locked ;
917
+ guard (spinlock )(& sb_lock );
897
918
919
+ for (sb = first_super (flags );
920
+ !list_entry_is_head (sb , & super_blocks , s_list );
921
+ sb = next_super (sb , flags )) {
898
922
if (super_flags (sb , SB_DYING ))
899
923
continue ;
900
924
sb -> s_count ++ ;
901
925
spin_unlock (& sb_lock );
902
926
903
- locked = super_lock (sb , excl );
904
- if (locked ) {
927
+ if (flags & SUPER_ITER_UNLOCKED ) {
928
+ f (sb , arg );
929
+ } else if (super_lock (sb , excl )) {
905
930
f (sb , arg );
906
931
super_unlock (sb , excl );
907
932
}
@@ -913,7 +938,11 @@ void __iterate_supers(void (*f)(struct super_block *, void *), void *arg, bool e
913
938
}
914
939
if (p )
915
940
__put_super (p );
916
- spin_unlock (& sb_lock );
941
+ }
942
+
943
+ void iterate_supers (void (* f )(struct super_block * , void * ), void * arg )
944
+ {
945
+ __iterate_supers (f , arg , 0 );
917
946
}
918
947
919
948
/**
@@ -1097,7 +1126,8 @@ static void do_emergency_remount_callback(struct super_block *sb, void *unused)
1097
1126
1098
1127
static void do_emergency_remount (struct work_struct * work )
1099
1128
{
1100
- __iterate_supers (do_emergency_remount_callback , NULL , true);
1129
+ __iterate_supers (do_emergency_remount_callback , NULL ,
1130
+ SUPER_ITER_EXCL | SUPER_ITER_REVERSE );
1101
1131
kfree (work );
1102
1132
printk ("Emergency Remount complete\n" );
1103
1133
}
@@ -1124,7 +1154,7 @@ static void do_thaw_all_callback(struct super_block *sb, void *unused)
1124
1154
1125
1155
static void do_thaw_all (struct work_struct * work )
1126
1156
{
1127
- __iterate_supers (do_thaw_all_callback , NULL , true );
1157
+ __iterate_supers (do_thaw_all_callback , NULL , SUPER_ITER_EXCL );
1128
1158
kfree (work );
1129
1159
printk (KERN_WARNING "Emergency Thaw complete\n" );
1130
1160
}
0 commit comments