I’m hoping someone can fact check my assumptions on the question “Can lstat and/or stat be called form the Linux kernel 3.10.0 in Centos 7. I’ve been searching and reading as much as I can find and have only been able to confuse myself. I can’t tell if the examples I am finding are available to kernel space or user space only.
The basic question is, can I call lstat or stat from the kernel?
Specifically I am adding this to the exec.c under the fs directory.
The goal is to differentiate between files that are either symbolic links or hard links and is a learning experience only.
If this is true, would I be calling lstat/stat or the “64” version – I’m on an X86 architecture if that matters.
Added 11-18-2015 Per the comment below
// These two lines are in the original exec.c file struct file *file; file = do_filp_open(AT_FDCWD, &tmp, &open_exec_flags, LOOKUP_FOLLOW); // In the open_exec function I added the following struct stat buf; int lstat(struct file, struct stat buf); mm_segment_t security_old_fs; security_old_fs = get_fs(); set_fs(KERNEL_DS); if (lstat(*file, buf) == -) printk(KERN_INFO "stat errorn"); goto exit; } set_fs(security_old_fs);
Then run “make” and see
LINK vmlinux LD vmlinux.o MODPOST vmlinux.o GEN .version CHK include/generated/compile.h UPD include/generated/compile.h CC init/version.o D init/built-in.o fs/built-in.o: In function`open_exec': /home/user/rpmbuild/SOURCES/linux-3.10.0-123.20.1.el7/fs/exec.c:946: undefined reference to `lstat' make: *** [vmlinux] Error 1
Any pointers would be helpful.
Advertisement
Answer
There is no stat
/lstat
functions in the Linux kernel.
There are sys_stat
/sys_lstat
functions, which implements corresponded system calls, but calling these functions inside kernel is not recommended: these functions may use special conventions for passing arguments, which differ from the common conventions in the kernel.
Actually, there is vfs_stat function, which is called by sys_stat, and does the most work. Note, that this function expects name of the file be located in the user space. For use this function for kernel-allocated filename, set_fs
approach can be used:
int my_stat(const char* name, struct kstat* stat) { int res; mm_segment_t security_old_fs; security_old_fs = get_fs(); set_fs(KERNEL_DS); res = vfs_stat((const char __user *)name, stat); set_fs(security_old_fs); return res; }
Attributes of the file are stored in the variable of kernel’s type struct kstat
, which is defined in include/linux/stat.h
.
Similarly, vfs_lstat
does the most work of sys_lstat
.
Note, that both vfs_stat
and vfs_lstat
use 0/-E
conventions for return value: 0 is returned on success, negative error code is returned on fail.