On 5/30/24 11:00, Miklos Szeredi wrote:
> On Thu, 30 May 2024 at 05:20, Jingbo Xu <[email protected]> wrote:
>
>>> + if (test_bit(FR_FINISHED, &req->flags)) {
>>> + list_del_init(&req->intr_entry);
>>> + spin_unlock(&fiq->lock ^
>> missing "return" here?
>
> Well spotted. Thanks.
>
>>> - err = -ENODEV;
>>> - spin_unlock(&fiq->lock);
>>> - fuse_put_request(req);
>>> - }
>>> + fuse_send_one(fiq, req);
>>>
>>> - return err;
>>> + return 0;
>>> }
>>
>> There's a minor changed behavior visible to users. Prior to the patch,
>> the FUSE_NOTIFY_RETRIEVE will returns -ENODEV when the connection is
>> aborted, but now it returns 0.
>>
>> It seems only example/notify_store_retrieve.c has used
>> FUSE_NOTIFY_RETRIEVE in libfuse. I'm not sure if this change really
>> matters.
>
> It will return -ENOTCONN from fuse_simple_notify_reply() ->
> fuse_get_req(). The -ENODEV would be a very short transient error
> during the abort, so it doesn't matter.
example/notify_store_retrieve and example/notify_inval_inode actually
get EBADF on umount. Issue is that FUSE_DESTROY is sent very late only,
but inodes already released. If server side sends a notification in the
wrong moment, it gets EBADF. We would need something like
FUSE_PREPARE_DESTROY that is being send when umount processing starts to
stop notifications. I'm not sure if that exists in the VFS and didn't
have time yet to check.
Thanks,
Bernd