From: Boris Protopopov Date: Sat, 27 May 2017 00:50:25 +0000 (-0400) Subject: Fix ida leak in zvol_create_minor_impl X-Git-Tag: zfs-0.7.0-rc5~74 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2d82116e80ba88fb8efbc3e573ee8a924323b32a;p=zfs Fix ida leak in zvol_create_minor_impl Added missing ida_simple_remove() in the error handling path. Reviewed-by: Chunwei Chen Reviewed-by: Brian Behlendorf Reviewed-by: George Melikov Signed-off-by: Boris Protopopov Closes #6159 Closes #6172 --- diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c index 121f75e4e..8ca510b79 100644 --- a/module/zfs/zvol.c +++ b/module/zfs/zvol.c @@ -1164,6 +1164,12 @@ zvol_resume(zvol_state_t *zv) int error = 0; ASSERT(RW_WRITE_HELD(&zv->zv_suspend_lock)); + + /* + * Cannot take zv_state_lock here with zv_suspend_lock + * held; however, the latter is held in exclusive mode, + * so it is not necessary to do so + */ if (zv->zv_open_count > 0) { VERIFY0(dmu_objset_hold(zv->zv_name, zv, &zv->zv_objset)); VERIFY3P(zv->zv_objset->os_dsl_dataset->ds_owner, ==, zv); @@ -1620,6 +1626,7 @@ zvol_create_minor_impl(const char *name) zv = zvol_find_by_name_hash(name, hash); if (zv) { mutex_exit(&zvol_state_lock); + ida_simple_remove(&zvol_ida, idx); return (SET_ERROR(EEXIST)); }