md: extend spinlock protection in register_md_cluster_operations
authorNeilBrown <neilb@suse.com>
Thu, 13 Aug 2015 02:32:55 +0000 (12:32 +1000)
committerNeilBrown <neilb@suse.com>
Mon, 31 Aug 2015 17:42:59 +0000 (19:42 +0200)
This code looks racy.

The only possible race is if two modules try to register at the same
time and that won't happen.  But make the code look safe anyway.

Signed-off-by: NeilBrown <neilb@suse.com>
drivers/md/md.c

index c0637603a39183057eb9e179c5ee7b08720ecdef..7d5a6cede9b07888167cd5fd250238085c2b53b1 100644 (file)
@@ -7427,15 +7427,19 @@ int unregister_md_personality(struct md_personality *p)
 }
 EXPORT_SYMBOL(unregister_md_personality);
 
-int register_md_cluster_operations(struct md_cluster_operations *ops, struct module *module)
+int register_md_cluster_operations(struct md_cluster_operations *ops,
+                                  struct module *module)
 {
-       if (md_cluster_ops != NULL)
-               return -EALREADY;
+       int ret = 0;
        spin_lock(&pers_lock);
-       md_cluster_ops = ops;
-       md_cluster_mod = module;
+       if (md_cluster_ops != NULL)
+               ret = -EALREADY;
+       else {
+               md_cluster_ops = ops;
+               md_cluster_mod = module;
+       }
        spin_unlock(&pers_lock);
-       return 0;
+       return ret;
 }
 EXPORT_SYMBOL(register_md_cluster_operations);