From: Werner B. <wer...@on...> - 2009-03-22 19:24:23
|
Hello, when an application issues an open request with flag O_TRUNC set, davfs2 gets two separate upcalls from fuse: - FUSE_SETATTR to truncate the file to length zero - FUSE_OPEN to open the file for writing This is a problem for davfs2 (and probably for all file systems with an unreliable backend). The first upcall may succeed and the second on fail, leaving an empty file which was usually not intended by the user. My question: is this splitting of open into two upcalls done by fuse or is it done at a higher level (vfs, libc, ...)? if (done_by_fuse) { - I did not notice this earlier. Has this always been handled this way or has it been changed some time ago? I observed this behaviour with Linux 2.6.18 and 2.6.26 (both from Debian packages). - Why does fuse not use the O_TRUNC flag in the OPEN-upcall. This could be handled by davfs2 as one request which either succeeds or fails? } else { Sorry for bothering you. } Cheers Werner |
From: Corin <wak...@gm...> - 2009-03-22 20:12:58
|
On 23.03.2009 08:24, Werner Baumann wrote: > Hello, > > when an application issues an open request with flag O_TRUNC set, davfs2 > gets two separate upcalls from fuse: > - FUSE_SETATTR to truncate the file to length zero > - FUSE_OPEN to open the file for writing I'm not a real fuse expert but at least fuse 2.8.0-rc has an option "FUSE_CAP_ATOMIC_O_TRUNC" which you can pass back to fuse in the struct fuse_conn_info->want in fuse_init callback. I guess it tells fuse that your open implementation can handle O_TRUNC and so does only one call to open with this flag set. Corin |
From: Werner B. <wer...@on...> - 2009-03-24 20:24:30
|
Corin wrote: > On 23.03.2009 08:24, Werner Baumann wrote: >> Hello, >> >> when an application issues an open request with flag O_TRUNC set, >> davfs2 gets two separate upcalls from fuse: >> - FUSE_SETATTR to truncate the file to length zero >> - FUSE_OPEN to open the file for writing > I'm not a real fuse expert but at least fuse 2.8.0-rc has an option > "FUSE_CAP_ATOMIC_O_TRUNC" which you can pass back to fuse in the struct > fuse_conn_info->want in fuse_init callback. I guess it tells fuse that > your open implementation can handle O_TRUNC and so does only one call to > open with this flag set. > > Corin Thanks for the hint. It's exactly what I needed. I tested with Linux 2.6.26 and it works. Cheers Werner |