整数 "timer_interval" (グローバル変数) を保持する sysfs ファイルのストア関数を作成しようとしています。
static ssize_t sys_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count)
{
printk(KERN_ALERT "BUF IS %s and count is %d", buf, count);
int ret;
char *pTemp = kmalloc(100, GFP_KERNEL);
if (pTemp == NULL)
{
printk(KERN_ALERT "malloc WRONG");
return -EFAULT;
}
printk(KERN_ALERT "AFTER MALLOC");
if (ret = copy_from_user(pTemp ,buf, count))
{
printk(KERN_ALERT "COPY WRONG %d", ret);
kfree(pTemp);
printk(KERN_ALERT "%d" , pTemp);
return -EFAULT;
}
printk(KERN_ALERT "AFTER COPY");
if (sscanf(pTemp, "%d", &Timer_interval) < count);
{
printk(KERN_ALERT "SCANF WRONG");
kfree(pTemp);
return -EFAULT;
}
printk(KERN_ALERT "AFTER SCANF COUNT = %d", Timer_interval);
kfree(pTemp);
return count;
}
問題はユーザーへのコピーにあります。dmesg は、割り当てに問題がないことを示しています。buf には正しいデータが含まれていますが、copy_from_user はバッファのサイズを返します。つまり、何もコピーされていません。
ここで何が間違っていますか?