From patchwork Tue Jan 27 17:51:52 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dwight Engen X-Patchwork-Id: 433590 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 9C76B140216 for ; Wed, 28 Jan 2015 04:53:51 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758837AbbA0Rxu (ORCPT ); Tue, 27 Jan 2015 12:53:50 -0500 Received: from userp1040.oracle.com ([156.151.31.81]:51129 "EHLO userp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758763AbbA0Rxt (ORCPT ); Tue, 27 Jan 2015 12:53:49 -0500 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t0RHrmOW005410 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 27 Jan 2015 17:53:49 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id t0RHrm9v018689 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 27 Jan 2015 17:53:48 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by userz7022.oracle.com (8.14.5+Sun/8.14.4) with ESMTP id t0RHrlf1018569 for ; Tue, 27 Jan 2015 17:53:47 GMT Received: from Delphi.home (/71.171.88.67) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 27 Jan 2015 09:53:47 -0800 From: Dwight Engen To: sparclinux@vger.kernel.org Subject: [PATCH] sunvdc: don't dereference port->disk before disk probe finishes Date: Tue, 27 Jan 2015 12:51:52 -0500 Message-Id: <1422381112-21571-1-git-send-email-dwight.engen@oracle.com> X-Mailer: git-send-email 1.7.1 X-Source-IP: ucsinet22.oracle.com [156.151.31.94] Sender: sparclinux-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: sparclinux@vger.kernel.org If the backing file for a vdisk is not present in the service domain an ldc reset can occur during the initial port/disk probing. The ldc reset logic was dereferencing port->disk, which may not have been setup yet. Guard against this case. Orabug: 20362258 Signed-off-by: Dwight Engen --- drivers/block/sunvdc.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) diff --git a/drivers/block/sunvdc.c b/drivers/block/sunvdc.c index 4b911ed..7587a8c 100644 --- a/drivers/block/sunvdc.c +++ b/drivers/block/sunvdc.c @@ -938,6 +938,8 @@ err_out_free_tx_ring: vdc_free_tx_ring(port); err_out_free_ldc: + flush_work(&port->ldc_reset_work); + del_timer_sync(&port->ldc_reset_timer); vio_ldc_free(&port->vio); err_out_free_port: @@ -1017,6 +1019,9 @@ static void vdc_ldc_reset_timer(unsigned long _arg) struct vio_driver_state *vio = &port->vio; unsigned long flags; + if (!port->disk) + return; + spin_lock_irqsave(&vio->lock, flags); if (!(port->vio.hs_state & VIO_HS_COMPLETE)) { pr_warn(PFX "%s ldc down %llu seconds, draining queue\n", @@ -1048,6 +1053,9 @@ static void vdc_ldc_reset(struct vdc_port *port) assert_spin_locked(&port->vio.lock); pr_warn(PFX "%s ldc link reset\n", port->disk_name); + if (!port->disk) + return; + blk_stop_queue(port->disk->queue); vdc_requeue_inflight(port); vdc_port_down(port);