Merge changes I060f438c,I48fbca45 am: 2aaaa01bb9
Original change: https://android-review.googlesource.com/c/platform/system/core/+/1879728 Change-Id: I1f3fb5a576e2e0aec7b549118a48435f207e1882
This commit is contained in:
commit
8dc36d8cc5
4 changed files with 21 additions and 8 deletions
|
@ -725,7 +725,7 @@ class PartitionFetcher {
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!OpenPartition(device_, partition_name_, &handle_, true /* read */)) {
|
||||
if (!OpenPartition(device_, partition_name_, &handle_, O_RDONLY)) {
|
||||
ret_ = device_->WriteFail(
|
||||
android::base::StringPrintf("Cannot open %s", partition_name_.c_str()));
|
||||
return false;
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include "flashing.h"
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
@ -77,9 +78,20 @@ void WipeOverlayfsForPartition(FastbootDevice* device, const std::string& partit
|
|||
|
||||
int FlashRawDataChunk(int fd, const char* data, size_t len) {
|
||||
size_t ret = 0;
|
||||
const size_t max_write_size = 1048576;
|
||||
void* aligned_buffer;
|
||||
|
||||
if (posix_memalign(&aligned_buffer, 4096, max_write_size)) {
|
||||
PLOG(ERROR) << "Failed to allocate write buffer";
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
auto aligned_buffer_unique_ptr = std::unique_ptr<void, decltype(&free)>{aligned_buffer, free};
|
||||
|
||||
while (ret < len) {
|
||||
int this_len = std::min(static_cast<size_t>(1048576UL * 8), len - ret);
|
||||
int this_ret = write(fd, data, this_len);
|
||||
int this_len = std::min(max_write_size, len - ret);
|
||||
memcpy(aligned_buffer_unique_ptr.get(), data, this_len);
|
||||
int this_ret = write(fd, aligned_buffer_unique_ptr.get(), this_len);
|
||||
if (this_ret < 0) {
|
||||
PLOG(ERROR) << "Failed to flash data of len " << len;
|
||||
return -1;
|
||||
|
@ -147,7 +159,7 @@ static void CopyAVBFooter(std::vector<char>* data, const uint64_t block_device_s
|
|||
|
||||
int Flash(FastbootDevice* device, const std::string& partition_name) {
|
||||
PartitionHandle handle;
|
||||
if (!OpenPartition(device, partition_name, &handle)) {
|
||||
if (!OpenPartition(device, partition_name, &handle, O_WRONLY | O_DIRECT)) {
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
|
|
|
@ -78,7 +78,7 @@ bool OpenLogicalPartition(FastbootDevice* device, const std::string& partition_n
|
|||
} // namespace
|
||||
|
||||
bool OpenPartition(FastbootDevice* device, const std::string& name, PartitionHandle* handle,
|
||||
bool read) {
|
||||
int flags) {
|
||||
// We prioritize logical partitions over physical ones, and do this
|
||||
// consistently for other partition operations (like getvar:partition-size).
|
||||
if (LogicalPartitionExists(device, name)) {
|
||||
|
@ -90,7 +90,6 @@ bool OpenPartition(FastbootDevice* device, const std::string& name, PartitionHan
|
|||
return false;
|
||||
}
|
||||
|
||||
int flags = (read ? O_RDONLY : O_WRONLY);
|
||||
flags |= (O_EXCL | O_CLOEXEC | O_BINARY);
|
||||
unique_fd fd(TEMP_FAILURE_RETRY(open(handle->path().c_str(), flags)));
|
||||
if (fd < 0) {
|
||||
|
|
|
@ -76,9 +76,11 @@ std::optional<std::string> FindPhysicalPartition(const std::string& name);
|
|||
bool LogicalPartitionExists(FastbootDevice* device, const std::string& name,
|
||||
bool* is_zero_length = nullptr);
|
||||
|
||||
// If read, partition is readonly. Else it is write only.
|
||||
// Partition is O_WRONLY by default, caller should pass O_RDONLY for reading.
|
||||
// Caller may pass additional flags if needed. (O_EXCL | O_CLOEXEC | O_BINARY)
|
||||
// will be logically ORed internally.
|
||||
bool OpenPartition(FastbootDevice* device, const std::string& name, PartitionHandle* handle,
|
||||
bool read = false);
|
||||
int flags = O_WRONLY);
|
||||
|
||||
bool GetSlotNumber(const std::string& slot, android::hardware::boot::V1_0::Slot* number);
|
||||
std::vector<std::string> ListPartitions(FastbootDevice* device);
|
||||
|
|
Loading…
Reference in a new issue