Set media folder +F for adopted storage as well
We previously only set +F for /data/media, but adopted storage needs
this as well. Instead we add support for adding attrs to PrepareDir.
Bug: 163453310
Test: sm set-virtual-disk true
follow UI setup and confirm +F on /mnt/expand/*/media
Change-Id: I08f13b57a4de3538e88b38eb95b0ac115a5a5ce8
Merged-In: I08f13b57a4de3538e88b38eb95b0ac115a5a5ce8
diff --git a/Utils.cpp b/Utils.cpp
index a9b7440..17921e8 100644
--- a/Utils.cpp
+++ b/Utils.cpp
@@ -416,7 +416,32 @@
return OK;
}
-status_t PrepareDir(const std::string& path, mode_t mode, uid_t uid, gid_t gid) {
+int SetAttrs(const std::string& path, unsigned int attrs) {
+ unsigned long flags;
+ android::base::unique_fd fd(
+ TEMP_FAILURE_RETRY(open(path.c_str(), O_RDONLY | O_NONBLOCK | O_CLOEXEC)));
+
+ if (fd == -1) {
+ PLOG(ERROR) << "Failed to open " << path;
+ return -1;
+ }
+
+ if (ioctl(fd, FS_IOC_GETFLAGS, (void*)&flags)) {
+ PLOG(ERROR) << "Failed to get flags for " << path;
+ return -1;
+ }
+
+ if ((flags & attrs) == attrs) return 0;
+ flags |= attrs;
+ if (ioctl(fd, FS_IOC_SETFLAGS, (void*)&flags)) {
+ PLOG(ERROR) << "Failed to set flags for " << path << "(0x" << std::hex << attrs << ")";
+ return -1;
+ }
+ return 0;
+}
+
+status_t PrepareDir(const std::string& path, mode_t mode, uid_t uid, gid_t gid,
+ unsigned int attrs) {
std::lock_guard<std::mutex> lock(kSecurityLock);
const char* cpath = path.c_str();
@@ -434,6 +459,9 @@
freecon(secontext);
}
+ if (res) return -errno;
+ if (attrs) res = SetAttrs(path, attrs);
+
if (res == 0) {
return OK;
} else {