Hi all, I fear I can't rely on "open (path, O_CREAT | O_EXCL)" behaviour on samba share. The libc's doc says: If both `O_CREAT' and `O_EXCL' are set, then `open' fails if the specified file already exists. This is guaranteed to never clobber an existing file. But this isn't probably true on network filesystems. When I run this tiny program on 2 hosts in the same directory on samba share (with 'oplocks = no' in smb.conf): --<cut>-- #include <fcntl.h> #include <stdio.h> #include <unistd.h> // unlink main () { const char * path = "locktest.lck"; while (1) { int f = open (path, O_WRONLY | O_CREAT | O_EXCL); if (f > 0) { close (f); if (unlink (path) < 0) { perror ("unlink"); exit (1); } } } return 0; } --<cut>-- it fails quickly with: unlink: Text file busy When I run it on the same host (as 2 processes), it runs as I expect -- forever -- even on a samba share (talking to the same smbd on other side). To be fair, it fails on NFS as well -- immediately, just the message is different ("unlink: No such file or directory"). This is why I think it's unreliable on ANY or most network filesystems. But I'd like to be sure, of course. :-) May be it's just out config error... What do you think? Thanks, -- Egon Eckert, Heaven Industries, s.r.o. E-mail: egon@heaven.industries.cz
On Mon, Jun 17, 2002 at 09:25:44AM +0200, Egon Eckert wrote:> Hi all, > > I fear I can't rely on "open (path, O_CREAT | O_EXCL)" behaviour > on samba share. > > The libc's doc says: > > If both `O_CREAT' and `O_EXCL' are set, then `open' fails > if the specified file already exists. This is guaranteed > to never clobber an existing file. > > But this isn't probably true on network filesystems. When I run > this tiny program on 2 hosts in the same directory on samba > share (with 'oplocks = no' in smb.conf): > > --<cut>-- > #include <fcntl.h> > #include <stdio.h> > #include <unistd.h> // unlink > > main () > { > const char * path = "locktest.lck"; > while (1) { > int f = open (path, O_WRONLY | O_CREAT | O_EXCL); > if (f > 0) { > close (f); > if (unlink (path) < 0) { > perror ("unlink"); > exit (1); > } > } > } > return 0; > } > --<cut>-- > > it fails quickly with: > > unlink: Text file busy > > When I run it on the same host (as 2 processes), it runs as I > expect -- forever -- even on a samba share (talking to the same > smbd on other side). > > To be fair, it fails on NFS as well -- immediately, just the > message is different ("unlink: No such file or directory"). > This is why I think it's unreliable on ANY or most network > filesystems. But I'd like to be sure, of course. :-) May be > it's just out config error... What do you think?Looks like an smbfs problem to me (is that what you're mounting the Samba filesystem with). Jeremy.