Skip to content

Commit e49fbbb

Browse files
Christoph Hellwigaxboe
authored andcommitted
block: split block_class_lock
Split the block_class_lock mutex into one each to protect bdev_map and major_names. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 62b508f commit e49fbbb

File tree

1 file changed

+15
-14
lines changed

1 file changed

+15
-14
lines changed

block/genhd.c

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525

2626
#include "blk.h"
2727

28-
static DEFINE_MUTEX(block_class_lock);
2928
static struct kobject *block_depr;
3029

3130
struct bdev_map {
@@ -37,6 +36,7 @@ struct bdev_map {
3736
int (*lock)(dev_t, void *);
3837
void *data;
3938
} *bdev_map[255];
39+
static DEFINE_MUTEX(bdev_map_lock);
4040

4141
/* for extended dynamic devt allocation, currently only one major is used */
4242
#define NR_EXT_DEVT (1 << MINORBITS)
@@ -403,6 +403,7 @@ static struct blk_major_name {
403403
int major;
404404
char name[16];
405405
} *major_names[BLKDEV_MAJOR_HASH_SIZE];
406+
static DEFINE_MUTEX(major_names_lock);
406407

407408
/* index in the above - for now: assume no multimajor ranges */
408409
static inline int major_to_index(unsigned major)
@@ -415,11 +416,11 @@ void blkdev_show(struct seq_file *seqf, off_t offset)
415416
{
416417
struct blk_major_name *dp;
417418

418-
mutex_lock(&block_class_lock);
419+
mutex_lock(&major_names_lock);
419420
for (dp = major_names[major_to_index(offset)]; dp; dp = dp->next)
420421
if (dp->major == offset)
421422
seq_printf(seqf, "%3d %s\n", dp->major, dp->name);
422-
mutex_unlock(&block_class_lock);
423+
mutex_unlock(&major_names_lock);
423424
}
424425
#endif /* CONFIG_PROC_FS */
425426

@@ -448,7 +449,7 @@ int register_blkdev(unsigned int major, const char *name)
448449
struct blk_major_name **n, *p;
449450
int index, ret = 0;
450451

451-
mutex_lock(&block_class_lock);
452+
mutex_lock(&major_names_lock);
452453

453454
/* temporary */
454455
if (major == 0) {
@@ -501,7 +502,7 @@ int register_blkdev(unsigned int major, const char *name)
501502
kfree(p);
502503
}
503504
out:
504-
mutex_unlock(&block_class_lock);
505+
mutex_unlock(&major_names_lock);
505506
return ret;
506507
}
507508

@@ -513,7 +514,7 @@ void unregister_blkdev(unsigned int major, const char *name)
513514
struct blk_major_name *p = NULL;
514515
int index = major_to_index(major);
515516

516-
mutex_lock(&block_class_lock);
517+
mutex_lock(&major_names_lock);
517518
for (n = &major_names[index]; *n; n = &(*n)->next)
518519
if ((*n)->major == major)
519520
break;
@@ -523,7 +524,7 @@ void unregister_blkdev(unsigned int major, const char *name)
523524
p = *n;
524525
*n = p->next;
525526
}
526-
mutex_unlock(&block_class_lock);
527+
mutex_unlock(&major_names_lock);
527528
kfree(p);
528529
}
529530

@@ -674,15 +675,15 @@ void blk_register_region(dev_t devt, unsigned long range, struct module *module,
674675
p->data = data;
675676
}
676677

677-
mutex_lock(&block_class_lock);
678+
mutex_lock(&bdev_map_lock);
678679
for (i = 0, p -= n; i < n; i++, p++, index++) {
679680
struct bdev_map **s = &bdev_map[index % 255];
680681
while (*s && (*s)->range < range)
681682
s = &(*s)->next;
682683
p->next = *s;
683684
*s = p;
684685
}
685-
mutex_unlock(&block_class_lock);
686+
mutex_unlock(&bdev_map_lock);
686687
}
687688
EXPORT_SYMBOL(blk_register_region);
688689

@@ -693,7 +694,7 @@ void blk_unregister_region(dev_t devt, unsigned long range)
693694
unsigned i;
694695
struct bdev_map *found = NULL;
695696

696-
mutex_lock(&block_class_lock);
697+
mutex_lock(&bdev_map_lock);
697698
for (i = 0; i < min(n, 255u); i++, index++) {
698699
struct bdev_map **s;
699700
for (s = &bdev_map[index % 255]; *s; s = &(*s)->next) {
@@ -706,7 +707,7 @@ void blk_unregister_region(dev_t devt, unsigned long range)
706707
}
707708
}
708709
}
709-
mutex_unlock(&block_class_lock);
710+
mutex_unlock(&bdev_map_lock);
710711
kfree(found);
711712
}
712713
EXPORT_SYMBOL(blk_unregister_region);
@@ -1037,7 +1038,7 @@ static struct gendisk *lookup_gendisk(dev_t dev, int *partno)
10371038
unsigned long best = ~0UL;
10381039

10391040
retry:
1040-
mutex_lock(&block_class_lock);
1041+
mutex_lock(&bdev_map_lock);
10411042
for (p = bdev_map[MAJOR(dev) % 255]; p; p = p->next) {
10421043
struct kobject *(*probe)(dev_t, int *, void *);
10431044
struct module *owner;
@@ -1058,15 +1059,15 @@ static struct gendisk *lookup_gendisk(dev_t dev, int *partno)
10581059
module_put(owner);
10591060
continue;
10601061
}
1061-
mutex_unlock(&block_class_lock);
1062+
mutex_unlock(&bdev_map_lock);
10621063
kobj = probe(dev, partno, data);
10631064
/* Currently ->owner protects _only_ ->probe() itself. */
10641065
module_put(owner);
10651066
if (kobj)
10661067
return dev_to_disk(kobj_to_dev(kobj));
10671068
goto retry;
10681069
}
1069-
mutex_unlock(&block_class_lock);
1070+
mutex_unlock(&bdev_map_lock);
10701071
return NULL;
10711072
}
10721073

0 commit comments

Comments
 (0)