From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-bn3nam01on0135.outbound.protection.outlook.com ([104.47.33.135]:19456 "EHLO NAM01-BN3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932264AbeARU7c (ORCPT ); Thu, 18 Jan 2018 15:59:32 -0500 From: Sasha Levin To: "stable@vger.kernel.org" , "stable-commits@vger.kernel.org" CC: Hannes Reinecke , "Martin K . Petersen" , Sasha Levin Subject: [added to the 4.1 stable tree] sd: get disk reference in sd_check_events() Date: Thu, 18 Jan 2018 20:59:28 +0000 Message-ID: <20180118205908.3220-9-alexander.levin@microsoft.com> References: <20180118205908.3220-1-alexander.levin@microsoft.com> In-Reply-To: <20180118205908.3220-1-alexander.levin@microsoft.com> Content-Language: en-US Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Sender: stable-owner@vger.kernel.org List-ID: From: Hannes Reinecke This patch has been added to the stable tree. If you have any objections, please let us know. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D [ Upstream commit eb72d0bb84eee5d0dc3044fd17b75e7101dabb57 ] sd_check_events() is called asynchronously, and might race with device removal. So always take a disk reference when processing the event to avoid the device being removed while the event is processed. Signed-off-by: Hannes Reinecke Reviewed-by: Ewan D. Milne Reviewed-by: Bart Van Assche Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/sd.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 80cebe691fee..a678dd10905f 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1383,11 +1383,15 @@ static int media_not_present(struct scsi_disk *sdkp= , **/ static unsigned int sd_check_events(struct gendisk *disk, unsigned int cle= aring) { - struct scsi_disk *sdkp =3D scsi_disk(disk); - struct scsi_device *sdp =3D sdkp->device; + struct scsi_disk *sdkp =3D scsi_disk_get(disk); + struct scsi_device *sdp; struct scsi_sense_hdr *sshdr =3D NULL; int retval; =20 + if (!sdkp) + return 0; + + sdp =3D sdkp->device; SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_check_events\n")); =20 /* @@ -1444,6 +1448,7 @@ static unsigned int sd_check_events(struct gendisk *d= isk, unsigned int clearing) kfree(sshdr); retval =3D sdp->changed ? DISK_EVENT_MEDIA_CHANGE : 0; sdp->changed =3D 0; + scsi_disk_put(sdkp); return retval; } =20 --=20 2.11.0