fs: add ksys_chdir() helper; remove in-kernel calls to sys_chdir()
authorDominik Brodowski <linux@dominikbrodowski.net>
Sun, 11 Mar 2018 10:34:46 +0000 (11:34 +0100)
committerDominik Brodowski <linux@dominikbrodowski.net>
Mon, 2 Apr 2018 18:15:51 +0000 (20:15 +0200)
Using this helper allows us to avoid the in-kernel calls to the sys_chdir()
syscall. The ksys_ prefix denotes that this function is meant as a drop-in
replacement for the syscall. In particular, it uses the same calling
convention as sys_chdir().

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.GA17492@light.dominikbrodowski.net

Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
drivers/base/devtmpfs.c
fs/open.c
include/linux/syscalls.h
init/do_mounts.c
init/do_mounts_initrd.c

index 5743f04014ca8e42b56cd63230b9150949a02ce7..3f7ee954fd2cda533de4f8d0a2f8becdda464a0b 100644 (file)
@@ -386,7 +386,7 @@ static int devtmpfsd(void *p)
        *err = ksys_mount("devtmpfs", "/", "devtmpfs", MS_SILENT, options);
        if (*err)
                goto out;
-       sys_chdir("/.."); /* will traverse into overmounted root */
+       ksys_chdir("/.."); /* will traverse into overmounted root */
        ksys_chroot(".");
        complete(&setup_done);
        while (1) {
index 7a475e8a2e41a9c1fba737667b383e4cf00de4be..a19b8277c4391aad8d80654330f6dd8ecd7c0902 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -431,7 +431,7 @@ SYSCALL_DEFINE2(access, const char __user *, filename, int, mode)
        return sys_faccessat(AT_FDCWD, filename, mode);
 }
 
-SYSCALL_DEFINE1(chdir, const char __user *, filename)
+int ksys_chdir(const char __user *filename)
 {
        struct path path;
        int error;
@@ -457,6 +457,11 @@ out:
        return error;
 }
 
+SYSCALL_DEFINE1(chdir, const char __user *, filename)
+{
+       return ksys_chdir(filename);
+}
+
 SYSCALL_DEFINE1(fchdir, unsigned int, fd)
 {
        struct fd f = fdget_raw(fd);
index 80524faa966443e7716ed8d1ce64100ceb96b3c2..090645b4844745360cfe689d2292e39684d0e334 100644 (file)
@@ -952,5 +952,6 @@ int ksys_umount(char __user *name, int flags);
 int ksys_dup(unsigned int fildes);
 int ksys_chroot(const char __user *filename);
 ssize_t ksys_write(unsigned int fd, const char __user *buf, size_t count);
+int ksys_chdir(const char __user *filename);
 
 #endif
index 2f06f7827b0c1e6b11f201f5ad0849b85af41181..89f18985fa908478ed96e8869bb1cbadbed315f5 100644 (file)
@@ -367,7 +367,7 @@ static int __init do_mount_root(char *name, char *fs, int flags, void *data)
        if (err)
                return err;
 
-       sys_chdir("/root");
+       ksys_chdir("/root");
        s = current->fs->pwd.dentry->d_sb;
        ROOT_DEV = s->s_dev;
        printk(KERN_INFO
index 71293265ac4b66e4c4ce1b5ea90eb43dddb3feb0..83f396d30b9a3fb8044208e0111ecc226c8d9006 100644 (file)
@@ -42,7 +42,7 @@ static int init_linuxrc(struct subprocess_info *info, struct cred *new)
        ksys_dup(0);
        ksys_dup(0);
        /* move initrd over / and chdir/chroot in initrd root */
-       sys_chdir("/root");
+       ksys_chdir("/root");
        ksys_mount(".", "/", NULL, MS_MOVE, NULL);
        ksys_chroot(".");
        sys_setsid();
@@ -61,7 +61,7 @@ static void __init handle_initrd(void)
        /* mount initrd on rootfs' /root */
        mount_block_root("/dev/root.old", root_mountflags & ~MS_RDONLY);
        sys_mkdir("/old", 0700);
-       sys_chdir("/old");
+       ksys_chdir("/old");
 
        /* try loading default modules from initrd */
        load_default_modules();
@@ -86,11 +86,11 @@ static void __init handle_initrd(void)
        ksys_chroot("..");
 
        if (new_decode_dev(real_root_dev) == Root_RAM0) {
-               sys_chdir("/old");
+               ksys_chdir("/old");
                return;
        }
 
-       sys_chdir("/");
+       ksys_chdir("/");
        ROOT_DEV = new_decode_dev(real_root_dev);
        mount_root();