Commit 99a643b8 authored by Daeseok Youn's avatar Daeseok Youn Committed by Greg Kroah-Hartman

staging: dgap: introduce dgap_cleanup_nodes()

When a configration file is parsed with dgap_parsefile(),
makes nodes for saving configrations for board.

Making a node will allocate node memory and strings for saving
configrations with kstrdup().

So these are freed when dgap is unloaded or failed to initialize.
Signed-off-by: default avatarDaeseok Youn <daeseok.youn@gmail.com>
Tested-by: default avatarMark Hounschell <markh@compro.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2eb61f38
...@@ -201,6 +201,7 @@ static int dgap_test_fep(struct board_t *brd); ...@@ -201,6 +201,7 @@ static int dgap_test_fep(struct board_t *brd);
static int dgap_tty_register_ports(struct board_t *brd); static int dgap_tty_register_ports(struct board_t *brd);
static int dgap_firmware_load(struct pci_dev *pdev, int card_type, static int dgap_firmware_load(struct pci_dev *pdev, int card_type,
struct board_t *brd); struct board_t *brd);
static void dgap_cleanup_nodes(void);
static void dgap_cleanup_module(void); static void dgap_cleanup_module(void);
...@@ -619,6 +620,7 @@ static int dgap_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -619,6 +620,7 @@ static int dgap_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
free_flipbuf: free_flipbuf:
dgap_free_flipbuf(brd); dgap_free_flipbuf(brd);
cleanup_brd: cleanup_brd:
dgap_cleanup_nodes();
dgap_release_remap(brd); dgap_release_remap(brd);
kfree(brd); kfree(brd);
...@@ -659,6 +661,8 @@ static void dgap_cleanup_module(void) ...@@ -659,6 +661,8 @@ static void dgap_cleanup_module(void)
dgap_cleanup_board(dgap_board[i]); dgap_cleanup_board(dgap_board[i]);
} }
dgap_cleanup_nodes();
if (dgap_numboards) if (dgap_numboards)
pci_unregister_driver(&dgap_driver); pci_unregister_driver(&dgap_driver);
} }
...@@ -6323,6 +6327,54 @@ static void dgap_remove_tty_sysfs(struct device *c) ...@@ -6323,6 +6327,54 @@ static void dgap_remove_tty_sysfs(struct device *c)
sysfs_remove_group(&c->kobj, &dgap_tty_attribute_group); sysfs_remove_group(&c->kobj, &dgap_tty_attribute_group);
} }
static void dgap_cleanup_nodes(void)
{
struct cnode *p;
p = &dgap_head;
while (p) {
struct cnode *tmp = p->next;
if (p->type == NULLNODE) {
p = tmp;
continue;
}
switch (p->type) {
case BNODE:
kfree(p->u.board.portstr);
kfree(p->u.board.addrstr);
kfree(p->u.board.pcibusstr);
kfree(p->u.board.pcislotstr);
kfree(p->u.board.method);
break;
case CNODE:
kfree(p->u.conc.id);
kfree(p->u.conc.connect);
break;
case MNODE:
kfree(p->u.module.id);
break;
case TNODE:
kfree(p->u.ttyname);
break;
case CUNODE:
kfree(p->u.cuname);
break;
case LNODE:
kfree(p->u.line.cable);
break;
case PNODE:
kfree(p->u.printname);
break;
}
kfree(p->u.board.status);
kfree(p);
p = tmp;
}
}
/* /*
* Parse a configuration file read into memory as a string. * Parse a configuration file read into memory as a string.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment