如何在以后更改sysfs_create_file()的权限?

时间:2017-01-26 10:34:38

标签: linux-kernel kernel sysfs

我正在为Linux内核编写一个模块。

此模块将某些I / O作为文件/sys/kernel/mymodule/foo公开:

static struct kobj_attribute foo_attribute =__ATTR(foo, 0660, foo_show, foo_store);
...        
ret = sysfs_create_file(&mymodule->kobj, &foo_attribute.attr);

我希望能够在将一些数据写入/sys/kernel/mymodule/foo后立即将0660权限更改为0440。我将在foo_store()函数中执行此操作。

我调查了__ATTR宏 - 它产生了大量代码,主要是操纵权限。上面的代码扩展为:

static struct foo_attribute = { .attr = {.name = "foo", .mode = ((sizeof(struct { int:-!!((0660) < 0); })) + (sizeof(struct { int:-!!((0660) > 0777); })) + (sizeof(struct { int:-!!(((0660) >> 6) < (((0660) >> 3) & 7)); })) + (sizeof(struct { int:-!!((((0660) >> 3) & 7) < ((0660) & 7)); })) + (sizeof(struct { int:-!!((0660) & 2); })) + (0660)) }, .show = foo_show, .store = foo_store, };
...
ret = sysfs_create_file(&vr2200pmu->kobj, &revision_attribute.attr);

在模块目录中使用gcc -E mymodule.c -I../../include -I../../arch/arm/include -I../../arch/arm/include/generated

如何以干净的便携式方式实现这一目标?

1 个答案:

答案 0 :(得分:1)

不确定,是否打算以编程方式修改sysfs文件权限,但这应该有效:

// Obtain kernfs object for directory
struct kernfs_node* dir_knode = kobj->sd;
// Obtain kernfs object for file in the directory
struct kernfs_node* file_knode = sysfs_get_dirent(dir_knode, foo_attr.attr.name);
// Change permissions. Set only permissions-related bits.
file_knode->mode = (file_knode->mode & S_IFMT) | 0440;