From: Stephen Rothwell Date: Wed, 3 Oct 2012 01:36:45 +0000 (+1000) Subject: Merge remote-tracking branch 'vfs/for-next' X-Git-Tag: next-20121003~73 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=ae342cd7388feeb178404c0ca35b04f098576fcf;p=karo-tx-linux.git Merge remote-tracking branch 'vfs/for-next' Conflicts: drivers/staging/android/binder.c net/socket.c --- ae342cd7388feeb178404c0ca35b04f098576fcf diff --cc drivers/staging/android/binder.c index b1937ca13575,f71d624995ea..7b0ba92e7e46 --- a/drivers/staging/android/binder.c +++ b/drivers/staging/android/binder.c @@@ -362,14 -362,9 +362,9 @@@ struct binder_transaction static void binder_defer_work(struct binder_proc *proc, enum binder_deferred_state defer); - /* - * copied from get_unused_fd_flags - */ -int task_get_unused_fd_flags(struct binder_proc *proc, int flags) +static int task_get_unused_fd_flags(struct binder_proc *proc, int flags) { struct files_struct *files = proc->files; - int fd, error; - struct fdtable *fdt; unsigned long rlim_cur; unsigned long irqs; diff --cc include/linux/net.h index 99276c3dc89a,c8a9708d4d66..a3831f30e120 --- a/include/linux/net.h +++ b/include/linux/net.h @@@ -246,7 -247,7 +247,8 @@@ extern int sock_sendmsg(struct size_t len); extern int sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, int flags); - extern int sock_map_fd(struct socket *sock, int flags); -extern struct file *sock_alloc_file(struct socket *sock, int flags); ++extern struct file *sock_alloc_file(struct socket *sock, int flags, ++ const char *dname); extern struct socket *sockfd_lookup(int fd, int *err); extern struct socket *sock_from_file(struct file *file, int *err); #define sockfd_put(sock) fput(sock->file) diff --cc net/9p/trans_fd.c index 730a435b2c0b,8c4e0b538a8a..02efb25c2957 --- a/net/9p/trans_fd.c +++ b/net/9p/trans_fd.c @@@ -802,8 -801,8 +803,8 @@@ static int p9_socket_open(struct p9_cli return -ENOMEM; csocket->sk->sk_allocation = GFP_NOIO; - fd = sock_map_fd(csocket, 0); - if (fd < 0) { - file = sock_alloc_file(csocket, 0); ++ file = sock_alloc_file(csocket, 0, NULL); + if (IS_ERR(file)) { pr_err("%s (%d): failed to map fd\n", __func__, task_pid_nr(current)); sock_release(csocket); diff --cc net/sctp/socket.c index d37d24ff197f,fb5931ca50d0..59d16ea927f0 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@@ -4311,6 -4297,13 +4313,13 @@@ static int sctp_getsockopt_peeloff(stru goto out; } - newfile = sock_alloc_file(newsock, 0); ++ newfile = sock_alloc_file(newsock, 0, NULL); + if (unlikely(IS_ERR(newfile))) { + put_unused_fd(retval); + sock_release(newsock); + return PTR_ERR(newfile); + } + SCTP_DEBUG_PRINTK("%s: sk: %p newsk: %p sd: %d\n", __func__, sk, newsock->sk, retval); diff --cc net/socket.c index 80dc7e84b046,38a14311f3a6..5584bd8ccd3f --- a/net/socket.c +++ b/net/socket.c @@@ -347,30 -346,15 +347,23 @@@ static struct file_system_type sock_fs_ * but we take care of internal coherence yet. */ - static int sock_alloc_file(struct socket *sock, struct file **f, int flags, - const char *dname) -struct file *sock_alloc_file(struct socket *sock, int flags) ++struct file *sock_alloc_file(struct socket *sock, int flags, ++ const char *dname) { struct qstr name = { .name = "" }; struct path path; struct file *file; - int fd; - - fd = get_unused_fd_flags(flags); - if (unlikely(fd < 0)) - return fd; + if (dname) { + name.name = dname; + name.len = strlen(name.name); + } else if (sock->sk) { + name.name = sock->sk->sk_prot_creator->name; + name.len = strlen(name.name); + } path.dentry = d_alloc_pseudo(sock_mnt->mnt_sb, &name); - if (unlikely(!path.dentry)) { - put_unused_fd(fd); - return -ENOMEM; - } + if (unlikely(!path.dentry)) + return ERR_PTR(-ENOMEM); path.mnt = mntget(sock_mnt); d_instantiate(path.dentry, SOCK_INODE(sock)); @@@ -390,22 -373,26 +382,26 @@@ file->f_flags = O_RDWR | (flags & O_NONBLOCK); file->f_pos = 0; file->private_data = sock; - - *f = file; - return fd; + return file; } + EXPORT_SYMBOL(sock_alloc_file); - int sock_map_fd(struct socket *sock, int flags) + static int sock_map_fd(struct socket *sock, int flags) { struct file *newfile; - int fd = sock_alloc_file(sock, &newfile, flags, NULL); + int fd = get_unused_fd_flags(flags); + if (unlikely(fd < 0)) + return fd; - if (likely(fd >= 0)) - newfile = sock_alloc_file(sock, flags); ++ newfile = sock_alloc_file(sock, flags, NULL); + if (likely(!IS_ERR(newfile))) { fd_install(fd, newfile); + return fd; + } - return fd; + put_unused_fd(fd); + return PTR_ERR(newfile); } - EXPORT_SYMBOL(sock_map_fd); struct socket *sock_from_file(struct file *file, int *err) { @@@ -1471,12 -1395,27 +1467,27 @@@ SYSCALL_DEFINE4(socketpair, int, family err = fd1; goto out_release_both; } - - fd2 = sock_alloc_file(sock2, &newfile2, flags, NULL); + fd2 = get_unused_fd_flags(flags); if (unlikely(fd2 < 0)) { err = fd2; + put_unused_fd(fd1); + goto out_release_both; + } + - newfile1 = sock_alloc_file(sock1, flags); ++ newfile1 = sock_alloc_file(sock1, flags, NULL); + if (unlikely(IS_ERR(newfile1))) { + err = PTR_ERR(newfile1); + put_unused_fd(fd1); + put_unused_fd(fd2); + goto out_release_both; + } + - newfile2 = sock_alloc_file(sock2, flags); ++ newfile2 = sock_alloc_file(sock2, flags, NULL); + if (IS_ERR(newfile2)) { + err = PTR_ERR(newfile2); fput(newfile1); put_unused_fd(fd1); + put_unused_fd(fd2); sock_release(sock2); goto out; } @@@ -1615,6 -1553,13 +1625,14 @@@ SYSCALL_DEFINE4(accept4, int, fd, struc sock_release(newsock); goto out_put; } - newfile = sock_alloc_file(newsock, flags); ++ newfile = sock_alloc_file(newsock, flags, ++ sock->sk->sk_prot_creator->name); + if (unlikely(IS_ERR(newfile))) { + err = PTR_ERR(newfile); + put_unused_fd(newfd); + sock_release(newsock); + goto out_put; + } err = security_socket_accept(sock, newsock); if (err)