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,6 +79,7 @@ CacheRevalidator::_DirectoryCacheRevalidator()
B_RELATIVE_TIMEOUT, DirectoryCache::kExpirationTime); B_RELATIVE_TIMEOUT, DirectoryCache::kExpirationTime);
if (result != B_TIMED_OUT) { if (result != B_TIMED_OUT) {
if (result == B_OK)
release_sem(fWaitCancel); release_sem(fWaitCancel);
return; return;
} }
@@ -95,6 +96,7 @@ CacheRevalidator::_DirectoryCacheRevalidator()
status_t result = acquire_sem_etc(fWaitCancel, 1, status_t result = acquire_sem_etc(fWaitCancel, 1,
B_ABSOLUTE_TIMEOUT, current->ExpireTime()); B_ABSOLUTE_TIMEOUT, current->ExpireTime());
if (result != B_TIMED_OUT) { if (result != B_TIMED_OUT) {
if (result == B_OK)
release_sem(fWaitCancel); release_sem(fWaitCancel);
return; return;
} }
@@ -476,7 +476,14 @@ Connection::Connect(Connection **_connection, const PeerAddress& address)
if (conn == NULL) if (conn == NULL)
return B_NO_MEMORY; 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) { if (result != B_OK) {
delete conn; delete conn;
return result; return result;
@@ -495,6 +502,14 @@ Connection::SetTo(Connection **_connection, int socket,
Connection* conn = CreateObject(address); Connection* conn = CreateObject(address);
if (conn == NULL) if (conn == NULL)
return B_NO_MEMORY; return B_NO_MEMORY;
status_t result;
if (conn->fWaitCancel < B_OK) {
result = conn->fWaitCancel;
delete conn;
return result;
}
conn->fSocket = socket; conn->fSocket = socket;
*_connection = conn; *_connection = conn;
@@ -642,6 +657,14 @@ ConnectionListener::Listen(ConnectionListener** listener, uint16 port)
return B_NO_MEMORY; return B_NO_MEMORY;
} }
status_t result;
if ((*listener)->fWaitCancel < B_OK) {
result = (*listener)->fWaitCancel;
close(sock);
delete *listener;
return result;
}
(*listener)->fSocket = sock; (*listener)->fSocket = sock;
return B_OK; return B_OK;
@@ -41,7 +41,9 @@ NFS4Object::HandleErrors(uint32 nfs4Error, RPC::Server* serv,
*sequence = fFileSystem->OpenOwnerSequenceLock(); *sequence = fFileSystem->OpenOwnerSequenceLock();
return true; return true;
} else if ((cookie->fMode & O_NONBLOCK) == 0) { }
if ((cookie->fMode & O_NONBLOCK) == 0) {
status_t result = acquire_sem_etc(cookie->fSnoozeCancel, 1, status_t result = acquire_sem_etc(cookie->fSnoozeCancel, 1,
B_RELATIVE_TIMEOUT, sSecToBigTime(5)); B_RELATIVE_TIMEOUT, sSecToBigTime(5));
@@ -49,6 +51,7 @@ NFS4Object::HandleErrors(uint32 nfs4Error, RPC::Server* serv,
*sequence = fFileSystem->OpenOwnerSequenceLock(); *sequence = fFileSystem->OpenOwnerSequenceLock();
if (result != B_TIMED_OUT) { if (result != B_TIMED_OUT) {
if (result == B_OK)
release_sem(cookie->fSnoozeCancel); release_sem(cookie->fSnoozeCancel);
return false; return false;
} }
@@ -71,7 +74,9 @@ NFS4Object::HandleErrors(uint32 nfs4Error, RPC::Server* serv,
if (sequence != NULL) if (sequence != NULL)
*sequence = fFileSystem->OpenOwnerSequenceLock(); *sequence = fFileSystem->OpenOwnerSequenceLock();
return true; return true;
} else if ((cookie->fMode & O_NONBLOCK) == 0) { }
if ((cookie->fMode & O_NONBLOCK) == 0) {
status_t result = acquire_sem_etc(cookie->fSnoozeCancel, 1, status_t result = acquire_sem_etc(cookie->fSnoozeCancel, 1,
B_RELATIVE_TIMEOUT, sSecToBigTime(leaseTime) / 3); B_RELATIVE_TIMEOUT, sSecToBigTime(leaseTime) / 3);
@@ -79,6 +84,7 @@ NFS4Object::HandleErrors(uint32 nfs4Error, RPC::Server* serv,
*sequence = fFileSystem->OpenOwnerSequenceLock(); *sequence = fFileSystem->OpenOwnerSequenceLock();
if (result != B_TIMED_OUT) { if (result != B_TIMED_OUT) {
if (result == B_OK)
release_sem(cookie->fSnoozeCancel); release_sem(cookie->fSnoozeCancel);
return false; return false;
} }
@@ -231,6 +231,7 @@ NFS4Server::_Renewal()
status_t result = acquire_sem_etc(fWaitCancel, 1, status_t result = acquire_sem_etc(fWaitCancel, 1,
B_RELATIVE_TIMEOUT, sSecToBigTime(fLeaseTime - 2)); B_RELATIVE_TIMEOUT, sSecToBigTime(fLeaseTime - 2));
if (result != B_TIMED_OUT) { if (result != B_TIMED_OUT) {
if (result == B_OK)
release_sem(fWaitCancel); release_sem(fWaitCancel);
return B_OK; return B_OK;
} }