Re: [PATCH 10/19] brd: use __register_blkdev to allocate devices on demand

2020-09-04 Thread Hannes Reinecke

On 9/3/20 10:01 AM, Christoph Hellwig wrote:

Use the simpler mechanism attached to major_name to allocate a brd device
when a currently unregistered minor is accessed.

Signed-off-by: Christoph Hellwig 
---
  drivers/block/brd.c | 39 +++
  1 file changed, 11 insertions(+), 28 deletions(-)
Reviewed-by: Hannes Reinecke 


Cheers,

Hannes
--
Dr. Hannes ReineckeKernel Storage Architect
h...@suse.de  +49 911 74053 688
SUSE Software Solutions GmbH, Maxfeldstr. 5, 90409 Nürnberg
HRB 36809 (AG Nürnberg), Geschäftsführer: Felix Imendörffer


[PATCH 10/19] brd: use __register_blkdev to allocate devices on demand

2020-09-03 Thread Christoph Hellwig
Use the simpler mechanism attached to major_name to allocate a brd device
when a currently unregistered minor is accessed.

Signed-off-by: Christoph Hellwig 
---
 drivers/block/brd.c | 39 +++
 1 file changed, 11 insertions(+), 28 deletions(-)

diff --git a/drivers/block/brd.c b/drivers/block/brd.c
index 2723a70eb85593..c8ac36351115ef 100644
--- a/drivers/block/brd.c
+++ b/drivers/block/brd.c
@@ -427,14 +427,15 @@ static void brd_free(struct brd_device *brd)
kfree(brd);
 }
 
-static struct brd_device *brd_init_one(int i, bool *new)
+static void brd_probe(dev_t dev)
 {
struct brd_device *brd;
+   int i = MINOR(dev) / max_part;
 
-   *new = false;
+   mutex_lock(_devices_mutex);
list_for_each_entry(brd, _devices, brd_list) {
if (brd->brd_number == i)
-   goto out;
+   goto out_unlock;
}
 
brd = brd_alloc(i);
@@ -443,9 +444,9 @@ static struct brd_device *brd_init_one(int i, bool *new)
add_disk(brd->brd_disk);
list_add_tail(>brd_list, _devices);
}
-   *new = true;
-out:
-   return brd;
+
+out_unlock:
+   mutex_unlock(_devices_mutex);
 }
 
 static void brd_del_one(struct brd_device *brd)
@@ -455,23 +456,6 @@ static void brd_del_one(struct brd_device *brd)
brd_free(brd);
 }
 
-static struct kobject *brd_probe(dev_t dev, int *part, void *data)
-{
-   struct brd_device *brd;
-   struct kobject *kobj;
-   bool new;
-
-   mutex_lock(_devices_mutex);
-   brd = brd_init_one(MINOR(dev) / max_part, );
-   kobj = brd ? get_disk_and_module(brd->brd_disk) : NULL;
-   mutex_unlock(_devices_mutex);
-
-   if (new)
-   *part = 0;
-
-   return kobj;
-}
-
 static inline void brd_check_and_reset_par(void)
 {
if (unlikely(!max_part))
@@ -511,11 +495,12 @@ static int __init brd_init(void)
 *  dynamically.
 */
 
-   if (register_blkdev(RAMDISK_MAJOR, "ramdisk"))
+   if (__register_blkdev(RAMDISK_MAJOR, "ramdisk", brd_probe))
return -EIO;
 
brd_check_and_reset_par();
 
+   mutex_lock(_devices_mutex);
for (i = 0; i < rd_nr; i++) {
brd = brd_alloc(i);
if (!brd)
@@ -533,9 +518,7 @@ static int __init brd_init(void)
brd->brd_disk->queue = brd->brd_queue;
add_disk(brd->brd_disk);
}
-
-   blk_register_region(MKDEV(RAMDISK_MAJOR, 0), 1UL << MINORBITS,
- THIS_MODULE, brd_probe, NULL, NULL);
+   mutex_unlock(_devices_mutex);
 
pr_info("brd: module loaded\n");
return 0;
@@ -545,6 +528,7 @@ static int __init brd_init(void)
list_del(>brd_list);
brd_free(brd);
}
+   mutex_unlock(_devices_mutex);
unregister_blkdev(RAMDISK_MAJOR, "ramdisk");
 
