From: crquan@gmail.com
To: dm-devel@redhat.com
Cc: Alasdair G Kergon <agk@redhat.com>, linux-kernel@vger.kernel.org
Subject: [PATCH 3/3] dm-target: embed internally used list_head into target_type
Date: Fri, 19 Dec 2008 12:19:45 +0800 [thread overview]
Message-ID: <1229660385-17153-4-git-send-email-crquan@gmail.com> (raw)
In-Reply-To: <1229660385-17153-3-git-send-email-crquan@gmail.com>
From: Cheng Renquan <crquan@gmail.com>
The tt_internal is really just a list_head to manage registered target_type
in a double linked list,
Here embed the list_head into target_type directly,
1. to avoid kmalloc/kfree;
2. then tt_internal is really unneeded;
Signed-off-by: Cheng Renquan <crquan@gmail.com>
---
drivers/md/dm-target.c | 95 +++++++++++++++--------------------------
include/linux/device-mapper.h | 3 +
2 files changed, 37 insertions(+), 61 deletions(-)
diff --git a/drivers/md/dm-target.c b/drivers/md/dm-target.c
index a713c7f..ee120a9 100644
--- a/drivers/md/dm-target.c
+++ b/drivers/md/dm-target.c
@@ -14,40 +14,34 @@
#define DM_MSG_PREFIX "target"
-struct tt_internal {
- struct target_type *tt;
-
- struct list_head list;
-};
-
static LIST_HEAD(_targets);
static DECLARE_RWSEM(_lock);
#define DM_MOD_NAME_SIZE 32
-static inline struct tt_internal *__find_target_type(const char *name)
+static inline struct target_type *__find_target_type(const char *name)
{
- struct tt_internal *ti;
+ struct target_type *tt;
- list_for_each_entry (ti, &_targets, list)
- if (!strcmp(name, ti->tt->name))
- return ti;
+ list_for_each_entry (tt, &_targets, list)
+ if (!strcmp(name, tt->name))
+ return tt;
return NULL;
}
-static struct tt_internal *get_target_type(const char *name)
+static struct target_type *get_target_type(const char *name)
{
- struct tt_internal *ti;
+ struct target_type *tt;
down_read(&_lock);
- ti = __find_target_type(name);
- if (ti && !try_module_get(ti->tt->module))
- ti = NULL;
+ tt = __find_target_type(name);
+ if (tt && !try_module_get(tt->module))
+ tt = NULL;
up_read(&_lock);
- return ti;
+ return tt;
}
static void load_module(const char *name)
@@ -57,91 +51,70 @@ static void load_module(const char *name)
struct target_type *dm_get_target_type(const char *name)
{
- struct tt_internal *ti = get_target_type(name);
+ struct target_type *tt = get_target_type(name);
- if (!ti) {
+ if (!tt) {
load_module(name);
- ti = get_target_type(name);
+ tt = get_target_type(name);
}
- return ti ? ti->tt : NULL;
+ return tt;
}
-void dm_put_target_type(struct target_type *t)
+void dm_put_target_type(struct target_type *tt)
{
- struct tt_internal *ti = (struct tt_internal *) t;
-
down_read(&_lock);
- module_put(ti->tt->module);
+ module_put(tt->module);
up_read(&_lock);
-
- return;
}
-static struct tt_internal *alloc_target(struct target_type *t)
-{
- struct tt_internal *ti = kzalloc(sizeof(*ti), GFP_KERNEL);
-
- if (ti)
- ti->tt = t;
-
- return ti;
-}
-
-
int dm_target_iterate(void (*iter_func)(struct target_type *tt,
void *param), void *param)
{
- struct tt_internal *ti;
+ struct target_type *tt;
down_read(&_lock);
- list_for_each_entry (ti, &_targets, list)
- iter_func(ti->tt, param);
+ list_for_each_entry (tt, &_targets, list)
+ iter_func(tt, param);
up_read(&_lock);
return 0;
}
-int dm_register_target(struct target_type *t)
+int dm_register_target(struct target_type *tt)
{
int rv = 0;
- struct tt_internal *ti = alloc_target(t);
-
- if (!ti)
- return -ENOMEM;
down_write(&_lock);
- if (__find_target_type(t->name))
+ if (__find_target_type(tt->name))
rv = -EEXIST;
else
- list_add(&ti->list, &_targets);
+ list_add(&tt->list, &_targets);
up_write(&_lock);
- if (rv)
- kfree(ti);
return rv;
}
-int dm_unregister_target(struct target_type *t)
+int dm_unregister_target(struct target_type *tt)
{
- struct tt_internal *ti;
+ int rv = 0;
down_write(&_lock);
- if (!(ti = __find_target_type(t->name))) {
- up_write(&_lock);
- return -EINVAL;
+ if (!__find_target_type(tt->name)) {
+ rv = -EINVAL;
+ goto out;
}
- if (ti->tt->module && module_refcount(ti->tt->module)) {
- up_write(&_lock);
- return -ETXTBSY;
+ if (tt->module && module_refcount(tt->module)) {
+ rv = -ETXTBSY;
+ goto out;
}
- list_del(&ti->list);
- kfree(ti);
+ list_del(&tt->list);
+ out:
up_write(&_lock);
- return 0;
+ return rv;
}
/*
diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h
index c17fd33..8bcc7f5 100644
--- a/include/linux/device-mapper.h
+++ b/include/linux/device-mapper.h
@@ -117,6 +117,9 @@ struct target_type {
dm_message_fn message;
dm_ioctl_fn ioctl;
dm_merge_fn merge;
+
+ /* for internal use only */
+ struct list_head list;
};
struct io_restrictions {
--
1.6.0.2.GIT
next prev parent reply other threads:[~2008-12-19 4:19 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-19 4:19 [PATCH 0/3] dm-target: target_type improvements crquan
2008-12-19 4:19 ` [PATCH 1/3] dm-target: use the module's refcount instead crquan
2008-12-19 4:19 ` [PATCH 2/3] dm-target: use pointer reference instead of making a copy crquan
2008-12-19 4:19 ` crquan [this message]
2009-01-02 18:12 ` [PATCH 0/3] dm-target: target_type improvements Alasdair G Kergon
2009-01-02 18:12 ` [dm-devel] " Alasdair G Kergon
2009-01-03 6:42 ` Cheng Renquan (程任全)
2009-01-03 6:42 ` Cheng Renquan (程任全)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1229660385-17153-4-git-send-email-crquan@gmail.com \
--to=crquan@gmail.com \
--cc=agk@redhat.com \
--cc=dm-devel@redhat.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.