问题描述
做老化测试时,在使用U盘频繁快速插拔的情况下,SDCard目录会突然被Kill掉,然后又重新挂载上,这会导致系统及APP的数据因为读写异常,从而界面卡死正常U盘插拔不应该导致内部存储卸载
解决方案:
SDK根目录/system/vold 打上以下补丁解决
diff --git a/Process.cpp b/Process.cpp
index 277d6a39..62d51a22 100644
--- a/Process.cpp
+++ b/Process.cpp
@@ -39,6 +39,7 @@
#include <android-base/strings.h>
#include "Process.h"
+#include "Utils.h"
using android::base::StringPrintf;
@@ -127,7 +128,7 @@ int KillProcessesWithMounts(const std::string& prefix, int signal) {
return pids.size();
}
-int KillProcessesWithOpenFiles(const std::string& prefix, int signal) {
+int KillProcessesWithOpenFiles(const std::string& prefix, int signal, bool killFuseDaemon) {
std::unordered_set<pid_t> pids;
auto proc_d = std::unique_ptr<DIR, int (*)(DIR*)>(opendir("/proc"), closedir);
@@ -164,7 +165,11 @@ int KillProcessesWithOpenFiles(const std::string& prefix, int signal) {
}
if (found) {
- pids.insert(pid);
+ if (!IsFuseDaemon(pid) || killFuseDaemon) {
+ pids.insert(pid);
+ } else {
+ LOG(WARNING) << "Found FUSE daemon with open file. Skipping...";
+ }
}
}
if (signal != 0) {
diff --git a/Process.h b/Process.h
index 1c59812a..a56b9ceb 100644
--- a/Process.h
+++ b/Process.h
@@ -20,7 +20,7 @@
namespace android {
namespace vold {
-int KillProcessesWithOpenFiles(const std::string& path, int signal);
+int KillProcessesWithOpenFiles(const std::string& path, int signal, bool killFuseDaemon = true);
int KillProcessesWithMounts(const std::string& path, int signal);
} // namespace vold
diff --git a/Utils.cpp b/Utils.cpp
index cef0f399..9ff79202 100644
--- a/Utils.cpp
+++ b/Utils.cpp
@@ -525,24 +525,25 @@ status_t KillProcessesWithMountPrefix(const std::string& path) {
}
status_t KillProcessesUsingPath(const std::string& path) {
- if (KillProcessesWithOpenFiles(path, SIGINT) == 0) {
+ if (KillProcessesWithOpenFiles(path, SIGINT, false /* killFuseDaemon */) == 0) {
return OK;
}
if (sSleepOnUnmount) sleep(5);
- if (KillProcessesWithOpenFiles(path, SIGTERM) == 0) {
+ if (KillProcessesWithOpenFiles(path, SIGTERM, false /* killFuseDaemon */) == 0) {
return OK;
}
if (sSleepOnUnmount) sleep(5);
- if (KillProcessesWithOpenFiles(path, SIGKILL) == 0) {
+ if (KillProcessesWithOpenFiles(path, SIGKILL, false /* killFuseDaemon */) == 0) {
return OK;
}
if (sSleepOnUnmount) sleep(5);
// Send SIGKILL a second time to determine if we've
// actually killed everyone with open files
- if (KillProcessesWithOpenFiles(path, SIGKILL) == 0) {
+ // This time, we also kill the FUSE daemon if found
+ if (KillProcessesWithOpenFiles(path, SIGKILL, true /* killFuseDaemon */) == 0) {
return OK;
}
PLOG(ERROR) << "Failed to kill processes using " << path;