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>
This commit is contained in:
@@ -1546,7 +1546,6 @@ struct task_struct {
|
|||||||
unsigned long timer_slack_ns;
|
unsigned long timer_slack_ns;
|
||||||
unsigned long default_timer_slack_ns;
|
unsigned long default_timer_slack_ns;
|
||||||
|
|
||||||
struct list_head *scm_work_list;
|
|
||||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||||
/* Index of current stored address in ret_stack */
|
/* Index of current stored address in ret_stack */
|
||||||
int curr_ret_stack;
|
int curr_ret_stack;
|
||||||
|
@@ -13,7 +13,6 @@
|
|||||||
#define SCM_MAX_FD 253
|
#define SCM_MAX_FD 253
|
||||||
|
|
||||||
struct scm_fp_list {
|
struct scm_fp_list {
|
||||||
struct list_head list;
|
|
||||||
short count;
|
short count;
|
||||||
short max;
|
short max;
|
||||||
struct file *fp[SCM_MAX_FD];
|
struct file *fp[SCM_MAX_FD];
|
||||||
|
@@ -109,26 +109,10 @@ void __scm_destroy(struct scm_cookie *scm)
|
|||||||
|
|
||||||
if (fpl) {
|
if (fpl) {
|
||||||
scm->fp = NULL;
|
scm->fp = NULL;
|
||||||
if (current->scm_work_list) {
|
|
||||||
list_add_tail(&fpl->list, current->scm_work_list);
|
|
||||||
} else {
|
|
||||||
LIST_HEAD(work_list);
|
|
||||||
|
|
||||||
current->scm_work_list = &work_list;
|
|
||||||
|
|
||||||
list_add(&fpl->list, &work_list);
|
|
||||||
while (!list_empty(&work_list)) {
|
|
||||||
fpl = list_first_entry(&work_list, struct scm_fp_list, list);
|
|
||||||
|
|
||||||
list_del(&fpl->list);
|
|
||||||
for (i=fpl->count-1; i>=0; i--)
|
for (i=fpl->count-1; i>=0; i--)
|
||||||
fput(fpl->fp[i]);
|
fput(fpl->fp[i]);
|
||||||
kfree(fpl);
|
kfree(fpl);
|
||||||
}
|
}
|
||||||
|
|
||||||
current->scm_work_list = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__scm_destroy);
|
EXPORT_SYMBOL(__scm_destroy);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user