From 8f57d30ea4934abc215ae850fa3612474087d7a3 Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Tue, 3 Jul 2012 22:16:08 +0200 Subject: [PATCH] nfs4: Abandon owner and owner_group when id mapping causes problems --- src/add-ons/kernel/file_systems/nfs4/Inode.cpp | 10 ++++++++-- src/add-ons/kernel/file_systems/nfs4/InodeDir.cpp | 10 ++++++++-- src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp | 9 +++++++-- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp index 5199cb2055..055b6b2a68 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp @@ -340,6 +340,8 @@ Inode::Rename(Inode* from, Inode* to, const char* fromName, const char* toName) status_t Inode::CreateLink(const char* name, const char* path, int mode) { + bool badOwner = false; + do { RPC::Server* serv = fFilesystem->Server(); Request request(serv); @@ -354,14 +356,14 @@ Inode::CreateLink(const char* name, const char* path, int mode) cattr[i].fData.fValue32 = mode; i++; - if (fFilesystem->IsAttrSupported(FATTR4_OWNER)) { + if (!badOwner && fFilesystem->IsAttrSupported(FATTR4_OWNER)) { cattr[i].fAttribute = FATTR4_OWNER; cattr[i].fFreePointer = true; cattr[i].fData.fPointer = gIdMapper->GetOwner(getuid()); i++; } - if (fFilesystem->IsAttrSupported(FATTR4_OWNER_GROUP)) { + if (!badOwner && fFilesystem->IsAttrSupported(FATTR4_OWNER_GROUP)) { cattr[i].fAttribute = FATTR4_OWNER_GROUP; cattr[i].fFreePointer = true; cattr[i].fData.fPointer = gIdMapper->GetOwnerGroup(getgid()); @@ -376,6 +378,10 @@ Inode::CreateLink(const char* name, const char* path, int mode) ReplyInterpreter& reply = request.Reply(); + if (reply.NFS4Error() == NFS4ERR_BADOWNER) { + badOwner = true; + continue; + } if (_HandleErrors(reply.NFS4Error(), serv)) continue; diff --git a/src/add-ons/kernel/file_systems/nfs4/InodeDir.cpp b/src/add-ons/kernel/file_systems/nfs4/InodeDir.cpp index bde7506f66..19b274351d 100644 --- a/src/add-ons/kernel/file_systems/nfs4/InodeDir.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/InodeDir.cpp @@ -20,6 +20,8 @@ status_t Inode::CreateDir(const char* name, int mode) { + bool badOwner = false; + do { RPC::Server* serv = fFilesystem->Server(); Request request(serv); @@ -34,14 +36,14 @@ Inode::CreateDir(const char* name, int mode) cattr[i].fData.fValue32 = mode; i++; - if (fFilesystem->IsAttrSupported(FATTR4_OWNER)) { + if (!badOwner && fFilesystem->IsAttrSupported(FATTR4_OWNER)) { cattr[i].fAttribute = FATTR4_OWNER; cattr[i].fFreePointer = true; cattr[i].fData.fPointer = gIdMapper->GetOwner(getuid()); i++; } - if (fFilesystem->IsAttrSupported(FATTR4_OWNER_GROUP)) { + if (!badOwner && fFilesystem->IsAttrSupported(FATTR4_OWNER_GROUP)) { cattr[i].fAttribute = FATTR4_OWNER_GROUP; cattr[i].fFreePointer = true; cattr[i].fData.fPointer = gIdMapper->GetOwnerGroup(getgid()); @@ -56,6 +58,10 @@ Inode::CreateDir(const char* name, int mode) ReplyInterpreter& reply = request.Reply(); + if (reply.NFS4Error() == NFS4ERR_BADOWNER) { + badOwner = true; + continue; + } if (_HandleErrors(reply.NFS4Error(), serv)) continue; diff --git a/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp b/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp index 3f104fcbcf..742ba45bbe 100644 --- a/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp @@ -66,6 +66,7 @@ Inode::Create(const char* name, int mode, int perms, OpenFileCookie* cookie, cookie->fSequence = 0; cookie->fLocks = NULL; + bool badOwner = false; Filehandle fh; do { cookie->fClientId = fFilesystem->NFSServer()->ClientId(); @@ -91,14 +92,14 @@ Inode::Create(const char* name, int mode, int perms, OpenFileCookie* cookie, cattr[i].fData.fValue32 = perms; i++; - if (fFilesystem->IsAttrSupported(FATTR4_OWNER)) { + if (!badOwner && fFilesystem->IsAttrSupported(FATTR4_OWNER)) { cattr[i].fAttribute = FATTR4_OWNER; cattr[i].fFreePointer = true; cattr[i].fData.fPointer = gIdMapper->GetOwner(getuid()); i++; } - if (fFilesystem->IsAttrSupported(FATTR4_OWNER_GROUP)) { + if (!badOwner && fFilesystem->IsAttrSupported(FATTR4_OWNER_GROUP)) { cattr[i].fAttribute = FATTR4_OWNER_GROUP; cattr[i].fFreePointer = true; cattr[i].fData.fPointer = gIdMapper->GetOwnerGroup(getgid()); @@ -122,6 +123,10 @@ Inode::Create(const char* name, int mode, int perms, OpenFileCookie* cookie, ReplyInterpreter& reply = request.Reply(); + if (reply.NFS4Error() == NFS4ERR_BADOWNER) { + badOwner = true; + continue; + } if (_HandleErrors(reply.NFS4Error(), serv)) continue;