From fe5d1317096ab7f49e6e7ba420b2a8ee985c4e97 Mon Sep 17 00:00:00 2001 From: Vyacheslav Cherkashin Date: Fri, 3 Jul 2015 20:23:09 +0300 Subject: [PATCH] [FIX] correct to call mod_us_app_inst() at the second start Change-Id: I876fb4136345286b241a0d0a749271f9c80b77dd Signed-off-by: Vyacheslav Cherkashin --- parser/us_inst.c | 43 +++++++++++++++++++++---------------------- us_manager/pf/pf_group.c | 6 ++++++ us_manager/pf/pf_group.h | 1 + 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/parser/us_inst.c b/parser/us_inst.c index d298ae8..b6f44b8 100644 --- a/parser/us_inst.c +++ b/parser/us_inst.c @@ -50,21 +50,36 @@ static LIST_HEAD(pfg_item_list); static DEFINE_SPINLOCK(pfg_item_lock); +static struct pfg_msg_cb msg_cb = { + .msg_info = usm_msg_info, + .msg_status_info = usm_msg_status_info, + .msg_term = usm_msg_term, + .msg_map = usm_msg_map, + .msg_unmap = usm_msg_unmap +}; + static struct pfg_item *pfg_item_create(struct pf_group *pfg) { + int ret; struct pfg_item *item; + ret = pfg_msg_cb_set(pfg, &msg_cb); + if (ret) + return ERR_PTR(ret); + item = kmalloc(sizeof(*item), GFP_KERNEL); - if (item) { - INIT_LIST_HEAD(&item->list); - item->pfg = pfg; - } + if (item == NULL) + return ERR_PTR(-ENOMEM); + + INIT_LIST_HEAD(&item->list); + item->pfg = pfg; return item; } static void pfg_item_free(struct pfg_item *item) { + pfg_msg_cb_reset(item->pfg); kfree(item); } @@ -95,8 +110,8 @@ static int pfg_add(struct pf_group *pfg) struct pfg_item *item; item = pfg_item_create(pfg); - if (item == NULL) - return -ENOMEM; + if (IS_ERR(item)) + return PTR_ERR(item); spin_lock(&pfg_item_lock); list_add(&item->list, &pfg_item_list); @@ -202,14 +217,6 @@ static int get_pfg_by_app_info(struct app_info_data *app_info, return 0; } -static struct pfg_msg_cb msg_cb = { - .msg_info = usm_msg_info, - .msg_status_info = usm_msg_status_info, - .msg_term = usm_msg_term, - .msg_map = usm_msg_map, - .msg_unmap = usm_msg_unmap -}; - static int mod_us_app_inst(struct app_inst_data *app_inst, enum MOD_TYPE mt) { int ret, i; @@ -229,14 +236,6 @@ static int mod_us_app_inst(struct app_inst_data *app_inst, enum MOD_TYPE mt) return ret; } - ret = pfg_msg_cb_set(pfg, &msg_cb); - if (ret) { - put_pf_group(pfg); - printk(KERN_INFO "Cannot set path [%s], ret=%d\n", - app_inst->app_info->exec_path, ret); - return ret; - } - for (i = 0; i < app_inst->cnt_func; ++i) { /* TODO: */ dentry = dentry_by_path(app_inst->app_info->exec_path); diff --git a/us_manager/pf/pf_group.c b/us_manager/pf/pf_group.c index 6b2ec7b..345c69e 100644 --- a/us_manager/pf/pf_group.c +++ b/us_manager/pf/pf_group.c @@ -230,6 +230,12 @@ int pfg_msg_cb_set(struct pf_group *pfg, struct pfg_msg_cb *msg_cb) } EXPORT_SYMBOL_GPL(pfg_msg_cb_set); +void pfg_msg_cb_reset(struct pf_group *pfg) +{ + pfg->msg_cb = NULL; +} +EXPORT_SYMBOL_GPL(pfg_msg_cb_reset); + struct pfg_msg_cb *pfg_msg_cb_get(struct pf_group *pfg) { return pfg->msg_cb; diff --git a/us_manager/pf/pf_group.h b/us_manager/pf/pf_group.h index 908891b..00f71c1 100644 --- a/us_manager/pf/pf_group.h +++ b/us_manager/pf/pf_group.h @@ -52,6 +52,7 @@ struct pf_group *get_pf_group_dumb(void *priv); void put_pf_group(struct pf_group *pfg); int pfg_msg_cb_set(struct pf_group *pfg, struct pfg_msg_cb *msg_cb); +void pfg_msg_cb_reset(struct pf_group *pfg); struct pfg_msg_cb *pfg_msg_cb_get(struct pf_group *pfg); int pf_register_probe(struct pf_group *pfg, struct dentry *dentry, -- 2.7.4