dm: consolidate target deregistration error handling
authorMikulas Patocka <mpatocka@redhat.com>
Tue, 6 Jan 2009 03:04:58 +0000 (03:04 +0000)
committerAlasdair G Kergon <agk@redhat.com>
Tue, 6 Jan 2009 03:04:58 +0000 (03:04 +0000)
Change dm_unregister_target to return void and use BUG() for error
reporting.

dm_unregister_target can only fail because of programming bug in the
target driver. It can't fail because of user's behavior or disk errors.

This patch changes unregister_target to return void and use BUG if
someone tries to unregister non-registered target or unregister target
that is in use.

This patch removes code duplication (testing of error codes in all dm
targets) and reports bugs in just one place, in dm_unregister_target. In
some target drivers, these return codes were ignored, which could lead
to a situation where bugs could be missed.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
drivers/md/dm-crypt.c
drivers/md/dm-delay.c
drivers/md/dm-linear.c
drivers/md/dm-mpath.c
drivers/md/dm-raid1.c
drivers/md/dm-snap.c
drivers/md/dm-stripe.c
drivers/md/dm-target.c
drivers/md/dm-zero.c
include/linux/device-mapper.h

index 3326750ec02c9d056329cb075842954012bc25cb..35bda49796fbca493800a275360a6d443dac5cf2 100644 (file)
@@ -1322,11 +1322,7 @@ static int __init dm_crypt_init(void)
 
 static void __exit dm_crypt_exit(void)
 {
-       int r = dm_unregister_target(&crypt_target);
-
-       if (r < 0)
-               DMERR("unregister failed %d", r);
-
+       dm_unregister_target(&crypt_target);
        kmem_cache_destroy(_crypt_io_pool);
 }
 
index 848b381f11732c626161ecc8f8c06e5d82927a07..59ee1b015d2df5870f7ac775a6d612adb5f44e11 100644 (file)
@@ -364,11 +364,7 @@ bad_queue:
 
 static void __exit dm_delay_exit(void)
 {
-       int r = dm_unregister_target(&delay_target);
-
-       if (r < 0)
-               DMERR("unregister failed %d", r);
-
+       dm_unregister_target(&delay_target);
        kmem_cache_destroy(delayed_cache);
        destroy_workqueue(kdelayd_wq);
 }
index 44042becad8adea2e53af2af8bdf2589f070d91e..79fb53e51c709e2875382c517bc61413e50fd978 100644 (file)
@@ -156,8 +156,5 @@ int __init dm_linear_init(void)
 
 void dm_linear_exit(void)
 {
-       int r = dm_unregister_target(&linear_target);
-
-       if (r < 0)
-               DMERR("unregister failed %d", r);
+       dm_unregister_target(&linear_target);
 }
index 3d7f4923cd133a2216115bb18d6fb177eb93ffd1..345a26047ae0422c09801c5e8b85925cbba0fdc6 100644 (file)
@@ -1495,14 +1495,10 @@ static int __init dm_multipath_init(void)
 
 static void __exit dm_multipath_exit(void)
 {
-       int r;
-
        destroy_workqueue(kmpath_handlerd);
        destroy_workqueue(kmultipathd);
 
-       r = dm_unregister_target(&multipath_target);
-       if (r < 0)
-               DMERR("target unregister failed %d", r);
+       dm_unregister_target(&multipath_target);
        kmem_cache_destroy(_mpio_cache);
 }
 
index d0fed2b21b089b68f96f0c51a59c2dfdfc84c2ab..250f401668d520662f8e8d36b25abee520f24261 100644 (file)
@@ -1300,11 +1300,7 @@ static int __init dm_mirror_init(void)
 
 static void __exit dm_mirror_exit(void)
 {
-       int r;
-
-       r = dm_unregister_target(&mirror_target);
-       if (r < 0)
-               DMERR("unregister failed %d", r);
+       dm_unregister_target(&mirror_target);
 }
 
 /* Module hooks */
