diff --git a/fs/open.c b/fs/open.c
index 986cef6..32e24a9 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -993,7 +993,7 @@ EXPORT_SYMBOL(dentry_open);
 /*
  * Find an empty file descriptor entry, and mark it busy.
  */
-int get_unused_fd(void)
+int get_unused_fd_flags(int flags)
 {
 	struct files_struct * files = current->files;
 	int fd, error;
@@ -1030,7 +1030,10 @@ repeat:
 	}
 
 	FD_SET(fd, files->open_fds);
-	FD_CLR(fd, files->close_on_exec);
+	if (flags & O_CLOEXEC)
+		FD_SET(fd, files->close_on_exec);
+	else
+		FD_CLR(fd, files->close_on_exec);
 	files->next_fd = fd + 1;
 #if 1
 	/* Sanity check */
@@ -1046,6 +1049,11 @@ out:
 	return error;
 }
 
+int get_unused_fd(void)
+{
+	return get_unused_fd_flags(0);
+}
+
 EXPORT_SYMBOL(get_unused_fd);
 
 static inline void __put_unused_fd(struct files_struct *files, unsigned int fd)
@@ -1098,7 +1106,7 @@ long do_sys_open(int dfd, const char __user *filename, int flags, int mode)
 	tmp = getname(filename);
 	fd = PTR_ERR(tmp);
 	if (!IS_ERR(tmp)) {
-		fd = get_unused_fd();
+		fd = get_unused_fd_flags(flags);
 		if (fd >= 0) {
 			struct file *f = filp_fd_open(dfd, tmp, flags, mode);
 			error = PTR_ERR(f);
diff --git a/include/asm-i386/fcntl.h b/include/asm-i386/fcntl.h
index 1e8abef..e498009 100644
--- a/include/asm-i386/fcntl.h
+++ b/include/asm-i386/fcntl.h
@@ -48,6 +48,7 @@
 #define O_DIRECTORY	0200000	/* must be a directory */
 #define O_NOFOLLOW	0400000 /* don't follow links */
 #define O_NOATIME	01000000
+#define O_CLOEXEC	02000000	/* set close_on_exec */
 
 #define F_DUPFD		0	/* dup */
 #define F_GETFD		1	/* get close_on_exec */
diff --git a/include/asm-x86_64/fcntl.h b/include/asm-x86_64/fcntl.h
index 1e8abef..e498009 100644
--- a/include/asm-x86_64/fcntl.h
+++ b/include/asm-x86_64/fcntl.h
@@ -48,6 +48,9 @@
 #define O_DIRECTORY	0200000	/* must be a directory */
 #define O_NOFOLLOW	0400000 /* don't follow links */
 #define O_NOATIME	01000000
+#ifndef O_CLOEXEC
+#define O_CLOEXEC	02000000	/* set close_on_exec */
+#endif
 
 #define F_DUPFD		0	/* dup */
 #define F_GETFD		1	/* get close_on_exec */
diff --git a/include/linux/file.h b/include/linux/file.h
index 433bc1c..7c6a46f 100644
--- a/include/linux/file.h
+++ b/include/linux/file.h
@@ -78,6 +78,7 @@ extern struct file * FASTCALL(fget_light(unsigned int fd, int *fput_needed));
 extern void FASTCALL(set_close_on_exec(unsigned int fd, int flag));
 extern void put_filp(struct file *);
 extern int get_unused_fd(void);
+extern int get_unused_fd_flags(int flags);
 extern void FASTCALL(put_unused_fd(unsigned int fd));
 struct kmem_cache_s;
 extern void filp_ctor(void * objp, struct kmem_cache_s *cachep, unsigned long cflags);
