mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
Fix taskq creation failure in vdev_open_children()
When creating and destroying pools in tight loop it's possible to exhaust the number of allowed threads on a system. This results in taskq_create() failling and a NULL dereference. Resolve the issue by falling back to opening the vdevs all synchronously. Reviewed-by: Denys Rtveliashvili <denys@rtveliashvili.name> Reviewed-by: Håkan Johansson <f96hajo@chalmers.se> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes zfsonlinux/spl#521 Closes #4637
This commit is contained in:
@@ -1179,12 +1179,15 @@ vdev_open_children(vdev_t *vd)
|
||||
* spa_namespace_lock
|
||||
*/
|
||||
if (vdev_uses_zvols(vd)) {
|
||||
retry_sync:
|
||||
for (c = 0; c < children; c++)
|
||||
vd->vdev_child[c]->vdev_open_error =
|
||||
vdev_open(vd->vdev_child[c]);
|
||||
} else {
|
||||
tq = taskq_create("vdev_open", children, minclsyspri,
|
||||
children, children, TASKQ_PREPOPULATE);
|
||||
if (tq == NULL)
|
||||
goto retry_sync;
|
||||
|
||||
for (c = 0; c < children; c++)
|
||||
VERIFY(taskq_dispatch(tq, vdev_open_child,
|
||||
|
||||
Reference in New Issue
Block a user