md: factor out a mddev_find_locked helper from mddev_find
authorChristoph Hellwig <hch@lst.de>
Sat, 3 Apr 2021 16:15:28 +0000 (18:15 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 14 May 2021 07:49:59 +0000 (09:49 +0200)
commit 8b57251f9a91f5e5a599de7549915d2d226cc3af upstream.

Factor out a self-contained helper to just lookup a mddev by the dev_t
"unit".

Cc: stable@vger.kernel.org
Reviewed-by: Heming Zhao <heming.zhao@suse.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Song Liu <song@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/md/md.c

index 885151a..b541b47 100644 (file)
@@ -748,6 +748,17 @@ void mddev_init(struct mddev *mddev)
 }
 EXPORT_SYMBOL_GPL(mddev_init);
 
+static struct mddev *mddev_find_locked(dev_t unit)
+{
+       struct mddev *mddev;
+
+       list_for_each_entry(mddev, &all_mddevs, all_mddevs)
+               if (mddev->unit == unit)
+                       return mddev;
+
+       return NULL;
+}
+
 static struct mddev *mddev_find(dev_t unit)
 {
        struct mddev *mddev;
@@ -775,13 +786,13 @@ static struct mddev *mddev_find_or_alloc(dev_t unit)
        spin_lock(&all_mddevs_lock);
 
        if (unit) {
-               list_for_each_entry(mddev, &all_mddevs, all_mddevs)
-                       if (mddev->unit == unit) {
-                               mddev_get(mddev);
-                               spin_unlock(&all_mddevs_lock);
-                               kfree(new);
-                               return mddev;
-                       }
+               mddev = mddev_find_locked(unit);
+               if (mddev) {
+                       mddev_get(mddev);
+                       spin_unlock(&all_mddevs_lock);
+                       kfree(new);
+                       return mddev;
+               }
 
                if (new) {
                        list_add(&new->all_mddevs, &all_mddevs);
@@ -807,12 +818,7 @@ static struct mddev *mddev_find_or_alloc(dev_t unit)
                                return NULL;
                        }
 
-                       is_free = 1;
-                       list_for_each_entry(mddev, &all_mddevs, all_mddevs)
-                               if (mddev->unit == dev) {
-                                       is_free = 0;
-                                       break;
-                               }
+                       is_free = !mddev_find_locked(dev);
                }
                new->unit = dev;
                new->md_minor = MINOR(dev);