nfs4: Check for semaphore creation errors in ConnectionBase classes

This commit is contained in:
Pawel Dziepak
2012-08-16 03:06:36 +02:00
parent a37a22884c
commit a15e8fcfbe
5 changed files with 41 additions and 9 deletions
@@ -79,7 +79,8 @@ CacheRevalidator::_DirectoryCacheRevalidator()
B_RELATIVE_TIMEOUT, DirectoryCache::kExpirationTime);
if (result != B_TIMED_OUT) {
release_sem(fWaitCancel);
if (result == B_OK)
release_sem(fWaitCancel);
return;
}
continue;
@@ -95,7 +96,8 @@ CacheRevalidator::_DirectoryCacheRevalidator()
status_t result = acquire_sem_etc(fWaitCancel, 1,
B_ABSOLUTE_TIMEOUT, current->ExpireTime());
if (result != B_TIMED_OUT) {
release_sem(fWaitCancel);
if (result == B_OK)
release_sem(fWaitCancel);
return;
}
@@ -476,7 +476,14 @@ Connection::Connect(Connection **_connection, const PeerAddress& address)
if (conn == NULL)
return B_NO_MEMORY;
status_t result = conn->Connect();
status_t result;
if (conn->fWaitCancel < B_OK) {
result = conn->fWaitCancel;
delete conn;
return result;
}
result = conn->Connect();
if (result != B_OK) {
delete conn;
return result;
@@ -495,6 +502,14 @@ Connection::SetTo(Connection **_connection, int socket,
Connection* conn = CreateObject(address);
if (conn == NULL)
return B_NO_MEMORY;
status_t result;
if (conn->fWaitCancel < B_OK) {
result = conn->fWaitCancel;
delete conn;
return result;
}
conn->fSocket = socket;
*_connection = conn;
@@ -642,6 +657,14 @@ ConnectionListener::Listen(ConnectionListener** listener, uint16 port)
return B_NO_MEMORY;
}
status_t result;
if ((*listener)->fWaitCancel < B_OK) {
result = (*listener)->fWaitCancel;
close(sock);
delete *listener;
return result;
}
(*listener)->fSocket = sock;
return B_OK;
@@ -41,7 +41,9 @@ NFS4Object::HandleErrors(uint32 nfs4Error, RPC::Server* serv,
*sequence = fFileSystem->OpenOwnerSequenceLock();
return true;
} else if ((cookie->fMode & O_NONBLOCK) == 0) {
}
if ((cookie->fMode & O_NONBLOCK) == 0) {
status_t result = acquire_sem_etc(cookie->fSnoozeCancel, 1,
B_RELATIVE_TIMEOUT, sSecToBigTime(5));
@@ -49,7 +51,8 @@ NFS4Object::HandleErrors(uint32 nfs4Error, RPC::Server* serv,
*sequence = fFileSystem->OpenOwnerSequenceLock();
if (result != B_TIMED_OUT) {
release_sem(cookie->fSnoozeCancel);
if (result == B_OK)
release_sem(cookie->fSnoozeCancel);
return false;
}
return true;
@@ -71,7 +74,9 @@ NFS4Object::HandleErrors(uint32 nfs4Error, RPC::Server* serv,
if (sequence != NULL)
*sequence = fFileSystem->OpenOwnerSequenceLock();
return true;
} else if ((cookie->fMode & O_NONBLOCK) == 0) {
}
if ((cookie->fMode & O_NONBLOCK) == 0) {
status_t result = acquire_sem_etc(cookie->fSnoozeCancel, 1,
B_RELATIVE_TIMEOUT, sSecToBigTime(leaseTime) / 3);
@@ -79,7 +84,8 @@ NFS4Object::HandleErrors(uint32 nfs4Error, RPC::Server* serv,
*sequence = fFileSystem->OpenOwnerSequenceLock();
if (result != B_TIMED_OUT) {
release_sem(cookie->fSnoozeCancel);
if (result == B_OK)
release_sem(cookie->fSnoozeCancel);
return false;
}
return true;
@@ -231,7 +231,8 @@ NFS4Server::_Renewal()
status_t result = acquire_sem_etc(fWaitCancel, 1,
B_RELATIVE_TIMEOUT, sSecToBigTime(fLeaseTime - 2));
if (result != B_TIMED_OUT) {
release_sem(fWaitCancel);
if (result == B_OK)
release_sem(fWaitCancel);
return B_OK;
}
@@ -112,7 +112,7 @@ Server::_StartListening()
fThreadCancel = false;
fThreadError = B_OK;
fThread = spawn_kernel_thread(&Server::_ListenerThreadStart,
"NFSv4 Listener", B_NORMAL_PRIORITY, this);
"NFSv4 Listener", B_NORMAL_PRIORITY, this);
if (fThread < B_OK)
return fThread;