2016-11-23 12 views
2

Я работаю с sysfs, и мне нужно создать файл под sysfs, файл должен быть доступен для чтения и записи всем пользователям, для которых я установил разрешения в '__ATTR' на 0666. Но модуль не компилируется, как только я изменяю разрешения на 0660, он компилируется правильно.Не удается установить права доступа к атрибутам 0666 в sysfs

Сообщение об ошибке, что я получаю с 0666 разрешений выглядит следующим образом

`/home/rishabh/kernel_modules/Task09/task9.c: At top level: 
include/linux/bug.h:33:45: error: negative width in bit-field ‘<anonymous>’ 
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); })) 
              ^
include/linux/kernel.h:859:3: note: in expansion of macro ‘BUILD_BUG_ON_ZERO’ 
    BUILD_BUG_ON_ZERO((perms) & 2) +  \ 
^
include/linux/sysfs.h:102:12: note: in expansion of macro ‘VERIFY_OCTAL_PERMISSIONS’ 
    .mode = VERIFY_OCTAL_PERMISSIONS(_mode) }, \ 
      ^
/home/rishabh/kernel_modules/Task09/task9.c:65:2: note: in expansion of macro ‘__ATTR’ 
    __ATTR(id, 0666, id_show, id_store); 
^
include/linux/bug.h:33:45: warning: initialization from incompatible pointer type [enabled by default] 
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); })) 
              ^
include/linux/kernel.h:859:3: note: in expansion of macro ‘BUILD_BUG_ON_ZERO’ 
    BUILD_BUG_ON_ZERO((perms) & 2) +  \ 
^
include/linux/sysfs.h:102:12: note: in expansion of macro ‘VERIFY_OCTAL_PERMISSIONS’ 
    .mode = VERIFY_OCTAL_PERMISSIONS(_mode) }, \ 
      ^
/home/rishabh/kernel_modules/Task09/task9.c:65:2: note: in expansion of macro ‘__ATTR’ 
    __ATTR(id, 0666, id_show, id_store); 
^
include/linux/bug.h:33:45: warning: (near initialization for ‘id_attribute.show’) [enabled by default] 
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); })) 
              ^
include/linux/kernel.h:859:3: note: in expansion of macro ‘BUILD_BUG_ON_ZERO’ 
    BUILD_BUG_ON_ZERO((perms) & 2) +  \ 
^
include/linux/sysfs.h:102:12: note: in expansion of macro ‘VERIFY_OCTAL_PERMISSIONS’ 
    .mode = VERIFY_OCTAL_PERMISSIONS(_mode) }, \ 
      ^
/home/rishabh/kernel_modules/Task09/task9.c:65:2: note: in expansion of macro ‘__ATTR’ 
    __ATTR(id, 0666, id_show, id_store); 
^
` 

Я также попытался с помощью __ATTR_RW(_name) макросов, но это дает разрешения на чтение-запись только корень, а все остальные остались с разрешением на чтение.

+0

Нам нужно больше контекста. Кто-то поставил чек, чтобы во время компиляции было обнаружено недопустимое значение, аналогично тому, как 'assert' используется для отображения ошибок во время выполнения. Высказывание чего-то, остановленного в 'assert', говорит нам, что кто-то подумал о том, чтобы поставить чек, но не говорит нам, что такое чек. –

+0

Это касается задачи вызова eudyptula 09. Я редактирую свой вопрос, добавляя фрагмент вывода make – RishabhHardas

ответ

2

Если следовать сообщения об ошибках, то второй из них является

kernel.h:859:3: note: in expansion of macro ‘BUILD_BUG_ON_ZERO’ 
BUILD_BUG_ON_ZERO((perms) & 2) 

и если вы посмотрите в kernel.h вы увидите комментарий

#define VERIFY_OCTAL_PERMISSIONS(perms)      
    ... 
    /* OTHER_WRITABLE? Generally considered a bad idea. */ \ 
    BUILD_BUG_ON_ZERO((perms) & 2) + \ 
... 

Таким образом, вы можете видеть, что вам говорят, что это плохая идея сделать файл sysfs доступным для записи. Если вы действительно хотите это сделать, вы должны обойти эту проверку макросов. Например, можно добавить непосредственно перед вызовом __ATTR() переопределение макроса:

/* warning! need write-all permission so overriding check */ 
#undef VERIFY_OCTAL_PERMISSIONS 
#define VERIFY_OCTAL_PERMISSIONS(perms) (perms) 
+0

. Это скомпилировано, но у файла нет разрешений на чтение и запись для всех. Есть ли другое ограничение, которое накладывает ядро? – RishabhHardas

+0

Возможно, код ядра, создающий файл, также динамически ограничивает маску. Это должно быть частью проблемы, чтобы узнать, где этот код и как его обойти. – meuh

+0

Хорошо. Я постараюсь понять, что происходит точно. – RishabhHardas

1

__ATTR_RW(id) должен быть правильный путь (и eudyptula принято считать, что;)). Определение в sysfs.h говорит, что он устанавливает права на 0644, которые являются правильными правами, которые вы хотите - не один, кроме суперпользователя, не может написать /sys/kernel файлы (и это указано в задаче тоже).

sysfs.h часть:

#define __ATTR_RW(_name) __ATTR(_name, (S_IWUSR | S_IRUGO),    \ 
         _name##_show, _name##_store) 
+0

Да, я сделал это, но в заявлении говорилось, что он должен быть доступен для чтения и записи всем. Следовательно, я пытался это сделать. Затем файл id и foo должен быть установлен через __ATTR_RW()? – RishabhHardas

+0

Заявление должно быть для предыдущей задачи в debugfs, если я правильно помню. Задача для sysfs отредактировать это: «- исправить разрешения файлов, чтобы не допускать общедоступных значений, но только для того, чтобы их можно было записать с помощью root». И да, файл 'foo' должен иметь одинаковые права. – stderr

+0

Отлично! Спасибо! – RishabhHardas