@@ -599,7 +599,6 @@ static zio_t *
599
599
vdev_queue_aggregate (vdev_queue_t * vq , zio_t * zio )
600
600
{
601
601
zio_t * first , * last , * aio , * dio , * mandatory , * nio ;
602
- zio_link_t * zl = NULL ;
603
602
uint64_t maxgap = 0 ;
604
603
uint64_t size ;
605
604
uint64_t limit ;
@@ -797,19 +796,12 @@ vdev_queue_aggregate(vdev_queue_t *vq, zio_t *zio)
797
796
ASSERT3U (abd_get_size (aio -> io_abd ), = = , aio -> io_size );
798
797
799
798
/*
800
- * We need to drop the vdev queue's lock during zio_execute() to
801
- * avoid a deadlock that we could encounter due to lock order
802
- * reversal between vq_lock and io_lock in zio_change_priority().
799
+ * Callers must call zio_vdev_io_bypass() and zio_execute() for
800
+ * aggregated (parent) I/Os so that we could avoid dropping the
801
+ * queue's lock here to avoid a deadlock that we could encounter
802
+ * due to lock order reversal between vq_lock and io_lock in
803
+ * zio_change_priority().
803
804
*/
804
- mutex_exit (& vq -> vq_lock );
805
- while ((dio = zio_walk_parents (aio , & zl )) != NULL ) {
806
- ASSERT3U (dio -> io_type , = = , aio -> io_type );
807
-
808
- zio_vdev_io_bypass (dio );
809
- zio_execute (dio );
810
- }
811
- mutex_enter (& vq -> vq_lock );
812
-
813
805
return (aio );
814
806
}
815
807
@@ -847,23 +839,24 @@ vdev_queue_io_to_issue(vdev_queue_t *vq)
847
839
ASSERT3U (zio -> io_priority , = = , p );
848
840
849
841
aio = vdev_queue_aggregate (vq , zio );
850
- if (aio != NULL )
842
+ if (aio != NULL ) {
851
843
zio = aio ;
852
- else
844
+ } else {
853
845
vdev_queue_io_remove (vq , zio );
854
846
855
- /*
856
- * If the I/O is or was optional and therefore has no data, we need to
857
- * simply discard it. We need to drop the vdev queue's lock to avoid a
858
- * deadlock that we could encounter since this I/O will complete
859
- * immediately.
860
- */
861
- if (zio -> io_flags & ZIO_FLAG_NODATA ) {
862
- mutex_exit (& vq -> vq_lock );
863
- zio_vdev_io_bypass (zio );
864
- zio_execute (zio );
865
- mutex_enter (& vq -> vq_lock );
866
- goto again ;
847
+ /*
848
+ * If the I/O is or was optional and therefore has no data, we
849
+ * need to simply discard it. We need to drop the vdev queue's
850
+ * lock to avoid a deadlock that we could encounter since this
851
+ * I/O will complete immediately.
852
+ */
853
+ if (zio -> io_flags & ZIO_FLAG_NODATA ) {
854
+ mutex_exit (& vq -> vq_lock );
855
+ zio_vdev_io_bypass (zio );
856
+ zio_execute (zio );
857
+ mutex_enter (& vq -> vq_lock );
858
+ goto again ;
859
+ }
867
860
}
868
861
869
862
vdev_queue_pending_add (vq , zio );
@@ -876,7 +869,8 @@ zio_t *
876
869
vdev_queue_io (zio_t * zio )
877
870
{
878
871
vdev_queue_t * vq = & zio -> io_vd -> vdev_queue ;
879
- zio_t * nio ;
872
+ zio_t * dio , * nio ;
873
+ zio_link_t * zl = NULL ;
880
874
881
875
if (zio -> io_flags & ZIO_FLAG_DONT_QUEUE )
882
876
return (zio );
@@ -923,6 +917,11 @@ vdev_queue_io(zio_t *zio)
923
917
return (NULL );
924
918
925
919
if (nio -> io_done == vdev_queue_agg_io_done ) {
920
+ while ((dio = zio_walk_parents (nio , & zl )) != NULL ) {
921
+ ASSERT3U (dio -> io_type , = = , nio -> io_type );
922
+ zio_vdev_io_bypass (dio );
923
+ zio_execute (dio );
924
+ }
926
925
zio_nowait (nio );
927
926
return (NULL );
928
927
}
934
933
vdev_queue_io_done (zio_t * zio )
935
934
{
936
935
vdev_queue_t * vq = & zio -> io_vd -> vdev_queue ;
937
- zio_t * nio ;
936
+ zio_t * dio , * nio ;
937
+ zio_link_t * zl = NULL ;
938
938
939
939
hrtime_t now = gethrtime ();
940
940
vq -> vq_io_complete_ts = now ;
@@ -946,6 +946,11 @@ vdev_queue_io_done(zio_t *zio)
946
946
while ((nio = vdev_queue_io_to_issue (vq )) != NULL ) {
947
947
mutex_exit (& vq -> vq_lock );
948
948
if (nio -> io_done == vdev_queue_agg_io_done ) {
949
+ while ((dio = zio_walk_parents (nio , & zl )) != NULL ) {
950
+ ASSERT3U (dio -> io_type , = = , nio -> io_type );
951
+ zio_vdev_io_bypass (dio );
952
+ zio_execute (dio );
953
+ }
949
954
zio_nowait (nio );
950
955
} else {
951
956
zio_vdev_io_reissue (nio );
0 commit comments