On 24.01.2019 12:17, Pavel Butsykin wrote:
> Yes, I missed this synchronization idea, the check and list_add should
> be together, will fix.

Also, __fuse_request_send() may need to be fixed, since it does not look
as having appropriate in already existing code (I haven't checked deeply).
 
> On 24.01.2019 11:45, Kirill Tkhai wrote:
>> On 23.01.2019 20:22, Pavel Butsykin wrote:
>>>
>>> 23.01.2019 16:55, Kirill Tkhai пишет:
>>>> On 23.01.2019 14:49, Pavel Butsykin wrote:
>>>>> Fuse file with FUSE_S_FAIL_IMMEDIATELY state should not allow to execute 
>>>>> new
>>>>> requests. But in case of kio requests it doesn't work because the status 
>>>>> check
>>>>> is located behind kio.op->req_send(). To fix this let's move the status 
>>>>> check
>>>>> before kio.op->req_send().
>>>>>
>>>>> Note: We can drop hunk with req->end(fc, req) in __fuse_request_send() 
>>>>> because
>>>>> it was only needed to clenup kio setattr request after 
>>>>> pcs_kio_setattr_handle().
>>>>>
>>>>> Signed-off-by: Pavel Butsykin <pbutsy...@virtuozzo.com>
>>>> Why is this safe?
>>>>
>>>> After you move the check out of fc->lock, it becomes racy, and 
>>>> fuse_invalidate_files()
>>>> may become work not as expected.
>>>
>>> test_bit is atomic operation. Which type of race do you mean?
>>
>> fuse_request_send_background()                                 
>> fuse_invalidate_files()
>>    test_bit(FUSE_S_FAIL_IMMEDIATELY, &req->ff->ff_state))
>>
>>                                                                   
>> spin_lock(&fc->lock);
>>                                                                   
>> list_for_each_entry(ff, &fi->rw_files, rw_entry)
>>                                                                     
>> set_bit(FUSE_S_FAIL_IMMEDIATELY, &ff->ff_state);
>>                                                                   
>> spin_unlock(&fc->lock);
>>
>>                                                                   
>> spin_lock(&fc->lock);
>>                                                                   
>> fuse_kill_requests(fc, inode, &fc->bg_queue);
>>                                                                   
>> spin_unlock(&fc->lock);
>>
>>
>>    spin_lock(&fc->lock);
>>    if (fc->connected) {
>>      fuse_request_send_background_locked(fc, req); <-- queuing request after 
>> fuse_invalidate_files() thinks that
>>                                                        requests for all 
>> immediate files already killed.
>>
>>
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to