@@ -184,24 +184,13 @@ static struct block_device *__disk_get_part(struct gendisk *disk, int partno)
184184void disk_part_iter_init (struct disk_part_iter * piter , struct gendisk * disk ,
185185 unsigned int flags )
186186{
187- struct disk_part_tbl * ptbl ;
188-
189- rcu_read_lock ();
190- ptbl = rcu_dereference (disk -> part_tbl );
191-
192187 piter -> disk = disk ;
193188 piter -> part = NULL ;
194-
195- if (flags & DISK_PITER_REVERSE )
196- piter -> idx = ptbl -> len - 1 ;
197- else if (flags & (DISK_PITER_INCL_PART0 | DISK_PITER_INCL_EMPTY_PART0 ))
189+ if (flags & (DISK_PITER_INCL_PART0 | DISK_PITER_INCL_EMPTY_PART0 ))
198190 piter -> idx = 0 ;
199191 else
200192 piter -> idx = 1 ;
201-
202193 piter -> flags = flags ;
203-
204- rcu_read_unlock ();
205194}
206195
207196/**
@@ -216,7 +205,6 @@ void disk_part_iter_init(struct disk_part_iter *piter, struct gendisk *disk,
216205struct block_device * disk_part_iter_next (struct disk_part_iter * piter )
217206{
218207 struct disk_part_tbl * ptbl ;
219- int inc , end ;
220208
221209 /* put the last partition */
222210 disk_part_iter_exit (piter );
@@ -225,21 +213,8 @@ struct block_device *disk_part_iter_next(struct disk_part_iter *piter)
225213 rcu_read_lock ();
226214 ptbl = rcu_dereference (piter -> disk -> part_tbl );
227215
228- /* determine iteration parameters */
229- if (piter -> flags & DISK_PITER_REVERSE ) {
230- inc = -1 ;
231- if (piter -> flags & (DISK_PITER_INCL_PART0 |
232- DISK_PITER_INCL_EMPTY_PART0 ))
233- end = -1 ;
234- else
235- end = 0 ;
236- } else {
237- inc = 1 ;
238- end = ptbl -> len ;
239- }
240-
241216 /* iterate to the next partition */
242- for (; piter -> idx != end ; piter -> idx += inc ) {
217+ for (; piter -> idx != ptbl -> len ; piter -> idx += 1 ) {
243218 struct block_device * part ;
244219
245220 part = rcu_dereference (ptbl -> part [piter -> idx ]);
@@ -257,7 +232,10 @@ struct block_device *disk_part_iter_next(struct disk_part_iter *piter)
257232 continue ;
258233 }
259234
260- piter -> idx += inc ;
235+ piter -> part = bdgrab (part );
236+ if (!piter -> part )
237+ continue ;
238+ piter -> idx += 1 ;
261239 break ;
262240 }
263241
@@ -781,8 +759,7 @@ void del_gendisk(struct gendisk *disk)
781759 down_write (& bdev_lookup_sem );
782760
783761 /* invalidate stuff */
784- disk_part_iter_init (& piter , disk ,
785- DISK_PITER_INCL_EMPTY | DISK_PITER_REVERSE );
762+ disk_part_iter_init (& piter , disk , DISK_PITER_INCL_EMPTY );
786763 while ((part = disk_part_iter_next (& piter ))) {
787764 invalidate_partition (part );
788765 delete_partition (part );
0 commit comments