OSDN Git Service

Block and wait for /dev/block/loop<N> to appear in case it was created asynchronously.
authorDavid Anderson <dvander@google.com>
Tue, 11 Jun 2019 21:51:25 +0000 (14:51 -0700)
committerDavid Anderson <dvander@google.com>
Tue, 18 Jun 2019 22:27:37 +0000 (15:27 -0700)
Bug: 134711825
Test: StorageManagerTest
Change-Id: Id8616804bba622226ca21b8eff0d3eb577b4b7e0

Loop.cpp

index fa8f8ba..9fa876c 100644 (file)
--- a/Loop.cpp
+++ b/Loop.cpp
 
 #include <linux/kdev_t.h>
 
+#include <chrono>
+
 #include <android-base/logging.h>
 #include <android-base/stringprintf.h>
 #include <android-base/strings.h>
 #include <android-base/unique_fd.h>
+#include <fs_mgr/file_wait.h>
 #include <utils/Trace.h>
 
 #include "Loop.h"
 #include "VoldUtil.h"
 #include "sehandle.h"
 
+using namespace std::literals;
 using android::base::StringPrintf;
 using android::base::unique_fd;
 
@@ -74,6 +78,10 @@ int Loop::create(const std::string& target, std::string& out_device) {
         PLOG(ERROR) << "Failed to open " << target;
         return -errno;
     }
+    if (!android::fs_mgr::WaitForFile(out_device, 2s)) {
+        LOG(ERROR) << "Failed to find " << out_device;
+        return -ENOENT;
+    }
     unique_fd device_fd(open(out_device.c_str(), O_RDWR | O_CLOEXEC));
     if (device_fd.get() == -1) {
         PLOG(ERROR) << "Failed to open " << out_device;