@@ -21,12 +21,12 @@ static inline struct mount *next_peer(struct mount *p)
2121
2222static inline struct mount * first_slave (struct mount * p )
2323{
24- return list_entry (p -> mnt_slave_list .next , struct mount , mnt_slave );
24+ return hlist_entry (p -> mnt_slave_list .first , struct mount , mnt_slave );
2525}
2626
2727static inline struct mount * next_slave (struct mount * p )
2828{
29- return list_entry (p -> mnt_slave .next , struct mount , mnt_slave );
29+ return hlist_entry (p -> mnt_slave .next , struct mount , mnt_slave );
3030}
3131
3232static struct mount * get_peer_under_root (struct mount * mnt ,
@@ -85,21 +85,18 @@ static struct mount *propagation_source(struct mount *mnt)
8585
8686static void transfer_propagation (struct mount * mnt , struct mount * to )
8787{
88- struct mount * slave_mnt ;
89- if (!to ) {
90- struct list_head * p = & mnt -> mnt_slave_list ;
91- while (!list_empty (p )) {
92- slave_mnt = list_first_entry (p ,
93- struct mount , mnt_slave );
94- list_del_init (& slave_mnt -> mnt_slave );
95- slave_mnt -> mnt_master = NULL ;
96- }
97- return ;
88+ struct hlist_node * p = NULL , * n ;
89+ struct mount * m ;
90+
91+ hlist_for_each_entry_safe (m , n , & mnt -> mnt_slave_list , mnt_slave ) {
92+ m -> mnt_master = to ;
93+ if (!to )
94+ hlist_del_init (& m -> mnt_slave );
95+ else
96+ p = & m -> mnt_slave ;
9897 }
99- list_for_each_entry (slave_mnt , & mnt -> mnt_slave_list , mnt_slave )
100- slave_mnt -> mnt_master = to ;
101- list_splice (& mnt -> mnt_slave_list , to -> mnt_slave_list .prev );
102- INIT_LIST_HEAD (& mnt -> mnt_slave_list );
98+ if (p )
99+ hlist_splice_init (& mnt -> mnt_slave_list , p , & to -> mnt_slave_list );
103100}
104101
105102/*
@@ -124,10 +121,10 @@ void change_mnt_propagation(struct mount *mnt, int type)
124121 transfer_propagation (mnt , m );
125122 mnt -> mnt_master = m ;
126123 }
127- list_del_init (& mnt -> mnt_slave );
124+ hlist_del_init (& mnt -> mnt_slave );
128125 if (type == MS_SLAVE ) {
129126 if (mnt -> mnt_master )
130- list_add (& mnt -> mnt_slave ,
127+ hlist_add_head (& mnt -> mnt_slave ,
131128 & mnt -> mnt_master -> mnt_slave_list );
132129 } else {
133130 mnt -> mnt_master = NULL ;
@@ -147,7 +144,7 @@ static struct mount *__propagation_next(struct mount *m,
147144 if (master == origin -> mnt_master ) {
148145 struct mount * next = next_peer (m );
149146 return (next == origin ) ? NULL : next ;
150- } else if (m -> mnt_slave .next != & master -> mnt_slave_list )
147+ } else if (m -> mnt_slave .next )
151148 return next_slave (m );
152149
153150 /* back at master */
@@ -169,7 +166,7 @@ static struct mount *propagation_next(struct mount *m,
169166 struct mount * origin )
170167{
171168 /* are there any slaves of this mount? */
172- if (!IS_MNT_NEW (m ) && !list_empty (& m -> mnt_slave_list ))
169+ if (!IS_MNT_NEW (m ) && !hlist_empty (& m -> mnt_slave_list ))
173170 return first_slave (m );
174171
175172 return __propagation_next (m , origin );
@@ -194,7 +191,7 @@ static struct mount *next_group(struct mount *m, struct mount *origin)
194191 while (1 ) {
195192 while (1 ) {
196193 struct mount * next ;
197- if (!IS_MNT_NEW (m ) && !list_empty (& m -> mnt_slave_list ))
194+ if (!IS_MNT_NEW (m ) && !hlist_empty (& m -> mnt_slave_list ))
198195 return first_slave (m );
199196 next = next_peer (m );
200197 if (m -> mnt_group_id == origin -> mnt_group_id ) {
@@ -207,7 +204,7 @@ static struct mount *next_group(struct mount *m, struct mount *origin)
207204 /* m is the last peer */
208205 while (1 ) {
209206 struct mount * master = m -> mnt_master ;
210- if (m -> mnt_slave .next != & master -> mnt_slave_list )
207+ if (m -> mnt_slave .next )
211208 return next_slave (m );
212209 m = next_peer (master );
213210 if (master -> mnt_group_id == origin -> mnt_group_id )
0 commit comments