From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753196AbbDHGZN (ORCPT ); Wed, 8 Apr 2015 02:25:13 -0400 Received: from mx1.redhat.com ([209.132.183.28]:52673 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752944AbbDHGZG (ORCPT ); Wed, 8 Apr 2015 02:25:06 -0400 From: Jarod Wilson To: linux-kernel@vger.kernel.org Cc: Ming Lei , Christoph Hellwig , Jens Axboe , Tejun Heo , Alexander Viro , Markus Pargmann , Stefan Weinhuber , Stefan Haberland , Sebastian Ott , Fabian Frederick , David Herrmann , Mike Galbraith , Andrew Morton , Peter Zijlstra , nbd-general@lists.sourceforge.net, linux-s390@vger.kernel.org, Jarod Wilson Subject: [PATCH 6/7] block: replace trylock with mutex_lock in blkdev_reread_part() Date: Wed, 8 Apr 2015 02:23:45 -0400 Message-Id: <1428474226-27386-7-git-send-email-jarod@redhat.com> In-Reply-To: <1428474226-27386-1-git-send-email-jarod@redhat.com> References: <1428218688-4092-1-git-send-email-ming.lei@canonical.com> <1428474226-27386-1-git-send-email-jarod@redhat.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Ming Lei The only possible problem of using mutex_lock() instead of trylock is about deadlock. If there aren't any locks held before calling blkdev_reread_part(lock), deadlock can't be caused by this conversion. If there are locks held before calling blkdev_reread_part(lock), and if these locks arn't required in open, close handler and I/O path, deadlock shouldn't be caused too. Both user space's ioctl(BLKRRPART) and md_setup_drive() from init/do_mounts_md.c belongs to the 1st case, so the conversion is safe for the two cases. For loop, the previous patches in this pathset has fixed the ABBA lock dependency, so the conversion is OK. For nbd, tx_lock is held when calling the function: - both open and release won't hold the lock - when blkdev_reread_part() is run, I/O thread has been stopped already, so tx_lock won't be acquired in I/O path at that time. - so the conversion won't cause deadlock for nbd For dasd, both dasd_open(), dasd_release() and request function don't acquire any mutex/semphone, so the conversion should be safe. [jarod: update for modifications earlier in series.] CC: Christoph Hellwig CC: Jens Axboe CC: Tejun Heo CC: Alexander Viro CC: Markus Pargmann CC: Stefan Weinhuber CC: Stefan Haberland CC: Sebastian Ott CC: Fabian Frederick CC: Ming Lei CC: David Herrmann CC: Mike Galbraith CC: Andrew Morton CC: Peter Zijlstra CC: nbd-general@lists.sourceforge.net CC: linux-s390@vger.kernel.org Signed-off-by: Ming Lei Signed-off-by: Jarod Wilson --- block/ioctl.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/block/ioctl.c b/block/ioctl.c index 64a4fcb..47c8e6d 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -170,15 +170,19 @@ EXPORT_SYMBOL(__blkdev_reread_part); /* * This is an exported API for the block driver, and will - * acquire bd_mutex. Make sure you aren't calling it with - * bd_mutex already held, or we'll return -EBUSY. + * acquire bd_mutex. + * + * Make sure held locks aren't required in open()/close() + * handlers and I/O paths to avoid an ABBA deadlock: + * - bd_mutex is held before calling a block driver's open/close + * handler + * - reading a partition table may submit I/O to the block device */ int blkdev_reread_part(struct block_device *bdev) { int res; - if (!mutex_trylock(&bdev->bd_mutex)) - return -EBUSY; + mutex_lock(&bdev->bd_mutex); res = __blkdev_reread_part(bdev); mutex_unlock(&bdev->bd_mutex); -- 1.8.3.1