From 383ac67cfab616cbaf21f028b319ca4662558ba3 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Tue, 10 Sep 2013 19:03:21 +0200 Subject: [PATCH] package daemon: Let Root know whether it is the system root --- src/servers/package/PackageDaemon.cpp | 17 +++++++++++------ src/servers/package/Root.cpp | 4 +++- src/servers/package/Root.h | 4 +++- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/servers/package/PackageDaemon.cpp b/src/servers/package/PackageDaemon.cpp index 426d5e3592..0c052137d3 100644 --- a/src/servers/package/PackageDaemon.cpp +++ b/src/servers/package/PackageDaemon.cpp @@ -59,11 +59,6 @@ PackageDaemon::Init() _RegisterVolume(device); } - // find the system root - struct stat st; - if (stat("/boot", &st) == 0) - fSystemRoot = _FindRoot(node_ref(st.st_dev, st.st_ino)); - return B_OK; } @@ -175,7 +170,14 @@ PackageDaemon::_GetOrCreateRoot(const node_ref& nodeRef, Root*& _root) RETURN_ERROR(B_NO_MEMORY); ObjectDeleter rootDeleter(root); - status_t error = root->Init(nodeRef); + bool isSystemRoot = false; + if (fSystemRoot == NULL) { + struct stat st; + isSystemRoot = stat("/boot", &st) == 0 + && node_ref(st.st_dev, st.st_ino) == nodeRef; + } + + status_t error = root->Init(nodeRef, isSystemRoot); if (error != B_OK) RETURN_ERROR(error); @@ -184,6 +186,9 @@ PackageDaemon::_GetOrCreateRoot(const node_ref& nodeRef, Root*& _root) rootDeleter.Detach(); + if (isSystemRoot) + fSystemRoot = root; + INFORM("root at \"%s\" (device: %" B_PRIdDEV ", node: %" B_PRIdINO ") " "registered\n", root->Path().String(), nodeRef.device, nodeRef.node); diff --git a/src/servers/package/Root.cpp b/src/servers/package/Root.cpp index bb3ac96aad..ebc3e7d26c 100644 --- a/src/servers/package/Root.cpp +++ b/src/servers/package/Root.cpp @@ -76,6 +76,7 @@ Root::Root() : fLock("packagefs root"), fNodeRef(), + fIsSystemRoot(false), fPath(), fSystemVolume(NULL), fCommonVolume(NULL), @@ -96,9 +97,10 @@ Root::~Root() status_t -Root::Init(const node_ref& nodeRef) +Root::Init(const node_ref& nodeRef, bool isSystemRoot) { fNodeRef = nodeRef; + fIsSystemRoot = isSystemRoot; // init members and spawn job runner thread status_t error = fJobQueue.Init(); diff --git a/src/servers/package/Root.h b/src/servers/package/Root.h index 512cd23abe..470eb1e9e5 100644 --- a/src/servers/package/Root.h +++ b/src/servers/package/Root.h @@ -29,7 +29,8 @@ public: Root(); virtual ~Root(); - status_t Init(const node_ref& nodeRef); + status_t Init(const node_ref& nodeRef, + bool isSystemRoot); const node_ref& NodeRef() const { return fNodeRef; } dev_t DeviceID() const { return fNodeRef.device; } @@ -76,6 +77,7 @@ private: private: mutable BLocker fLock; node_ref fNodeRef; + bool fIsSystemRoot; BString fPath; Volume* fSystemVolume; Volume* fCommonVolume;