]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/fcntl.c
r8169: convert bitfield to plain enum mask
[linux-2.6-omap-h63xx.git] / fs / fcntl.c
index 3f22e9f4f691ae3cb44312921c0aaf3a6b382086..c9db73fc5e3d2d2e137bab66724d4c91f3d7544c 100644 (file)
@@ -110,7 +110,7 @@ out:
        return error;
 }
 
-static int dupfd(struct file *file, unsigned int start)
+static int dupfd(struct file *file, unsigned int start, int cloexec)
 {
        struct files_struct * files = current->files;
        struct fdtable *fdt;
@@ -122,7 +122,10 @@ static int dupfd(struct file *file, unsigned int start)
                /* locate_fd() may have expanded fdtable, load the ptr */
                fdt = files_fdtable(files);
                FD_SET(fd, fdt->open_fds);
-               FD_CLR(fd, fdt->close_on_exec);
+               if (cloexec)
+                       FD_SET(fd, fdt->close_on_exec);
+               else
+                       FD_CLR(fd, fdt->close_on_exec);
                spin_unlock(&files->file_lock);
                fd_install(fd, file);
        } else {
@@ -195,7 +198,7 @@ asmlinkage long sys_dup(unsigned int fildes)
        struct file * file = fget(fildes);
 
        if (file)
-               ret = dupfd(file, 0);
+               ret = dupfd(file, 0, 0);
        return ret;
 }
 
@@ -319,8 +322,9 @@ static long do_fcntl(int fd, unsigned int cmd, unsigned long arg,
 
        switch (cmd) {
        case F_DUPFD:
+       case F_DUPFD_CLOEXEC:
                get_file(filp);
-               err = dupfd(filp, arg);
+               err = dupfd(filp, arg, cmd == F_DUPFD_CLOEXEC);
                break;
        case F_GETFD:
                err = get_close_on_exec(fd) ? FD_CLOEXEC : 0;
@@ -638,7 +642,7 @@ EXPORT_SYMBOL(kill_fasync);
 static int __init fasync_init(void)
 {
        fasync_cache = kmem_cache_create("fasync_cache",
-               sizeof(struct fasync_struct), 0, SLAB_PANIC, NULL, NULL);
+               sizeof(struct fasync_struct), 0, SLAB_PANIC, NULL);
        return 0;
 }