Почему device_create не возвращает ошибку, если файл уже существует?
Я пишу драйвер PCI с символьным устройством для интерфейса (Linux 4.9.13). Вот сценарий, который беспокоит меня:
- Бежать
touch /dev/foo0
который создает нормальный файл в/dev
каталог. Загрузите модуль драйвера. Вот псевдокод, представляющий, что там происходит (довольно стандартная регистрация символов):
// When the module is initialized: alloc_chrdev_region(&dev, 0, 256, "foo"); class = class_create(THIS_MODULE, "foo"); // Later, when a suitable PCI device is connected the probe function // calls the following functions: cdev_init(dev->md_cdev, &fops); dev->md_devnum = MKDEV(major, 0 + index); res = cdev_add(dev->md_cdev, dev->md_devnum, 1); dev->md_sysfsdev = device_create(class, 0, dev->md_devnum, 0, "foo%d", index);
Подробности:
index
это просто еще один бесплатный индекс
Что мне кажется странным, так это то, что ничто не вызывает ошибку, что уже есть /dev/foo0
файл, который не является символьным устройством. Я проверяю все ошибки (я так думаю), но для краткости я опустил связанный код. Все работает как положено, если я не запускаю touch /dev/foo0
, В противном случае я не могу ни читать, ни писать на устройство.
Почему это так? не должны device_create
вернуть ошибку или хотя бы создать /dev/foo1
вместо?