aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/drm_proc.c22
1 files changed, 7 insertions, 15 deletions
diff --git a/drivers/gpu/drm/drm_proc.c b/drivers/gpu/drm/drm_proc.c
index 0646a462d4c7..d7f2324b4fb1 100644
--- a/drivers/gpu/drm/drm_proc.c
+++ b/drivers/gpu/drm/drm_proc.c
@@ -95,7 +95,7 @@ static int drm_proc_create_files(const struct drm_info_list *files, int count,
95 struct drm_device *dev = minor->dev; 95 struct drm_device *dev = minor->dev;
96 struct proc_dir_entry *ent; 96 struct proc_dir_entry *ent;
97 struct drm_info_node *tmp; 97 struct drm_info_node *tmp;
98 int i, ret; 98 int i;
99 99
100 for (i = 0; i < count; i++) { 100 for (i = 0; i < count; i++) {
101 u32 features = files[i].driver_features; 101 u32 features = files[i].driver_features;
@@ -105,10 +105,9 @@ static int drm_proc_create_files(const struct drm_info_list *files, int count,
105 continue; 105 continue;
106 106
107 tmp = kmalloc(sizeof(struct drm_info_node), GFP_KERNEL); 107 tmp = kmalloc(sizeof(struct drm_info_node), GFP_KERNEL);
108 if (tmp == NULL) { 108 if (!tmp)
109 ret = -1; 109 return -1;
110 goto fail; 110
111 }
112 tmp->minor = minor; 111 tmp->minor = minor;
113 tmp->info_ent = &files[i]; 112 tmp->info_ent = &files[i];
114 list_add(&tmp->list, &minor->proc_nodes.list); 113 list_add(&tmp->list, &minor->proc_nodes.list);
@@ -120,16 +119,10 @@ static int drm_proc_create_files(const struct drm_info_list *files, int count,
120 minor->index, files[i].name); 119 minor->index, files[i].name);
121 list_del(&tmp->list); 120 list_del(&tmp->list);
122 kfree(tmp); 121 kfree(tmp);
123 ret = -1; 122 return -1;
124 goto fail;
125 } 123 }
126 } 124 }
127 return 0; 125 return 0;
128
129fail:
130 for (i = 0; i < count; i++)
131 remove_proc_entry(drm_proc_list[i].name, minor->proc_root);
132 return ret;
133} 126}
134 127
135/** 128/**
@@ -160,7 +153,7 @@ int drm_proc_init(struct drm_minor *minor, struct proc_dir_entry *root)
160 ret = drm_proc_create_files(drm_proc_list, DRM_PROC_ENTRIES, 153 ret = drm_proc_create_files(drm_proc_list, DRM_PROC_ENTRIES,
161 minor->proc_root, minor); 154 minor->proc_root, minor);
162 if (ret) { 155 if (ret) {
163 remove_proc_entry(name, root); 156 remove_proc_subtree(name, root);
164 minor->proc_root = NULL; 157 minor->proc_root = NULL;
165 DRM_ERROR("Failed to create core drm proc files\n"); 158 DRM_ERROR("Failed to create core drm proc files\n");
166 return ret; 159 return ret;
@@ -210,8 +203,7 @@ int drm_proc_cleanup(struct drm_minor *minor, struct proc_dir_entry *root)
210 drm_proc_remove_files(drm_proc_list, DRM_PROC_ENTRIES, minor); 203 drm_proc_remove_files(drm_proc_list, DRM_PROC_ENTRIES, minor);
211 204
212 sprintf(name, "%d", minor->index); 205 sprintf(name, "%d", minor->index);
213 remove_proc_entry(name, root); 206 remove_proc_subtree(name, root);
214
215 return 0; 207 return 0;
216} 208}
217 209