From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-oa1-f51.google.com (mail-oa1-f51.google.com [209.85.160.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 545832931F5 for ; Mon, 24 Aug 2026 06:01:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.51 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787551296; cv=none; b=JJvQGPtpMTnAT//6CdRZ4PuxQFPP3JmOkttMqHaDsPJuvQw5CpVvv3f7vIFLf5cl/VYzyusD9w8iT+YXkhO0Lh+j0jyxv1t8zAUFvS1M0tjSLyBeYPB6yXt6mpeqq6M4+w6tfLn0nnRfiQItzb80gnQgJthcSdVSUc8ueJHK9Ls= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787551296; c=relaxed/simple; bh=yAExTnD/6sHbPyBlq8UQCphOUIBnBA4uhXlnhV32iCk=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=DO9V71TEVv/VRkEzaV/s+SQA0SNntEb8i0KYOAt9pmAD58VXwmHTUboKHexxAChGIG46nkjEctO8iwEDQUQA0b5AjhIdHPot3Aivg1R/L6MDufsSR3bBFRBS6PWGf8vBoYBSLOYbGCo2n+6TfwhXUG9cmNYCwaq7NccjnqSUizU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=nhqcwheC; arc=none smtp.client-ip=209.85.160.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nhqcwheC" Received: by mail-oa1-f51.google.com with SMTP id 586e51a60fabf-44caeb973b3so2853166fac.1 for ; Sun, 23 Aug 2026 23:01:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787551294; x=1788156094; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=Gpm6zCO2JAQz0/FH0uq/+6yxEFK8TYfovI1Zuayc2Bk=; b=nhqcwheCQAQvjiXia2mb56hYo+zaH6f9KnJ1M9lg8dDudALiZGcn+OiMn7AZcT+WaY XsaHVV4JaBWzNS/tMEK93dqZPG372nLXSaRMo0OHSES3k4SLj+ovnSzFVAo9Kuq981rA 1ZHhaQN61QZNEla34Q9K56quh3oqH29yjdmJxusL6k7MCLzHyTNRDVu/XJlbHitnTpMK JxO4hOgVZ3VKSDKnVYyey/7qT+IH4c7gZ3zEDBeApiU9tDDNMefVu3lyTHr6JycFR7KD He7SY7rOZ4Otf8I0sWqCsnh91FcaRvPmvNSWTPyHx8ZSagdYBjG1yeOQRmfiH5N+f7tR huUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787551294; x=1788156094; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Gpm6zCO2JAQz0/FH0uq/+6yxEFK8TYfovI1Zuayc2Bk=; b=NKT/DeWiO3+/m59m2Po5Yi/JIfAKNFMepCTfP4uHeqYGe/9c/bNK5YuisZwM0/dNjD 0Uxz4ZA9q1qlzHYtdvh3itCKnlY/MuhHkF8krqc7pmWdtTN8PsBPQxST2LARxaeeA4up 8g6btWk1Smm5WvKne1UyIv4CEfHfRoacOCLxoQyY7Hkm9dgV9bKD6+dvCgTe7KwWU2IA DPJ4skyUmeR6kiPrBf/ehlJMDM9WLKspUAWmcksJljJ6x9cH0Z0Pi1oBhXBfyqLG66EQ rmbeHMMCW//PpKT7JpquRUfte7gUG3LtMnb4Duq/PSHf4psdR0ZtRmjUFaw/oY4FsUmk pZGA== X-Forwarded-Encrypted: i=1; AHgh+RqYmA78oS/lbvEFSE7f8eBx43j7VwWbd2D8LBboUmi7OGulGXvP7oM3WlJ/ZYaArM8AheTp55Ol7pA/zX8=@vger.kernel.org X-Gm-Message-State: AFuF++n/XGe0pN9+auxYeurg+BTG8g8x1QXgXpSyGpAZXwTBY5TgdttX /S0VFs099kJyOz0hrw1DOo7H6uW6v2Dp7YS9mQUJEWBdtrkIv1mO8JOt X-Gm-Gg: AR+sD10hAyv7MwuzmAvNtLTtT03mBbQFBylpJ8cVxWAXKImUU0yn1HMtTCSSDl2alzq klp8zprEF9exkb0qPIl+B5QHfdpugyDuETN6MYjpu2PjYl5nSm6RfF1/YjME+rDU6EHd0H1DaYL uXjt9xI2MqCzrqThSOm3PJjq4rywoSXDvMOc19unjGConY8Ia6WnG6rxhEz24m/5KhihC/mOW3z 862Yp8ALjLYoGoIKUtyCrT+oL0oJ4JWjzd3hzM1Gy/v8pcz4kZG47YN+3cg71URENi0KbFK1ygT jTisS8SpVXDvzLo6rMVhnKZW/p3+Z+K7c4NIDZgypHIJ2y+zIg3yw32/nRa+iAbeC6UCHxxgTpe /zObRtkY++S48uIhLgCaV2aAcewGDFa0zTF3XvRnzW1BvVaD5Y9Jix7tuNk2JKoZ6WfhnA6B8LW VSn2kmcWlpljhHDh86xLmBy4nzdAnH9Zrm4JqP5OaVtdsrkhHqcEzDxXNY2ml3mPwUw3SyhdlSa CNr32Hn8pcduXr9hHeHPQ== X-Received: by 2002:a05:6820:4b17:b0:6a1:77ce:1b09 with SMTP id 006d021491bc7-6b1591cf1f0mr23760202eaf.6.1787551294202; Sun, 23 Aug 2026 23:01:34 -0700 (PDT) Received: from volcano9f8e-host.amd.com ([165.204.217.251]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-327f9236166sm22501895eec.28.2026.08.23.23.01.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 23 Aug 2026 23:01:33 -0700 (PDT) From: Hemanth Selam To: djbw@kernel.org, vishal.l.verma@intel.com, dave.jiang@intel.com, alison.schofield@intel.com Cc: iweiny@kernel.org, nvdimm@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [PATCH] nvdimm: pmem: fix gendisk leak when badblocks init fails Date: Mon, 24 Aug 2026 11:31:13 +0530 Message-ID: <20260824060113.2330468-1-hemanth.selam@gmail.com> X-Mailer: git-send-email 2.43.7 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit pmem_attach_disk() allocates the gendisk with blk_alloc_disk() and only hands it over to devres at the very end, after device_add_disk() has succeeded: if (devm_add_action_or_reset(dev, pmem_release_disk, pmem)) return -ENOMEM; Every error path in between either has nothing to release yet or jumps to the out: label, which drops the last reference with put_disk(). The devm_init_badblocks() failure returns directly instead, so on that path the gendisk, its queue and its bdev inode are never freed. The disk has been allocated before this check since the check was introduced, so the leak is as old as the check itself. Forcing the branch and rebinding a namespace 64 times shows one gendisk leaked per failed probe: disk_release() is never reached and bdev_cache grows by 60 objects. With the goto, disk_release() runs on every attempt and bdev_cache returns to its original size. Fixes: b95f5f4391fa ("libnvdimm: convert to statically allocated badblocks") Signed-off-by: Hemanth Selam --- drivers/nvdimm/pmem.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index 30a51c365ce8..648fc7d66063 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -563,8 +563,10 @@ static int pmem_attach_disk(struct device *dev, nvdimm_namespace_disk_name(ndns, disk->disk_name); set_capacity(disk, (pmem->size - pmem->pfn_pad - pmem->data_offset) / 512); - if (devm_init_badblocks(dev, &pmem->bb)) - return -ENOMEM; + if (devm_init_badblocks(dev, &pmem->bb)) { + rc = -ENOMEM; + goto out; + } nvdimm_badblocks_populate(nd_region, &pmem->bb, &bb_range); disk->bb = &pmem->bb; -- 2.43.7