Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+52 −0
Original line number Diff line number Diff line
@@ -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_firmware_load(struct pci_dev *pdev, int card_type,
			      struct board_t *brd);
static void dgap_cleanup_nodes(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)
free_flipbuf:
	dgap_free_flipbuf(brd);
cleanup_brd:
	dgap_cleanup_nodes();
	dgap_release_remap(brd);
	kfree(brd);

@@ -659,6 +661,8 @@ static void dgap_cleanup_module(void)
		dgap_cleanup_board(dgap_board[i]);
	}

	dgap_cleanup_nodes();

	if (dgap_numboards)
		pci_unregister_driver(&dgap_driver);
}
@@ -6323,6 +6327,54 @@ static void dgap_remove_tty_sysfs(struct device *c)
	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.
 */