initramfs: use vfs_stat/lstat directly
sys_newlstat is a system call implementation that is meant for user space, and that copies kernel-internal data structure to the user format, which is not needed for in-kernel users. Further, as we rearrange the system call implementation so we can extend it with 64-bit time_t, the prototype for sys_newlstat changes. This changes the initramfs code to use vfs_lstat directly, to get it out of the way of the time_t changes, and make it slightly more efficient in the process. Along the same lines we also replace sys_stat and sys_stat64 with vfs_stat. Link: http://lkml.kernel.org/r/20170314214932.4052842-1-arnd@arndb.de Signed-off-by: Arnd Bergmann <arnd@arndb.de> Cc: Alexander Viro <viro@zeniv.linux.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
cff75e0b6f
commit
046aa1265f
@ -19,29 +19,15 @@ static inline int create_dev(char *name, dev_t dev)
|
||||
return sys_mknod(name, S_IFBLK|0600, new_encode_dev(dev));
|
||||
}
|
||||
|
||||
#if BITS_PER_LONG == 32
|
||||
static inline u32 bstat(char *name)
|
||||
{
|
||||
struct stat64 stat;
|
||||
if (sys_stat64(name, &stat) != 0)
|
||||
struct kstat stat;
|
||||
if (vfs_stat(name, &stat) != 0)
|
||||
return 0;
|
||||
if (!S_ISBLK(stat.st_mode))
|
||||
if (!S_ISBLK(stat.mode))
|
||||
return 0;
|
||||
if (stat.st_rdev != (u32)stat.st_rdev)
|
||||
return 0;
|
||||
return stat.st_rdev;
|
||||
return stat.rdev;
|
||||
}
|
||||
#else
|
||||
static inline u32 bstat(char *name)
|
||||
{
|
||||
struct stat stat;
|
||||
if (sys_newstat(name, &stat) != 0)
|
||||
return 0;
|
||||
if (!S_ISBLK(stat.st_mode))
|
||||
return 0;
|
||||
return stat.st_rdev;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_RAM
|
||||
|
||||
|
@ -312,10 +312,10 @@ static int __init maybe_link(void)
|
||||
|
||||
static void __init clean_path(char *path, umode_t fmode)
|
||||
{
|
||||
struct stat st;
|
||||
struct kstat st;
|
||||
|
||||
if (!sys_newlstat(path, &st) && (st.st_mode ^ fmode) & S_IFMT) {
|
||||
if (S_ISDIR(st.st_mode))
|
||||
if (!vfs_lstat(path, &st) && (st.mode ^ fmode) & S_IFMT) {
|
||||
if (S_ISDIR(st.mode))
|
||||
sys_rmdir(path);
|
||||
else
|
||||
sys_unlink(path);
|
||||
@ -581,13 +581,13 @@ static void __init clean_rootfs(void)
|
||||
num = sys_getdents64(fd, dirp, BUF_SIZE);
|
||||
while (num > 0) {
|
||||
while (num > 0) {
|
||||
struct stat st;
|
||||
struct kstat st;
|
||||
int ret;
|
||||
|
||||
ret = sys_newlstat(dirp->d_name, &st);
|
||||
ret = vfs_lstat(dirp->d_name, &st);
|
||||
WARN_ON_ONCE(ret);
|
||||
if (!ret) {
|
||||
if (S_ISDIR(st.st_mode))
|
||||
if (S_ISDIR(st.mode))
|
||||
sys_rmdir(dirp->d_name);
|
||||
else
|
||||
sys_unlink(dirp->d_name);
|
||||
|
Loading…
Reference in New Issue
Block a user