drm: proc: Use remove_proc_subtree()
authorDavid Howells <dhowells@redhat.com>
Fri, 12 Apr 2013 15:15:07 +0000 (16:15 +0100)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 1 May 2013 21:29:44 +0000 (17:29 -0400)
Use remove_proc_subtree() rather than remove_proc_entry() to remove a
minor-specific drm proc directory and all its children.

Things could theoretically be improved by storing the drm_minor pointer in the
minor-specific dir proc_dir_entry struct data and then scrapping the list of
proc files - but that's shared with the debugfs interface where you can't do
that, so I don't see an easy way of doing it.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: dri-devel@lists.freedesktop.org
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
drivers/gpu/drm/drm_proc.c

index 0646a46..d7f2324 100644 (file)
@@ -95,7 +95,7 @@ static int drm_proc_create_files(const struct drm_info_list *files, int count,
        struct drm_device *dev = minor->dev;
        struct proc_dir_entry *ent;
        struct drm_info_node *tmp;
-       int i, ret;
+       int i;
 
        for (i = 0; i < count; i++) {
                u32 features = files[i].driver_features;
@@ -105,10 +105,9 @@ static int drm_proc_create_files(const struct drm_info_list *files, int count,
                        continue;
 
                tmp = kmalloc(sizeof(struct drm_info_node), GFP_KERNEL);
-               if (tmp == NULL) {
-                       ret = -1;
-                       goto fail;
-               }
+               if (!tmp)
+                       return -1;
+
                tmp->minor = minor;
                tmp->info_ent = &files[i];
                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,
                                  minor->index, files[i].name);
                        list_del(&tmp->list);
                        kfree(tmp);
-                       ret = -1;
-                       goto fail;
+                       return -1;
                }
        }
        return 0;
-
-fail:
-       for (i = 0; i < count; i++)
-               remove_proc_entry(drm_proc_list[i].name, minor->proc_root);
-       return ret;
 }
 
 /**
@@ -160,7 +153,7 @@ int drm_proc_init(struct drm_minor *minor, struct proc_dir_entry *root)
        ret = drm_proc_create_files(drm_proc_list, DRM_PROC_ENTRIES,
                                    minor->proc_root, minor);
        if (ret) {
-               remove_proc_entry(name, root);
+               remove_proc_subtree(name, root);
                minor->proc_root = NULL;
                DRM_ERROR("Failed to create core drm proc files\n");
                return ret;
@@ -210,8 +203,7 @@ int drm_proc_cleanup(struct drm_minor *minor, struct proc_dir_entry *root)
        drm_proc_remove_files(drm_proc_list, DRM_PROC_ENTRIES, minor);
 
        sprintf(name, "%d", minor->index);
-       remove_proc_entry(name, root);
-
+       remove_proc_subtree(name, root);
        return 0;
 }