Fixed a bug related to EINTR.

geesefs-0-30-9
Aaron Jacobs 2015-07-24 15:20:43 +10:00
parent 816f77d732
commit 4de334e034
1 changed files with 18 additions and 6 deletions

View File

@ -232,15 +232,27 @@ func (c *Connection) readMessage() (m *buffer.InMessage, err error) {
err = m.Init(c.wrapped.Dev)
c.wrapped.Rio.RUnlock()
// Special cases:
//
// * ENODEV means fuse has hung up.
//
// * EINTR means we should try again. (This seems to happen often on
// OS X, cf. http://golang.org/issue/11180)
//
if pe, ok := err.(*os.PathError); ok {
switch pe.Err {
case syscall.ENODEV:
err = io.EOF
case syscall.EINTR:
err = nil
continue
}
}
if err != nil {
c.destroyInMessage(m)
m = nil
// Special case: ENODEV means fuse has hung up.
if pe, ok := err.(*os.PathError); ok && pe.Err == syscall.ENODEV {
err = io.EOF
}
return
}