Linux Драйвер устройства, поток ядра не может открыть файл? - PullRequest
1 голос
/ 22 января 2020

Я пишу Linux Драйвер с Linux Модулями ядра, когда пользователь может писать, и когда пользователь звонит близко, драйвер должен передать sh содержимое в файл в другом каталоге с тем же именем файла устройства .

У меня есть проблема: когда процесс вызывает close, драйвер может открыть файл и flu sh все его содержимое корректно; когда процесс завершается (например, из терминала с kill), драйвер устройства не может выполнить filp_open, поскольку fs->CURRENT имеет значение NULL. Итак, я пытался запустить поток ядра, чтобы выполнить эту работу.

Когда я пытаюсь открыть файл в том же каталоге, например filp_open("myfile"...), он работает правильно. Но если мне нужно открыть файл в другом каталоге, то filp_open("dirA/myfile"), filp_open возвращает -2. Но этого не произойдет, когда я вызову filp_open из основного потока.

Это мой код:

static int thread_fn(void *unused){
  struct thread_data* td = (struct thread_data *) unused;
  if(td == NULL)
     printk(KERN_INFO "td is null\n");
  struct file* filp=filp_open("/dirA/myfile",O_RDWR,0666);
  if(filp == NULL || (IS_ERR(filp)))
    printk(KERN_INFO "filp is null!\n");
  else
    printk(KERN_INFO "filp is not null!\n");

  size_t filp_size = filp->f_inode->i_size;
  printk(KERN_INFO "size on release: %ld\n",filp_size);
  if(filp_size > td->size){
    printk(KERN_INFO "truncating file\n");
    truncate_setsize(filp->f_inode, td->size);
  }


  inode_lock(filp->f_inode); 
  //file_write(filp,/*file->f_pos*/0,td->data,td->size);
  inode_unlock(filp->f_inode);

  printk(KERN_INFO "Thread Stopping\n");
  do_exit(0);
  return 0;
}

Это моя device_release функция:

static int device_release(struct inode *inode, struct file *file)
{
   if(my_data->buffer == NULL)
      return -ENOMEM;

  struct thread_data* td=alloc_mem(sizeof(struct thread_data));
  td->filename=my_data->filename;
  td->data=my_data->buffer;
  td->size=my_data->size;

  thread_st = kthread_run(thread_fn, (void *)td,"Thread!");
  if (thread_st)
    printk(KERN_INFO "Thread Created successfully\n");
  else
    printk(KERN_ERR "Thread creation failed\n");

  return 0;
}

В чем проблема? Я не могу понять, это может быть проблема с ОС? Я также пробовал с set_fs / get_fs, но это не сработало.

1 Ответ

0 голосов
/ 22 января 2020

У меня есть обновление: если я поставлю флаг O_CREAT, filp_open не вернет ошибку, но файл не будет создан; Итак, поток ядра не может работать с файлом?

...