fusefrontend: doWrite: no need to take HeaderLock.RLock()
Other writers are blocked by ContentLock already.
This commit is contained in:
parent
bbf5b72fff
commit
55bb22bad6
@ -266,13 +266,13 @@ func (f *File) Read(buf []byte, off int64) (resultData fuse.ReadResult, code fus
|
|||||||
//
|
//
|
||||||
// Empty writes do nothing and are allowed.
|
// Empty writes do nothing and are allowed.
|
||||||
func (f *File) doWrite(data []byte, off int64) (uint32, fuse.Status) {
|
func (f *File) doWrite(data []byte, off int64) (uint32, fuse.Status) {
|
||||||
// Read header from disk, create a new one if the file is empty
|
// If the file ID is not cached, read it from disk
|
||||||
f.fileTableEntry.HeaderLock.RLock()
|
|
||||||
if f.fileTableEntry.ID == nil {
|
if f.fileTableEntry.ID == nil {
|
||||||
f.fileTableEntry.HeaderLock.RUnlock()
|
// Block other readers while we mess with the file header. Other writers
|
||||||
// Somebody else may write the header here, but this would do no harm.
|
// are blocked by ContentLock already.
|
||||||
f.fileTableEntry.HeaderLock.Lock()
|
f.fileTableEntry.HeaderLock.Lock()
|
||||||
tmpID, err := f.readFileID()
|
tmpID, err := f.readFileID()
|
||||||
|
// Write a new file header if the file is empty
|
||||||
if err == io.EOF {
|
if err == io.EOF {
|
||||||
tmpID, err = f.createHeader()
|
tmpID, err = f.createHeader()
|
||||||
}
|
}
|
||||||
@ -282,11 +282,7 @@ func (f *File) doWrite(data []byte, off int64) (uint32, fuse.Status) {
|
|||||||
}
|
}
|
||||||
f.fileTableEntry.ID = tmpID
|
f.fileTableEntry.ID = tmpID
|
||||||
f.fileTableEntry.HeaderLock.Unlock()
|
f.fileTableEntry.HeaderLock.Unlock()
|
||||||
// The file ID may change in here. This does no harm because we
|
|
||||||
// re-read it after the RLock().
|
|
||||||
f.fileTableEntry.HeaderLock.RLock()
|
|
||||||
}
|
}
|
||||||
defer f.fileTableEntry.HeaderLock.RUnlock()
|
|
||||||
// Handle payload data
|
// Handle payload data
|
||||||
dataBuf := bytes.NewBuffer(data)
|
dataBuf := bytes.NewBuffer(data)
|
||||||
blocks := f.contentEnc.ExplodePlainRange(uint64(off), uint64(len(data)))
|
blocks := f.contentEnc.ExplodePlainRange(uint64(off), uint64(len(data)))
|
||||||
|
Loading…
Reference in New Issue
Block a user