Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752288AbdLNDdy (ORCPT ); Wed, 13 Dec 2017 22:33:54 -0500 Received: from szxga04-in.huawei.com ([45.249.212.190]:2678 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751917AbdLNDdx (ORCPT ); Wed, 13 Dec 2017 22:33:53 -0500 From: Jason Yan To: , , CC: , , Jason Yan , Bart Van Assche , "Ewan D . Milne" , Christoph Hellwig Subject: [PATCH] driver core: Make it safe to use get_device() if the reference count is zero Date: Thu, 14 Dec 2017 11:39:36 +0800 Message-ID: <20171214033936.6534-1-yanaijie@huawei.com> X-Mailer: git-send-email 2.9.5 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.175.124.28] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1401 Lines: 40 Some driviers may have the chance to increase a reference count that has dropped to zero when using get_device() because of their design. We have met such a issue with scsi: https://www.spinics.net/lists/linux-scsi/msg115295.html The scsi core will keep the scsi device object in the host list after it has been deleted and the iterator can still find it. All of the places where need iterating have to check the state of the scsi device and this makes a lot of code redundancy and complexity. Provide a safe mechanism in get_device() by using kobject_get_unless_zero(). Suggested-by: Bart Van Assche Signed-off-by: Jason Yan CC: Greg Kroah-Hartman CC: Bart Van Assche CC: Ewan D. Milne CC: James E.J. Bottomley CC: Christoph Hellwig --- drivers/base/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/base/core.c b/drivers/base/core.c index 12ebd05..cc74810 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -1916,7 +1916,7 @@ EXPORT_SYMBOL_GPL(device_register); */ struct device *get_device(struct device *dev) { - return dev ? kobj_to_dev(kobject_get(&dev->kobj)) : NULL; + return dev && kobject_get_unless_zero(&dev->kobj) ? dev : NULL; } EXPORT_SYMBOL_GPL(get_device); -- 2.9.5