diff options
| author | Vasily Averin <vvs@sw.ru> | 2006-03-05 23:18:14 +0100 | 
|---|---|---|
| committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-03-12 08:53:16 -0600 | 
| commit | 071a651e28bfc1a66a885dc285792e335427a097 (patch) | |
| tree | b0329efb4c0e2643e19058157b34648c820e61d9 /drivers/message/i2o/exec-osm.c | |
| parent | cf7f5b45fe0180a0f0e3491183c0ec95e4b96d44 (diff) | |
[SCSI] i2o: fix memory leak in i2o_exec_lct_modified
i2o_exec_lct_modified() does not release memory allocated for work_struct.
Signed-off-by: Vasily Averin <vvs@sw.ru>
Although your patch is the same, i've rewritten it a little bit for
naming consistency in the I2O driver.
Acked-by: Markus Lidel <Markus.Lidel@shadowconnect.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/message/i2o/exec-osm.c')
| -rw-r--r-- | drivers/message/i2o/exec-osm.c | 21 | 
1 files changed, 17 insertions, 4 deletions
| diff --git a/drivers/message/i2o/exec-osm.c b/drivers/message/i2o/exec-osm.c index 9bb9859f6dfe..5ea133c59afb 100644 --- a/drivers/message/i2o/exec-osm.c +++ b/drivers/message/i2o/exec-osm.c @@ -57,6 +57,13 @@ struct i2o_exec_wait {  	struct list_head list;	/* node in global wait list */  }; +/* Work struct needed to handle LCT NOTIFY replies */ +struct i2o_exec_lct_notify_work { +	struct work_struct work;	/* work struct */ +	struct i2o_controller *c;	/* controller on which the LCT NOTIFY +					   was received */ +}; +  /* Exec OSM class handling definition */  static struct i2o_class_id i2o_exec_class_id[] = {  	{I2O_CLASS_EXECUTIVE}, @@ -355,9 +362,12 @@ static int i2o_exec_remove(struct device *dev)   *	new LCT and if the buffer for the LCT was to small sends a LCT NOTIFY   *	again, otherwise send LCT NOTIFY to get informed on next LCT change.   */ -static void i2o_exec_lct_modified(struct i2o_controller *c) +static void i2o_exec_lct_modified(struct i2o_exec_lct_notify_work *work)  {  	u32 change_ind = 0; +	struct i2o_controller *c = work->c; + +	kfree(work);  	if (i2o_device_parse_lct(c) != -EAGAIN)  		change_ind = c->lct->change_ind + 1; @@ -410,7 +420,7 @@ static int i2o_exec_reply(struct i2o_controller *c, u32 m,  		return i2o_msg_post_wait_complete(c, m, msg, context);  	if ((le32_to_cpu(msg->u.head[1]) >> 24) == I2O_CMD_LCT_NOTIFY) { -		struct work_struct *work; +		struct i2o_exec_lct_notify_work *work;  		pr_debug("%s: LCT notify received\n", c->name); @@ -418,8 +428,11 @@ static int i2o_exec_reply(struct i2o_controller *c, u32 m,  		if (!work)  			return -ENOMEM; -		INIT_WORK(work, (void (*)(void *))i2o_exec_lct_modified, c); -		queue_work(i2o_exec_driver.event_queue, work); +		work->c = c; + +		INIT_WORK(&work->work, (void (*)(void *))i2o_exec_lct_modified, +			  work); +		queue_work(i2o_exec_driver.event_queue, &work->work);  		return 1;  	} | 
