diff options
| author | Taras Madan <tarasmadan@google.com> | 2022-09-05 14:27:54 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-09-05 12:27:54 +0000 |
| commit | b2f2446b46bf02821d90ebedadae2bf7ae0e880e (patch) | |
| tree | 923cf42842918d6bebca1d6bbdc08abed54d274d /vendor/github.com/gofrs | |
| parent | e6654faff4bcca4be92e9a8596fd4b77f747c39e (diff) | |
go.mod, vendor: update (#3358)
* go.mod, vendor: remove unnecessary dependencies
Commands:
1. go mod tidy
2. go mod vendor
* go.mod, vendor: update cloud.google.com/go
Commands:
1. go get -u cloud.google.com/go
2. go mod tidy
3. go mod vendor
* go.mod, vendor: update cloud.google.com/*
Commands:
1. go get -u cloud.google.com/storage cloud.google.com/logging
2. go mod tidy
3. go mod vendor
* go.mod, .golangci.yml, vendor: update *lint*
Commands:
1. go get -u golang.org/x/tools github.com/golangci/golangci-lint@v1.47.0
2. go mod tidy
3. go mod vendor
4. edit .golangci.yml to suppress new errors (resolved in the same PR later)
* all: fix lint errors
hash.go: copy() recommended by gosimple
parse.go: ent is never nil
verifier.go: signal.Notify() with unbuffered channel is bad. Have no idea why.
* .golangci.yml: adjust godot rules
check-all is deprecated, but still work
if you're hesitating too - I'll remove this commit
Diffstat (limited to 'vendor/github.com/gofrs')
| -rw-r--r-- | vendor/github.com/gofrs/flock/flock_aix.go | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/vendor/github.com/gofrs/flock/flock_aix.go b/vendor/github.com/gofrs/flock/flock_aix.go index 2a1607b2f..7277c1b6b 100644 --- a/vendor/github.com/gofrs/flock/flock_aix.go +++ b/vendor/github.com/gofrs/flock/flock_aix.go @@ -34,6 +34,13 @@ const ( writeLock lockType = unix.F_WRLCK ) +type cmdType int + +const ( + tryLock cmdType = unix.F_SETLK + waitLock cmdType = unix.F_SETLKW +) + type inode = uint64 type inodeLock struct { @@ -90,7 +97,7 @@ func (f *Flock) lock(locked *bool, flag lockType) error { defer f.ensureFhState() } - if _, err := f.doLock(flag, true); err != nil { + if _, err := f.doLock(waitLock, flag, true); err != nil { return err } @@ -98,7 +105,7 @@ func (f *Flock) lock(locked *bool, flag lockType) error { return nil } -func (f *Flock) doLock(lt lockType, blocking bool) (bool, error) { +func (f *Flock) doLock(cmd cmdType, lt lockType, blocking bool) (bool, error) { // POSIX locks apply per inode and process, and the lock for an inode is // released when *any* descriptor for that inode is closed. So we need to // synchronize access to each inode internally, and must serialize lock and @@ -143,10 +150,13 @@ func (f *Flock) doLock(lt lockType, blocking bool) (bool, error) { wait <- f } - err = setlkw(f.fh.Fd(), lt) + err = setlkw(f.fh.Fd(), cmd, lt) if err != nil { f.doUnlock() + if cmd == tryLock && err == unix.EACCES { + return false, nil + } return false, err } @@ -186,7 +196,7 @@ func (f *Flock) doUnlock() (err error) { mu.Unlock() if owner == f { - err = setlkw(f.fh.Fd(), unix.F_UNLCK) + err = setlkw(f.fh.Fd(), waitLock, unix.F_UNLCK) } mu.Lock() @@ -246,7 +256,7 @@ func (f *Flock) try(locked *bool, flag lockType) (bool, error) { defer f.ensureFhState() } - haslock, err := f.doLock(flag, false) + haslock, err := f.doLock(tryLock, flag, false) if err != nil { return false, err } @@ -255,10 +265,10 @@ func (f *Flock) try(locked *bool, flag lockType) (bool, error) { return haslock, nil } -// setlkw calls FcntlFlock with F_SETLKW for the entire file indicated by fd. -func setlkw(fd uintptr, lt lockType) error { +// setlkw calls FcntlFlock with cmd for the entire file indicated by fd. +func setlkw(fd uintptr, cmd cmdType, lt lockType) error { for { - err := unix.FcntlFlock(fd, unix.F_SETLKW, &unix.Flock_t{ + err := unix.FcntlFlock(fd, int(cmd), &unix.Flock_t{ Type: int16(lt), Whence: io.SeekStart, Start: 0, |
