Re: [PATCH] SUNRPC: fix race to sk_err after xs_error_report

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 1 Oct 2019, at 15:38, Trond Myklebust wrote:

> On Tue, 2019-10-01 at 14:30 -0400, Benjamin Coddington wrote:
>> ...
>> diff --git a/include/linux/sunrpc/xprtsock.h
>> b/include/linux/sunrpc/xprtsock.h
>> index 7638dbe7bc50..8ffae73dea6c 100644
>> --- a/include/linux/sunrpc/xprtsock.h
>> +++ b/include/linux/sunrpc/xprtsock.h
>> @@ -56,6 +56,7 @@ struct sock_xprt {
>>  	 */
>>  	unsigned long		sock_state;
>>  	struct delayed_work	connect_worker;
>> +	int			xprt_err;
>
> Perhaps move this down just after srcport so we don't create an
> unnecessary hole in the structure?

Ok!

>>  	struct work_struct	error_worker;
>>  	struct work_struct	recv_worker;
>>  	struct mutex		recv_mutex;
>> diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
>> index e2176c167a57..7fe77eef7080 100644
>> --- a/net/sunrpc/xprtsock.c
>> +++ b/net/sunrpc/xprtsock.c
>> @@ -1250,12 +1250,12 @@ static void xs_error_report(struct sock *sk)
>>  		goto out;
>>
>>  	transport = container_of(xprt, struct sock_xprt, xprt);
>> -	err = -sk->sk_err;
>> -	if (err == 0)
>> +	transport->xprt_err = -sk->sk_err;
>
> Doesn't this need a smp write barrier to ensure it isn't reordered with
> the set_bit() in xs_run_error_worker()?

Yes, it does need that or the error_worker may clear the bit without seeing
the error.

Ben



[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux