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>,
Finn Thain <fthain@telegraphics.com.au>,
Michael Schmitz <schmitzmic@gmail.com>,
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: Thu, 3 Sep 2020 10:01:04 +0200 [thread overview]
Message-ID: <20200903080119.441674-5-hch@lst.de> (raw)
In-Reply-To: <20200903080119.441674-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 ec9b64207d9c2e..034e9089965a82 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)
@@ -400,6 +400,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)
@@ -412,11 +413,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 */
@@ -445,7 +446,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) {
@@ -498,7 +499,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;
}
@@ -510,7 +511,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;
@@ -520,7 +521,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);
}
@@ -671,7 +672,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)
@@ -679,7 +680,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);
@@ -690,7 +691,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) {
@@ -703,7 +704,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);
@@ -1039,7 +1040,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;
@@ -1060,7 +1061,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);
@@ -1068,7 +1069,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-09-03 8:17 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-03 8:01 simplify gendisk lookup and remove struct block_device aliases v3 Christoph Hellwig
2020-09-03 8:01 ` [PATCH 01/19] char_dev: replace cdev_map with an xarray Christoph Hellwig
2020-09-04 10:16 ` Hannes Reinecke
2020-09-03 8:01 ` [PATCH 02/19] block: merge drivers/base/map.c into block/genhd.c Christoph Hellwig
2020-09-04 10:17 ` Hannes Reinecke
2020-09-03 8:01 ` [PATCH 03/19] block: cleanup del_gendisk a bit Christoph Hellwig
2020-09-04 10:18 ` Hannes Reinecke
2020-09-03 8:01 ` Christoph Hellwig [this message]
2020-09-04 10:19 ` [PATCH 04/19] block: split block_class_lock Hannes Reinecke
2020-09-03 8:01 ` [PATCH 05/19] block: rework requesting modules for unclaimed devices Christoph Hellwig
2020-09-04 10:20 ` Hannes Reinecke
2020-09-03 8:01 ` [PATCH 06/19] block: add an optional probe callback to major_names Christoph Hellwig
2020-09-04 10:20 ` Hannes Reinecke
2020-09-03 8:01 ` [PATCH 07/19] ide: remove ide_{,un}register_region Christoph Hellwig
2020-09-03 8:01 ` [PATCH 08/19] swim: don't call blk_register_region Christoph Hellwig
2020-09-04 10:21 ` Hannes Reinecke
2020-09-03 8:01 ` [PATCH 09/19] sd: use __register_blkdev to avoid a modprobe for an unregistered dev_t Christoph Hellwig
2020-09-04 10:22 ` Hannes Reinecke
2020-09-03 8:01 ` [PATCH 10/19] brd: use __register_blkdev to allocate devices on demand Christoph Hellwig
2020-09-04 10:23 ` Hannes Reinecke
2020-09-03 8:01 ` [PATCH 11/19] loop: " Christoph Hellwig
2020-09-04 10:24 ` Hannes Reinecke
2020-09-03 8:01 ` [PATCH 12/19] md: " Christoph Hellwig
2020-09-04 10:25 ` Hannes Reinecke
2020-09-03 8:01 ` [PATCH 13/19] ide: switch to __register_blkdev for command set probing Christoph Hellwig
2020-09-04 10:26 ` Hannes Reinecke
2020-09-03 8:01 ` [PATCH 14/19] floppy: use a separate gendisk for each media format Christoph Hellwig
2020-09-04 9:59 ` Denis Efremov
2020-09-04 10:28 ` Hannes Reinecke
2020-09-03 8:01 ` [PATCH 15/19] amiflop: use separate gendisks for Amiga vs MS-DOS mode Christoph Hellwig
2020-09-04 10:28 ` Hannes Reinecke
2020-09-03 8:01 ` [PATCH 16/19] ataflop: use a separate gendisk for each media format Christoph Hellwig
2020-09-03 8:14 ` John Paul Adrian Glaubitz
2020-09-04 10:29 ` Hannes Reinecke
2020-09-03 8:01 ` [PATCH 17/19] z2ram: reindent Christoph Hellwig
2020-09-04 10:29 ` Hannes Reinecke
2020-09-03 8:01 ` [PATCH 18/19] z2ram: use separate gendisk for the different modes Christoph Hellwig
2020-09-04 10:30 ` Hannes Reinecke
2020-09-03 8:01 ` [PATCH 19/19] block: switch gendisk lookup to a simple xarray Christoph Hellwig
2020-09-04 10:30 ` Hannes Reinecke
-- strict thread matches above, loose matches on Subject: below --
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-08-26 6:24 simplify gendisk lookup and remove struct block_device aliases Christoph Hellwig
2020-08-26 6:24 ` [PATCH 04/19] block: split block_class_lock Christoph Hellwig
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=20200903080119.441674-5-hch@lst.de \
--to=hch@lst.de \
--cc=axboe@kernel.dk \
--cc=davem@davemloft.net \
--cc=efremov@linux.com \
--cc=fthain@telegraphics.com.au \
--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=schmitzmic@gmail.com \
--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).