Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 244976 | Differences between
and this patch

Collapse All | Expand All

(-)a/net/sunrpc/xprtsock.c (-10 / +48 lines)
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 */

Return to bug 244976