Page MenuHomeFreeBSD

D17495.diff
No OneTemporary

D17495.diff

Index: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_queue.c
===================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_queue.c
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_queue.c
@@ -670,6 +670,7 @@
vdev_queue_aggregate(vdev_queue_t *vq, zio_t *zio)
{
zio_t *first, *last, *aio, *dio, *mandatory, *nio;
+ zio_link_t *zl = NULL;
uint64_t maxgap = 0;
uint64_t size;
boolean_t stretch;
@@ -813,9 +814,18 @@
zio_add_child(dio, aio);
vdev_queue_io_remove(vq, dio);
+ } while (dio != last);
+
+ /*
+ * We need to drop the vdev queue's lock to avoid a deadlock that we
+ * could encounter since this I/O will complete immediately.
+ */
+ mutex_exit(&vq->vq_lock);
+ while ((dio = zio_walk_parents(aio, &zl)) != NULL) {
zio_vdev_io_bypass(dio);
zio_execute(dio);
- } while (dio != last);
+ }
+ mutex_enter(&vq->vq_lock);
return (aio);
}

File Metadata

Mime Type
text/plain
Expires
Mon, Feb 2, 1:22 AM (3 h, 31 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28408740
Default Alt Text
D17495.diff (960 B)

Event Timeline