static __poll_t xs_poll_socket(struct sock_xprt *transport)
 {
-       return transport->sock->ops->poll(NULL, transport->sock, NULL);
+       return transport->sock->ops->poll(transport->file, transport->sock,
+                       NULL);
 }
 
 static bool xs_poll_socket_readable(struct sock_xprt *transport)
        struct socket *sock = transport->sock;
        struct sock *sk = transport->inet;
        struct rpc_xprt *xprt = &transport->xprt;
+       struct file *filp = transport->file;
 
        if (sk == NULL)
                return;
        write_lock_bh(&sk->sk_callback_lock);
        transport->inet = NULL;
        transport->sock = NULL;
+       transport->file = NULL;
 
        sk->sk_user_data = NULL;
 
        mutex_unlock(&transport->recv_mutex);
 
        trace_rpc_socket_close(xprt, sock);
-       sock_release(sock);
+       fput(filp);
 
        xprt_disconnect_done(xprt);
 }
                struct sock_xprt *transport, int family, int type,
                int protocol, bool reuseport)
 {
+       struct file *filp;
        struct socket *sock;
        int err;
 
                goto out;
        }
 
+       filp = sock_alloc_file(sock, O_NONBLOCK, NULL);
+       if (IS_ERR(filp))
+               return ERR_CAST(filp);
+       transport->file = filp;
+
        return sock;
 out:
        return ERR_PTR(err);
 static int xs_local_setup_socket(struct sock_xprt *transport)
 {
        struct rpc_xprt *xprt = &transport->xprt;
+       struct file *filp;
        struct socket *sock;
        int status = -EIO;
 
        }
        xs_reclassify_socket(AF_LOCAL, sock);
 
+       filp = sock_alloc_file(sock, O_NONBLOCK, NULL);
+       if (IS_ERR(filp)) {
+               status = PTR_ERR(filp);
+               goto out;
+       }
+       transport->file = filp;
+
        dprintk("RPC:       worker connecting xprt %p via AF_LOCAL to %s\n",
                        xprt, xprt->address_strings[RPC_DISPLAY_ADDR]);