Skip to content

Commit

Permalink
initramfs: use vfs_stat/lstat directly
Browse files Browse the repository at this point in the history
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/[email protected]
Signed-off-by: Arnd Bergmann <[email protected]>
Cc: Alexander Viro <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
arndb authored and torvalds committed May 9, 2017
1 parent cff75e0 commit 046aa12
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 24 deletions.
22 changes: 4 additions & 18 deletions init/do_mounts.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
#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;
return stat.rdev;
}
#endif

#ifdef CONFIG_BLK_DEV_RAM

Expand Down
12 changes: 6 additions & 6 deletions init/initramfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 046aa12

Please sign in to comment.