From: Russell M. <rmc...@vi...> - 2006-10-18 19:49:59
|
I have ported the p2mp patch for the 2.6 Kernel back to the 2.4 Kernel, and have managed to get the atm_pmp.c file running. However, when I issue ATM_ADDPARTY or ATM_DROPPARTY IOCTL calls the entire system freezes up. Not even the debugging from the kernel gets pushed out to the NFS file system log, so I can't see exactly where it is locking up. I have a feeling it might be due to a hack that I placed in for porting the 2.6 WAITQUEUE's back to the 2.4 calls. I was wondering if anyone might take at look at these two functions <see below> and see if there are any glaring errors for the usage. -------- Current Code in my /linux-2.4.25/net/atm/svc.c ------------------- static int svc_addparty(struct socket *sock, struct sockaddr *sockaddr, int sockaddr_len, int flags) { /* DEFINE_WAIT(wait); */ DECLARE_WAITQUEUE(wait, current); struct atm_vcc *vcc = ATM_SD(sock); int error; lock_sock(vcc->sk); set_bit(ATM_VF_WAITING, &vcc->flags); add_wait_queue(vcc->sk->sleep, &wait); /* prepare_to_wait(vcc->sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); */ sigd_enq(vcc, as_addparty, NULL, NULL, (struct sockaddr_atmsvc *) sockaddr); if (flags & O_NONBLOCK) { remove_wait_queue(vcc->sk->sleep, &wait); /* finish_wait(vcc->sk->sk_sleep, &wait); */ error = -EINPROGRESS; goto out; } DPRINTK("svc_addparty added wait queue\n"); while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) { schedule(); add_wait_queue(vcc->sk->sleep, &wait); /*prepare_to_wait(vcc->sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);*/ } remove_wait_queue(vcc->sk->sleep, &wait); /* finish_wait(vcc->sk->sk_sleep, &wait); */ error = xchg(&vcc->sk->err_soft, 0); out: release_sock(vcc->sk); return error; } static int svc_dropparty(struct socket *sock, int ep_ref) { /* DEFINE_WAIT(wait); */ DECLARE_WAITQUEUE(wait, current); struct atm_vcc *vcc = ATM_SD(sock); int error; lock_sock(vcc->sk); set_bit(ATM_VF_WAITING, &vcc->flags); add_wait_queue(vcc->sk->sleep, &wait); /* prepare_to_wait(vcc->sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); */ sigd_enq2(vcc, as_dropparty, NULL, NULL, NULL, NULL, ep_ref); while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) { schedule(); add_wait_queue(vcc->sk->sleep, &wait); /* prepare_to_wait(vcc->sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); */ } remove_wait_queue(vcc->sk->sleep, &wait); /* finish_wait(vcc->sk->sk_sleep, &wait); */ if (!sigd) { error = -EUNATCH; goto out; } error = xchg(&vcc->sk->err_soft, 0); out: release_sock(vcc->sk); return error; } ----------------- |