vfs_stat()调用有什么问题?

时间:2013-10-05 08:17:28

标签: c linux linux-kernel kernel stat

我正在尝试对文件进行统计,

    struct kstat stat;
    int error = vfs_stat ("/bin/ls", &stat); // /bin/ls exists

    if (error)
    {
            printk (KERN_INFO "error code %d\n", error);
    }
    else
    {
            printk (KERN_INFO "mode of ls: %o\n", stat.mode);
            printk (KERN_INFO "owner of ls: %o\n", stat.uid);
    }

    return error;

但是错误始终设置为14(错误地址),代码有什么问题?

我正在运行3.9内核。

2 个答案:

答案 0 :(得分:4)

vfs_stat()defined as

int vfs_stat(const char __user *name, struct kstat *stat);

__userdefined as

# define __user __attribute__((noderef, address_space(1)))

换句话说,vfs_stat()仅支持使用指向用户空间的文件名,不应在内核空间内取消引用。请注意,"/bin/ls"不指向用户空间,而是指向内核空间,因此不能在此处使用。

实际上,错误消息14(错误的地址)会直接告诉您这个问题:)

答案 1 :(得分:1)

使用以下代码:

#include <linux/uaccess.h>

int error;
mm_segment_t old_fs = get_fs();

set_fs(KERNEL_DS);
error = vfs_stat ("/bin/ls", &stat);
set_fs(old_fs);

...