diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-06-24 02:03:05 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-07-22 15:58:00 -0400 |
commit | 6120d3dbb1220792ebea88cd475e1ec8f8620a93 (patch) | |
tree | 0ca01ed01651ddb1f54f6fe43c2288acb8d361c3 | |
parent | 3ffa3c0e3f6e62f67fc2346ca60161dfb030083d (diff) |
get rid of ->scm_work_list
recursion in __scm_destroy() will be cut by delaying final fput()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | include/linux/sched.h | 1 | ||||
-rw-r--r-- | include/net/scm.h | 1 | ||||
-rw-r--r-- | net/core/scm.c | 22 |
3 files changed, 3 insertions, 21 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h index af3555cc760f..598ba2da7865 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -1546,7 +1546,6 @@ struct task_struct { | |||
1546 | unsigned long timer_slack_ns; | 1546 | unsigned long timer_slack_ns; |
1547 | unsigned long default_timer_slack_ns; | 1547 | unsigned long default_timer_slack_ns; |
1548 | 1548 | ||
1549 | struct list_head *scm_work_list; | ||
1550 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | 1549 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
1551 | /* Index of current stored address in ret_stack */ | 1550 | /* Index of current stored address in ret_stack */ |
1552 | int curr_ret_stack; | 1551 | int curr_ret_stack; |
diff --git a/include/net/scm.h b/include/net/scm.h index d456f4c71a32..079d7887dac1 100644 --- a/include/net/scm.h +++ b/include/net/scm.h | |||
@@ -13,7 +13,6 @@ | |||
13 | #define SCM_MAX_FD 253 | 13 | #define SCM_MAX_FD 253 |
14 | 14 | ||
15 | struct scm_fp_list { | 15 | struct scm_fp_list { |
16 | struct list_head list; | ||
17 | short count; | 16 | short count; |
18 | short max; | 17 | short max; |
19 | struct file *fp[SCM_MAX_FD]; | 18 | struct file *fp[SCM_MAX_FD]; |
diff --git a/net/core/scm.c b/net/core/scm.c index 611c5efd4cb0..8f6ccfd68ef4 100644 --- a/net/core/scm.c +++ b/net/core/scm.c | |||
@@ -109,25 +109,9 @@ void __scm_destroy(struct scm_cookie *scm) | |||
109 | 109 | ||
110 | if (fpl) { | 110 | if (fpl) { |
111 | scm->fp = NULL; | 111 | scm->fp = NULL; |
112 | if (current->scm_work_list) { | 112 | for (i=fpl->count-1; i>=0; i--) |
113 | list_add_tail(&fpl->list, current->scm_work_list); | 113 | fput(fpl->fp[i]); |
114 | } else { | 114 | kfree(fpl); |
115 | LIST_HEAD(work_list); | ||
116 | |||
117 | current->scm_work_list = &work_list; | ||
118 | |||
119 | list_add(&fpl->list, &work_list); | ||
120 | while (!list_empty(&work_list)) { | ||
121 | fpl = list_first_entry(&work_list, struct scm_fp_list, list); | ||
122 | |||
123 | list_del(&fpl->list); | ||
124 | for (i=fpl->count-1; i>=0; i--) | ||
125 | fput(fpl->fp[i]); | ||
126 | kfree(fpl); | ||
127 | } | ||
128 | |||
129 | current->scm_work_list = NULL; | ||
130 | } | ||
131 | } | 115 | } |
132 | } | 116 | } |
133 | EXPORT_SYMBOL(__scm_destroy); | 117 | EXPORT_SYMBOL(__scm_destroy); |