From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755611AbbLLCtG (ORCPT ); Fri, 11 Dec 2015 21:49:06 -0500 Received: from p3plsmtps2ded04.prod.phx3.secureserver.net ([208.109.80.198]:42114 "EHLO p3plsmtps2ded04.prod.phx3.secureserver.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754646AbbLLCsW (ORCPT ); Fri, 11 Dec 2015 21:48:22 -0500 x-originating-ip: 72.167.245.219 From: "K. Y. Srinivasan" To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, devel@linuxdriverproject.org, olaf@aepfle.de, apw@canonical.com, vkuznets@redhat.com, jasowang@redhat.com Cc: Dexuan Cui , "K. Y. Srinivasan" Subject: [PATCH RESEND 17/27] Drivers: hv: vmbus: do sanity check of channel state in vmbus_close_internal() Date: Fri, 11 Dec 2015 20:21:37 -0800 Message-Id: <1449894107-3389-17-git-send-email-kys@microsoft.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1449894107-3389-1-git-send-email-kys@microsoft.com> References: <1449894084-3348-1-git-send-email-kys@microsoft.com> <1449894107-3389-1-git-send-email-kys@microsoft.com> X-CMAE-Envelope: MS4wfLUnTU88VcBBo5kfbsqYwADnJ1GbBJfHjyAlUznfOzrKV1LJ1/CM6461TSIoCj2pVQSNew0PPtH6cRZL+jG59h1oiWvffYIQn40s8gPGOn2nMmcEUXs3 Yez87yor9CoTFss4HNRzQh434/qJT+gXXDVnURAvQlxwXNoKJVBlp1DlrZZ+c0S5VR72/cE24nIFclaUbIVWKT+SQtIvKF+P8p+/+VkUMpD6lvrvZmjQtOex AOXSxuJ8rZFFPVKUkjX9uuf+Gan9BfvJHCQtzs6wAqELwjST2UYcDjW3U5jjumJ5aG0Ava/IsEf+6OCBrOv+mDqzqOB7FNi6YAAG5ecwp6168t2j3fLF9UhI WcFpMr0Ea/pB70aScEOWyTz7HmrAuHWtfBU+OiAQkVGG1xEEw5HpJHPSl73cCTQ9p+ODSdVDBJ8tFoF5Mze0dE5HAl9NVw== Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Dexuan Cui This fixes an incorrect assumption of channel state in the function. Signed-off-by: Dexuan Cui Signed-off-by: K. Y. Srinivasan --- drivers/hv/channel.c | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c index f7f3d5c..00e1be7 100644 --- a/drivers/hv/channel.c +++ b/drivers/hv/channel.c @@ -512,6 +512,18 @@ static int vmbus_close_internal(struct vmbus_channel *channel) tasklet = hv_context.event_dpc[channel->target_cpu]; tasklet_disable(tasklet); + /* + * In case a device driver's probe() fails (e.g., + * util_probe() -> vmbus_open() returns -ENOMEM) and the device is + * rescinded later (e.g., we dynamically disble an Integrated Service + * in Hyper-V Manager), the driver's remove() invokes vmbus_close(): + * here we should skip most of the below cleanup work. + */ + if (channel->state != CHANNEL_OPENED_STATE) { + ret = -EINVAL; + goto out; + } + channel->state = CHANNEL_OPEN_STATE; channel->sc_creation_callback = NULL; /* Stop callback and cancel the timer asap */ -- 1.7.4.1