From: Ming Lei <ming.lei@canonical.com>
To: Jens Axboe <axboe@kernel.dk>,
linux-kernel@vger.kernel.org,
Christoph Hellwig <hch@infradead.org>, Tejun Heo <tj@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Alexander Viro <viro@zeniv.linux.org.uk>,
Jarod Wilson <jarod@redhat.com>,
David Herrmann <dh.herrmann@gmail.com>,
Markus Pargmann <mpa@pengutronix.de>,
nbd-general@lists.sourceforge.net,
Stefan Haberland <stefan.haberland@de.ibm.com>,
Sebastian Ott <sebott@linux.vnet.ibm.com>,
Fabian Frederick <fabf@skynet.be>,
linux-s390@vger.kernel.org, Ming Lei <ming.lei@canonical.com>
Subject: [RFC PATCH 6/6] block: replace trylock with mutex_lock in __blkdev_reread_part()
Date: Sun, 5 Apr 2015 15:24:48 +0800 [thread overview]
Message-ID: <1428218688-4092-7-git-send-email-ming.lei@canonical.com> (raw)
In-Reply-To: <1428218688-4092-1-git-send-email-ming.lei@canonical.com>
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.
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
block/ioctl.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/block/ioctl.c b/block/ioctl.c
index 7dce19a..a7aaf13 100644
--- a/block/ioctl.c
+++ b/block/ioctl.c
@@ -153,6 +153,12 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user
/*
* This is exported as API for block driver, can be called
* with requiring bd_mutex or not.
+ *
+ * When lock is true, make sure the held locks aren't required in
+ * open()/close() handler and I/O path for avoiding ABBA deadlock:
+ * - bd_mutex is held before calling block driver's open/close
+ * handler
+ * - reading partition table may submit I/O to the block device
*/
int __blkdev_reread_part(struct block_device *bdev, bool lock)
{
@@ -163,8 +169,8 @@ int __blkdev_reread_part(struct block_device *bdev, bool lock)
return -EINVAL;
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
- if (lock && !mutex_trylock(&bdev->bd_mutex))
- return -EBUSY;
+ if (lock)
+ mutex_lock(&bdev->bd_mutex);
res = rescan_partitions(disk, bdev);
if (lock)
mutex_unlock(&bdev->bd_mutex);
--
1.7.9.5
next prev parent reply other threads:[~2015-04-05 7:24 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-05 7:24 [PATCH 0/6] block: reread partitions changes and fix for loop Ming Lei
2015-04-05 7:24 ` [PATCH 1/6] block: export blkdev_reread_part() Ming Lei
2015-04-05 16:12 ` Christoph Hellwig
2015-04-05 16:40 ` Ming Lei
2015-04-06 13:42 ` Jarod Wilson
2015-04-06 13:48 ` Jarod Wilson
2015-04-07 2:43 ` Ming Lei
2015-04-06 14:50 ` Christoph Hellwig
2015-04-07 2:11 ` Ming Lei
2015-04-05 7:24 ` [PATCH 2/6] block: loop: don't hold lo_ctl_mutex in lo_open Ming Lei
2015-04-05 16:28 ` Ming Lei
2015-04-06 14:49 ` Christoph Hellwig
2015-04-05 7:24 ` [PATCH 3/6] block: loop: fix another reread part failure Ming Lei
2015-04-05 7:24 ` [PATCH 4/6] block: nbd: convert to blkdev_reread_part() Ming Lei
2015-04-05 7:24 ` [PATCH 5/6] block: dasd_genhd: convert to blkdev_reread_part Ming Lei
2015-04-06 13:46 ` Jarod Wilson
2015-04-06 13:51 ` Jarod Wilson
2015-04-07 1:59 ` Ming Lei
2015-04-07 0:47 ` Ming Lei
2015-04-05 7:24 ` Ming Lei [this message]
2015-04-08 6:23 ` [PATCH 0/7] block: reread partitions improvements Jarod Wilson
2015-04-08 6:23 ` [PATCH 1/7] block: export blkdev_reread_part() and __blkdev_reread_part() Jarod Wilson
2015-04-08 14:50 ` Ming Lei
2015-04-08 15:03 ` Peter Zijlstra
2015-04-08 15:27 ` Jarod Wilson
2015-04-08 15:28 ` Ming Lei
2015-04-08 6:23 ` [PATCH 2/7] block: loop: don't hold lo_ctl_mutex in lo_open Jarod Wilson
2015-04-08 6:50 ` Ming Lei
2015-04-08 13:40 ` Jarod Wilson
2015-04-08 14:00 ` Jarod Wilson
2015-04-08 14:20 ` Ming Lei
2015-04-08 15:28 ` Jarod Wilson
2015-04-08 6:23 ` [PATCH 3/7] block: loop: fix another reread part failure Jarod Wilson
2015-04-08 6:23 ` [PATCH 4/7] block: nbd: convert to blkdev_reread_part() Jarod Wilson
2015-04-08 6:23 ` [PATCH 5/7] block: dasd_genhd: convert to blkdev_reread_part Jarod Wilson
2015-04-08 6:23 ` [PATCH 6/7] block: replace trylock with mutex_lock in blkdev_reread_part() Jarod Wilson
2015-04-08 6:23 ` [PATCH 7/7] s390/block/dasd: remove obsolete while -EBUSY loop Jarod Wilson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1428218688-4092-7-git-send-email-ming.lei@canonical.com \
--to=ming.lei@canonical.com \
--cc=akpm@linux-foundation.org \
--cc=axboe@kernel.dk \
--cc=dh.herrmann@gmail.com \
--cc=fabf@skynet.be \
--cc=hch@infradead.org \
--cc=jarod@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=mpa@pengutronix.de \
--cc=nbd-general@lists.sourceforge.net \
--cc=sebott@linux.vnet.ibm.com \
--cc=stefan.haberland@de.ibm.com \
--cc=tj@kernel.org \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox