From 108094ba6375c83ae671ed02bc821d51aaeab068 Mon Sep 17 00:00:00 2001 From: Adam Jiang Date: Thu, 16 Feb 2012 19:02:56 +0900 Subject: 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 Reviewed-on: http://git-master/r/84284 Reviewed-by: Laxman Dewangan --- drivers/media/video/tegra/tegra_dtv.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'drivers') 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; } -- cgit v1.2.3