[incfs] Use new IncFs_ReleaseControlFds() instead of duping

Vold needs to pass / accept IncFs control via Binder, so it
neeeds to get and put its internal FDs in and out. Using the new
release() function it works without extra fd duping

Bug: 153704006
Test: builds & boots
Change-Id: I64bc5b1ca9f2c69e34c3a860ed3edbe58bd9ea29
gugelfrei
Yurii Zubrytskyi 4 years ago
parent 4e1e7ef09a
commit fc7b6697b4

@ -41,7 +41,7 @@
#include "VoldUtil.h"
#include "VolumeManager.h"
#include "cryptfs.h"
#include "incfs_ndk.h"
#include "incfs.h"
using android::base::StringPrintf;
using std::endl;
@ -879,7 +879,7 @@ binder::Status VoldNativeService::resetCheckpoint() {
binder::Status VoldNativeService::incFsEnabled(bool* _aidl_return) {
ENFORCE_SYSTEM_OR_ROOT;
*_aidl_return = IncFs_IsEnabled();
*_aidl_return = incfs::enabled();
return Ok();
}
@ -890,22 +890,19 @@ binder::Status VoldNativeService::mountIncFs(
CHECK_ARGUMENT_PATH(backingPath);
CHECK_ARGUMENT_PATH(targetDir);
auto control = IncFs_Mount(backingPath.c_str(), targetDir.c_str(),
{.flags = IncFsMountFlags(flags),
.defaultReadTimeoutMs = INCFS_DEFAULT_READ_TIMEOUT_MS,
// Mount with read logs disabled.
.readLogBufferPages = 0});
if (control == nullptr) {
return translate(-1);
auto control = incfs::mount(backingPath, targetDir,
{.flags = IncFsMountFlags(flags),
.defaultReadTimeoutMs = INCFS_DEFAULT_READ_TIMEOUT_MS,
// Mount with read logs disabled.
.readLogBufferPages = 0});
if (!control) {
return translate(-errno);
}
using unique_fd = ::android::base::unique_fd;
_aidl_return->cmd.reset(unique_fd(dup(IncFs_GetControlFd(control, CMD))));
_aidl_return->pendingReads.reset(unique_fd(dup(IncFs_GetControlFd(control, PENDING_READS))));
auto logsFd = IncFs_GetControlFd(control, LOGS);
if (logsFd >= 0) {
_aidl_return->log.reset(unique_fd(dup(logsFd)));
}
IncFs_DeleteControl(control);
auto fds = control.releaseFds();
using android::base::unique_fd;
_aidl_return->cmd.reset(unique_fd(fds[CMD].release()));
_aidl_return->pendingReads.reset(unique_fd(fds[PENDING_READS].release()));
_aidl_return->log.reset(unique_fd(fds[LOGS].release()));
return Ok();
}
@ -913,7 +910,7 @@ binder::Status VoldNativeService::unmountIncFs(const std::string& dir) {
ENFORCE_SYSTEM_OR_ROOT;
CHECK_ARGUMENT_PATH(dir);
return translate(IncFs_Unmount(dir.c_str()));
return translate(incfs::unmount(dir));
}
binder::Status VoldNativeService::setIncFsMountOptions(
@ -921,19 +918,24 @@ binder::Status VoldNativeService::setIncFsMountOptions(
bool enableReadLogs) {
ENFORCE_SYSTEM_OR_ROOT;
auto status = Ok();
auto incfsControl = IncFs_CreateControl(dup(control.cmd.get()), dup(control.pendingReads.get()),
dup(control.log.get()));
if (auto error = IncFs_SetOptions(
auto incfsControl =
incfs::createControl(control.cmd.get(), control.pendingReads.get(), control.log.get());
auto cleanupFunc = [](auto incfsControl) {
for (auto& fd : incfsControl->releaseFds()) {
(void)fd.release();
}
};
auto cleanup =
std::unique_ptr<incfs::Control, decltype(cleanupFunc)>(&incfsControl, cleanupFunc);
if (auto error = incfs::setOptions(
incfsControl,
{.defaultReadTimeoutMs = INCFS_DEFAULT_READ_TIMEOUT_MS,
.readLogBufferPages = enableReadLogs ? INCFS_DEFAULT_PAGE_READ_BUFFER_PAGES : 0});
error < 0) {
status = binder::Status::fromServiceSpecificError(error);
return binder::Status::fromServiceSpecificError(error);
}
IncFs_DeleteControl(incfsControl);
return status;
return Ok();
}
binder::Status VoldNativeService::bindMount(const std::string& sourceDir,
@ -942,7 +944,7 @@ binder::Status VoldNativeService::bindMount(const std::string& sourceDir,
CHECK_ARGUMENT_PATH(sourceDir);
CHECK_ARGUMENT_PATH(targetDir);
return translate(IncFs_BindMount(sourceDir.c_str(), targetDir.c_str()));
return translate(incfs::bindMount(sourceDir, targetDir));
}
} // namespace vold

Loading…
Cancel
Save