svc.c (87d8a69709d971913e6cc7210450fcb8be963667) svc.c (aa395145165cb06a0d0885221bbe0ce4a564391d)
1/* net/atm/svc.c - ATM SVC sockets */
2
3/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
4
5#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
6
7#include <linux/string.h>
8#include <linux/net.h> /* struct socket, struct proto_ops */

--- 35 unchanged lines hidden (view full) ---

44static void svc_disconnect(struct atm_vcc *vcc)
45{
46 DEFINE_WAIT(wait);
47 struct sk_buff *skb;
48 struct sock *sk = sk_atm(vcc);
49
50 pr_debug("%p\n", vcc);
51 if (test_bit(ATM_VF_REGIS, &vcc->flags)) {
1/* net/atm/svc.c - ATM SVC sockets */
2
3/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
4
5#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
6
7#include <linux/string.h>
8#include <linux/net.h> /* struct socket, struct proto_ops */

--- 35 unchanged lines hidden (view full) ---

44static void svc_disconnect(struct atm_vcc *vcc)
45{
46 DEFINE_WAIT(wait);
47 struct sk_buff *skb;
48 struct sock *sk = sk_atm(vcc);
49
50 pr_debug("%p\n", vcc);
51 if (test_bit(ATM_VF_REGIS, &vcc->flags)) {
52 prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
52 prepare_to_wait(sk_sleep(sk), &wait, TASK_UNINTERRUPTIBLE);
53 sigd_enq(vcc, as_close, NULL, NULL, NULL);
54 while (!test_bit(ATM_VF_RELEASED, &vcc->flags) && sigd) {
55 schedule();
53 sigd_enq(vcc, as_close, NULL, NULL, NULL);
54 while (!test_bit(ATM_VF_RELEASED, &vcc->flags) && sigd) {
55 schedule();
56 prepare_to_wait(sk->sk_sleep, &wait,
56 prepare_to_wait(sk_sleep(sk), &wait,
57 TASK_UNINTERRUPTIBLE);
58 }
57 TASK_UNINTERRUPTIBLE);
58 }
59 finish_wait(sk->sk_sleep, &wait);
59 finish_wait(sk_sleep(sk), &wait);
60 }
61 /* beware - socket is still in use by atmsigd until the last
62 as_indicate has been answered */
63 while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
64 atm_return(vcc, skb->truesize);
65 pr_debug("LISTEN REL\n");
66 sigd_enq2(NULL, as_reject, vcc, NULL, NULL, &vcc->qos, 0);
67 dev_kfree_skb(skb);

--- 52 unchanged lines hidden (view full) ---

120 /* failing rebind will kill old binding */
121 /* @@@ check memory (de)allocation on rebind */
122 if (!test_bit(ATM_VF_HASQOS, &vcc->flags)) {
123 error = -EBADFD;
124 goto out;
125 }
126 vcc->local = *addr;
127 set_bit(ATM_VF_WAITING, &vcc->flags);
60 }
61 /* beware - socket is still in use by atmsigd until the last
62 as_indicate has been answered */
63 while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
64 atm_return(vcc, skb->truesize);
65 pr_debug("LISTEN REL\n");
66 sigd_enq2(NULL, as_reject, vcc, NULL, NULL, &vcc->qos, 0);
67 dev_kfree_skb(skb);

--- 52 unchanged lines hidden (view full) ---

120 /* failing rebind will kill old binding */
121 /* @@@ check memory (de)allocation on rebind */
122 if (!test_bit(ATM_VF_HASQOS, &vcc->flags)) {
123 error = -EBADFD;
124 goto out;
125 }
126 vcc->local = *addr;
127 set_bit(ATM_VF_WAITING, &vcc->flags);
128 prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
128 prepare_to_wait(sk_sleep(sk), &wait, TASK_UNINTERRUPTIBLE);
129 sigd_enq(vcc, as_bind, NULL, NULL, &vcc->local);
130 while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
131 schedule();
129 sigd_enq(vcc, as_bind, NULL, NULL, &vcc->local);
130 while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
131 schedule();
132 prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
132 prepare_to_wait(sk_sleep(sk), &wait, TASK_UNINTERRUPTIBLE);
133 }
133 }
134 finish_wait(sk->sk_sleep, &wait);
134 finish_wait(sk_sleep(sk), &wait);
135 clear_bit(ATM_VF_REGIS, &vcc->flags); /* doesn't count */
136 if (!sigd) {
137 error = -EUNATCH;
138 goto out;
139 }
140 if (!sk->sk_err)
141 set_bit(ATM_VF_BOUND, &vcc->flags);
142 error = -sk->sk_err;

