diff options
| author | Mike Snitzer <snitzer@redhat.com> | 2009-04-02 19:55:30 +0100 | 
|---|---|---|
| committer | Alasdair G Kergon <agk@redhat.com> | 2009-04-02 19:55:30 +0100 | 
| commit | ec44ab9d6681ddf9026b593e866bec9c0e075e1d (patch) | |
| tree | 56c0f99068c7bf2a474e8094c1fa9d14a7861ae8 /drivers | |
| parent | 84e67c9319eb2232757a022c24f6a461291eaee5 (diff) | |
| download | olio-linux-3.10-ec44ab9d6681ddf9026b593e866bec9c0e075e1d.tar.xz olio-linux-3.10-ec44ab9d6681ddf9026b593e866bec9c0e075e1d.zip  | |
dm log: remove struct dm_dirty_log_internal
Remove the 'dm_dirty_log_internal' structure.  The resulting cleanup
eliminates extra memory allocations.  Therefore exposing the internal
list_head to the external 'dm_dirty_log_type' structure is a worthwhile
compromise.
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/md/dm-log.c | 58 | 
1 files changed, 14 insertions, 44 deletions
diff --git a/drivers/md/dm-log.c b/drivers/md/dm-log.c index 094c8f0e009..be233bc4d91 100644 --- a/drivers/md/dm-log.c +++ b/drivers/md/dm-log.c @@ -16,34 +16,28 @@  #define DM_MSG_PREFIX "dirty region log" -struct dm_dirty_log_internal { -	struct dm_dirty_log_type *type; - -	struct list_head list; -}; -  static LIST_HEAD(_log_types);  static DEFINE_SPINLOCK(_lock); -static struct dm_dirty_log_internal *__find_dirty_log_type(const char *name) +static struct dm_dirty_log_type *__find_dirty_log_type(const char *name)  { -	struct dm_dirty_log_internal *log_type; +	struct dm_dirty_log_type *log_type;  	list_for_each_entry(log_type, &_log_types, list) -		if (!strcmp(name, log_type->type->name)) +		if (!strcmp(name, log_type->name))  			return log_type;  	return NULL;  } -static struct dm_dirty_log_internal *_get_dirty_log_type(const char *name) +static struct dm_dirty_log_type *_get_dirty_log_type(const char *name)  { -	struct dm_dirty_log_internal *log_type; +	struct dm_dirty_log_type *log_type;  	spin_lock(&_lock);  	log_type = __find_dirty_log_type(name); -	if (log_type && !try_module_get(log_type->type->module)) +	if (log_type && !try_module_get(log_type->module))  		log_type = NULL;  	spin_unlock(&_lock); @@ -71,14 +65,14 @@ static struct dm_dirty_log_internal *_get_dirty_log_type(const char *name)  static struct dm_dirty_log_type *get_type(const char *type_name)  {  	char *p, *type_name_dup; -	struct dm_dirty_log_internal *log_type; +	struct dm_dirty_log_type *log_type;  	if (!type_name)  		return NULL;  	log_type = _get_dirty_log_type(type_name);  	if (log_type) -		return log_type->type; +		return log_type;  	type_name_dup = kstrdup(type_name, GFP_KERNEL);  	if (!type_name_dup) { @@ -100,19 +94,16 @@ static struct dm_dirty_log_type *get_type(const char *type_name)  	kfree(type_name_dup); -	return log_type ? log_type->type : NULL; +	return log_type;  }  static void put_type(struct dm_dirty_log_type *type)  { -	struct dm_dirty_log_internal *log_type; -  	if (!type)  		return;  	spin_lock(&_lock); -	log_type = __find_dirty_log_type(type->name); -	if (!log_type) +	if (!__find_dirty_log_type(type->name))  		goto out;  	module_put(type->module); @@ -121,32 +112,15 @@ out:  	spin_unlock(&_lock);  } -static struct dm_dirty_log_internal *_alloc_dirty_log_type(struct dm_dirty_log_type *type) -{ -	struct dm_dirty_log_internal *log_type = kzalloc(sizeof(*log_type), -							 GFP_KERNEL); - -	if (log_type) -		log_type->type = type; - -	return log_type; -} -  int dm_dirty_log_type_register(struct dm_dirty_log_type *type)  { -	struct dm_dirty_log_internal *log_type = _alloc_dirty_log_type(type);  	int r = 0; -	if (!log_type) -		return -ENOMEM; -  	spin_lock(&_lock);  	if (!__find_dirty_log_type(type->name)) -		list_add(&log_type->list, &_log_types); -	else { -		kfree(log_type); +		list_add(&type->list, &_log_types); +	else  		r = -EEXIST; -	}  	spin_unlock(&_lock);  	return r; @@ -155,20 +129,16 @@ EXPORT_SYMBOL(dm_dirty_log_type_register);  int dm_dirty_log_type_unregister(struct dm_dirty_log_type *type)  { -	struct dm_dirty_log_internal *log_type; -  	spin_lock(&_lock); -	log_type = __find_dirty_log_type(type->name); -	if (!log_type) { +	if (!__find_dirty_log_type(type->name)) {  		spin_unlock(&_lock);  		return -EINVAL;  	} -	list_del(&log_type->list); +	list_del(&type->list);  	spin_unlock(&_lock); -	kfree(log_type);  	return 0;  }  |