From: Jarod Wilson <jarod@redhat.com>
To: Ming Lei <ming.lei@canonical.com>
Cc: Christoph Hellwig <hch@infradead.org>,
Jens Axboe <axboe@kernel.dk>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
Tejun Heo <tj@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Alexander Viro <viro@zeniv.linux.org.uk>,
David Herrmann <dh.herrmann@gmail.com>,
Markus Pargmann <mpa@pengutronix.de>,
"nbd-general@lists.sourceforge.net"
<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
Subject: Re: [PATCH 1/6] block: export blkdev_reread_part()
Date: Mon, 6 Apr 2015 09:42:27 -0400 [thread overview]
Message-ID: <20150406134227.GC14217@redhat.com> (raw)
In-Reply-To: <CACVXFVP-rokGRrMus_QXju+MVzFPTaFC45oZBe2PEBfbid8nmQ@mail.gmail.com>
On Mon, Apr 06, 2015 at 12:40:12AM +0800, Ming Lei wrote:
> On Mon, Apr 6, 2015 at 12:12 AM, Christoph Hellwig <hch@infradead.org> wrote:
> >> +/*
> >> + * This is exported as API for block driver, can be called
> >> + * with requiring bd_mutex or not.
> >> + */
> >> +int __blkdev_reread_part(struct block_device *bdev, bool lock)
> >> {
> >> struct gendisk *disk = bdev->bd_disk;
> >> int res;
> >> @@ -159,12 +163,14 @@ static int blkdev_reread_part(struct block_device *bdev)
> >> return -EINVAL;
> >> if (!capable(CAP_SYS_ADMIN))
> >> return -EACCES;
> >> - if (!mutex_trylock(&bdev->bd_mutex))
> >> + if (lock && !mutex_trylock(&bdev->bd_mutex))
> >> return -EBUSY;
> >
> > Please don't add funtions that do conditional locking, instead move
> > all the code into blkdev_reread_part_nolock, and then wrap it:
> >
> > int blkdev_reread_part(struct block_device *bdev)
> > {
> > if (!mutex_trylock(&bdev->bd_mutex))
> > return -EBUSY;
> > blkdev_reread_part_nolock(bdev);
> > mutex_unlock(&bdev->bd_mutex);
> > }
>
> Yes, it is more clean, but with extra acquiring lock cost for the
> failure cases, especially when we replace trylock with mutex_lock().
I was working on a version of this myself over the past few days, I
actually removed blkdev_reread_part() entirely, renamed
fs/partition-generic.c::reread_partitions() to __reread_partitions(), then
moved the locking from blkdev_reread_part() into a new reread_partitions()
that wrapped around __reread_partitions(). Same difference, I guess.
> > Please also add a lockdep_assert_held to blkdev_reread_part_nolock to
> > ensure callers actually do hold the lock.
>
> Good point!
Looks like fs/block_dev.c::__blkdev_get() is the only thing that would be
calling the _nolock variant of whichever route, as it handles bd_mutex
acquisition within __blkdev_get().
As an aside, there's a piece of that function that could be worth
duplicating over into loop.c as well:
if (bdev->bd_invalidated) {
if (!ret)
rescan_partitions(bdev);
else if (ret == -ENOMEDIUM)
invalidate_partitions(disk, bdev);
Might this possibly be put to use to help with the problem commit
8761a3dc1f07b163414e2215a2cadbb4cfe2a107 was trying to solve?
--
Jarod Wilson
jarod@redhat.com
next prev parent reply other threads:[~2015-04-06 13:42 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 [this message]
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 ` [RFC PATCH 6/6] block: replace trylock with mutex_lock in __blkdev_reread_part() Ming Lei
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=20150406134227.GC14217@redhat.com \
--to=jarod@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=axboe@kernel.dk \
--cc=dh.herrmann@gmail.com \
--cc=fabf@skynet.be \
--cc=hch@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=ming.lei@canonical.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.