通过miscdevice获得驱动私有数据结构体时file->private_data为空的解决方法

本文讨论了在Linux内核中通过file->private_data传递misc设备私有数据的方法,提出了一种更高效的实现方式,以解决驱动与misc设备内部数据断开链接的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PS:实际上标准的做法是在调用misc_open之前将file->private_data置为空,然后在调用misc_open的时候通过container_of函数得到驱动私有数据结构体的地址,然后让file->private_data指向私有数据结构体以供fops中的其他函数使用。尝试了一些办法,还是这个方法比较高效。
Author:     Samu Onkalo <samu.p.onkalo@nokia.com>
AuthorDate: Mon May 24 14:33:10 2010 -0700
Committer:  Linus Torvalds <torvalds@linux-foundation.org>
CommitDate: Tue May 25 08:07:03 2010 -0700

    drivers: misc: pass miscdevice pointer via file private data
    For misc devices, inode->i_cdev doesn't point to the device drivers own
    data.  Link between file operations and device driver internal data is
    lost.  Pass pointer to misc device struct via file private data for driver
    open function use.

    Signed-off-by: Samu Onkalo <samu.p.onkalo@nokia.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
---
 drivers/char/misc.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/drivers/char/misc.c b/drivers/char/misc.c
index 92ab03d..cd650ca 100644
--- a/drivers/char/misc.c
+++ b/drivers/char/misc.c
@@ -144,6 +144,7 @@ static int misc_open(struct inode * inode, struct file * file)
 	old_fops = file->f_op;
 	file->f_op = new_fops;
 	if (file->f_op->open) {
+		/* 重要:这里最好加一个name的判断,或者打印出申请者的name,用于DEBUG */
+		file->private_data = c; //增加这句,c指向misc_register时传进来的参数
 		err=file->f_op->open(inode,file);
 		if (err) {
 			fops_put(file->f_op);
--
 
原文地址:http://kerneltrap.org/mailarchive/git-commits-head/2010/5/25/39820
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值