diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp index c8ba0e483d..9779993966 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp @@ -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: diff --git a/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp b/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp index 981a775da9..6955182e85 100644 --- a/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp @@ -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; } }