switch sock_alloc_file() to alloc_file()
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 6 Aug 2009 05:43:59 +0000 (09:43 +0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 16 Dec 2009 17:16:42 +0000 (12:16 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
net/socket.c

index dbb3802a7645b1fa676e38e7a89675d3d12e5f23..eaaba3510e81009bb2e02799785dda8ff704e329 100644 (file)
@@ -366,16 +366,8 @@ static int sock_alloc_file(struct socket *sock, struct file **f, int flags)
        if (unlikely(fd < 0))
                return fd;
 
-       file = get_empty_filp();
-
-       if (unlikely(!file)) {
-               put_unused_fd(fd);
-               return -ENFILE;
-       }
-
        dentry = d_alloc(sock_mnt->mnt_sb->s_root, &name);
        if (unlikely(!dentry)) {
-               put_filp(file);
                put_unused_fd(fd);
                return -ENOMEM;
        }
@@ -388,11 +380,19 @@ static int sock_alloc_file(struct socket *sock, struct file **f, int flags)
         */
        dentry->d_flags &= ~DCACHE_UNHASHED;
        d_instantiate(dentry, SOCK_INODE(sock));
+       SOCK_INODE(sock)->i_fop = &socket_file_ops;
 
-       sock->file = file;
-       init_file(file, sock_mnt, dentry, FMODE_READ | FMODE_WRITE,
+       file = alloc_file(sock_mnt, dentry, FMODE_READ | FMODE_WRITE,
                  &socket_file_ops);
-       SOCK_INODE(sock)->i_fop = &socket_file_ops;
+       if (unlikely(!file)) {
+               /* drop dentry, keep inode */
+               atomic_inc(&path.dentry->d_inode->i_count);
+               dput(dentry);
+               put_unused_fd(fd);
+               return -ENFILE;
+       }
+
+       sock->file = file;
        file->f_flags = O_RDWR | (flags & O_NONBLOCK);
        file->f_pos = 0;
        file->private_data = sock;