fs/torrentfs.go | 21 ++++++++++++--------- diff --git a/fs/torrentfs.go b/fs/torrentfs.go index 31891effbf021cd7ba678aa50061a53b0e404f8d..dd10d413975a45b320244cd6a2c7ff6eaa23f703 100644 --- a/fs/torrentfs.go +++ b/fs/torrentfs.go @@ -59,18 +59,21 @@ panic("read on directory") } log.Printf("read request for %s: offset=%d size=%d", fn.fsPath(), req.Offset, req.Size) size := req.Size - if int64(fn.size)-req.Offset < int64(size) { - size = int(int64(fn.size) - req.Offset) + fileLeft := int64(fn.size) - req.Offset + if fileLeft < int64(size) { + size = int(fileLeft) } - if size < 0 { - size = 0 + resp.Data = resp.Data[:size] + if len(resp.Data) == 0 { + return nil } infoHash := fn.InfoHash torrentOff := fn.TorrentOffset + req.Offset - if err := fn.FS.Client.PrioritizeDataRegion(infoHash, torrentOff, int64(size)); err != nil { - panic(err) - } - resp.Data = resp.Data[:size] + go func() { + if err := fn.FS.Client.PrioritizeDataRegion(infoHash, torrentOff, int64(size)); err != nil { + panic(err) + } + }() for { dataWaiter := fn.FS.Client.DataWaiter() n, err := fn.FS.Client.TorrentReadAt(infoHash, torrentOff, resp.Data) @@ -88,7 +91,7 @@ return fuse.EINTR } default: log.Print(err) - return fuse.EIO + return err // bazil.org/fuse will convert generic errors appropriately. } } }