aboutsummaryrefslogtreecommitdiffstats
path: root/features/cgroups/Fix-RFC-cgroups-Resource-controller-for-open-files.patch
blob: 9224503ab19aa04f7602f02808a316f239190352 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
From a36af1327d41aae19708fdf35b0cbc7e1b73a4b4 Mon Sep 17 00:00:00 2001
From: He Zhe <zhe.he@windriver.com>
Date: Wed, 30 Jul 2014 16:58:52 +0800
Subject: [PATCH 2/2] Fix [RFC] cgroups: Resource controller for open files.

The original patch is based on:
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
fad01e866afdbe01a1f3ec06a39c3a8b9e197014
3.15-rc8

Modify variable and macro in fs/filescontrol.c and include/linux/cgroup_subsys.h
according to target version. Correct wrong handling which causes boot failure in
fs/file.c.

Signed-off-by: He Zhe <zhe.he@windriver.com>
Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
---
 fs/file.c                     |  6 ++++--
 fs/filescontrol.c             | 12 +++++++-----
 include/linux/cgroup_subsys.h |  2 +-
 3 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/fs/file.c b/fs/file.c
index 4b84070bf8f4..e615dc918ac8 100644
--- a/fs/file.c
+++ b/fs/file.c
@@ -820,8 +820,10 @@ static int do_dup2(struct files_struct *files,
 
 #ifdef CONFIG_CGROUP_FILES
 	if (!tofree)
-		if (!files_cgroup_alloc_fd(files, 1))
-			goto Ebusy;
+		if (files_cgroup_alloc_fd(files, 1)) {
+			spin_unlock(&files->file_lock);
+			return -EMFILE;
+		}
 #endif
 
 	get_file(file);
diff --git a/fs/filescontrol.c b/fs/filescontrol.c
index c532d02eb023..0ba8ffaa85d3 100644
--- a/fs/filescontrol.c
+++ b/fs/filescontrol.c
@@ -23,8 +23,8 @@
 #include <linux/fs.h>
 #include <linux/fdtable.h>
 
-struct cgroup_subsys files_cgrp_subsys __read_mostly;
-EXPORT_SYMBOL(files_cgrp_subsys);
+struct cgroup_subsys files_subsys __read_mostly;
+EXPORT_SYMBOL(files_subsys);
 
 struct files_cgroup {
 	struct cgroup_subsys_state css;
@@ -92,9 +92,10 @@ u64 files_cgroup_count_fds(struct files_struct *files)
 
 static u64 files_in_taskset(struct cgroup_taskset *tset)
 {
+	struct cgroup_subsys_state *css = NULL;
 	struct task_struct *task;
 	u64 files = 0;
-	cgroup_taskset_for_each(task, tset) {
+	cgroup_taskset_for_each(task, css, tset) {
 		if (!thread_group_leader(task))
 			continue;
 
@@ -212,13 +213,14 @@ static struct cftype files[] = {
 	{ }
 };
 
-struct cgroup_subsys files_cgrp_subsys = {
+struct cgroup_subsys files_subsys = {
 	.name = "files",
 	.css_alloc = files_cgroup_css_alloc,
 	.css_free = files_cgroup_css_free,
 	.can_attach = files_cgroup_can_attach,
 	.attach = files_cgroup_attach,
 	.base_cftypes = files,
+	.subsys_id = files_subsys_id,
 };
 
 void files_cgroup_assign(struct files_struct *files)
@@ -227,7 +229,7 @@ void files_cgroup_assign(struct files_struct *files)
 	struct cgroup_subsys_state *css;
 
 	task_lock(tsk);
-	css = task_css(tsk, files_cgrp_id);
+	css = task_css(tsk, files_subsys_id);
 	css_get(css);
 	files->files_cgroup = container_of(css, struct files_cgroup, css);
 	task_unlock(tsk);
diff --git a/include/linux/cgroup_subsys.h b/include/linux/cgroup_subsys.h
index e6c9a40f29e3..defadc0cb593 100644
--- a/include/linux/cgroup_subsys.h
+++ b/include/linux/cgroup_subsys.h
@@ -51,7 +51,7 @@ SUBSYS(net_prio)
 SUBSYS(hugetlb)
 #endif
 
-#if IS_ENABLED(CONFIG_CGROUP_FILES)
+#if IS_SUBSYS_ENABLED(CONFIG_CGROUP_FILES)
 SUBSYS(files)
 #endif
 
-- 
1.8.1.2