Commit 2ca2a09d authored by Dominik Brodowski's avatar Dominik Brodowski

fs: add ksys_close() wrapper; remove in-kernel calls to sys_close()

Using the ksys_close() wrapper allows us to get rid of in-kernel calls
to the sys_close() 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_close(), with one subtle
difference:

The few places which checked the return value did not care about the return
value re-writing in sys_close(), so simply use a wrapper around
__close_fd().

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: default avatarDominik Brodowski <linux@dominikbrodowski.net>
parent 411d9475
...@@ -310,7 +310,7 @@ static int autofs_dev_ioctl_closemount(struct file *fp, ...@@ -310,7 +310,7 @@ static int autofs_dev_ioctl_closemount(struct file *fp,
struct autofs_sb_info *sbi, struct autofs_sb_info *sbi,
struct autofs_dev_ioctl *param) struct autofs_dev_ioctl *param)
{ {
return sys_close(param->ioctlfd); return ksys_close(param->ioctlfd);
} }
/* /*
......
...@@ -241,7 +241,7 @@ static int load_misc_binary(struct linux_binprm *bprm) ...@@ -241,7 +241,7 @@ static int load_misc_binary(struct linux_binprm *bprm)
return retval; return retval;
error: error:
if (fd_binary > 0) if (fd_binary > 0)
sys_close(fd_binary); ksys_close(fd_binary);
bprm->interp_flags = 0; bprm->interp_flags = 0;
bprm->interp_data = 0; bprm->interp_data = 0;
goto ret; goto ret;
......
...@@ -638,6 +638,7 @@ int __close_fd(struct files_struct *files, unsigned fd) ...@@ -638,6 +638,7 @@ int __close_fd(struct files_struct *files, unsigned fd)
spin_unlock(&files->file_lock); spin_unlock(&files->file_lock);
return -EBADF; return -EBADF;
} }
EXPORT_SYMBOL(__close_fd); /* for ksys_close() */
void do_close_on_exec(struct files_struct *files) void do_close_on_exec(struct files_struct *files)
{ {
......
...@@ -1200,7 +1200,6 @@ SYSCALL_DEFINE1(close, unsigned int, fd) ...@@ -1200,7 +1200,6 @@ SYSCALL_DEFINE1(close, unsigned int, fd)
return retval; return retval;
} }
EXPORT_SYMBOL(sys_close);
/* /*
* This routine simulates a hangup on the tty, to arrange that users * This routine simulates a hangup on the tty, to arrange that users
......
...@@ -1045,4 +1045,16 @@ static inline long ksys_ftruncate(unsigned int fd, unsigned long length) ...@@ -1045,4 +1045,16 @@ static inline long ksys_ftruncate(unsigned int fd, unsigned long length)
return do_sys_ftruncate(fd, length, 1); return do_sys_ftruncate(fd, length, 1);
} }
extern int __close_fd(struct files_struct *files, unsigned int fd);
/*
* In contrast to sys_close(), this stub does not check whether the syscall
* should or should not be restarted, but returns the raw error codes from
* __close_fd().
*/
static inline int ksys_close(unsigned int fd)
{
return __close_fd(current->files, fd);
}
#endif #endif
...@@ -492,7 +492,7 @@ void __init change_floppy(char *fmt, ...) ...@@ -492,7 +492,7 @@ void __init change_floppy(char *fmt, ...)
fd = sys_open("/dev/root", O_RDWR | O_NDELAY, 0); fd = sys_open("/dev/root", O_RDWR | O_NDELAY, 0);
if (fd >= 0) { if (fd >= 0) {
sys_ioctl(fd, FDEJECT, 0); sys_ioctl(fd, FDEJECT, 0);
sys_close(fd); ksys_close(fd);
} }
printk(KERN_NOTICE "VFS: Insert %s and press ENTER\n", buf); printk(KERN_NOTICE "VFS: Insert %s and press ENTER\n", buf);
fd = sys_open("/dev/console", O_RDWR, 0); fd = sys_open("/dev/console", O_RDWR, 0);
...@@ -503,7 +503,7 @@ void __init change_floppy(char *fmt, ...) ...@@ -503,7 +503,7 @@ void __init change_floppy(char *fmt, ...)
sys_read(fd, &c, 1); sys_read(fd, &c, 1);
termios.c_lflag |= ICANON; termios.c_lflag |= ICANON;
sys_ioctl(fd, TCSETSF, (long)&termios); sys_ioctl(fd, TCSETSF, (long)&termios);
sys_close(fd); ksys_close(fd);
} }
} }
#endif #endif
......
...@@ -111,7 +111,7 @@ static void __init handle_initrd(void) ...@@ -111,7 +111,7 @@ static void __init handle_initrd(void)
error = fd; error = fd;
} else { } else {
error = sys_ioctl(fd, BLKFLSBUF, 0); error = sys_ioctl(fd, BLKFLSBUF, 0);
sys_close(fd); ksys_close(fd);
} }
printk(!error ? "okay\n" : "failed\n"); printk(!error ? "okay\n" : "failed\n");
} }
......
...@@ -191,7 +191,7 @@ static void __init md_setup_drive(void) ...@@ -191,7 +191,7 @@ static void __init md_setup_drive(void)
printk(KERN_WARNING printk(KERN_WARNING
"md: Ignoring md=%d, already autodetected. (Use raid=noautodetect)\n", "md: Ignoring md=%d, already autodetected. (Use raid=noautodetect)\n",
minor); minor);
sys_close(fd); ksys_close(fd);
continue; continue;
} }
...@@ -243,11 +243,11 @@ static void __init md_setup_drive(void) ...@@ -243,11 +243,11 @@ static void __init md_setup_drive(void)
* boot a kernel with devfs compiled in from partitioned md * boot a kernel with devfs compiled in from partitioned md
* array without it * array without it
*/ */
sys_close(fd); ksys_close(fd);
fd = sys_open(name, 0, 0); fd = sys_open(name, 0, 0);
sys_ioctl(fd, BLKRRPART, 0); sys_ioctl(fd, BLKRRPART, 0);
} }
sys_close(fd); ksys_close(fd);
} }
} }
...@@ -297,7 +297,7 @@ static void __init autodetect_raid(void) ...@@ -297,7 +297,7 @@ static void __init autodetect_raid(void)
fd = sys_open("/dev/md0", 0, 0); fd = sys_open("/dev/md0", 0, 0);
if (fd >= 0) { if (fd >= 0) {
sys_ioctl(fd, RAID_AUTORUN, raid_autopart); sys_ioctl(fd, RAID_AUTORUN, raid_autopart);
sys_close(fd); ksys_close(fd);
} }
} }
......
...@@ -257,7 +257,7 @@ int __init rd_load_image(char *from) ...@@ -257,7 +257,7 @@ int __init rd_load_image(char *from)
if (i && (i % devblocks == 0)) { if (i && (i % devblocks == 0)) {
printk("done disk #%d.\n", disk++); printk("done disk #%d.\n", disk++);
rotate = 0; rotate = 0;
if (sys_close(in_fd)) { if (ksys_close(in_fd)) {
printk("Error closing the disk.\n"); printk("Error closing the disk.\n");
goto noclose_input; goto noclose_input;
} }
...@@ -283,9 +283,9 @@ int __init rd_load_image(char *from) ...@@ -283,9 +283,9 @@ int __init rd_load_image(char *from)
successful_load: successful_load:
res = 1; res = 1;
done: done:
sys_close(in_fd); ksys_close(in_fd);
noclose_input: noclose_input:
sys_close(out_fd); ksys_close(out_fd);
out: out:
kfree(buf); kfree(buf);
ksys_unlink("/dev/ram"); ksys_unlink("/dev/ram");
......
...@@ -373,7 +373,7 @@ static int __init do_copy(void) ...@@ -373,7 +373,7 @@ static int __init do_copy(void)
if (byte_count >= body_len) { if (byte_count >= body_len) {
if (xwrite(wfd, victim, body_len) != body_len) if (xwrite(wfd, victim, body_len) != body_len)
error("write error"); error("write error");
sys_close(wfd); ksys_close(wfd);
do_utime(vcollected, mtime); do_utime(vcollected, mtime);
kfree(vcollected); kfree(vcollected);
eat(body_len); eat(body_len);
...@@ -574,7 +574,7 @@ static void __init clean_rootfs(void) ...@@ -574,7 +574,7 @@ static void __init clean_rootfs(void)
buf = kzalloc(BUF_SIZE, GFP_KERNEL); buf = kzalloc(BUF_SIZE, GFP_KERNEL);
WARN_ON(!buf); WARN_ON(!buf);
if (!buf) { if (!buf) {
sys_close(fd); ksys_close(fd);
return; return;
} }
...@@ -602,7 +602,7 @@ static void __init clean_rootfs(void) ...@@ -602,7 +602,7 @@ static void __init clean_rootfs(void)
num = sys_getdents64(fd, dirp, BUF_SIZE); num = sys_getdents64(fd, dirp, BUF_SIZE);
} }
sys_close(fd); ksys_close(fd);
kfree(buf); kfree(buf);
} }
#endif #endif
...@@ -639,7 +639,7 @@ static int __init populate_rootfs(void) ...@@ -639,7 +639,7 @@ static int __init populate_rootfs(void)
pr_err("/initrd.image: incomplete write (%zd != %ld)\n", pr_err("/initrd.image: incomplete write (%zd != %ld)\n",
written, initrd_end - initrd_start); written, initrd_end - initrd_start);
sys_close(fd); ksys_close(fd);
free_initrd(); free_initrd();
} }
done: done:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment