aboutsummaryrefslogtreecommitdiffstats
path: root/fs/open.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/open.c')
-rw-r--r--fs/open.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/fs/open.c b/fs/open.c
index 0d515d161974..e6991c1b5874 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -855,7 +855,7 @@ EXPORT_SYMBOL(dentry_open);
855/* 855/*
856 * Find an empty file descriptor entry, and mark it busy. 856 * Find an empty file descriptor entry, and mark it busy.
857 */ 857 */
858int get_unused_fd(void) 858static int get_unused_fd_flags(int flags)
859{ 859{
860 struct files_struct * files = current->files; 860 struct files_struct * files = current->files;
861 int fd, error; 861 int fd, error;
@@ -891,7 +891,10 @@ repeat:
891 } 891 }
892 892
893 FD_SET(fd, fdt->open_fds); 893 FD_SET(fd, fdt->open_fds);
894 FD_CLR(fd, fdt->close_on_exec); 894 if (flags & O_CLOEXEC)
895 FD_SET(fd, fdt->close_on_exec);
896 else
897 FD_CLR(fd, fdt->close_on_exec);
895 files->next_fd = fd + 1; 898 files->next_fd = fd + 1;
896#if 1 899#if 1
897 /* Sanity check */ 900 /* Sanity check */
@@ -907,6 +910,11 @@ out:
907 return error; 910 return error;
908} 911}
909 912
913int get_unused_fd(void)
914{
915 return get_unused_fd_flags(0);
916}
917
910EXPORT_SYMBOL(get_unused_fd); 918EXPORT_SYMBOL(get_unused_fd);
911 919
912static void __put_unused_fd(struct files_struct *files, unsigned int fd) 920static void __put_unused_fd(struct files_struct *files, unsigned int fd)
@@ -959,7 +967,7 @@ long do_sys_open(int dfd, const char __user *filename, int flags, int mode)
959 int fd = PTR_ERR(tmp); 967 int fd = PTR_ERR(tmp);
960 968
961 if (!IS_ERR(tmp)) { 969 if (!IS_ERR(tmp)) {
962 fd = get_unused_fd(); 970 fd = get_unused_fd_flags(flags);
963 if (fd >= 0) { 971 if (fd >= 0) {
964 struct file *f = do_filp_open(dfd, tmp, flags, mode); 972 struct file *f = do_filp_open(dfd, tmp, flags, mode);
965 if (IS_ERR(f)) { 973 if (IS_ERR(f)) {