pr_info("brd: module NOT loaded !!!\n");
@@ -558,7 +542,6 @@ static void __exit brd_exit(void)
list_for_each_entry_safe(brd, next, _devices, brd_list)
brd_del_one(brd);
 
-   blk_unregister_region(MKDEV(RAMDISK_MAJOR, 0), 1UL << MINORBITS);
unregister_blkdev(RAMDISK_MAJOR, "ramdisk");
 
pr_info("brd: module unloaded\n");
-- 
2.28.0



[PATCH 10/19] brd: use __register_blkdev to allocate devices on demand

2020-08-30 Thread Christoph Hellwig
Use the simpler mechanism attached to major_name to allocate a brd device
when a currently unregistered minor is accessed.

Signed-off-by: Christoph Hellwig 
---
 drivers/block/brd.c | 39 +++
 1 file changed, 11 insertions(+), 28 deletions(-)

diff --git a/drivers/block/brd.c b/drivers/block/brd.c
index 2723a70eb85593..c8ac36351115ef 100644
--- a/drivers/block/brd.c
+++ b/drivers/block/brd.c
@@ -427,14 +427,15 @@ static void brd_free(struct brd_device *brd)
kfree(brd);
 }
 
-static struct brd_device *brd_init_one(int i, bool *new)
+static void brd_probe(dev_t dev)
 {
struct brd_device *brd;
+   int i = MINOR(dev) / max_part;
 
-   *new = false;
+   mutex_lock(_devices_mutex);
list_for_each_entry(brd, _devices, brd_list) {
if (brd->brd_number == i)
-   goto out;
+   goto out_unlock;
}
 
brd = brd_alloc(i);
@@ -443,9 +444,9 @@ static struct brd_device *brd_init_one(int i, bool *new)
add_disk(brd->brd_disk);
list_add_tail(>brd_list, _devices);
}
-   *new = true;
-out:
-   return brd;
+
+out_unlock:
+   mutex_unlock(_devices_mutex);
 }
 
 static void brd_del_one(struct brd_device *brd)
@@ -455,23 +456,6 @@ static void brd_del_one(struct brd_device *brd)
brd_free(brd);
 }
 
-static struct kobject *brd_probe(dev_t dev, int *part, void *data)
-{
-   struct brd_device *brd;
-   struct kobject *kobj;
-   bool new;
-
-   mutex_lock(_devices_mutex);
-   brd = brd_init_one(MINOR(dev) / max_part, );
-   kobj = brd ? get_disk_and_module(brd->brd_disk) : NULL;
-   mutex_unlock(_devices_mutex);
-
-   if (new)
-   *part = 0;
-
-   return kobj;
-}
-
 static inline void brd_check_and_reset_par(void)
 {
if (unlikely(!max_part))
@@ -511,11 +495,12 @@ static int __init brd_init(void)
 *  dynamically.
 */
 
-   if (register_blkdev(RAMDISK_MAJOR, "ramdisk"))
+   if (__register_blkdev(RAMDISK_MAJOR, "ramdisk", brd_probe))
return -EIO;
 
brd_check_and_reset_par();
 
+   mutex_lock(_devices_mutex);
for (i = 0; i < rd_nr; i++) {
brd = brd_alloc(i);
if (!brd)
@@ -533,9 +518,7 @@ static int __init brd_init(void)
brd->brd_disk->queue = brd->brd_queue;
add_disk(brd->brd_disk);
}
-
-   blk_register_region(MKDEV(RAMDISK_MAJOR, 0), 1UL << MINORBITS,
- THIS_MODULE, brd_probe, NULL, NULL);
+   mutex_unlock(_devices_mutex);
 
pr_info("brd: module loaded\n");
return 0;
@@ -545,6 +528,7 @@ static int __init brd_init(void)
list_del(>brd_list);
brd_free(brd);
}
+   mutex_unlock(_devices_mutex);
unregister_blkdev(RAMDISK_MAJOR, "ramdisk");
 
pr_info("brd: module NOT loaded !!!\n");
@@ -558,7 +542,6 @@ static void __exit brd_exit(void)
list_for_each_entry_safe(brd, next, _devices, brd_list)
brd_del_one(brd);
 
