写入某个sysfs节点,导致系统始终写入该节点



我在本地编写了一个模块来测试功能/特性,并且我创建了以下节点信息:

/sys/class/dbc/dbc # ls -l
total 0
-rw------- 1 root root 4096 2021-10-08 21:52 dbc_backlight
-rw------- 1 root root 4096 2021-10-08 22:30 dbc_pwm_max
-rw------- 1 root root 4096 2021-10-08 22:30 dbc_pwm_min
-rw------- 1 root root 4096 2021-10-08 21:52 dbc_setting
-rw------- 1 root root 4096 2021-10-08 21:52 dbc_thread_enable
-r--r--r-- 1 root root 4096 2021-10-08 22:30 dev
drwxr-xr-x 2 root root    0 2021-10-08 22:30 power
lrwxrwxrwx 1 root root    0 2021-10-08 22:30 subsystem -> ../../../../class/dbc
-rw-r--r-- 1 root root 4096 2021-10-08 22:30 uevent

当我把正确的值回显到dbc_backlight节点时,可以正常工作,但是当我把错误值写到dbc_backlight节点时,结果总是写,信息如下:节点源代码如下:

static ssize_t dbc_backlight_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
unsigned int DBC_BACKLIGHT = 0;
int readCount = 0;

printk("===========Set DBC Backlight========n");
readCount = sscanf(buf, "%d", &DBC_BACKLIGHT);
if (readCount != 1)
{
printk("[ERROR] cannot read DBC_BACKLIGHT from [%s] n", buf);
return 0;
}
if (DBC_BACKLIGHT > 100)
{
printk("Invalid Parameter DBC_BACKLIGHT=%d n", DBC_BACKLIGHT);
return 0;
}

printk("Set Parameter DBC_BACKLIGHT=%d successn", DBC_BACKLIGHT);
m_u8BacklightSetting = DBC_BACKLIGHT;

SetActiveBacklightSwitch(m_eActiveBackLight, m_u8BacklightSetting);

return count;
}

dmesg log info is:

[ 2562.416693] ===========Set DBC Backlight========
[ 2562.416739] Invalid Parameter DBC_BACKLIGHT=101 
[ 2562.416786] ===========Set DBC Backlight========
[ 2562.416832] Invalid Parameter DBC_BACKLIGHT=101 
[ 2562.416878] ===========Set DBC Backlight========
[ 2562.416960] Invalid Parameter DBC_BACKLIGHT=101 
[ 2562.417006] ===========Set DBC Backlight========
[ 2562.417089] Invalid Parameter DBC_BACKLIGHT=101 
[ 2562.417135] ===========Set DBC Backlight========
[ 2562.417181] Invalid Parameter DBC_BACKLIGHT=101 
[ 2562.417265] ===========Set DBC Backlight========
[ 2562.417309] Invalid Parameter DBC_BACKLIGHT=101 
[ 2562.417391] ===========Set DBC Backlight========
[ 2562.417436] Invalid Parameter DBC_BACKLIGHT=101 
[ 2562.417481] ===========Set DBC Backlight========
[ 2562.417564] Invalid Parameter DBC_BACKLIGHT=101 

日志将一直运行并且不能停止,否则,kill -9 pid可以杀死(kill pid不能杀死它),top info如下:

Tasks: 410 total,   2 running, 349 sleeping,   0 stopped,   0 zombie                                                                    
Mem:   1694992k total,  1583088k used,   111904k free,    12844k buffers                                                                
Swap:   409596k total,    13056k used,   396540k free,   732388k cached                                                                 
400%cpu   6%user 102%nice 135%sys 157%idle   0%iow   0%irq   0%sirq   0%host                                                            
PID USER         PR  NI VIRT  RES  SHR S[%CPU] %MEM     TIME+ ARGS                                                                    
2272 logd         30  10  34M 9.4M 4.1M S  152   0.5   2:29.57 logd
10181 root         20   0 4.4M 2.3M 1.9M R 98.6   0.1   1:33.14 sh -

kill -9 10181可以停止线程运行。

我不知道为什么总是写节点(dbc_backlight),请帮助我。

在本地,我遵循修改,问题不会重现:

printk("===========Set DBC Backlight========n");
readCount = sscanf(buf, "%d", &DBC_BACKLIGHT);
if (readCount != 1)
{
printk("[ERROR] cannot read DBC_BACKLIGHT from [%s] n", buf);
return 0;
}
if (DBC_BACKLIGHT > 100)
{
printk("Invalid Parameter DBC_BACKLIGHT=%d n", DBC_BACKLIGHT);
return 0;
}
//modify follow will fix it the problem
printk("===========Set DBC Backlight========n");
readCount = sscanf(buf, "%d", &DBC_BACKLIGHT);
if (readCount != 1)
{
printk("[ERROR] cannot read DBC_BACKLIGHT from [%s] n", buf);
return -EINVAL; //........
}
if (DBC_BACKLIGHT > 100)
{
printk("Invalid Parameter DBC_BACKLIGHT=%d n", DBC_BACKLIGHT);
return -EINVAL;........
}

你知道为什么吗?谢谢你的帮助。

成功时,.store函数应返回字符数写。

如果失败,它应该返回负错误码.

从函数返回0 (return 0;)是不正确的.

正如您正确注意到的,您可以使用return -EINVAL;来指示输入无效。

最新更新