From 40dd968f1302da9fa65c53ba0ae0e6a12c7cda9b Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 25 Nov 2014 13:03:09 +0100 Subject: 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. --- src/lib/nfs/FileReader.cxx | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'src/lib/nfs/FileReader.cxx') 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)); } -- cgit v1.2.3 From 38f19981b2bcaa6f08f1d1e81be66d217e8da9b8 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 25 Nov 2014 13:50:36 +0100 Subject: lib/nfs/FileReader: reset state in OnNfsConnectionFailed() Avoid calling NfsConnection::RemoveLease(), because the lease has been removed already. --- src/lib/nfs/FileReader.cxx | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/lib/nfs/FileReader.cxx') diff --git a/src/lib/nfs/FileReader.cxx b/src/lib/nfs/FileReader.cxx index 7f5506d50..79256492b 100644 --- a/src/lib/nfs/FileReader.cxx +++ b/src/lib/nfs/FileReader.cxx @@ -164,6 +164,8 @@ NfsFileReader::OnNfsConnectionFailed(const Error &error) { assert(state == State::MOUNT); + state = State::INITIAL; + Error copy; copy.Set(error); OnNfsFileError(std::move(copy)); -- cgit v1.2.3 From 016063c810281bd05c792dfe8643cc68b4c3cab2 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 25 Nov 2014 14:00:32 +0100 Subject: lib/nfs/FileReader: move code to CancelOrClose() --- src/lib/nfs/FileReader.cxx | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src/lib/nfs/FileReader.cxx') diff --git a/src/lib/nfs/FileReader.cxx b/src/lib/nfs/FileReader.cxx index 79256492b..455165bbd 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 */ -- cgit v1.2.3 From e72eef421b75516e0447e4a06419d1a7aba4d853 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 25 Nov 2014 12:29:55 +0100 Subject: lib/nfs/FileReader: clean up on disconnect Avoids crash because Close() invokes a call on a destructed NfsConnection. --- src/lib/nfs/FileReader.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/lib/nfs/FileReader.cxx') diff --git a/src/lib/nfs/FileReader.cxx b/src/lib/nfs/FileReader.cxx index 455165bbd..1b80f2c86 100644 --- a/src/lib/nfs/FileReader.cxx +++ b/src/lib/nfs/FileReader.cxx @@ -186,7 +186,7 @@ NfsFileReader::OnNfsConnectionDisconnected(const Error &error) { assert(state > State::MOUNT); - state = State::INITIAL; + CancelOrClose(); Error copy; copy.Set(error); -- cgit v1.2.3