summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-11-25 13:03:09 +0100
committerMax Kellermann <max@duempel.org>2014-11-25 13:39:42 +0100
commit40dd968f1302da9fa65c53ba0ae0e6a12c7cda9b (patch)
tree69e2f87c3bc5cd56bb9f31fe9b0ae96fe35afa59 /src
parent3cef348f30ad8a018b1c46f257d3e719be3f96b0 (diff)
lib/nfs/FileReader: update "state" in OnNfsError()
Clean up the "state" to indicate that there is no longer any asynchronous operation. Fixes another NFS-related crash due to cleanup of a non-existing asynchronous operation.
Diffstat (limited to 'src')
-rw-r--r--src/lib/nfs/FileReader.cxx24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/lib/nfs/FileReader.cxx b/src/lib/nfs/FileReader.cxx
index 4837e1f0e..7f5506d50 100644
--- a/src/lib/nfs/FileReader.cxx
+++ b/src/lib/nfs/FileReader.cxx
@@ -246,6 +246,30 @@ NfsFileReader::OnNfsCallback(unsigned status, void *data)
void
NfsFileReader::OnNfsError(Error &&error)
{
+ switch (state) {
+ case State::INITIAL:
+ case State::DEFER:
+ case State::MOUNT:
+ case State::IDLE:
+ assert(false);
+ gcc_unreachable();
+
+ case State::OPEN:
+ connection->RemoveLease(*this);
+ state = State::INITIAL;
+ break;
+
+ case State::STAT:
+ connection->RemoveLease(*this);
+ connection->Close(fh);
+ state = State::INITIAL;
+ break;
+
+ case State::READ:
+ state = State::IDLE;
+ break;
+ }
+
OnNfsFileError(std::move(error));
}