-   blk_unregister_region(MKDEV(RAMDISK_MAJOR, 0), 1UL << MINORBITS);
unregister_blkdev(RAMDISK_MAJOR, "ramdisk");
 
pr_info("brd: module unloaded\n");
-- 
2.28.0



[PATCH 10/19] brd: use __register_blkdev to allocate devices on demand

2020-08-26 Thread Christoph Hellwig
Use the simpler mechanism attached to major_name to allocate a brd device
when a currently unregistered minor is accessed.

Signed-off-by: Christoph Hellwig 
---
 drivers/block/brd.c | 39 +++
 1 file changed, 11 insertions(+), 28 deletions(-)

diff --git a/drivers/block/brd.c b/drivers/block/brd.c
index 2723a70eb85593..c8ac36351115ef 100644
--- a/drivers/block/brd.c
+++ b/drivers/block/brd.c
@@ -427,14 +427,15 @@ static void brd_free(struct brd_device *brd)
kfree(brd);
 }
 
-static struct brd_device *brd_init_one(int i, bool *new)
+static void brd_probe(dev_t dev)
 {
struct brd_device *brd;
+   int i = MINOR(dev) / max_part;
 
-   *new = false;
+   mutex_lock(_devices_mutex);
list_for_each_entry(brd, _devices, brd_list) {
if (brd->brd_number == i)
-   goto out;
+   goto out_unlock;
}
 
brd = brd_alloc(i);
@@ -443,9 +444,9 @@ static struct brd_device *brd_init_one(int i, bool *new)
add_disk(brd->brd_disk);
list_add_tail(>brd_list, _devices);
}
-   *new = true;
-out:
-   return brd;
+
+out_unlock:
+   mutex_unlock(_devices_mutex);
 }
 
 static void brd_del_one(struct brd_device *brd)
@@ -455,23 +456,6 @@ static void brd_del_one(struct brd_device *brd)
brd_free(brd);
 }
 
-static struct kobject *brd_probe(dev_t dev, int *part, void *data)
-{
-   struct brd_device *brd;
-   struct kobject *kobj;
-   bool new;
-
-   mutex_lock(_devices_mutex);
-   brd = brd_init_one(MINOR(dev) / max_part, );
-   kobj = brd ? get_disk_and_module(brd->brd_disk) : NULL;
-   mutex_unlock(_devices_mutex);
-
-   if (new)
-   *part = 0;
-
-   return kobj;
-}
-
 static inline void brd_check_and_reset_par(void)
 {
if (unlikely(!max_part))
@@ -511,11 +495,12 @@ static int __init brd_init(void)
 *  dynamically.
 */
 
-   if (register_blkdev(RAMDISK_MAJOR, "ramdisk"))
+   if (__register_blkdev(RAMDISK_MAJOR, "ramdisk", brd_probe))
return -EIO;
 
brd_check_and_reset_par();
 
+   mutex_lock(_devices_mutex);
for (i = 0; i < rd_nr; i++) {
brd = brd_alloc(i);
if (!brd)
@@ -533,9 +518,7 @@ static int __init brd_init(void)
brd->brd_disk->queue = brd->brd_queue;
add_disk(brd->brd_disk);
}
-
-   blk_register_region(MKDEV(RAMDISK_MAJOR, 0), 1UL << MINORBITS,
- THIS_MODULE, brd_probe, NULL, NULL);
+   mutex_unlock(_devices_mutex);
 
pr_info("brd: module loaded\n");
return 0;
@@ -545,6 +528,7 @@ static int __init brd_init(void)
list_del(>brd_list);
brd_free(brd);
}
+   mutex_unlock(_devices_mutex);
unregister_blkdev(RAMDISK_MAJOR, "ramdisk");
 
pr_info("brd: module NOT loaded !!!\n");
@@ -558,7 +542,6 @@ static void __exit brd_exit(void)
list_for_each_entry_safe(brd, next, _devices, brd_list)
brd_del_one(brd);
 
-   blk_unregister_region(MKDEV(RAMDISK_MAJOR, 0), 1UL << MINORBITS);
unregister_blkdev(RAMDISK_MAJOR, "ramdisk");
 
pr_info("brd: module unloaded\n");
-- 
2.28.0