微记录-Linux字符设备的write函数如何避免文件系统重复调用?
背景
linux字符设备的fops实现read write的时候,尤其是write,因为会指定写入的总长度,那么如果如果驱动中单次write最大个数小于需求len的时候,文件系统就会多次调用到write。他是根据wirte函数的返回值来判断的。如果返回值不是目标len,就会不停地调用。这在撰写驱动中要特别注意。
举例
static const struct file_operations umad_fops = {
.owner = THIS_MODULE,
.read = ib_umad_read,
.write = ib_umad_write
//...
};
static ssize_t ib_umad_write(struct file *filp, const char __user *buf, size_t count, loff_t *pos)
{
if (copy_from_user(&packet->mad, buf, hdr_size(file))) {
ret = -EFAULT;
goto err;
}
//...
return count;
//return count或者return 错误都不会继续调用,其他场景需要单独处理。另外可以配合pos处理,该部分以后补充。
}