aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/nfs/FileReader.cxx
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-11-26 20:19:17 +0100
committerMax Kellermann <max@duempel.org>2014-11-26 20:19:17 +0100
commit737a56a0302b1030e1071c7be9add7bdca955e32 (patch)
tree93d9b6d625fa1b0ce9e8bf8d13fbc829be5178d1 /src/lib/nfs/FileReader.cxx
parent12b6959ea201fea925c4376f961b8d54738292e2 (diff)
parent67cba251c8826409c82fb2ab75072dc4fca2b4dc (diff)
downloadmpd-737a56a0302b1030e1071c7be9add7bdca955e32.tar.gz
mpd-737a56a0302b1030e1071c7be9add7bdca955e32.tar.xz
mpd-737a56a0302b1030e1071c7be9add7bdca955e32.zip
Merge tag 'v0.19.5'
Diffstat (limited to 'src/lib/nfs/FileReader.cxx')
-rw-r--r--src/lib/nfs/FileReader.cxx38
1 files changed, 37 insertions, 1 deletions
diff --git a/src/lib/nfs/FileReader.cxx b/src/lib/nfs/FileReader.cxx
index 4837e1f0e..1b80f2c86 100644
--- a/src/lib/nfs/FileReader.cxx
+++ b/src/lib/nfs/FileReader.cxx
@@ -56,8 +56,18 @@ NfsFileReader::Close()
return;
}
+ /* this cancels State::MOUNT */
connection->RemoveLease(*this);
+ CancelOrClose();
+}
+
+void
+NfsFileReader::CancelOrClose()
+{
+ assert(state != State::INITIAL &&
+ state != State::DEFER);
+
if (state == State::IDLE)
/* no async operation in progress: can close
immediately */
@@ -164,6 +174,8 @@ NfsFileReader::OnNfsConnectionFailed(const Error &error)
{
assert(state == State::MOUNT);
+ state = State::INITIAL;
+
Error copy;
copy.Set(error);
OnNfsFileError(std::move(copy));
@@ -174,7 +186,7 @@ NfsFileReader::OnNfsConnectionDisconnected(const Error &error)
{
assert(state > State::MOUNT);
- state = State::INITIAL;
+ CancelOrClose();
Error copy;
copy.Set(error);
@@ -246,6 +258,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));
}