Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp16624596ybl; Wed, 1 Jan 2020 09:31:18 -0800 (PST) X-Google-Smtp-Source: APXvYqxQR86MMvFJ5IcbOvSW2SGK6YFyFVmBMjhcWaxTY+KanaPrh19kCllE5zwF1emeBGoG8ps8 X-Received: by 2002:a9d:4f18:: with SMTP id d24mr84060462otl.179.1577899878179; Wed, 01 Jan 2020 09:31:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577899878; cv=none; d=google.com; s=arc-20160816; b=nIRNB+TNkVp7tatUgcaSQgW3epUPoeR0j8Y1m2uGUnT3QujPsSMnaNmNJs+MDNhaGy B9EyNa1ChTfICF4Cwcn9gprn6f4sXgdq3/w8eMJQlASnHiuAGT21m7Du75k9c+O4ZF0c EYH4J9xQFZLbi/kcs8gEIqe9JH5iC6qCGzHXfpGJJzkQB9PXw+gbqIG7c18Lbc6UCPTl FFO5N5Jo7qn/zuO7cpqN8EzmS88tmi6jAMsilfgoOvcB9peEU7bkSyYfVVcvO3oDTqsg jtsDywMBFnjOEGc26NaC5Ha/1c2WRIpfEAEp3/LXuCgEfgSL065ieR6uU7o3Ev43oJXA OXXA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date; bh=1rzuAyg0jnGQN+LVD01GfGFEYuFqH8esT80NqKNnQWc=; b=Pq0fW3u5wqK3wh3ofJoWyMkdudshQVThYrypGIrkJJYDOACIyzy5Kgjo/KKFV5P9P8 z378YUo9OVmwKVn4aqmeatT3Ha8DnWtyDjayuziBN0pAUP9yO1Sc8nhlXO3JrkCaG2rV 8yM+sVDlXh5ZEyyBU3XdDuKgMgGJ3dOIHrLOCEFGUEk/ehFDpWd4s0IXSidSpcsS+UcS b+r2UjsUA0juwKjCBENjRngKzwotQ47LJW77cO/r1cRDcbqNiATze9B1oIm2+s5H/jBo 9ZVpy1dsldiDFap95pLbweVCD+4I+et4VX6wdFQXh5LrNLuZkPJuY9BBgrDsHyVXW75p 9NkQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v25si24020102ote.261.2020.01.01.09.31.05; Wed, 01 Jan 2020 09:31:18 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727280AbgAARa0 (ORCPT + 99 others); Wed, 1 Jan 2020 12:30:26 -0500 Received: from isilmar-4.linta.de ([136.243.71.142]:55976 "EHLO isilmar-4.linta.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727170AbgAARaZ (ORCPT ); Wed, 1 Jan 2020 12:30:25 -0500 X-isilmar-external: YES X-isilmar-external: YES X-isilmar-external: YES X-isilmar-external: YES X-isilmar-external: YES Received: from light.dominikbrodowski.net (brodo.linta [10.1.0.102]) by isilmar-4.linta.de (Postfix) with ESMTPSA id CCB46200A62; Wed, 1 Jan 2020 17:30:22 +0000 (UTC) Received: by light.dominikbrodowski.net (Postfix, from userid 1000) id CB22920342; Wed, 1 Jan 2020 18:24:38 +0100 (CET) Date: Wed, 1 Jan 2020 18:24:38 +0100 From: Dominik Brodowski To: youling 257 Cc: Arvind Sankar , torvalds@linux-foundation.org, linux-kernel@vger.kernel.org, viro@zeniv.linux.org.uk Subject: Re: [PATCH] early init: open /dev/console with O_LARGEFILE Message-ID: <20200101172438.GA38218@light.dominikbrodowski.net> References: <20191231150226.GA523748@light.dominikbrodowski.net> <20200101003017.GA116793@rani.riverdale.lan> <20200101104313.GA666771@light.dominikbrodowski.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jan 01, 2020 at 09:27:27PM +0800, youling 257 wrote: > Unfortunately, test this patch still no help, has system/bin/sh warning. Thanks for testing! Could you test one more try, please (on top of current mainline)? It's mainly a revert, and then an attempt to get ksys_open() right. Thanks, Dominik NOTE: test patch only. Do not commit. diff --git a/fs/file.c b/fs/file.c index 2f4fcf985079..3da91a112bab 100644 --- a/fs/file.c +++ b/fs/file.c @@ -960,7 +960,7 @@ SYSCALL_DEFINE2(dup2, unsigned int, oldfd, unsigned int, newfd) return ksys_dup3(oldfd, newfd, 0); } -SYSCALL_DEFINE1(dup, unsigned int, fildes) +int ksys_dup(unsigned int fildes) { int ret = -EBADF; struct file *file = fget_raw(fildes); @@ -975,6 +975,11 @@ SYSCALL_DEFINE1(dup, unsigned int, fildes) return ret; } +SYSCALL_DEFINE1(dup, unsigned int, fildes) +{ + return ksys_dup(fildes); +} + int f_dupfd(unsigned int from, struct file *file, unsigned flags) { int err; diff --git a/fs/open.c b/fs/open.c index b62f5c0923a8..270767c9966b 100644 --- a/fs/open.c +++ b/fs/open.c @@ -1079,7 +1079,50 @@ struct file *file_open_root(struct dentry *dentry, struct vfsmount *mnt, } EXPORT_SYMBOL(file_open_root); -long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode) +/** + * ksys_open - open file and return fd + * + * @filename: path to open + * @flags: open flags as per the open(2) second argument + * @mode: mode for the new file if O_CREAT is set, else ignored + * + * This is the helper to open a file from kernelspace if you really + * have to. But in generally you should not do this, so please move + * along, nothing to see here.. + */ +long ksys_open(const char *filename, int flags, umode_t mode) +{ + struct open_flags op; + struct filename *tmp; + int fd; + + if (force_o_largefile()) + flags |= O_LARGEFILE; + + fd = build_open_flags(flags, mode, &op); + if (fd) + return fd; + + tmp = getname_kernel(filename); + if (IS_ERR(tmp)) + return PTR_ERR(tmp); + + fd = get_unused_fd_flags(flags); + if (fd >= 0) { + struct file *f = do_filp_open(AT_FDCWD, tmp, &op); + if (IS_ERR(f)) { + put_unused_fd(fd); + fd = PTR_ERR(f); + } else { + fsnotify_open(f); + fd_install(fd, f); + } + } + putname(tmp); + return fd; +} + +static long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode) { struct open_flags op; int fd = build_open_flags(flags, mode, &op); diff --git a/include/linux/fs.h b/include/linux/fs.h index 98e0349adb52..8ffe1fd6b6dc 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2528,8 +2528,6 @@ extern int do_truncate(struct dentry *, loff_t start, unsigned int time_attrs, struct file *filp); extern int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len); -extern long do_sys_open(int dfd, const char __user *filename, int flags, - umode_t mode); extern struct file *file_open_name(struct filename *, int, umode_t); extern struct file *filp_open(const char *, int, umode_t); extern struct file *file_open_root(struct dentry *, struct vfsmount *, diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 2960dedcfde8..6aa988e66e7b 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -1232,6 +1232,7 @@ asmlinkage long sys_ni_syscall(void); */ 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); @@ -1371,16 +1372,7 @@ static inline int ksys_close(unsigned int fd) return __close_fd(current->files, fd); } -extern long do_sys_open(int dfd, const char __user *filename, int flags, - umode_t mode); - -static inline long ksys_open(const char __user *filename, int flags, - umode_t mode) -{ - if (force_o_largefile()) - flags |= O_LARGEFILE; - return do_sys_open(AT_FDCWD, filename, flags, mode); -} +extern long ksys_open(const char *filename, int flags, umode_t mode); extern long do_sys_truncate(const char __user *pathname, loff_t length); diff --git a/init/main.c b/init/main.c index 1ecfd43ed464..72aa063bf29e 100644 --- a/init/main.c +++ b/init/main.c @@ -93,7 +93,6 @@ #include #include #include -#include #include #include @@ -1158,26 +1157,13 @@ static int __ref kernel_init(void *unused) void console_on_rootfs(void) { - struct file *file; - unsigned int i; - - /* Open /dev/console in kernelspace, this should never fail */ - file = filp_open("/dev/console", O_RDWR, 0); - if (IS_ERR(file)) - goto err_out; - - /* create stdin/stdout/stderr, this should never fail */ - for (i = 0; i < 3; i++) { - if (f_dupfd(i, file, 0) != i) - goto err_out; - } - - return; + /* Open the /dev/console as stdin, this should never fail */ + if (ksys_open("/dev/console", O_RDWR, 0) < 0) + pr_err("Warning: unable to open an initial console.\n"); -err_out: - /* no panic -- this might not be fatal */ - pr_err("Warning: unable to open an initial console.\n"); - return; + /* create stdout/stderr */ + (void) ksys_dup(0); + (void) ksys_dup(0); } static noinline void __init kernel_init_freeable(void)