aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2012-06-24 02:03:05 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2012-07-22 15:58:00 -0400
commit6120d3dbb1220792ebea88cd475e1ec8f8620a93 (patch)
tree0ca01ed01651ddb1f54f6fe43c2288acb8d361c3
parent3ffa3c0e3f6e62f67fc2346ca60161dfb030083d (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.h1
-rw-r--r--include/net/scm.h1
-rw-r--r--net/core/scm.c22
3 files changed, 3 insertions, 21 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h
index af3555cc760..598ba2da786 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 d456f4c71a3..079d7887dac 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
15struct scm_fp_list { 15struct 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 611c5efd4cb..8f6ccfd68ef 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}
133EXPORT_SYMBOL(__scm_destroy); 117EXPORT_SYMBOL(__scm_destroy);