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;
}