diff options
author | Adam Jiang <chaoj@nvidia.com> | 2012-02-16 19:02:56 +0900 |
---|---|---|
committer | Rohan Somvanshi <rsomvanshi@nvidia.com> | 2012-02-17 08:00:47 -0800 |
commit | 108094ba6375c83ae671ed02bc821d51aaeab068 (patch) | |
tree | 1cadb66e34582b4f0122915194711e71b1af803e /drivers/media | |
parent | f3636b910624bcc823a03fe03c40e71d1a5be0bb (diff) |
dtv: Fixed file-private_data assigned error
NULL pointer caused kernel crash when tegra_dtv driver was opened. This
patch fixed the bug.
fixed Bug 940932
Change-Id: I09f8caff789ea8e1222f4afd9bf73ef890472583
Signed-off-by: Adam Jiang <chaoj@nvidia.com>
Reviewed-on: http://git-master/r/84284
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/video/tegra/tegra_dtv.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/drivers/media/video/tegra/tegra_dtv.c b/drivers/media/video/tegra/tegra_dtv.c index 9d5100c1af62..e1e2596007f6 100644 --- a/drivers/media/video/tegra/tegra_dtv.c +++ b/drivers/media/video/tegra/tegra_dtv.c @@ -154,6 +154,7 @@ struct tegra_dtv_context { struct dentry *d; /* for refer back */ struct platform_device *pdev; + struct miscdevice miscdev; }; static inline struct tegra_dtv_context *to_ctx(struct dtv_stream *s) @@ -618,7 +619,10 @@ static ssize_t tegra_dtv_read(struct file *file, char __user *buf, static int tegra_dtv_open(struct inode *inode, struct file *file) { int i; - struct tegra_dtv_context *dtv_ctx; + struct miscdevice *miscdev = file->private_data; + struct tegra_dtv_context *dtv_ctx = + container_of(miscdev, struct tegra_dtv_context, miscdev); + file->private_data = dtv_ctx; dtv_ctx = (struct tegra_dtv_context *) file->private_data; @@ -680,12 +684,6 @@ static const struct file_operations tegra_dtv_fops = { .release = tegra_dtv_release, }; -static struct miscdevice tegra_dtv_misc_device = { - .minor = MISC_DYNAMIC_MINOR, - .name = TEGRA_DTV_NAME, - .fops = &tegra_dtv_fops, -}; - #ifdef CONFIG_DEBUG_FS static int dtv_reg_show(struct seq_file *s, void *unused) { @@ -965,7 +963,10 @@ static int tegra_dtv_probe(struct platform_device *pdev) goto fail_setup_dma; /* register as a misc device */ - ret = misc_register(&tegra_dtv_misc_device); + dtv_ctx->miscdev.minor = MISC_DYNAMIC_MINOR; + dtv_ctx->miscdev.name = TEGRA_DTV_NAME; + dtv_ctx->miscdev.fops = &tegra_dtv_fops; + ret = misc_register(&dtv_ctx->miscdev); if (ret) { pr_err("%s: Unable to register misc device.\n", __func__); @@ -985,7 +986,7 @@ static int tegra_dtv_probe(struct platform_device *pdev) fail_debugfs_reg: dtv_debugfs_exit(dtv_ctx); fail_misc_reg: - misc_deregister(&tegra_dtv_misc_device); + misc_deregister(&dtv_ctx->miscdev); fail_setup_stream: fail_setup_dma: tear_down_dma(dtv_ctx); @@ -1004,14 +1005,14 @@ static int __devexit tegra_dtv_remove(struct platform_device *pdev) pr_info("%s: remove dtv.\n", __func__); - misc_deregister(&tegra_dtv_misc_device); - dtv_ctx = platform_get_drvdata(pdev); dtv_debugfs_exit(dtv_ctx); tear_down_dma(dtv_ctx); release_stream_buffer(&dtv_ctx->stream, dtv_ctx->stream.num_bufs); + misc_deregister(&dtv_ctx->miscdev); + return 0; } |