Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S943149AbcJSOrg (ORCPT ); Wed, 19 Oct 2016 10:47:36 -0400 Received: from onstation.org ([52.200.56.107]:35500 "EHLO onstation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S942056AbcJSOrc (ORCPT ); Wed, 19 Oct 2016 10:47:32 -0400 From: Brian Masney To: jic23@kernel.org Cc: knaack.h@gmx.de, lars@metafoo.de, pmeerw@pmeerw.net, gregkh@linuxfoundation.org, linux-iio@vger.kernel.org, devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org Subject: [PATCH 7/7] iio: light: tsl2583: fix concurrency issue in taos_get_lux() Date: Wed, 19 Oct 2016 06:32:10 -0400 Message-Id: <1476873130-24926-7-git-send-email-masneyb@onstation.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1476873130-24926-1-git-send-email-masneyb@onstation.org> References: <1476873130-24926-1-git-send-email-masneyb@onstation.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1351 Lines: 36 taos_get_lux() calls mutex_trylock(). If the lock could not be acquired, then chip->als_cur_info.lux is returned. The issue is that this value is updated while the mutex is held and could cause a half written value to be returned to the caller. This patch changes the call to mutex_trylock() with mutex_lock(). Signed-off-by: Brian Masney --- This is the most controversial change in my patch set. There are two other possible solutions that I could envision to work around this issue: 1) Return -EBUSY and make the caller responsible for backing off 2) Change this driver to use RCU instead of a mutex drivers/staging/iio/light/tsl2583.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/drivers/staging/iio/light/tsl2583.c b/drivers/staging/iio/light/tsl2583.c index 47656ae..c4d2e3a 100644 --- a/drivers/staging/iio/light/tsl2583.c +++ b/drivers/staging/iio/light/tsl2583.c @@ -206,10 +206,7 @@ static int taos_get_lux(struct iio_dev *indio_dev) u32 ch0lux = 0; u32 ch1lux = 0; - if (mutex_trylock(&chip->als_mutex) == 0) { - dev_info(&chip->client->dev, "taos_get_lux device is busy\n"); - return chip->als_cur_info.lux; /* busy, so return LAST VALUE */ - } + mutex_lock(&chip->als_mutex); if (chip->taos_chip_status != TSL258X_CHIP_WORKING) { /* device is not enabled */ -- 2.7.4