fusefrontend: fix panic due to concurrently unregistered wlock
Commit 730291feab
properly freed wlock when the file descriptor is
closed. However, concurrently running Write and Truncates may
still want to lock it. Check if the fd has been closed first.
This commit is contained in:
parent
4b6cf43521
commit
ba7c798418
@ -278,6 +278,10 @@ func (f *file) doWrite(data []byte, off int64) (uint32, fuse.Status) {
|
|||||||
func (f *file) Write(data []byte, off int64) (uint32, fuse.Status) {
|
func (f *file) Write(data []byte, off int64) (uint32, fuse.Status) {
|
||||||
f.fdLock.RLock()
|
f.fdLock.RLock()
|
||||||
defer f.fdLock.RUnlock()
|
defer f.fdLock.RUnlock()
|
||||||
|
if f.fd.Fd() < 0 {
|
||||||
|
// The file descriptor has been closed concurrently.
|
||||||
|
return 0, fuse.EBADF
|
||||||
|
}
|
||||||
wlock.lock(f.ino)
|
wlock.lock(f.ino)
|
||||||
defer wlock.unlock(f.ino)
|
defer wlock.unlock(f.ino)
|
||||||
|
|
||||||
@ -337,6 +341,10 @@ func (f *file) Fsync(flags int) (code fuse.Status) {
|
|||||||
func (f *file) Truncate(newSize uint64) fuse.Status {
|
func (f *file) Truncate(newSize uint64) fuse.Status {
|
||||||
f.fdLock.RLock()
|
f.fdLock.RLock()
|
||||||
defer f.fdLock.RUnlock()
|
defer f.fdLock.RUnlock()
|
||||||
|
if f.fd.Fd() < 0 {
|
||||||
|
// The file descriptor has been closed concurrently.
|
||||||
|
return fuse.EBADF
|
||||||
|
}
|
||||||
wlock.lock(f.ino)
|
wlock.lock(f.ino)
|
||||||
defer wlock.unlock(f.ino)
|
defer wlock.unlock(f.ino)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user