vfs_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内核。

vfs_stat()被定义为 :

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

__user被定义为 :

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

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

其实,错误信息14(坏地址)把这个问题告诉你的脸:)

使用下面的代码:

 #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); ...