From f5f43db2da6bf0e5f39c8fb281ccca6e3dd8e65a Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 25 Nov 2014 13:09:19 +0100 Subject: lib/nfs/Connection: cancel DeferredMonitor on disconnect Fixes potential second mount attempt after the old connection to the NFS server was shut down. --- src/lib/nfs/Connection.cxx | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/lib/nfs/Connection.cxx') diff --git a/src/lib/nfs/Connection.cxx b/src/lib/nfs/Connection.cxx index c2c7ceb2b..c4612f613 100644 --- a/src/lib/nfs/Connection.cxx +++ b/src/lib/nfs/Connection.cxx @@ -327,6 +327,10 @@ NfsConnection::DestroyContext() assert(GetEventLoop().IsInside()); assert(context != nullptr); + /* cancel pending DeferredMonitor that was scheduled to notify + new leases */ + DeferredMonitor::Cancel(); + if (SocketMonitor::IsDefined()) SocketMonitor::Cancel(); -- cgit v1.2.3 From b293b160079fd19cfc675fa86c2b99695aac171f Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 25 Nov 2014 13:27:06 +0100 Subject: lib/nfs/Connection: broadcast error before closing connection During the NfsLease::OnNfsConnectionFailed() call, the old (defunct) nfs_context may be used to close file handles. Such code does not yet exist, but will be added soon to fix other bugs. --- src/lib/nfs/Connection.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/lib/nfs/Connection.cxx') diff --git a/src/lib/nfs/Connection.cxx b/src/lib/nfs/Connection.cxx index c4612f613..06d2a4d2a 100644 --- a/src/lib/nfs/Connection.cxx +++ b/src/lib/nfs/Connection.cxx @@ -409,10 +409,10 @@ NfsConnection::OnSocketReady(unsigned flags) error.Format(nfs_domain, "NFS connection has failed: %s", nfs_get_error(context)); + BroadcastError(std::move(error)); + DestroyContext(); closed = true; - - BroadcastError(std::move(error)); } else if (SocketMonitor::IsDefined() && nfs_get_fd(context) < 0) { /* this happens when rpc_reconnect_requeue() is called after the connection broke, but autoreconnet was @@ -425,10 +425,10 @@ NfsConnection::OnSocketReady(unsigned flags) error.Format(nfs_domain, "NFS socket disappeared: %s", msg); + BroadcastError(std::move(error)); + DestroyContext(); closed = true; - - BroadcastError(std::move(error)); } assert(in_event); -- cgit v1.2.3