Merge "Retry deleting dm devices."
diff --git a/cryptfs.cpp b/cryptfs.cpp
index e00165f..1596460 100644
--- a/cryptfs.cpp
+++ b/cryptfs.cpp
@@ -64,6 +64,9 @@
#include <time.h>
#include <unistd.h>
+#include <chrono>
+#include <thread>
+
extern "C" {
#include <crypto_scrypt.h>
}
@@ -1220,9 +1223,22 @@
}
static int delete_crypto_blk_dev(const std::string& name) {
+ bool ret;
auto& dm = DeviceMapper::Instance();
- if (!dm.DeleteDevice(name)) {
- SLOGE("Cannot remove dm-crypt device %s: %s\n", name.c_str(), strerror(errno));
+ // TODO(b/149396179) there appears to be a race somewhere in the system where trying
+ // to delete the device fails with EBUSY; for now, work around this by retrying.
+ int tries = 5;
+ while (tries-- > 0) {
+ ret = dm.DeleteDevice(name);
+ if (ret || errno != EBUSY) {
+ break;
+ }
+ SLOGW("DM_DEV Cannot remove dm-crypt device %s: %s, retrying...\n", name.c_str(),
+ strerror(errno));
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+ }
+ if (!ret) {
+ SLOGE("DM_DEV Cannot remove dm-crypt device %s: %s\n", name.c_str(), strerror(errno));
return -1;
}
return 0;