From e66cd9d71b0ae8fe311674bf7b87cb26d7452b61 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Thu, 2 Apr 2009 19:41:53 +0000 Subject: [PATCH] * For every request to userland we also send the team/thread/user/group ID of the current thread, now. Implemented by introducing a new base class KernelRequest which has respective attributes. * Server: RequestThreadContext does now also save the request that is being processed. Furthermore some space has been reserved for file system specific data, which can be initialized by the new FileSystem::InitRequestThreadContext(). * FUSE library: Implemented fuse_get_context() using the new RequestThreadContext feature. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29872 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/userlandfs/private/Requests.h | 22 ++- .../userlandfs/kernel_add_on/Volume.cpp | 10 ++ .../userlandfs/server/FileSystem.cpp | 11 +- .../userlandfs/server/FileSystem.h | 11 +- .../userlandfs/server/RequestThread.cpp | 27 +++- .../userlandfs/server/RequestThread.h | 15 +- .../server/UserlandRequestHandler.cpp | 137 +++++++++--------- .../userlandfs/server/fuse/FUSEFileSystem.cpp | 26 ++++ .../userlandfs/server/fuse/FUSEFileSystem.h | 3 + .../userlandfs/server/fuse/FUSEVolume.cpp | 6 + .../userlandfs/server/fuse/fuse_main.cpp | 12 ++ 11 files changed, 193 insertions(+), 87 deletions(-) diff --git a/headers/private/userlandfs/private/Requests.h b/headers/private/userlandfs/private/Requests.h index fdf15a5c27..592a9c447c 100644 --- a/headers/private/userlandfs/private/Requests.h +++ b/headers/private/userlandfs/private/Requests.h @@ -256,10 +256,21 @@ public: // #pragma mark - kernel requests -// VolumeRequest -class VolumeRequest : public Request { +// KernelRequest +class KernelRequest : public Request { public: - VolumeRequest(uint32 type) : Request(type) {} + KernelRequest(uint32 type) : Request(type) {} + + team_id team; + thread_id thread; + uid_t user; + gid_t group; +}; + +// VolumeRequest +class VolumeRequest : public KernelRequest { +public: + VolumeRequest(uint32 type) : KernelRequest(type) {} void* volume; }; @@ -365,9 +376,9 @@ public: // MountVolumeRequest -class MountVolumeRequest : public Request { +class MountVolumeRequest : public KernelRequest { public: - MountVolumeRequest() : Request(MOUNT_VOLUME_REQUEST) {} + MountVolumeRequest() : KernelRequest(MOUNT_VOLUME_REQUEST) {} status_t GetAddressInfos(AddressInfo* infos, int32* count); dev_t nsid; @@ -2235,6 +2246,7 @@ status_t relocate_request(Request* request, int32 requestBufferSize, } // namespace UserlandFSUtil using UserlandFSUtil::ReplyRequest; +using UserlandFSUtil::KernelRequest; using UserlandFSUtil::VolumeRequest; using UserlandFSUtil::NodeRequest; using UserlandFSUtil::FileRequest; diff --git a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.cpp b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.cpp index ff4327aba2..944df6a8f0 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.cpp @@ -18,6 +18,7 @@ #include #include // kernel private +#include #include "IORequest.h" // kernel internal @@ -4327,6 +4328,15 @@ status_t Volume::_SendRequest(RequestPort* port, RequestAllocator* allocator, RequestHandler* handler, Request** reply) { + // fill in the caller info + KernelRequest* request = static_cast( + allocator->GetRequest()); + struct thread* thread = thread_get_current_thread(); + request->team = thread->team->id; + request->thread = thread->id; + request->user = geteuid(); + request->group = getegid(); + if (!fFileSystem->IsUserlandServerThread()) return port->SendRequest(allocator, handler, reply); // Here it gets dangerous: a thread of the userland server team being here diff --git a/src/add-ons/kernel/file_systems/userlandfs/server/FileSystem.cpp b/src/add-ons/kernel/file_systems/userlandfs/server/FileSystem.cpp index 2fb7c597fe..ab7d1bf11f 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/server/FileSystem.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/server/FileSystem.cpp @@ -1,4 +1,7 @@ -// FileSystem.cpp +/* + * Copyright 2001-2009, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ #include "FileSystem.h" @@ -32,6 +35,12 @@ FileSystem::GetInstance() } +void +FileSystem::InitRequestThreadContext(RequestThreadContext* context) +{ +} + + void FileSystem::RegisterVolume(Volume* volume) { diff --git a/src/add-ons/kernel/file_systems/userlandfs/server/FileSystem.h b/src/add-ons/kernel/file_systems/userlandfs/server/FileSystem.h index eb39919824..f87c28e677 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/server/FileSystem.h +++ b/src/add-ons/kernel/file_systems/userlandfs/server/FileSystem.h @@ -1,5 +1,7 @@ -// FileSystem.h - +/* + * Copyright 2001-2009, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ #ifndef USERLAND_FS_FILE_SYSTEM_H #define USERLAND_FS_FILE_SYSTEM_H @@ -15,8 +17,10 @@ namespace UserlandFS { +class RequestThreadContext; class Volume; + class FileSystem { public: FileSystem(const char* fsName); @@ -29,6 +33,9 @@ public: virtual status_t CreateVolume(Volume** volume, dev_t id) = 0; virtual status_t DeleteVolume(Volume* volume) = 0; + virtual void InitRequestThreadContext( + RequestThreadContext* context); + void RegisterVolume(Volume* volume); void UnregisterVolume(Volume* volume); Volume* VolumeWithID(dev_t id); diff --git a/src/add-ons/kernel/file_systems/userlandfs/server/RequestThread.cpp b/src/add-ons/kernel/file_systems/userlandfs/server/RequestThread.cpp index 1e4a486b87..8612306c47 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/server/RequestThread.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/server/RequestThread.cpp @@ -1,28 +1,39 @@ -// RequestThread.cpp +/* + * Copyright 2001-2009, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ + +#include "RequestThread.h" #include #include -#include "RequestThread.h" +#include "FileSystem.h" #include "ServerDefs.h" #include "UserlandRequestHandler.h" +#include "Volume.h" -using std::nothrow; static const int32 sTLSVariable = tls_allocate(); + // constructor -RequestThreadContext::RequestThreadContext(Volume* volume) - : fPreviousContext(NULL), - fThread(NULL), - fVolume(volume) +RequestThreadContext::RequestThreadContext(Volume* volume, + KernelRequest* request) + : + fPreviousContext(NULL), + fThread(NULL), + fVolume(volume), + fRequest(request) { fThread = RequestThread::GetCurrentThread(); if (fThread) { fPreviousContext = fThread->GetContext(); fThread->SetContext(this); } + + volume->GetFileSystem()->InitRequestThreadContext(this); } // destructor @@ -74,7 +85,7 @@ RequestThread::Init(FileSystem* fileSystem) if (!fileSystem) return B_BAD_VALUE; // create the port - fPort = new(nothrow) RequestPort(kRequestPortSize); + fPort = new(std::nothrow) RequestPort(kRequestPortSize); if (!fPort) return B_NO_MEMORY; status_t error = fPort->InitCheck(); diff --git a/src/add-ons/kernel/file_systems/userlandfs/server/RequestThread.h b/src/add-ons/kernel/file_systems/userlandfs/server/RequestThread.h index 28dd82a1ee..5a80e91ade 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/server/RequestThread.h +++ b/src/add-ons/kernel/file_systems/userlandfs/server/RequestThread.h @@ -1,5 +1,7 @@ -// RequestThread.h - +/* + * Copyright 2001-2009, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ #ifndef USERLAND_FS_REQUEST_THREAD_H #define USERLAND_FS_REQUEST_THREAD_H @@ -11,19 +13,26 @@ class FileSystem; class RequestThread; class Volume; +#define REQUEST_THREAD_CONTEXT_FS_DATA_SIZE 256 + // RequestThreadContext class RequestThreadContext { public: - RequestThreadContext(Volume* volume); + RequestThreadContext(Volume* volume, + KernelRequest* request); ~RequestThreadContext(); RequestThread* GetThread() const; Volume* GetVolume() const; + KernelRequest* GetRequest() const { return fRequest; } + void* GetFSData() { return fFSData; } private: RequestThreadContext* fPreviousContext; RequestThread* fThread; Volume* fVolume; + KernelRequest* fRequest; + uint8 fFSData[REQUEST_THREAD_CONTEXT_FS_DATA_SIZE]; }; // RequestThread diff --git a/src/add-ons/kernel/file_systems/userlandfs/server/UserlandRequestHandler.cpp b/src/add-ons/kernel/file_systems/userlandfs/server/UserlandRequestHandler.cpp index f5c92e4456..4f61daa61d 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/server/UserlandRequestHandler.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/server/UserlandRequestHandler.cpp @@ -51,6 +51,7 @@ UserlandRequestHandler::HandleRequest(Request* request) fDone = true; return B_OK; } + switch (request->GetType()) { // FS case MOUNT_VOLUME_REQUEST: @@ -253,7 +254,7 @@ UserlandRequestHandler::_HandleRequest(MountVolumeRequest* request) // mount it ino_t rootID; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->Mount(device, request->flags, (const char*)request->parameters.GetData(), &rootID); if (result != B_OK) @@ -288,7 +289,7 @@ UserlandRequestHandler::_HandleRequest(UnmountVolumeRequest* request) if (!volume) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->Unmount(); } @@ -314,7 +315,7 @@ UserlandRequestHandler::_HandleRequest(SyncVolumeRequest* request) if (!volume) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->Sync(); } // prepare the reply @@ -340,7 +341,7 @@ UserlandRequestHandler::_HandleRequest(ReadFSInfoRequest* request) result = B_BAD_VALUE; fs_info info; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->ReadFSInfo(&info); } // prepare the reply @@ -366,7 +367,7 @@ UserlandRequestHandler::_HandleRequest(WriteFSInfoRequest* request) if (!volume) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->WriteFSInfo(&request->info, request->mask); } @@ -398,7 +399,7 @@ UserlandRequestHandler::_HandleRequest(LookupRequest* request) ino_t vnid = 0; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->Lookup(request->node, (const char*)request->entryName.GetData(), &vnid); } @@ -444,7 +445,7 @@ UserlandRequestHandler::_HandleRequest(GetVNodeNameRequest* request) // execute the request if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->GetVNodeName(node, buffer, bufferSize); } @@ -471,7 +472,7 @@ UserlandRequestHandler::_HandleRequest(ReadVNodeRequest* request) uint32 flags; FSVNodeCapabilities capabilities; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->ReadVNode(request->vnid, request->reenter, &node, &type, &flags, &capabilities); } @@ -504,7 +505,7 @@ UserlandRequestHandler::_HandleRequest(WriteVNodeRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->WriteVNode(request->node, request->reenter); } @@ -532,7 +533,7 @@ UserlandRequestHandler::_HandleRequest(FSRemoveVNodeRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->RemoveVNode(request->node, request->reenter); } @@ -563,7 +564,7 @@ UserlandRequestHandler::_HandleRequest(DoIORequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); IORequestInfo requestInfo(request->request, request->isWrite, request->offset, request->length); result = volume->DoIO(request->node, request->fileCookie, requestInfo); @@ -593,7 +594,7 @@ UserlandRequestHandler::_HandleRequest(CancelIORequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->CancelIO(request->node, request->fileCookie, request->request); } @@ -625,7 +626,7 @@ UserlandRequestHandler::_HandleRequest(IterativeIOGetVecsRequest* request) file_io_vec vecs[IterativeIOGetVecsReply::MAX_VECS]; size_t vecCount = IterativeIOGetVecsReply::MAX_VECS; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->IterativeIOGetVecs(request->cookie, request->request, request->offset, request->size, vecs, &vecCount); if (result == B_OK) { @@ -664,7 +665,7 @@ UserlandRequestHandler::_HandleRequest(IterativeIOFinishedRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->IterativeIOFinished(request->cookie, request->request, request->status, request->partialTransfer, request->bytesTransferred); @@ -729,7 +730,7 @@ UserlandRequestHandler::_HandleRequest(IOCtlRequest* request) // execute the request status_t ioctlError = B_OK; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); ioctlError = volume->IOCtl(request->node, request->fileCookie, request->command, buffer, len); } @@ -754,7 +755,7 @@ UserlandRequestHandler::_HandleRequest(SetFlagsRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->SetFlags(request->node, request->fileCookie, request->flags); } @@ -783,7 +784,7 @@ UserlandRequestHandler::_HandleRequest(SelectRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->Select(request->node, request->fileCookie, request->event, request->sync); } @@ -812,7 +813,7 @@ UserlandRequestHandler::_HandleRequest(DeselectRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->Deselect(request->node, request->fileCookie, request->event, request->sync); } @@ -841,7 +842,7 @@ UserlandRequestHandler::_HandleRequest(FSyncRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->FSync(request->node); } @@ -886,7 +887,7 @@ UserlandRequestHandler::_HandleRequest(ReadSymlinkRequest* request) // execute the request size_t bytesRead; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->ReadSymlink(node, buffer, bufferSize, &bytesRead); } @@ -910,7 +911,7 @@ UserlandRequestHandler::_HandleRequest(CreateSymlinkRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->CreateSymlink(request->node, (const char*)request->name.GetData(), (const char*)request->target.GetData(), request->mode); @@ -940,7 +941,7 @@ UserlandRequestHandler::_HandleRequest(LinkRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->Link(request->node, (const char*)request->name.GetData(), request->target); } @@ -969,7 +970,7 @@ UserlandRequestHandler::_HandleRequest(UnlinkRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->Unlink(request->node, (const char*)request->name.GetData()); } @@ -998,7 +999,7 @@ UserlandRequestHandler::_HandleRequest(RenameRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->Rename(request->oldDir, (const char*)request->oldName.GetData(), request->newDir, (const char*)request->newName.GetData()); @@ -1028,7 +1029,7 @@ UserlandRequestHandler::_HandleRequest(AccessRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->Access(request->node, request->mode); } @@ -1057,7 +1058,7 @@ UserlandRequestHandler::_HandleRequest(ReadStatRequest* request) struct stat st; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->ReadStat(request->node, &st); } @@ -1086,7 +1087,7 @@ UserlandRequestHandler::_HandleRequest(WriteStatRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->WriteStat(request->node, &request->st, request->mask); } @@ -1120,7 +1121,7 @@ UserlandRequestHandler::_HandleRequest(CreateRequest* request) ino_t vnid; void* fileCookie; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->Create(request->node, (const char*)request->name.GetData(), request->openMode, request->mode, &fileCookie, &vnid); @@ -1153,7 +1154,7 @@ UserlandRequestHandler::_HandleRequest(OpenRequest* request) void* fileCookie; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->Open(request->node, request->openMode, &fileCookie); } @@ -1182,7 +1183,7 @@ UserlandRequestHandler::_HandleRequest(CloseRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->Close(request->node, request->fileCookie); } @@ -1210,7 +1211,7 @@ UserlandRequestHandler::_HandleRequest(FreeCookieRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->FreeCookie(request->node, request->fileCookie); } @@ -1258,7 +1259,7 @@ UserlandRequestHandler::_HandleRequest(ReadRequest* request) // execute the request size_t bytesRead; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->Read(node, fileCookie, pos, buffer, size, &bytesRead); } @@ -1283,7 +1284,7 @@ UserlandRequestHandler::_HandleRequest(WriteRequest* request) size_t bytesWritten; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->Write(request->node, request->fileCookie, request->pos, request->buffer.GetData(), request->buffer.GetSize(), &bytesWritten); @@ -1318,7 +1319,7 @@ UserlandRequestHandler::_HandleRequest(CreateDirRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->CreateDir(request->node, (const char*)request->name.GetData(), request->mode); } @@ -1347,7 +1348,7 @@ UserlandRequestHandler::_HandleRequest(RemoveDirRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->RemoveDir(request->node, (const char*)request->name.GetData()); } @@ -1377,7 +1378,7 @@ UserlandRequestHandler::_HandleRequest(OpenDirRequest* request) void* dirCookie = NULL; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->OpenDir(request->node, &dirCookie); } @@ -1406,7 +1407,7 @@ UserlandRequestHandler::_HandleRequest(CloseDirRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->CloseDir(request->node, request->dirCookie); } @@ -1434,7 +1435,7 @@ UserlandRequestHandler::_HandleRequest(FreeDirCookieRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->FreeDirCookie(request->node, request->dirCookie); } @@ -1482,7 +1483,7 @@ UserlandRequestHandler::_HandleRequest(ReadDirRequest* request) // execute the request uint32 countRead; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->ReadDir(node, dirCookie, buffer, bufferSize, count, &countRead); } @@ -1517,7 +1518,7 @@ UserlandRequestHandler::_HandleRequest(RewindDirRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->RewindDir(request->node, request->dirCookie); } @@ -1550,7 +1551,7 @@ UserlandRequestHandler::_HandleRequest(OpenAttrDirRequest* request) void* attrDirCookie; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->OpenAttrDir(request->node, &attrDirCookie); } @@ -1579,7 +1580,7 @@ UserlandRequestHandler::_HandleRequest(CloseAttrDirRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->CloseAttrDir(request->node, request->attrDirCookie); } @@ -1607,7 +1608,7 @@ UserlandRequestHandler::_HandleRequest(FreeAttrDirCookieRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->FreeAttrDirCookie(request->node, request->attrDirCookie); } @@ -1656,7 +1657,7 @@ UserlandRequestHandler::_HandleRequest(ReadAttrDirRequest* request) // execute the request uint32 countRead; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->ReadAttrDir(node, attrDirCookie, buffer, bufferSize, count, &countRead); } @@ -1681,7 +1682,7 @@ UserlandRequestHandler::_HandleRequest(RewindAttrDirRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->RewindAttrDir(request->node, request->attrDirCookie); } @@ -1714,7 +1715,7 @@ UserlandRequestHandler::_HandleRequest(CreateAttrRequest* request) void* attrCookie; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->CreateAttr(request->node, (const char*)request->name.GetData(), request->type, request->openMode, &attrCookie); @@ -1746,7 +1747,7 @@ UserlandRequestHandler::_HandleRequest(OpenAttrRequest* request) void* attrCookie; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->OpenAttr(request->node, (const char*)request->name.GetData(), request->openMode, &attrCookie); @@ -1777,7 +1778,7 @@ UserlandRequestHandler::_HandleRequest(CloseAttrRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->CloseAttr(request->node, request->attrCookie); } @@ -1805,7 +1806,7 @@ UserlandRequestHandler::_HandleRequest(FreeAttrCookieRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->FreeAttrCookie(request->node, request->attrCookie); } @@ -1853,7 +1854,7 @@ UserlandRequestHandler::_HandleRequest(ReadAttrRequest* request) // execute the request size_t bytesRead; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->ReadAttr(node, attrCookie, pos, buffer, size, &bytesRead); } @@ -1879,7 +1880,7 @@ UserlandRequestHandler::_HandleRequest(WriteAttrRequest* request) size_t bytesWritten; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->WriteAttr(request->node, request->attrCookie, request->pos, request->buffer.GetData(), request->buffer.GetSize(), &bytesWritten); @@ -1911,7 +1912,7 @@ UserlandRequestHandler::_HandleRequest(ReadAttrStatRequest* request) struct stat st; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->ReadAttrStat(request->node, request->attrCookie, &st); } @@ -1941,7 +1942,7 @@ UserlandRequestHandler::_HandleRequest(WriteAttrStatRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->WriteAttrStat(request->node, request->attrCookie, &request->st, request->mask); } @@ -1970,7 +1971,7 @@ UserlandRequestHandler::_HandleRequest(RenameAttrRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->RenameAttr( request->oldNode, (const char*)request->oldName.GetData(), request->newNode, (const char*)request->newName.GetData()); @@ -2000,7 +2001,7 @@ UserlandRequestHandler::_HandleRequest(RemoveAttrRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->RemoveAttr(request->node, (const char*)request->name.GetData()); } @@ -2034,7 +2035,7 @@ UserlandRequestHandler::_HandleRequest(OpenIndexDirRequest* request) void* indexDirCookie; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->OpenIndexDir(&indexDirCookie); } @@ -2063,7 +2064,7 @@ UserlandRequestHandler::_HandleRequest(CloseIndexDirRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->CloseIndexDir(request->indexDirCookie); } @@ -2091,7 +2092,7 @@ UserlandRequestHandler::_HandleRequest(FreeIndexDirCookieRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->FreeIndexDirCookie(request->indexDirCookie); } @@ -2138,7 +2139,7 @@ UserlandRequestHandler::_HandleRequest(ReadIndexDirRequest* request) // execute the request uint32 countRead; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->ReadIndexDir(indexDirCookie, buffer, bufferSize, count, &countRead); } @@ -2163,7 +2164,7 @@ UserlandRequestHandler::_HandleRequest(RewindIndexDirRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->RewindIndexDir(request->indexDirCookie); } @@ -2191,7 +2192,7 @@ UserlandRequestHandler::_HandleRequest(CreateIndexRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->CreateIndex((const char*)request->name.GetData(), request->type, request->flags); } @@ -2220,7 +2221,7 @@ UserlandRequestHandler::_HandleRequest(RemoveIndexRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->RemoveIndex((const char*)request->name.GetData()); } @@ -2249,7 +2250,7 @@ UserlandRequestHandler::_HandleRequest(ReadIndexStatRequest* request) struct stat st; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->ReadIndexStat((const char*)request->name.GetData(), &st); } @@ -2284,7 +2285,7 @@ UserlandRequestHandler::_HandleRequest(OpenQueryRequest* request) void* queryCookie; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->OpenQuery((const char*)request->queryString.GetData(), request->flags, request->port, request->token, &queryCookie); } @@ -2314,7 +2315,7 @@ UserlandRequestHandler::_HandleRequest(CloseQueryRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->CloseQuery(request->queryCookie); } @@ -2342,7 +2343,7 @@ UserlandRequestHandler::_HandleRequest(FreeQueryCookieRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->FreeQueryCookie(request->queryCookie); } @@ -2389,7 +2390,7 @@ UserlandRequestHandler::_HandleRequest(ReadQueryRequest* request) // execute the request uint32 countRead; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->ReadQuery(queryCookie, buffer, bufferSize, count, &countRead); } @@ -2414,7 +2415,7 @@ UserlandRequestHandler::_HandleRequest(RewindQueryRequest* request) result = B_BAD_VALUE; if (result == B_OK) { - RequestThreadContext context(volume); + RequestThreadContext context(volume, request); result = volume->RewindQuery(request->queryCookie); } diff --git a/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEFileSystem.cpp b/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEFileSystem.cpp index 5da158c901..87bbbd159e 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEFileSystem.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEFileSystem.cpp @@ -13,6 +13,8 @@ #include "fuse_fs.h" #include "FUSEVolume.h" +#include "../RequestThread.h" + class FUSEFileSystem::ArgumentVector { private: @@ -180,6 +182,30 @@ FUSEFileSystem::DeleteVolume(Volume* volume) } +void +FUSEFileSystem::InitRequestThreadContext(RequestThreadContext* context) +{ + // Statically assert that fuse_context fits in the RequestThreadContext + // FS data. We can't include as it clashes with our "Debug.h". + do { + static const int staticAssertHolds + = sizeof(fuse_context) <= REQUEST_THREAD_CONTEXT_FS_DATA_SIZE; + struct __staticAssertStruct__ { + char __static_assert_failed__[2 * staticAssertHolds - 1]; + }; + } while (false); + + // init a fuse_context + KernelRequest* request = context->GetRequest(); + fuse_context* fuseContext = (fuse_context*)context->GetFSData(); + fuseContext->fuse = (struct fuse*)this; + fuseContext->uid = request->user; + fuseContext->gid = request->group; + fuseContext->pid = request->team; + fuseContext->private_data = fFS != NULL ? fFS->userData : NULL; +} + + status_t FUSEFileSystem::InitClientFS(const char* parameters) { diff --git a/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEFileSystem.h b/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEFileSystem.h index 6fb30136f0..1f6f6d729d 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEFileSystem.h +++ b/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEFileSystem.h @@ -38,6 +38,9 @@ public: virtual status_t CreateVolume(Volume** _volume, dev_t id); virtual status_t DeleteVolume(Volume* volume); + virtual void InitRequestThreadContext( + RequestThreadContext* context); + status_t InitClientFS(const char* parameters); void ExitClientFS(status_t status); diff --git a/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEVolume.cpp b/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEVolume.cpp index 070b14bcb9..2bda9edfca 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEVolume.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEVolume.cpp @@ -17,6 +17,7 @@ #include "FUSEFileSystem.h" #include "../kernel_emu.h" +#include "../RequestThread.h" // TODO: For remote/shared file systems (sshfs, nfs, etc.) we need to notice @@ -673,6 +674,11 @@ printf("FUSEVolume::Mount()\n"); const fuse_config& config = _FileSystem()->GetFUSEConfig(); fUseNodeIDs = config.use_ino; + // update the fuse_context::private_data field before calling into the FS + fuse_context* context = (fuse_context*)RequestThread::GetCurrentThread() + ->GetContext()->GetFSData(); + context->private_data = fFS->userData; + // get the root node struct stat st; int fuseError = fuse_fs_getattr(fFS, "/", &st); diff --git a/src/add-ons/kernel/file_systems/userlandfs/server/fuse/fuse_main.cpp b/src/add-ons/kernel/file_systems/userlandfs/server/fuse/fuse_main.cpp index 98f12d9455..1ffbc40b41 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/server/fuse/fuse_main.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/server/fuse/fuse_main.cpp @@ -10,6 +10,8 @@ #include "fuse_config.h" #include "FUSEFileSystem.h" +#include "../RequestThread.h" + int fuse_main_real(int argc, char* argv[], const struct fuse_operations* op, @@ -48,3 +50,13 @@ fuse_version(void) { return FUSE_VERSION; } + + +struct fuse_context* +fuse_get_context(void) +{ + RequestThread* requestThread = RequestThread::GetCurrentThread(); + return requestThread != NULL + ? (fuse_context*)requestThread->GetContext()->GetFSData() + : NULL; +}