aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
diff options
context:
space:
mode:
authorDan Carpenter <dan.carpenter@oracle.com>2018-06-14 10:45:23 -0400
committerAlex Deucher <alexander.deucher@amd.com>2018-10-16 16:10:34 -0400
commitd344b21bf405eed05963627bfed6dd3df422623c (patch)
tree7f23cd9c6b0f5bfe51ff52a3616c85714f7e0f2f /drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
parentc55045adf7210d246a016c961916f078ed31a951 (diff)
drm/amd/amdgpu: Fix debugfs error handling
The error handling is wrong and "ent" could be NULL we when dereference it to get "ent->d_inode". The thing is that normally debugfs_create_file() is not supposed to require (or have) any error handling. That function does return error pointers if debugfs is turned off but we know it's enable here. When it's enabled, then it returns NULL on error. So what I did was I stripped out all the error handling except around the i_size_write(). I could have just used a NULL check instead of an IS_ERR_OR_NULL() but I figured this was more clear because that way you don't have to look at the surrounding code to see whether debugfs is enabled or not. Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c12
1 files changed, 2 insertions, 10 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
index f5fb93795a69..dd9a4fb9ce39 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
@@ -826,21 +826,13 @@ int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
826{ 826{
827 struct drm_minor *minor = adev->ddev->primary; 827 struct drm_minor *minor = adev->ddev->primary;
828 struct dentry *ent, *root = minor->debugfs_root; 828 struct dentry *ent, *root = minor->debugfs_root;
829 unsigned i, j; 829 unsigned int i;
830 830
831 for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) { 831 for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
832 ent = debugfs_create_file(debugfs_regs_names[i], 832 ent = debugfs_create_file(debugfs_regs_names[i],
833 S_IFREG | S_IRUGO, root, 833 S_IFREG | S_IRUGO, root,
834 adev, debugfs_regs[i]); 834 adev, debugfs_regs[i]);
835 if (IS_ERR(ent)) { 835 if (!i && !IS_ERR_OR_NULL(ent))
836 for (j = 0; j < i; j++) {
837 debugfs_remove(adev->debugfs_regs[i]);
838 adev->debugfs_regs[i] = NULL;
839 }
840 return PTR_ERR(ent);
841 }
842
843 if (!i)
844 i_size_write(ent->d_inode, adev->rmmio_size); 836 i_size_write(ent->d_inode, adev->rmmio_size);
845 adev->debugfs_regs[i] = ent; 837 adev->debugfs_regs[i] = ent;
846 } 838 }