Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2023884pxj; Sun, 13 Jun 2021 06:17:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzUm+r/YirKEsDfBfP+6vENaGglqQ0L10eHEBJdD7EihCGj9IWW0rToh8L+3cpKy03VAmo8 X-Received: by 2002:a50:eb8f:: with SMTP id y15mr12925501edr.285.1623590256386; Sun, 13 Jun 2021 06:17:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623590256; cv=none; d=google.com; s=arc-20160816; b=uUDP9frkA33qhkxQA4o4LdeNLu0L8A5PyeyjUDWTvwGU3LUmHLxeaI4R8NFBTLqGLP 3D2TeF4aX5zAH7YtrGBYVb/TSN3TMR/1czuD7LPISvukvwkGfwVh0MxOL7bHfrnPgWwJ RzM/O49W/qYm24+4+SoxjvjHtMGxQ4cbEGZ3TWaLurI4fUVeYsqEMawbAso49Nwx46Yb 4bmdKZqn+JCdOSE0uxqe33Kbgrs6q/V8oxM9tzO8zCFoFox5uGggyCnUIO3b90RScN6r G0CR94hnl8GoyURsfnUfXxlm5gy9SxrlRJgeaoIv1xrvsbU8tgMXLwI2mxKnt1ACioIY c7Mg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:date:cc:to:from:subject:message-id:dkim-signature :dkim-signature; bh=j7vBJP72lUnzOBHkK3nu6jSViZMFYQH1CeGI/sC+F7U=; b=eX92VUnMFnvrUz0RE/gJVMVwm3KyuIbrQIMDLk8r1fLmno7lJdGBDzn6rQVgyiyVDm OQoxHB2BPP6Tb4+9Eei1NFX0UAPkt4o2Nm0TZwKAU4qHBl7k0Ap/L+PgiIeV9SguzJ/L e+rKj1c2awWauuKHNxzpxqt7D2Dq2l1quTZTHnkjY5yM9yKHoC6ysq8Wuo4xD6Eeq6Xb /Q95IZw6x0lqHvlbPtQvtr+eQgDDnCLnbWMjHYioLjDuSpPV/AoBeRzT3JnANfYqN0yd Ipsg80zgqM+u3RMv3aS0H+FzUVAALCJMMg4Xcfb9j0yE31Vwf2xsgn3pH1zymwUgMb22 w3oA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@hansenpartnership.com header.s=20151216 header.b=av96WejD; dkim=pass header.i=@hansenpartnership.com header.s=20151216 header.b=oEdMjy6R; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=hansenpartnership.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id v28si10006448ejk.538.2021.06.13.06.17.12; Sun, 13 Jun 2021 06:17:36 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@hansenpartnership.com header.s=20151216 header.b=av96WejD; dkim=pass header.i=@hansenpartnership.com header.s=20151216 header.b=oEdMjy6R; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=hansenpartnership.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231747AbhFMNRT (ORCPT + 99 others); Sun, 13 Jun 2021 09:17:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39464 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231286AbhFMNRT (ORCPT ); Sun, 13 Jun 2021 09:17:19 -0400 Received: from bedivere.hansenpartnership.com (bedivere.hansenpartnership.com [IPv6:2607:fcd0:100:8a00::2]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 18F32C061574; Sun, 13 Jun 2021 06:15:18 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by bedivere.hansenpartnership.com (Postfix) with ESMTP id 15A91128055B; Sun, 13 Jun 2021 06:15:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=hansenpartnership.com; s=20151216; t=1623590116; bh=pzxdLNEzqGnMnPZNOdg/sBCq6TrbljgRZQnji/Mau6Q=; h=Message-ID:Subject:From:To:Date:From; b=av96WejD7f0Pm6wVnOKP4mgskrdazILpjKwIi5oVLu25LR96wdWtHcarOJNgEH2iN 3kDFfzxvlvW1Pj4peMkQp6N0rpSpoBy6UKntodKVAFrY5W+kbIi4Yvt5wG5WhIYN9D M97iXEkDZ/7FR10M1zXfi/JMqEg1H9CA4ZNxmklc= Received: from bedivere.hansenpartnership.com ([127.0.0.1]) by localhost (bedivere.hansenpartnership.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id im6BXv7YPCau; Sun, 13 Jun 2021 06:15:16 -0700 (PDT) Received: from [10.71.4.154] (unknown [134.204.103.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bedivere.hansenpartnership.com (Postfix) with ESMTPSA id 6ABE11280558; Sun, 13 Jun 2021 06:15:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=hansenpartnership.com; s=20151216; t=1623590115; bh=pzxdLNEzqGnMnPZNOdg/sBCq6TrbljgRZQnji/Mau6Q=; h=Message-ID:Subject:From:To:Date:From; b=oEdMjy6RiuXfgYkpx1WBhMESyBRAbrubGaordZIcRsE/Frrj2jTVCeiyUr341kE9+ E4UGVk1vmk8zlvJOJei7q0gIh/ZY9wLg+kkrXbUqWnTrwJ9VFKwAS6FYvY/M5ijAjH oWc9vnfL4JxmM4F/DbdICdmV70qixUP7aM5O/rNQ= Message-ID: <3eba0f658b27558cd0e023d58912443886bc723e.camel@HansenPartnership.com> Subject: [GIT PULL] SCSI fixes for 5.13-rc5 From: James Bottomley To: Andrew Morton , Linus Torvalds Cc: linux-scsi , linux-kernel Date: Sun, 13 Jun 2021 09:15:13 -0400 Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.34.4 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Four reasonably small fixes to the core for scsi host allocation failure paths. The root problem is that we're not freeing the memory allocated by dev_set_name(), which involves a rejig of may of the free on error paths to do put_device() instead of kfree which, in turn, has several other knock on ramifications and inspection turned up a few other lurking bugs. The patch is available here: git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi.git scsi-fixes The short changelog is: Ming Lei (4): scsi: core: Only put parent device if host state differs from SHOST_CREATED scsi: core: Put .shost_dev in failure path if host state changes to RUNNING scsi: core: Fix failure handling of scsi_add_host_with_dma() scsi: core: Fix error handling of scsi_host_alloc() And the diffstat: drivers/scsi/hosts.c | 47 ++++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 21 deletions(-) With full diff below. James --- diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c index 697c09ef259b..cd52664920e1 100644 --- a/drivers/scsi/hosts.c +++ b/drivers/scsi/hosts.c @@ -254,12 +254,11 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev, device_enable_async_suspend(&shost->shost_dev); + get_device(&shost->shost_gendev); error = device_add(&shost->shost_dev); if (error) goto out_del_gendev; - get_device(&shost->shost_gendev); - if (shost->transportt->host_size) { shost->shost_data = kzalloc(shost->transportt->host_size, GFP_KERNEL); @@ -278,33 +277,36 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev, if (!shost->work_q) { error = -EINVAL; - goto out_free_shost_data; + goto out_del_dev; } } error = scsi_sysfs_add_host(shost); if (error) - goto out_destroy_host; + goto out_del_dev; scsi_proc_host_add(shost); scsi_autopm_put_host(shost); return error; - out_destroy_host: - if (shost->work_q) - destroy_workqueue(shost->work_q); - out_free_shost_data: - kfree(shost->shost_data); + /* + * Any host allocation in this function will be freed in + * scsi_host_dev_release(). + */ out_del_dev: device_del(&shost->shost_dev); out_del_gendev: + /* + * Host state is SHOST_RUNNING so we have to explicitly release + * ->shost_dev. + */ + put_device(&shost->shost_dev); device_del(&shost->shost_gendev); out_disable_runtime_pm: device_disable_async_suspend(&shost->shost_gendev); pm_runtime_disable(&shost->shost_gendev); pm_runtime_set_suspended(&shost->shost_gendev); pm_runtime_put_noidle(&shost->shost_gendev); - scsi_mq_destroy_tags(shost); fail: return error; } @@ -345,7 +347,7 @@ static void scsi_host_dev_release(struct device *dev) ida_simple_remove(&host_index_ida, shost->host_no); - if (parent) + if (shost->shost_state != SHOST_CREATED) put_device(parent); kfree(shost); } @@ -388,8 +390,10 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize) mutex_init(&shost->scan_mutex); index = ida_simple_get(&host_index_ida, 0, 0, GFP_KERNEL); - if (index < 0) - goto fail_kfree; + if (index < 0) { + kfree(shost); + return NULL; + } shost->host_no = index; shost->dma_channel = 0xff; @@ -481,7 +485,7 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize) shost_printk(KERN_WARNING, shost, "error handler thread failed to spawn, error = %ld\n", PTR_ERR(shost->ehandler)); - goto fail_index_remove; + goto fail; } shost->tmf_work_q = alloc_workqueue("scsi_tmf_%d", @@ -490,17 +494,18 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize) if (!shost->tmf_work_q) { shost_printk(KERN_WARNING, shost, "failed to create tmf workq\n"); - goto fail_kthread; + goto fail; } scsi_proc_hostdir_add(shost->hostt); return shost; + fail: + /* + * Host state is still SHOST_CREATED and that is enough to release + * ->shost_gendev. scsi_host_dev_release() will free + * dev_name(&shost->shost_dev). + */ + put_device(&shost->shost_gendev); - fail_kthread: - kthread_stop(shost->ehandler); - fail_index_remove: - ida_simple_remove(&host_index_ida, shost->host_no); - fail_kfree: - kfree(shost); return NULL; } EXPORT_SYMBOL(scsi_host_alloc);