Может ли кто-нибудь помочь мне заменить «lock_kernel» в драйвере блочного устройства?

Спасибо, что посмотрели этот пост. Я пытаюсь исправить драйвер сетевого блочного устройства. Если вам нужно увидеть исходные коды, они находятся на http: / / code.ximeta.com.

Я заметил, что lock_kernel () кажется устаревшим в linux 2.6.37. Я прочитал «Новый способ ioctl ()» и обнаружил, что драйверы устройств теперь должны выполнять определенную блокировку перед работой.

Поэтому я хотел бы получить совет по замене этого, если возможно.

Я обнаружил два раздела в текущем коде, которые, как мне кажется, связаны между собой, в разделе папки блоков.

Source 
      block->io.c
           ->ctrldev.c

Я предлагаю вам на рассмотрение фрагменты каждого из них.

io.c содержит один вызов lock_kernel:

NDAS_SAL_API xbool     sal_file_get_size(sal_file file, xuint64* size)
{
    definitions and declarations etc..

lock_kernel();

#ifdef HAVE_UNLOCKED_IOCTL
    if (filp->f_op->unlocked_ioctl) {   
       some small statements

       error = filp->f_op->unlocked_ioctl(filp, BLKGETSIZE64, (unsigned long)size);

       actions if error or not etc.
   }
#endif

   unlock_kernel(); 
   return ret;
}

И ctrldev.c содержит основную функцию io:

#include <linux/spinlock.h> // spinklock_t
#include <linux/semaphore.h> // struct semaphore
#include <asm/atomic.h> // atomic
#include <linux/interrupt.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <linux/ide.h>
#include <linux/smp_lock.h>
#include <linux/time.h>

......

int ndas_ctrldev_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
  lots of operations and functions. 

  return result;
}

Позже функция ndas_ctrldev_ioctl устанавливается как прежняя .ioctl .

static struct file_operations ndasctrl_fops = {
    .write = ndas_ctrldev_write,
    .read = ndas_ctrldev_read,
    .open = ndas_ctrldev_open,
    .release = ndas_ctrldev_release,
    .ioctl = ndas_ctrldev_ioctl, 
};

Теперь я хочу преобразовать это, чтобы избежать использования lock_kernel ();

По моему мнению, я изменю предыдущие разделы, как показано ниже: продолжение?

  • Правильно ли я перемещаю заблокировать функцию io?

  • Основываясь на включении в crtrldev.c, можете ли вы рекомендую любой замок сверху твоя голова? (Я пытался исследовать некоторые другие драйверы, работающие с filp и lock_kernel, но я слишком noob, чтобы сразу найти ответ.)

  • 6
    задан ndasusers 10 May 2011 в 20:35
    поделиться