dm target: use module refcount directly
authorCheng Renquan <crquan@gmail.com>
Thu, 2 Apr 2009 18:55:27 +0000 (19:55 +0100)
committerAlasdair G Kergon <agk@redhat.com>
Thu, 2 Apr 2009 18:55:27 +0000 (19:55 +0100)
The tt_internal's 'use' field is superfluous: the module's refcount can do
the work properly.  An acceptable side-effect is that this increases the
reference counts reported by 'lsmod'.

Remove the superfluous test when removing a target module.

[Crash possible without this on SMP - agk]

Cc: stable@kernel.org
Signed-off-by: Cheng Renquan <crquan@gmail.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Reviewed-by: Alasdair G Kergon <agk@redhat.com>
Reviewed-by: Jonathan Brassow <jbrassow@redhat.com>
drivers/md/dm-target.c

index 7decf10006e41cf9b3372544fa60eff54d195923..db72c9497bb4faf34ec9bfaf29c1de09f8d5a333 100644 (file)
@@ -18,7 +18,6 @@ struct tt_internal {
        struct target_type tt;
 
        struct list_head list;
-       long use;
 };
 
 static LIST_HEAD(_targets);
@@ -44,12 +43,8 @@ static struct tt_internal *get_target_type(const char *name)
        down_read(&_lock);
 
        ti = __find_target_type(name);
-       if (ti) {
-               if ((ti->use == 0) && !try_module_get(ti->tt.module))
-                       ti = NULL;
-               else
-                       ti->use++;
-       }
+       if (ti && !try_module_get(ti->tt.module))
+               ti = NULL;
 
        up_read(&_lock);
        return ti;
@@ -77,10 +72,7 @@ void dm_put_target_type(struct target_type *t)
        struct tt_internal *ti = (struct tt_internal *) t;
 
        down_read(&_lock);
-       if (--ti->use == 0)
-               module_put(ti->tt.module);
-
-       BUG_ON(ti->use < 0);
+       module_put(ti->tt.module);
        up_read(&_lock);
 
        return;
@@ -140,12 +132,6 @@ void dm_unregister_target(struct target_type *t)
                BUG();
        }
 
-       if (ti->use) {
-               DMCRIT("Attempt to unregister target still in use: %s",
-                      t->name);
-               BUG();
-       }
-
        list_del(&ti->list);
        kfree(ti);