*/
#define DEBUG_SUBSYSTEM S_LNET
+#ifdef HAVE_COMPAT_RDMA
+#include <linux/compat-2.6.h>
+#endif
#include <linux/if.h>
#include <linux/in.h>
#include <linux/net.h>
sock_filp = sock_alloc_file(sock, 0);
# endif
#endif
- if (!sock_filp) {
- rc = -ENOMEM;
+ if (IS_ERR(sock_filp)) {
+ rc = PTR_ERR(sock_filp);
sock_release(sock);
goto out;
}
return rc;
}
+#ifndef HAVE_SK_SLEEP
+static inline wait_queue_head_t *sk_sleep(struct sock *sk)
+{
+ return sk->sk_sleep;
+}
+#endif
+
int
lnet_sock_accept(struct socket **newsockp, struct socket *sock)
{
struct socket *newsock;
int rc;
- init_waitqueue_entry(&wait, current);
-
/* XXX this should add a ref to sock->ops->owner, if
* TCP could be a module */
rc = sock_create_lite(PF_PACKET, sock->type, IPPROTO_TCP, &newsock);
}
newsock->ops = sock->ops;
- add_wait_queue(sk_sleep(sock->sk), &wait);
rc = sock->ops->accept(sock, newsock, O_NONBLOCK);
if (rc == -EAGAIN) {
/* Nothing ready, so wait for activity */
+ init_waitqueue_entry(&wait, current);
+ add_wait_queue(sk_sleep(sock->sk), &wait);
+ set_current_state(TASK_INTERRUPTIBLE);
schedule();
+ remove_wait_queue(sk_sleep(sock->sk), &wait);
rc = sock->ops->accept(sock, newsock, O_NONBLOCK);
}
- remove_wait_queue(sk_sleep(sock->sk), &wait);
- set_current_state(TASK_RUNNING);
-
if (rc != 0)
goto failed;