From: Maxim P. <mpa...@pa...> - 2014-08-25 15:12:55
|
On 08/22/2014 06:00 PM, Miklos Szeredi wrote: > On Thu, Aug 21, 2014 at 6:08 PM, Maxim Patlasov <MPa...@pa...> wrote: >> There are two types of I/O activity that can be "in progress" at the time >> of fuse_release() execution: asynchronous read-ahead and write-back. The >> patch ensures that they are completed before fuse_release_common sends >> FUSE_RELEASE to userspace. >> >> So far as fuse_release() waits for end of async I/O, its callbacks >> (fuse_readpages_end and fuse_writepage_finish) calling fuse_file_put cannot >> be the last holders of fuse file anymore. To emphasize the fact, the patch >> replaces fuse_file_put with __fuse_file_put there. > 1) spinlock around __fuse_file_put() is unnecessary, > wake_up/wait_event will provide the necessary synchronization. Yes, I agree. > 2) can't we always wait for I/O and just make the actual RELEASE > message sync or async based on the flag? > 3) and can't we merge the fuseblk case into this as well? I think this is doable, but the same argument that Anand suggested for doing sync release selectively: > In a real world scenario you may want to perform synchronous release > selectively. As such performance over lots of small files is generally > slow because of context switches, and a synchronous release adds an > extra switch. is applicable here: if an application opened a file read-only and read a block initiating read-ahead, it's not obvious why the app doing close(2) should always wait for the end of that read-ahead. For some fs it's desirable, for others is not. Let's fuse daemon decide which behaviour is preferable. Thanks, Maxim |