From: Christoph Hellwig <hch@lst.de>
To: Jens Axboe <axboe@kernel.dk>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
"Rafael J. Wysocki" <rafael@kernel.org>,
Denis Efremov <efremov@linux.com>,
"David S. Miller" <davem@davemloft.net>,
Song Liu <song@kernel.org>, Al Viro <viro@zeniv.linux.org.uk>,
linux-block@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-ide@vger.kernel.org, linux-raid@vger.kernel.org,
linux-scsi@vger.kernel.org, linux-m68k@lists.linux-m68k.org
Subject: [PATCH 04/19] block: split block_class_lock
Date: Wed, 26 Aug 2020 08:24:31 +0200 [thread overview]
Message-ID: <20200826062446.31860-5-hch@lst.de> (raw)
In-Reply-To: <20200826062446.31860-1-hch@lst.de>
Split the block_class_lock mutex into one each to protect bdev_map
and major_names.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
block/genhd.c | 29 +++++++++++++++--------------
1 file changed, 15 insertions(+), 14 deletions(-)
diff --git a/block/genhd.c b/block/genhd.c
index df6485223a2c3d..0ae6210e141ee5 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -25,7 +25,6 @@
#include "blk.h"
-static DEFINE_MUTEX(block_class_lock);
static struct kobject *block_depr;
struct bdev_map {
@@ -37,6 +36,7 @@ struct bdev_map {
int (*lock)(dev_t, void *);
void *data;
} *bdev_map[255];
+static DEFINE_MUTEX(bdev_map_lock);
/* for extended dynamic devt allocation, currently only one major is used */
#define NR_EXT_DEVT (1 << MINORBITS)
@@ -403,6 +403,7 @@ static struct blk_major_name {
int major;
char name[16];
} *major_names[BLKDEV_MAJOR_HASH_SIZE];
+static DEFINE_MUTEX(major_names_lock);
/* index in the above - for now: assume no multimajor ranges */
static inline int major_to_index(unsigned major)
@@ -415,11 +416,11 @@ void blkdev_show(struct seq_file *seqf, off_t offset)
{
struct blk_major_name *dp;
- mutex_lock(&block_class_lock);
+ mutex_lock(&major_names_lock);
for (dp = major_names[major_to_index(offset)]; dp; dp = dp->next)
if (dp->major == offset)
seq_printf(seqf, "%3d %s\n", dp->major, dp->name);
- mutex_unlock(&block_class_lock);
+ mutex_unlock(&major_names_lock);
}
#endif /* CONFIG_PROC_FS */
@@ -448,7 +449,7 @@ int register_blkdev(unsigned int major, const char *name)
struct blk_major_name **n, *p;
int index, ret = 0;
- mutex_lock(&block_class_lock);
+ mutex_lock(&major_names_lock);
/* temporary */
if (major == 0) {
@@ -501,7 +502,7 @@ int register_blkdev(unsigned int major, const char *name)
kfree(p);
}
out:
- mutex_unlock(&block_class_lock);
+ mutex_unlock(&major_names_lock);
return ret;
}
@@ -513,7 +514,7 @@ void unregister_blkdev(unsigned int major, const char *name)
struct blk_major_name *p = NULL;
int index = major_to_index(major);
- mutex_lock(&block_class_lock);
+ mutex_lock(&major_names_lock);
for (n = &major_names[index]; *n; n = &(*n)->next)
if ((*n)->major == major)
break;
@@ -523,7 +524,7 @@ void unregister_blkdev(unsigned int major, const char *name)
p = *n;
*n = p->next;
}
- mutex_unlock(&block_class_lock);
+ mutex_unlock(&major_names_lock);
kfree(p);
}
@@ -674,7 +675,7 @@ void blk_register_region(dev_t devt, unsigned long range, struct module *module,
p->data = data;
}
- mutex_lock(&block_class_lock);
+ mutex_lock(&bdev_map_lock);
for (i = 0, p -= n; i < n; i++, p++, index++) {
struct bdev_map **s = &bdev_map[index % 255];
while (*s && (*s)->range < range)
@@ -682,7 +683,7 @@ void blk_register_region(dev_t devt, unsigned long range, struct module *module,
p->next = *s;
*s = p;
}
- mutex_unlock(&block_class_lock);
+ mutex_unlock(&bdev_map_lock);
}
EXPORT_SYMBOL(blk_register_region);
@@ -693,7 +694,7 @@ void blk_unregister_region(dev_t devt, unsigned long range)
unsigned i;
struct bdev_map *found = NULL;
- mutex_lock(&block_class_lock);
+ mutex_lock(&bdev_map_lock);
for (i = 0; i < min(n, 255u); i++, index++) {
struct bdev_map **s;
for (s = &bdev_map[index % 255]; *s; s = &(*s)->next) {
@@ -706,7 +707,7 @@ void blk_unregister_region(dev_t devt, unsigned long range)
}
}
}
- mutex_unlock(&block_class_lock);
+ mutex_unlock(&bdev_map_lock);
kfree(found);
}
EXPORT_SYMBOL(blk_unregister_region);
@@ -1041,7 +1042,7 @@ static struct gendisk *lookup_gendisk(dev_t dev, int *partno)
unsigned long best = ~0UL;
retry:
- mutex_lock(&block_class_lock);
+ mutex_lock(&bdev_map_lock);
for (p = bdev_map[MAJOR(dev) % 255]; p; p = p->next) {
struct kobject *(*probe)(dev_t, int *, void *);
struct module *owner;
@@ -1062,7 +1063,7 @@ static struct gendisk *lookup_gendisk(dev_t dev, int *partno)
module_put(owner);
continue;
}
- mutex_unlock(&block_class_lock);
+ mutex_unlock(&bdev_map_lock);
kobj = probe(dev, partno, data);
/* Currently ->owner protects _only_ ->probe() itself. */
module_put(owner);
@@ -1070,7 +1071,7 @@ static struct gendisk *lookup_gendisk(dev_t dev, int *partno)
return dev_to_disk(kobj_to_dev(kobj));
goto retry;
}
- mutex_unlock(&block_class_lock);
+ mutex_unlock(&bdev_map_lock);
return NULL;
}
--
2.28.0
next prev parent reply other threads:[~2020-08-26 6:36 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-26 6:24 simplify gendisk lookup and remove struct block_device aliases Christoph Hellwig
2020-08-26 6:24 ` [PATCH 01/19] char_dev: replace cdev_map with an xarray Christoph Hellwig
2020-08-26 8:19 ` Greg Kroah-Hartman
2020-08-27 8:53 ` Christoph Hellwig
2020-08-27 9:18 ` Greg Kroah-Hartman
2020-08-27 9:39 ` Christoph Hellwig
2020-08-27 7:25 ` Hannes Reinecke
2020-08-27 8:55 ` Christoph Hellwig
2020-08-26 6:24 ` [PATCH 02/19] block: merge drivers/base/map.c into block/genhd.c Christoph Hellwig
2020-08-26 8:19 ` Greg Kroah-Hartman
2020-08-26 6:24 ` [PATCH 03/19] block: cleanup del_gendisk a bit Christoph Hellwig
2020-08-26 6:24 ` Christoph Hellwig [this message]
2020-08-26 6:24 ` [PATCH 05/19] block: rework requesting modules for unclaimed devices Christoph Hellwig
2020-08-26 6:24 ` [PATCH 06/19] block: add an optional probe callback to major_names Christoph Hellwig
2020-08-26 6:24 ` [PATCH 07/19] ide: remove ide_{,un}register_region Christoph Hellwig
2020-08-27 7:25 ` Hannes Reinecke
2020-08-26 6:24 ` [PATCH 08/19] swim: don't call blk_register_region Christoph Hellwig
2020-08-26 6:24 ` [PATCH 09/19] sd: use __register_blkdev to avoid a modprobe for an unregistered dev_t Christoph Hellwig
2020-08-26 6:24 ` [PATCH 10/19] brd: use __register_blkdev to allocate devices on demand Christoph Hellwig
2020-08-26 6:24 ` [PATCH 11/19] loop: " Christoph Hellwig
2020-08-26 6:24 ` [PATCH 12/19] md: " Christoph Hellwig
2020-08-28 7:08 ` Song Liu
2020-08-26 6:24 ` [PATCH 13/19] ide: switch to __register_blkdev for command set probing Christoph Hellwig
2020-08-26 6:24 ` [PATCH 14/19] floppy: use a separate gendisk for each media format Christoph Hellwig
2020-08-26 6:24 ` [PATCH 15/19] amiflop: use separate gendisks for Amiga vs MS-DOS mode Christoph Hellwig
2020-08-26 6:24 ` [PATCH 16/19] ataflop: use a separate gendisk for each media format Christoph Hellwig
2020-08-26 6:24 ` [PATCH 17/19] z2ram: reindent Christoph Hellwig
2020-08-26 9:12 ` Joe Perches
2020-08-26 9:49 ` John Paul Adrian Glaubitz
2020-08-26 14:51 ` Joe Perches
2020-08-27 23:21 ` Finn Thain
2020-08-28 0:01 ` Joe Perches
2020-08-28 0:57 ` Finn Thain
2020-08-28 1:11 ` Joe Perches
2020-08-28 4:25 ` Christoph Hellwig
2020-08-26 6:24 ` [PATCH 18/19] z2ram: use separate gendisk for the different modes Christoph Hellwig
2020-08-26 6:24 ` [PATCH 19/19] block: switch gendisk lookup to a simple xarray Christoph Hellwig
2020-08-30 6:24 simplify gendisk lookup and remove struct block_device aliases v2 Christoph Hellwig
2020-08-30 6:24 ` [PATCH 04/19] block: split block_class_lock Christoph Hellwig
2020-09-03 8:01 simplify gendisk lookup and remove struct block_device aliases v3 Christoph Hellwig
2020-09-03 8:01 ` [PATCH 04/19] block: split block_class_lock Christoph Hellwig
2020-09-04 10:19 ` Hannes Reinecke
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=20200826062446.31860-5-hch@lst.de \
--to=hch@lst.de \
--cc=axboe@kernel.dk \
--cc=davem@davemloft.net \
--cc=efremov@linux.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-ide@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-m68k@lists.linux-m68k.org \
--cc=linux-raid@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=rafael@kernel.org \
--cc=song@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;
as well as URLs for NNTP newsgroup(s).