copy_from_user失败,但在一段时间后成功

时间:2015-01-16 18:16:26

标签: c linux-kernel linux-device-driver redhat kernel-module

我在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);
    }

0 个答案:

没有答案