Lines 249-254
struct sock_xprt {
Link Here
|
249 |
void (*old_data_ready)(struct sock *, int); |
249 |
void (*old_data_ready)(struct sock *, int); |
250 |
void (*old_state_change)(struct sock *); |
250 |
void (*old_state_change)(struct sock *); |
251 |
void (*old_write_space)(struct sock *); |
251 |
void (*old_write_space)(struct sock *); |
|
|
252 |
void (*old_error_report)(struct sock *); |
252 |
}; |
253 |
}; |
253 |
|
254 |
|
254 |
/* |
255 |
/* |
Lines 698-705
static int xs_tcp_send_request(struct rpc_task *task)
Link Here
|
698 |
case -EAGAIN: |
699 |
case -EAGAIN: |
699 |
xs_nospace(task); |
700 |
xs_nospace(task); |
700 |
break; |
701 |
break; |
701 |
case -ECONNREFUSED: |
|
|
702 |
case -ECONNRESET: |
702 |
case -ECONNRESET: |
|
|
703 |
xs_tcp_shutdown(xprt); |
704 |
case -ECONNREFUSED: |
703 |
case -ENOTCONN: |
705 |
case -ENOTCONN: |
704 |
case -EPIPE: |
706 |
case -EPIPE: |
705 |
status = -ENOTCONN; |
707 |
status = -ENOTCONN; |
Lines 742-747
out_release:
Link Here
|
742 |
xprt_release_xprt(xprt, task); |
744 |
xprt_release_xprt(xprt, task); |
743 |
} |
745 |
} |
744 |
|
746 |
|
|
|
747 |
static void xs_save_old_callbacks(struct sock_xprt *transport, struct sock *sk) |
748 |
{ |
749 |
transport->old_data_ready = sk->sk_data_ready; |
750 |
transport->old_state_change = sk->sk_state_change; |
751 |
transport->old_write_space = sk->sk_write_space; |
752 |
transport->old_error_report = sk->sk_error_report; |
753 |
} |
754 |
|
755 |
static void xs_restore_old_callbacks(struct sock_xprt *transport, struct sock *sk) |
756 |
{ |
757 |
sk->sk_data_ready = transport->old_data_ready; |
758 |
sk->sk_state_change = transport->old_state_change; |
759 |
sk->sk_write_space = transport->old_write_space; |
760 |
sk->sk_error_report = transport->old_error_report; |
761 |
} |
762 |
|
745 |
/** |
763 |
/** |
746 |
* xs_close - close a socket |
764 |
* xs_close - close a socket |
747 |
* @xprt: transport |
765 |
* @xprt: transport |
Lines 765-773
static void xs_close(struct rpc_xprt *xprt)
Link Here
|
765 |
transport->sock = NULL; |
783 |
transport->sock = NULL; |
766 |
|
784 |
|
767 |
sk->sk_user_data = NULL; |
785 |
sk->sk_user_data = NULL; |
768 |
sk->sk_data_ready = transport->old_data_ready; |
786 |
|
769 |
sk->sk_state_change = transport->old_state_change; |
787 |
xs_restore_old_callbacks(transport, sk); |
770 |
sk->sk_write_space = transport->old_write_space; |
|
|
771 |
write_unlock_bh(&sk->sk_callback_lock); |
788 |
write_unlock_bh(&sk->sk_callback_lock); |
772 |
|
789 |
|
773 |
sk->sk_no_check = 0; |
790 |
sk->sk_no_check = 0; |
Lines 1180-1185
static void xs_tcp_state_change(struct sock *sk)
Link Here
|
1180 |
} |
1197 |
} |
1181 |
|
1198 |
|
1182 |
/** |
1199 |
/** |
|
|
1200 |
* xs_tcp_error_report - callback mainly for catching RST events |
1201 |
* @sk: socket |
1202 |
*/ |
1203 |
static void xs_tcp_error_report(struct sock *sk) |
1204 |
{ |
1205 |
struct rpc_xprt *xprt; |
1206 |
|
1207 |
read_lock(&sk->sk_callback_lock); |
1208 |
if (sk->sk_err != ECONNRESET || sk->sk_state != TCP_ESTABLISHED) |
1209 |
goto out; |
1210 |
if (!(xprt = xprt_from_sock(sk))) |
1211 |
goto out; |
1212 |
dprintk("RPC: %s client %p...\n" |
1213 |
"RPC: error %d\n", |
1214 |
__func__, xprt, sk->sk_err); |
1215 |
|
1216 |
xprt_force_disconnect(xprt); |
1217 |
out: |
1218 |
read_unlock(&sk->sk_callback_lock); |
1219 |
} |
1220 |
|
1221 |
/** |
1183 |
* xs_udp_write_space - callback invoked when socket buffer space |
1222 |
* xs_udp_write_space - callback invoked when socket buffer space |
1184 |
* becomes available |
1223 |
* becomes available |
1185 |
* @sk: socket whose state has changed |
1224 |
* @sk: socket whose state has changed |
Lines 1454-1463
static void xs_udp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
Link Here
|
1454 |
|
1493 |
|
1455 |
write_lock_bh(&sk->sk_callback_lock); |
1494 |
write_lock_bh(&sk->sk_callback_lock); |
1456 |
|
1495 |
|
|
|
1496 |
xs_save_old_callbacks(transport, sk); |
1497 |
|
1457 |
sk->sk_user_data = xprt; |
1498 |
sk->sk_user_data = xprt; |
1458 |
transport->old_data_ready = sk->sk_data_ready; |
|
|
1459 |
transport->old_state_change = sk->sk_state_change; |
1460 |
transport->old_write_space = sk->sk_write_space; |
1461 |
sk->sk_data_ready = xs_udp_data_ready; |
1499 |
sk->sk_data_ready = xs_udp_data_ready; |
1462 |
sk->sk_write_space = xs_udp_write_space; |
1500 |
sk->sk_write_space = xs_udp_write_space; |
1463 |
sk->sk_no_check = UDP_CSUM_NORCV; |
1501 |
sk->sk_no_check = UDP_CSUM_NORCV; |
Lines 1589-1601
static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
Link Here
|
1589 |
|
1627 |
|
1590 |
write_lock_bh(&sk->sk_callback_lock); |
1628 |
write_lock_bh(&sk->sk_callback_lock); |
1591 |
|
1629 |
|
|
|
1630 |
xs_save_old_callbacks(transport, sk); |
1631 |
|
1592 |
sk->sk_user_data = xprt; |
1632 |
sk->sk_user_data = xprt; |
1593 |
transport->old_data_ready = sk->sk_data_ready; |
|
|
1594 |
transport->old_state_change = sk->sk_state_change; |
1595 |
transport->old_write_space = sk->sk_write_space; |
1596 |
sk->sk_data_ready = xs_tcp_data_ready; |
1633 |
sk->sk_data_ready = xs_tcp_data_ready; |
1597 |
sk->sk_state_change = xs_tcp_state_change; |
1634 |
sk->sk_state_change = xs_tcp_state_change; |
1598 |
sk->sk_write_space = xs_tcp_write_space; |
1635 |
sk->sk_write_space = xs_tcp_write_space; |
|
|
1636 |
sk->sk_error_report = xs_tcp_error_report; |
1599 |
sk->sk_allocation = GFP_ATOMIC; |
1637 |
sk->sk_allocation = GFP_ATOMIC; |
1600 |
|
1638 |
|
1601 |
/* socket options */ |
1639 |
/* socket options */ |