--- 53 unchanged lines hidden (view full) ---

196 }
197 if (!vcc->qos.txtp.traffic_class &&
198 !vcc->qos.rxtp.traffic_class) {
199 error = -EINVAL;
200 goto out;
201 }
202 vcc->remote = *addr;
203 set_bit(ATM_VF_WAITING, &vcc->flags);
135 clear_bit(ATM_VF_REGIS, &vcc->flags); /* doesn't count */
136 if (!sigd) {
137 error = -EUNATCH;
138 goto out;
139 }
140 if (!sk->sk_err)
141 set_bit(ATM_VF_BOUND, &vcc->flags);
142 error = -sk->sk_err;

--- 53 unchanged lines hidden (view full) ---

196 }
197 if (!vcc->qos.txtp.traffic_class &&
198 !vcc->qos.rxtp.traffic_class) {
199 error = -EINVAL;
200 goto out;
201 }
202 vcc->remote = *addr;
203 set_bit(ATM_VF_WAITING, &vcc->flags);
204 prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
204 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
205 sigd_enq(vcc, as_connect, NULL, NULL, &vcc->remote);
206 if (flags & O_NONBLOCK) {
205 sigd_enq(vcc, as_connect, NULL, NULL, &vcc->remote);
206 if (flags & O_NONBLOCK) {
207 finish_wait(sk->sk_sleep, &wait);
207 finish_wait(sk_sleep(sk), &wait);
208 sock->state = SS_CONNECTING;
209 error = -EINPROGRESS;
210 goto out;
211 }
212 error = 0;
213 while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
214 schedule();
215 if (!signal_pending(current)) {
208 sock->state = SS_CONNECTING;
209 error = -EINPROGRESS;
210 goto out;
211 }
212 error = 0;
213 while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
214 schedule();
215 if (!signal_pending(current)) {
216 prepare_to_wait(sk->sk_sleep, &wait,
216 prepare_to_wait(sk_sleep(sk), &wait,
217 TASK_INTERRUPTIBLE);
218 continue;
219 }
220 pr_debug("*ABORT*\n");
221 /*
222 * This is tricky:
223 * Kernel ---close--> Demon
224 * Kernel <--close--- Demon
225 * or
226 * Kernel ---close--> Demon
227 * Kernel <--error--- Demon
228 * or
229 * Kernel ---close--> Demon
230 * Kernel <--okay---- Demon
231 * Kernel <--close--- Demon
232 */
233 sigd_enq(vcc, as_close, NULL, NULL, NULL);
234 while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
217 TASK_INTERRUPTIBLE);
218 continue;
219 }
220 pr_debug("*ABORT*\n");
221 /*
222 * This is tricky:
223 * Kernel ---close--> Demon
224 * Kernel <--close--- Demon
225 * or
226 * Kernel ---close--> Demon
227 * Kernel <--error--- Demon
228 * or
229 * Kernel ---close--> Demon
230 * Kernel <--okay---- Demon
231 * Kernel <--close--- Demon
232 */
233 sigd_enq(vcc, as_close, NULL, NULL, NULL);
234 while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
235 prepare_to_wait(sk->sk_sleep, &wait,
235 prepare_to_wait(sk_sleep(sk), &wait,
236 TASK_INTERRUPTIBLE);
237 schedule();
238 }
239 if (!sk->sk_err)
240 while (!test_bit(ATM_VF_RELEASED, &vcc->flags) &&
241 sigd) {
236 TASK_INTERRUPTIBLE);
237 schedule();
238 }
239 if (!sk->sk_err)
240 while (!test_bit(ATM_VF_RELEASED, &vcc->flags) &&
241 sigd) {
242 prepare_to_wait(sk->sk_sleep, &wait,
242 prepare_to_wait(sk_sleep(sk), &wait,
243 TASK_INTERRUPTIBLE);
244 schedule();
245 }
246 clear_bit(ATM_VF_REGIS, &vcc->flags);
247 clear_bit(ATM_VF_RELEASED, &vcc->flags);
248 clear_bit(ATM_VF_CLOSE, &vcc->flags);
249 /* we're gone now but may connect later */
250 error = -EINTR;
251 break;
252 }
243 TASK_INTERRUPTIBLE);
244 schedule();
245 }
246 clear_bit(ATM_VF_REGIS, &vcc->flags);
247 clear_bit(ATM_VF_RELEASED, &vcc->flags);
248 clear_bit(ATM_VF_CLOSE, &vcc->flags);
249 /* we're gone now but may connect later */
250 error = -EINTR;
251 break;
252 }
253 finish_wait(sk->sk_sleep, &wait);
253 finish_wait(sk_sleep(sk), &wait);
254 if (error)
255 goto out;
256 if (!sigd) {
257 error = -EUNATCH;
258 goto out;
259 }
260 if (sk->sk_err) {
261 error = -sk->sk_err;

--- 35 unchanged lines hidden (view full) ---

297 error = -EINVAL;
298 goto out;
299 }
300 if (test_bit(ATM_VF_LISTEN, &vcc->flags)) {
301 error = -EADDRINUSE;
302 goto out;
303 }
304 set_bit(ATM_VF_WAITING, &vcc->flags);
254 if (error)
255 goto out;
256 if (!sigd) {
257 error = -EUNATCH;
258 goto out;
259 }
260 if (sk->sk_err) {
261 error = -sk->sk_err;

--- 35 unchanged lines hidden (view full) ---

297 error = -EINVAL;
298 goto out;
299 }
300 if (test_bit(ATM_VF_LISTEN, &vcc->flags)) {
301 error = -EADDRINUSE;
302 goto out;
303 }
304 set_bit(ATM_VF_WAITING, &vcc->flags);
305 prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
305 prepare_to_wait(sk_sleep(sk), &wait, TASK_UNINTERRUPTIBLE);
306 sigd_enq(vcc, as_listen, NULL, NULL, &vcc->local);
307 while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
308 schedule();
306 sigd_enq(vcc, as_listen, NULL, NULL, &vcc->local);
307 while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
308 schedule();
309 prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
309 prepare_to_wait(sk_sleep(sk), &wait, TASK_UNINTERRUPTIBLE);
310 }
310 }
311 finish_wait(sk->sk_sleep, &wait);
311 finish_wait(sk_sleep(sk), &wait);
312 if (!sigd) {
313 error = -EUNATCH;
314 goto out;
315 }
316 set_bit(ATM_VF_LISTEN, &vcc->flags);
317 vcc_insert_socket(sk);
318 sk->sk_max_ack_backlog = backlog > 0 ? backlog : ATM_BACKLOG_DEFAULT;
319 error = -sk->sk_err;

