return ret;
}
+static struct pd_t *do_create_pd(struct task_struct *task)
+{
+ struct pd_t *pd;
+ int ret;
+
+ pd = __create_pd();
+ if (pd == NULL) {
+ ret = -ENOMEM;
+ goto create_pd_exit;
+ }
+
+ ret = __get_handlers(pd, task);
+ if (ret)
+ goto free_pd;
+
+ __set_ld_mapped(pd, task->mm);
+
+ return pd;
+
+free_pd:
+ kfree(pd);
+
+create_pd_exit:
+ printk(KERN_ERR LOADER_PREFIX "do_pd_create_pd: error=%d\n", ret);
+ return NULL;
+}
+
+static void do_destroy_pd(struct pd_t *pd)
+{
+ struct hd_t *hd, *tmp;
+
+ list_for_each_entry_safe(hd, tmp, &pd->handlers, list) {
+ list_del(&hd->list);
+ kfree(hd);
+ }
+
+ kfree(pd);
+}
+
+static void *pd_create(struct sspt_proc *proc)
+{
+ struct pd_t *pd;
+
+ pd = do_create_pd(proc->leader);
+
+ return (void *)pd;
+}
+
+static void pd_destroy(struct sspt_proc *proc, void *data)
+{
+ do_destroy_pd((struct pd_t *)data);
+}
+
+struct sspt_proc_cb pd_cb = {
+ .priv_create = pd_create,
+ .priv_destroy = pd_destroy
+};
+
enum ps_t lpd_get_state(struct hd_t *hd)
}
EXPORT_SYMBOL_GPL(lpd_get);
+void lpd_set(struct sspt_proc *proc, struct pd_t *pd)
+{
+ proc->private_data = pd;
+}
+EXPORT_SYMBOL_GPL(lpd_set);
+
struct pd_t *lpd_get_by_task(struct task_struct *task)
{
- struct sspt_proc *proc = sspt_proc_by_task(task);
+ struct sspt_proc *proc;
+ struct pd_t *pd;
- return lpd_get(proc);
+ proc = sspt_proc_by_task(task);
+ pd = lpd_get(proc);
+ if (!pd) {
+ pd = do_create_pd(task);
+ lpd_set(proc, pd);
+ }
+
+ return pd;
}
EXPORT_SYMBOL_GPL(lpd_get_by_task);
}
EXPORT_SYMBOL_GPL(lpd_set_init_state);
-static struct pd_t *do_create_pd(struct task_struct *task)
-{
- struct pd_t *pd;
- int ret;
-
- pd = __create_pd();
- if (pd == NULL) {
- ret = -ENOMEM;
- goto create_pd_exit;
- }
-
- ret = __get_handlers(pd, task);
- if (ret)
- goto free_pd;
-
- __set_ld_mapped(pd, task->mm);
-
- return pd;
-
-free_pd:
- kfree(pd);
-
-create_pd_exit:
- printk(KERN_ERR LOADER_PREFIX "do_pd_create_pd: error=%d\n", ret);
- return NULL;
-}
-
-static void *pd_create(struct sspt_proc *proc)
-{
- struct pd_t *pd;
-
- pd = do_create_pd(proc->leader);
-
- return (void *)pd;
-}
-
-static void pd_destroy(struct sspt_proc *proc, void *data)
-{
- /* FIXME: to be implemented */
-}
-
-struct sspt_proc_cb pd_cb = {
- .priv_create = pd_create,
- .priv_destroy = pd_destroy
-};
-
int lpd_init(void)
{
int ret;