我在Linux内核(Red Hat 8.0)上有这个代码,我从用户那里得到了buf并且应该加密它,并将它保存到我自己的缓冲区。
问题是,似乎来自用户的副本失败(返回计数),但是在未知的运行突然之后它就可以了。在它没关系之后,它会一直保持这种状态直到重启。
谁有人向我解释这种奇怪的情况?
功能的其余部分,做了别的事情,所以我没有在这里包含它。
aux_arr
是暂时的,我会将其数据复制到我拥有的全局数据中。
ssize_t my_write_e(struct file *filp, const char *buf, size_t count, loff_t *f_pos) {
int byte_count = 0;
char aux_arr[SIZE];
up(&(encrypt.sem));
if (encrypt.tail <= encrypt.head) {
if (count > SIZE - encrypt.counter) {
count = encrypt.head - encrypt.tail - 1; }
byte_count = copy_from_user((char*)aux_arr,(char*) buf, count);
printk("the encryptor counter is %d\n",encrypt.counter);
if (!(encrypt.counter)) {
encryptor(aux_arr, ((encrypt.arr) + encrypt.tail), count
- byte_count, ((data) (filp->private_data))->key, ENCRYPT);
encrypt.tail = encrypt.tail + (((count - byte_count) / 8) * 8) - 1;
} else {
encryptor(aux_arr, ((encrypt.arr) + encrypt.tail + 1), count
- byte_count, ((data) (filp->private_data))->key, ENCRYPT);
encrypt.tail = encrypt.tail + (((count - byte_count) / 8) * 8);
}
encrypt.counter = encrypt.counter + (((count - byte_count) / 8) * 8);
down(&(encrypt.sem));
if ((count - byte_count) / 8 > 0) {
wake_up_all(&(encrypt.r_queue));
}
encrypt.w_counter--;
return (((count - byte_count) / 8) * 8);
}