From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753079AbdCNVuk (ORCPT ); Tue, 14 Mar 2017 17:50:40 -0400 Received: from mout.kundenserver.de ([212.227.17.24]:51946 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752455AbdCNVui (ORCPT ); Tue, 14 Mar 2017 17:50:38 -0400 From: Arnd Bergmann To: Alexander Viro , Andrew Morton Cc: linux-fsdevel@vger.kernel.org, y2038@lists.linaro.org, Arnd Bergmann , linux-kernel@vger.kernel.org Subject: [PATCH] initramfs: use vfs_stat/lstat directly Date: Tue, 14 Mar 2017 22:49:05 +0100 Message-Id: <20170314214932.4052842-1-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 X-Provags-ID: V03:K0:U0VTS2tiQptH+1bGeQjBWrhJL7Q39nC5msvo+hD/KABluvTriWI fo0EXwLfvi2Z/I0zAkO1QzzjFyGTtHWRuyoAkYOxYK5nh/qsxrGNKy71xWIrAd8xxruKUBb 3Fa0d5W1ycexsROydVBe/jTR13XioAj/YZ9cIiGdOWy70B6Zcngt6DBmc2eTfvufPXEHAI0 pRFHlyHmCOvzqNuyW9oWw== X-UI-Out-Filterresults: notjunk:1;V01:K0:2w/2seHDyWw=:vfMTIVmZPOSaM2iBP0iw6+ 1dC4IJq4jYGLIe3DeyrfgTmdi0V7zKT+WgZ2+NWJPem7YQNw54mLArT7Jg9neH2Z3oxMMH3tX Y+jwYURBRcGPQkzA9SPiyrgGd2VY5eAiA9cys5l3Ou/RX04FTJNnJi1CVAMCcbnhG8GREOIRz QNyM93Fy0ogpBrfUkO6z5nQOIYvRsCM8ASbrTHL4BNZREwd2UgTdtS5C7NshtPXdfWXrfNmqA J4n8byx42ba3cndLsTJWV/pD/qIOKUNbwJUY5FxTJROtA3VUFPCvS0inDt+TtmOEK4NqYyvgz 2VApvm/meLNApXGcGQGYljV9eZO16MRJSoeITUAcTpeSvFS5/P7K+eR+NQ8GiPNi7AtKCFHWa E33JFlE7gd6+V1G/ZLeF2ldnk0eB/KVrAUsLdJHnVDZFPF5rXvYfkABBu2trjhWoT7L9DuJFh B+xQakdUs2mJ0YqBC03mmRhYZ8t13YGXRXDr/yresK5xY3J4uYwLI8b1c3IOCOc9ysDOhKLGr ekkQ25l9oA+sX+WEVV2IgFVP+Fv7qwJ3CftfDAXeNrQjCqSWpbDDOXqePNNq4Tl/iUdQjta/H nXCU0bSbKoNpq0P8Vc7p389WM/FlDfH1DrrOfCpPbUZbT+R3WLxcgrnAqTPNopcbYWfGNqyRF Jv7n3EonoAy8b7kJl8DXtUQuoB5b1ldEyw6JzPc2q17IS+4PgEVTMwSr7j+H4nFKH7qY= Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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. Signed-off-by: Arnd Bergmann --- Submitted before in June 2016, but no reply. Andrew or Al, could one of you pick this up for v4.12? --- init/do_mounts.h | 22 ++++------------------ init/initramfs.c | 12 ++++++------ 2 files changed, 10 insertions(+), 24 deletions(-) diff --git a/init/do_mounts.h b/init/do_mounts.h index 067af1d9e8b6..282d65bfd674 100644 --- a/init/do_mounts.h +++ b/init/do_mounts.h @@ -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 diff --git a/init/initramfs.c b/init/initramfs.c index 7eb7cb7cb9b9..83d514d0e69d 100644 --- a/init/initramfs.c +++ b/init/initramfs.c @@ -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); -- 2.9.0