Fix for CTS test CtsAppSecurityHostTestCases

Fix random failures while running CtsAppSecurityHostTestCases with
adoptable storage due to a format failure. The crypto_blkdev node
might not be immediately available after create sometimes. Adding
a wait in create to make sure the node is available.

Issue: FP2P-515
CRs-Fixed: 2324063
Change-Id: I8a7599a9253ac530b05a97ed34829dad1f7f7a40
(cherry picked from commit ac25543bc8ef0f485d4771349ea155eb6e8746e3)
diff --git a/model/PrivateVolume.cpp b/model/PrivateVolume.cpp
index cf21577..f21e956 100644
--- a/model/PrivateVolume.cpp
+++ b/model/PrivateVolume.cpp
@@ -36,6 +36,9 @@
 #include <sys/wait.h>
 #include <sys/param.h>
 
+#define RETRY_MOUNT_ATTEMPTS 10
+#define RETRY_MOUNT_DELAY_SECONDS 1
+
 using android::base::StringPrintf;
 
 namespace android {
@@ -86,6 +89,26 @@
         return -EIO;
     }
 
+    int fd = 0;
+    int retries = RETRY_MOUNT_ATTEMPTS;
+    while ((fd = open(crypto_blkdev, O_WRONLY|O_CLOEXEC)) < 0) {
+        if (retries > 0) {
+            retries--;
+            PLOG(ERROR) << "Error opening crypto_blkdev " << crypto_blkdev
+                            << " for private volume. err=" << errno
+                            << "(" << strerror(errno) << "), retrying for the "
+                            << RETRY_MOUNT_ATTEMPTS - retries << " time";
+            sleep(RETRY_MOUNT_DELAY_SECONDS);
+        } else {
+            PLOG(ERROR) << "Error opening crypto_blkdev " << crypto_blkdev
+                            << " for private volume. err=" << errno
+                            << "(" << strerror(errno) << "), retried "
+                            << RETRY_MOUNT_ATTEMPTS << " times";
+            close(fd);
+            return -EIO;
+        }
+    }
+    close(fd);
     return OK;
 }