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.