--- 18 unchanged lines hidden (view full) ---

338 goto out;
339
340 new_vcc = ATM_SD(newsock);
341
342 pr_debug("%p -> %p\n", old_vcc, new_vcc);
343 while (1) {
344 DEFINE_WAIT(wait);
345
312 if (!sigd) {
313 error = -EUNATCH;
314 goto out;
315 }
316 set_bit(ATM_VF_LISTEN, &vcc->flags);
317 vcc_insert_socket(sk);
318 sk->sk_max_ack_backlog = backlog > 0 ? backlog : ATM_BACKLOG_DEFAULT;
319 error = -sk->sk_err;

--- 18 unchanged lines hidden (view full) ---

338 goto out;
339
340 new_vcc = ATM_SD(newsock);
341
342 pr_debug("%p -> %p\n", old_vcc, new_vcc);
343 while (1) {
344 DEFINE_WAIT(wait);
345
346 prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
346 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
347 while (!(skb = skb_dequeue(&sk->sk_receive_queue)) &&
348 sigd) {
349 if (test_bit(ATM_VF_RELEASED, &old_vcc->flags))
350 break;
351 if (test_bit(ATM_VF_CLOSE, &old_vcc->flags)) {
352 error = -sk->sk_err;
353 break;
354 }
355 if (flags & O_NONBLOCK) {
356 error = -EAGAIN;
357 break;
358 }
359 release_sock(sk);
360 schedule();
361 lock_sock(sk);
362 if (signal_pending(current)) {
363 error = -ERESTARTSYS;
364 break;
365 }
347 while (!(skb = skb_dequeue(&sk->sk_receive_queue)) &&
348 sigd) {
349 if (test_bit(ATM_VF_RELEASED, &old_vcc->flags))
350 break;
351 if (test_bit(ATM_VF_CLOSE, &old_vcc->flags)) {
352 error = -sk->sk_err;
353 break;
354 }
355 if (flags & O_NONBLOCK) {
356 error = -EAGAIN;
357 break;
358 }
359 release_sock(sk);
360 schedule();
361 lock_sock(sk);
362 if (signal_pending(current)) {
363 error = -ERESTARTSYS;
364 break;
365 }
366 prepare_to_wait(sk->sk_sleep, &wait,
366 prepare_to_wait(sk_sleep(sk), &wait,
367 TASK_INTERRUPTIBLE);
368 }
367 TASK_INTERRUPTIBLE);
368 }
369 finish_wait(sk->sk_sleep, &wait);
369 finish_wait(sk_sleep(sk), &wait);
370 if (error)
371 goto out;
372 if (!skb) {
373 error = -EUNATCH;
374 goto out;
375 }
376 msg = (struct atmsvc_msg *)skb->data;
377 new_vcc->qos = msg->qos;

--- 9 unchanged lines hidden (view full) ---

387 if (error) {
388 sigd_enq2(NULL, as_reject, old_vcc, NULL, NULL,
389 &old_vcc->qos, error);
390 error = error == -EAGAIN ? -EBUSY : error;
391 goto out;
392 }
393 /* wait should be short, so we ignore the non-blocking flag */
394 set_bit(ATM_VF_WAITING, &new_vcc->flags);
370 if (error)
371 goto out;
372 if (!skb) {
373 error = -EUNATCH;
374 goto out;
375 }
376 msg = (struct atmsvc_msg *)skb->data;
377 new_vcc->qos = msg->qos;

--- 9 unchanged lines hidden (view full) ---

387 if (error) {
388 sigd_enq2(NULL, as_reject, old_vcc, NULL, NULL,
389 &old_vcc->qos, error);
390 error = error == -EAGAIN ? -EBUSY : error;
391 goto out;
392 }
393 /* wait should be short, so we ignore the non-blocking flag */
394 set_bit(ATM_VF_WAITING, &new_vcc->flags);
395 prepare_to_wait(sk_atm(new_vcc)->sk_sleep, &wait,
395 prepare_to_wait(sk_sleep(sk_atm(new_vcc)), &wait,
396 TASK_UNINTERRUPTIBLE);
397 sigd_enq(new_vcc, as_accept, old_vcc, NULL, NULL);
398 while (test_bit(ATM_VF_WAITING, &new_vcc->flags) && sigd) {
399 release_sock(sk);
400 schedule();
401 lock_sock(sk);
396 TASK_UNINTERRUPTIBLE);
397 sigd_enq(new_vcc, as_accept, old_vcc, NULL, NULL);
398 while (test_bit(ATM_VF_WAITING, &new_vcc->flags) && sigd) {
399 release_sock(sk);
400 schedule();
401 lock_sock(sk);
402 prepare_to_wait(sk_atm(new_vcc)->sk_sleep, &wait,
402 prepare_to_wait(sk_sleep(sk_atm(new_vcc)), &wait,
403 TASK_UNINTERRUPTIBLE);
404 }
403 TASK_UNINTERRUPTIBLE);
404 }
405 finish_wait(sk_atm(new_vcc)->sk_sleep, &wait);
405 finish_wait(sk_sleep(sk_atm(new_vcc)), &wait);
406 if (!sigd) {
407 error = -EUNATCH;
408 goto out;
409 }
410 if (!sk_atm(new_vcc)->sk_err)
411 break;
412 if (sk_atm(new_vcc)->sk_err != ERESTARTSYS) {
413 error = -sk_atm(new_vcc)->sk_err;

--- 19 unchanged lines hidden (view full) ---

433}
434
435int svc_change_qos(struct atm_vcc *vcc, struct atm_qos *qos)
436{
437 struct sock *sk = sk_atm(vcc);
438 DEFINE_WAIT(wait);
439
440 set_bit(ATM_VF_WAITING, &vcc->flags);
406 if (!sigd) {
407 error = -EUNATCH;
408 goto out;
409 }
410 if (!sk_atm(new_vcc)->sk_err)
411 break;
412 if (sk_atm(new_vcc)->sk_err != ERESTARTSYS) {
413 error = -sk_atm(new_vcc)->sk_err;

--- 19 unchanged lines hidden (view full) ---

433}
434
435int svc_change_qos(struct atm_vcc *vcc, struct atm_qos *qos)
436{
437 struct sock *sk = sk_atm(vcc);
438 DEFINE_WAIT(wait);
439
440 set_bit(ATM_VF_WAITING, &vcc->flags);
441 prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
441 prepare_to_wait(sk_sleep(sk), &wait, TASK_UNINTERRUPTIBLE);
442 sigd_enq2(vcc, as_modify, NULL, NULL, &vcc->local, qos, 0);
443 while (test_bit(ATM_VF_WAITING, &vcc->flags) &&
444 !test_bit(ATM_VF_RELEASED, &vcc->flags) && sigd) {
445 schedule();
442 sigd_enq2(vcc, as_modify, NULL, NULL, &vcc->local, qos, 0);
443 while (test_bit(ATM_VF_WAITING, &vcc->flags) &&
444 !test_bit(ATM_VF_RELEASED, &vcc->flags) && sigd) {
445 schedule();
446 prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
446 prepare_to_wait(sk_sleep(sk), &wait, TASK_UNINTERRUPTIBLE);
447 }
447 }
448 finish_wait(sk->sk_sleep, &wait);
448 finish_wait(sk_sleep(sk), &wait);
449 if (!sigd)
450 return -EUNATCH;
451 return -sk->sk_err;
452}
453
454static int svc_setsockopt(struct socket *sock, int level, int optname,
455 char __user *optval, unsigned int optlen)
456{

--- 72 unchanged lines hidden (view full) ---

529{
530 DEFINE_WAIT(wait);
531 struct sock *sk = sock->sk;
532 struct atm_vcc *vcc = ATM_SD(sock);
533 int error;
534
535 lock_sock(sk);
536 set_bit(ATM_VF_WAITING, &vcc->flags);
449 if (!sigd)
450 return -EUNATCH;
451 return -sk->sk_err;
452}
453
454static int svc_setsockopt(struct socket *sock, int level, int optname,
455 char __user *optval, unsigned int optlen)
456{

--- 72 unchanged lines hidden (view full) ---

529{
530 DEFINE_WAIT(wait);
531 struct sock *sk = sock->sk;
532 struct atm_vcc *vcc = ATM_SD(sock);
533 int error;
534
535 lock_sock(sk);
536 set_bit(ATM_VF_WAITING, &vcc->flags);
537 prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
537 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
538 sigd_enq(vcc, as_addparty, NULL, NULL,
539 (struct sockaddr_atmsvc *) sockaddr);
540 if (flags & O_NONBLOCK) {
538 sigd_enq(vcc, as_addparty, NULL, NULL,
539 (struct sockaddr_atmsvc *) sockaddr);
540 if (flags & O_NONBLOCK) {
541 finish_wait(sk->sk_sleep, &wait);
541 finish_wait(sk_sleep(sk), &wait);
542 error = -EINPROGRESS;
543 goto out;
544 }
545 pr_debug("added wait queue\n");
546 while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
547 schedule();
542 error = -EINPROGRESS;
543 goto out;
544 }
545 pr_debug("added wait queue\n");
546 while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
547 schedule();
548 prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
548 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
549 }
549 }
550 finish_wait(sk->sk_sleep, &wait);
550 finish_wait(sk_sleep(sk), &wait);
551 error = xchg(&sk->sk_err_soft, 0);
552out:
553 release_sock(sk);
554 return error;
555}
556
557static int svc_dropparty(struct socket *sock, int ep_ref)
558{
559 DEFINE_WAIT(wait);
560 struct sock *sk = sock->sk;
561 struct atm_vcc *vcc = ATM_SD(sock);
562 int error;
563
564 lock_sock(sk);
565 set_bit(ATM_VF_WAITING, &vcc->flags);
551 error = xchg(&sk->sk_err_soft, 0);
552out:
553 release_sock(sk);
554 return error;
555}
556
557static int svc_dropparty(struct socket *sock, int ep_ref)
558{
559 DEFINE_WAIT(wait);
560 struct sock *sk = sock->sk;
561 struct atm_vcc *vcc = ATM_SD(sock);
562 int error;
563
564 lock_sock(sk);
565 set_bit(ATM_VF_WAITING, &vcc->flags);
566 prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
566 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
567 sigd_enq2(vcc, as_dropparty, NULL, NULL, NULL, NULL, ep_ref);
568 while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
569 schedule();
567 sigd_enq2(vcc, as_dropparty, NULL, NULL, NULL, NULL, ep_ref);
568 while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
569 schedule();
570 prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
570 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
571 }
571 }
572 finish_wait(sk->sk_sleep, &wait);
572 finish_wait(sk_sleep(sk), &wait);
573 if (!sigd) {
574 error = -EUNATCH;
575 goto out;
576 }
577 error = xchg(&sk->sk_err_soft, 0);
578out:
579 release_sock(sk);
580 return error;

--- 111 unchanged lines hidden ---
573 if (!sigd) {
574 error = -EUNATCH;
575 goto out;
576 }
577 error = xchg(&sk->sk_err_soft, 0);
578out:
579 release_sock(sk);
580 return error;

--- 111 unchanged lines hidden ---