From patchwork Thu Jan 16 23:16:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg KH X-Patchwork-Id: 233696 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=3.0 tests=DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A49E6C33CAF for ; Thu, 16 Jan 2020 23:45:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 75EB420748 for ; Thu, 16 Jan 2020 23:45:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1579218321; bh=kJNnl/UzmoXOLMb8P8vtHUTkV0BMt3uFLWsw58WtJzI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=YfXimCXzC4vMKS8A+jr9OFtRwZKSb1M1mruJGUgW4cDsCUu36uSDh0Jlm08ezE7p9 chVG160r03c33C0duUArpEArBB0wTnOMJ5jUdQU2vG6fMSMQQ6ob3uWVxgsJGtAMPY EEyV5uxLN7PrgU+yyky/k8cBRX8XmY0oozbSoJzc= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729399AbgAPXXI (ORCPT ); Thu, 16 Jan 2020 18:23:08 -0500 Received: from mail.kernel.org ([198.145.29.99]:51182 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387865AbgAPXXH (ORCPT ); Thu, 16 Jan 2020 18:23:07 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id DCD9820684; Thu, 16 Jan 2020 23:23:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1579216986; bh=kJNnl/UzmoXOLMb8P8vtHUTkV0BMt3uFLWsw58WtJzI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=n+0AU8Q0XR3AEzml5YSuyiEVXmQw2wl8c+EkRZK/ZYoGoV0ejzXXWQB0t3dZV7r3y 8AlTKmVbBH1e/MPQVnoI7An8vrrvakoXfD/5gan7oWembYL52QRNI0Y7Eu58pj6WDl 7eHU1sxRC+kgH/mUWkzfaPNqJwsIA59bbimKTnTY= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, James Bottomley , Luo Jiaxing , John Garry , "Martin K. Petersen" Subject: [PATCH 5.4 085/203] scsi: enclosure: Fix stale device oops with hot replug Date: Fri, 17 Jan 2020 00:16:42 +0100 Message-Id: <20200116231752.791827377@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200116231745.218684830@linuxfoundation.org> References: <20200116231745.218684830@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Sender: stable-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: stable@vger.kernel.org From: James Bottomley commit 529244bd1afc102ab164429d338d310d5d65e60d upstream. Doing an add/remove/add on a SCSI device in an enclosure leads to an oops caused by poisoned values in the enclosure device list pointers. The reason is because we are keeping the enclosure device across the enclosed device add/remove/add but the current code is doing a device_add/device_del/device_add on it. This is the wrong thing to do in sysfs, so fix it by not doing a device_del on the enclosure device simply because of a hot remove of the drive in the slot. [mkp: added missing email addresses] Fixes: 43d8eb9cfd0a ("[SCSI] ses: add support for enclosure component hot removal") Link: https://lore.kernel.org/r/1578532892.3852.10.camel@HansenPartnership.com Signed-off-by: James Bottomley Reported-by: Luo Jiaxing Tested-by: John Garry Signed-off-by: Martin K. Petersen Signed-off-by: Greg Kroah-Hartman --- drivers/misc/enclosure.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) --- a/drivers/misc/enclosure.c +++ b/drivers/misc/enclosure.c @@ -406,10 +406,9 @@ int enclosure_remove_device(struct enclo cdev = &edev->component[i]; if (cdev->dev == dev) { enclosure_remove_links(cdev); - device_del(&cdev->cdev); put_device(dev); cdev->dev = NULL; - return device_add(&cdev->cdev); + return 0; } } return -ENODEV;