diff --git a/flock.go b/flock.go index 73a2579..ff942b2 100644 --- a/flock.go +++ b/flock.go @@ -163,9 +163,9 @@ func tryCtx(ctx context.Context, fn func() (bool, error), retryDelay time.Durati } } -func (f *Flock) setFh() error { +func (f *Flock) setFh(flag int) error { // open a new os.File instance - fh, err := os.OpenFile(f.path, f.flag, f.perm) + fh, err := os.OpenFile(f.path, flag, f.perm) if err != nil { return err } diff --git a/flock_unix.go b/flock_unix.go index b27089a..cf8919c 100644 --- a/flock_unix.go +++ b/flock_unix.go @@ -9,6 +9,7 @@ package flock import ( "errors" + "os" "golang.org/x/sys/unix" ) @@ -49,7 +50,7 @@ func (f *Flock) lock(locked *bool, flag int) error { } if f.fh == nil { - if err := f.setFh(); err != nil { + if err := f.setFh(f.flag); err != nil { return err } @@ -146,7 +147,7 @@ func (f *Flock) try(locked *bool, flag int) (bool, error) { } if f.fh == nil { - if err := f.setFh(); err != nil { + if err := f.setFh(f.flag); err != nil { return false, err } @@ -182,6 +183,7 @@ retry: // This comes from `util-linux/sys-utils/flock.c`: // > Since Linux 3.4 (commit 55725513) // > Probably NFSv4 where flock() is emulated by fcntl(). +// > https://github.com/util-linux/util-linux/blob/198e920aa24743ef6ace4e07cf6237de527f9261/sys-utils/flock.c#L374-L390 func (f *Flock) reopenFDOnError(err error) (bool, error) { if !errors.Is(err, unix.EIO) && !errors.Is(err, unix.EBADF) { return false, nil @@ -198,8 +200,8 @@ func (f *Flock) reopenFDOnError(err error) (bool, error) { f.resetFh() - // reopen the file handle - err = f.setFh() + // reopen in read-write mode and set the file handle + err = f.setFh(f.flag | os.O_RDWR) if err != nil { return false, err } diff --git a/flock_unix_fcntl.go b/flock_unix_fcntl.go index e882516..ea007b4 100644 --- a/flock_unix_fcntl.go +++ b/flock_unix_fcntl.go @@ -112,7 +112,7 @@ func (f *Flock) lock(locked *bool, flag lockType) error { } if f.fh == nil { - if err := f.setFh(); err != nil { + if err := f.setFh(f.flag); err != nil { return err } @@ -359,7 +359,7 @@ func (f *Flock) try(locked *bool, flag lockType) (bool, error) { } if f.fh == nil { - if err := f.setFh(); err != nil { + if err := f.setFh(f.flag); err != nil { return false, err } diff --git a/flock_windows.go b/flock_windows.go index 4df90e2..dfd31e1 100644 --- a/flock_windows.go +++ b/flock_windows.go @@ -56,7 +56,7 @@ func (f *Flock) lock(locked *bool, flag uint32) error { } if f.fh == nil { - if err := f.setFh(); err != nil { + if err := f.setFh(f.flag); err != nil { return err } @@ -136,7 +136,7 @@ func (f *Flock) try(locked *bool, flag uint32) (bool, error) { } if f.fh == nil { - if err := f.setFh(); err != nil { + if err := f.setFh(f.flag); err != nil { return false, err }