nfs4: Add support for O_NONBLOCK mode

This commit is contained in:
Pawel Dziepak
2012-06-29 02:15:18 +02:00
parent 5cf2ee51b8
commit 1c97a367c5
2 changed files with 15 additions and 5 deletions
+11 -5
View File
@@ -1285,14 +1285,20 @@ Inode::_HandleErrors(uint32 nfs4Error, RPC::Server* serv,
// server needs more time, we need to wait
case NFS4ERR_DELAY:
snooze_etc(5 * 1000000, B_SYSTEM_TIMEBASE, B_RELATIVE_TIMEOUT);
return true;
if (cookie == NULL || (cookie->fMode & O_NONBLOCK) == 0) {
snooze_etc(5 * 1000000, B_SYSTEM_TIMEBASE, B_RELATIVE_TIMEOUT);
return true;
} else
return false;
// server is in grace period, we need to wait
case NFS4ERR_GRACE:
snooze_etc(fFilesystem->NFSServer()->LeaseTime() / 3,
B_SYSTEM_TIMEBASE, B_RELATIVE_TIMEOUT);
return true;
if (cookie == NULL || (cookie->fMode & O_NONBLOCK) == 0) {
snooze_etc(fFilesystem->NFSServer()->LeaseTime() / 3,
B_SYSTEM_TIMEBASE, B_RELATIVE_TIMEOUT);
return true;
} else
return false;
// server has rebooted, reclaim share and try again
case NFS4ERR_STALE_CLIENTID:
@@ -674,6 +674,10 @@ ReplyInterpreter::_NFS4ErrorToHaiku(uint32 x)
case NFS4ERR_INVAL: return B_BAD_VALUE;
case NFS4ERR_FBIG: return B_FILE_TOO_LARGE;
// ...
case NFS4ERR_DELAY:
case NFS4ERR_GRACE:
return B_WOULD_BLOCK;
// ...
default: return B_ERROR;
}
}