index 4ceedd4f22afc849d91ab92ac1ea96f22e40871c..a8005b43a06b6705f02c8ffb6b47d3e86564cae4 100644 (file)
@@ -1470,17 +1470,10 @@ static int __init dm_snapshot_init(void)
 
 static void __exit dm_snapshot_exit(void)
 {
-       int r;
-
        destroy_workqueue(ksnapd);
 
-       r = dm_unregister_target(&snapshot_target);
-       if (r)
-               DMERR("snapshot unregister failed %d", r);
-
-       r = dm_unregister_target(&origin_target);
-       if (r)
-               DMERR("origin unregister failed %d", r);
+       dm_unregister_target(&snapshot_target);
+       dm_unregister_target(&origin_target);
 
        exit_origin_hash();
        kmem_cache_destroy(pending_cache);
index 9e4ef88d421e499dfb05e1697593bcbf82fefe38..41569bc60abc9dfe2d8986beba23099ffd068d31 100644 (file)
@@ -337,9 +337,7 @@ int __init dm_stripe_init(void)
 
 void dm_stripe_exit(void)
 {
-       if (dm_unregister_target(&stripe_target))
-               DMWARN("target unregistration failed");
-
+       dm_unregister_target(&stripe_target);
        destroy_workqueue(kstriped);
 
        return;
index 835cf95b857fa6cbef32c0c6d0d474e03909221a..7decf10006e41cf9b3372544fa60eff54d195923 100644 (file)
@@ -130,26 +130,26 @@ int dm_register_target(struct target_type *t)
        return rv;
 }
 
-int dm_unregister_target(struct target_type *t)
+void dm_unregister_target(struct target_type *t)
 {
        struct tt_internal *ti;
 
        down_write(&_lock);
        if (!(ti = __find_target_type(t->name))) {
-               up_write(&_lock);
-               return -EINVAL;
+               DMCRIT("Unregistering unrecognised target: %s", t->name);
+               BUG();
        }
 
        if (ti->use) {
-               up_write(&_lock);
-               return -ETXTBSY;
+               DMCRIT("Attempt to unregister target still in use: %s",
+                      t->name);
+               BUG();
        }
 
        list_del(&ti->list);
        kfree(ti);
 
        up_write(&_lock);
-       return 0;
 }
 
 /*
@@ -187,8 +187,7 @@ int __init dm_target_init(void)
 
 void dm_target_exit(void)
 {
-       if (dm_unregister_target(&error_target))
-               DMWARN("error target unregistration failed");
+       dm_unregister_target(&error_target);
 }
 
 EXPORT_SYMBOL(dm_register_target);
index cdbf126ec10651f6632bfed0401598e3ced361d5..bbc97030c0c200eb35160beddb0342693c7c7250 100644 (file)
@@ -69,10 +69,7 @@ static int __init dm_zero_init(void)
 
 static void __exit dm_zero_exit(void)
 {
-       int r = dm_unregister_target(&zero_target);
-
-       if (r < 0)
-               DMERR("unregister failed %d", r);
+       dm_unregister_target(&zero_target);
 }
 
 module_init(dm_zero_init)
index c17fd334e574ec759285c892616ab01108ec0e13..89ff2df402405a280622c792064df3954cbae2a9 100644 (file)
@@ -157,8 +157,7 @@ struct dm_target {
 };
 
 int dm_register_target(struct target_type *t);
-int dm_unregister_target(struct target_type *t);
-
+void dm_unregister_target(struct target_type *t);
 
 /*-----------------------------------------------------------------
  * Functions for creating and manipulating mapped devices.
@@ -276,6 +275,9 @@ void *dm_vcalloc(unsigned long nmemb, unsigned long elem_size);
  *---------------------------------------------------------------*/
 #define DM_NAME "device-mapper"
 
+#define DMCRIT(f, arg...) \
+       printk(KERN_CRIT DM_NAME ": " DM_MSG_PREFIX ": " f "\n", ## arg)
+
 #define DMERR(f, arg...) \
        printk(KERN_ERR DM_NAME ": " DM_MSG_PREFIX ": " f "\n", ## arg)
 #define DMERR_LIMIT(f, arg...) \