summaryrefslogtreecommitdiff
path: root/net/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/socket.c')
-rw-r--r--net/socket.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/net/socket.c b/net/socket.c
index 42fc3028e891..136b98c54fb3 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -503,12 +503,21 @@ EXPORT_SYMBOL(sock_alloc_file);
static int sock_map_fd(struct socket *sock, int flags)
{
- int fd;
-
- fd = FD_ADD(flags, sock_alloc_file(sock, flags, NULL));
- if (fd < 0)
+ struct file *newfile;
+ int fd = get_unused_fd_flags(flags);
+ if (unlikely(fd < 0)) {
sock_release(sock);
- return fd;
+ return fd;
+ }
+
+ newfile = sock_alloc_file(sock, flags, NULL);
+ if (!IS_ERR(newfile)) {
+ fd_install(fd, newfile);
+ return fd;
+ }
+
+ put_unused_fd(fd);
+ return PTR_ERR(newfile);
}
/**