diff options
author | Yifan Hong <elsk@google.com> | 2019-01-08 02:11:37 +0100 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2019-01-08 02:11:37 +0100 |
commit | 159d267cc6ed9b5d6d561479b4579981aced6b64 (patch) | |
tree | c041e682fe59ac0ed27b31bb7daae22dc51eee83 | |
parent | Merge "minadbd: daemon_service_to_fd takes std::string_view." (diff) | |
parent | Merge "updater: erase ignores EOPNOTSUPP for BLKDISCARD" (diff) | |
download | android_bootable_recovery-159d267cc6ed9b5d6d561479b4579981aced6b64.tar android_bootable_recovery-159d267cc6ed9b5d6d561479b4579981aced6b64.tar.gz android_bootable_recovery-159d267cc6ed9b5d6d561479b4579981aced6b64.tar.bz2 android_bootable_recovery-159d267cc6ed9b5d6d561479b4579981aced6b64.tar.lz android_bootable_recovery-159d267cc6ed9b5d6d561479b4579981aced6b64.tar.xz android_bootable_recovery-159d267cc6ed9b5d6d561479b4579981aced6b64.tar.zst android_bootable_recovery-159d267cc6ed9b5d6d561479b4579981aced6b64.zip |
-rw-r--r-- | updater/blockimg.cpp | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/updater/blockimg.cpp b/updater/blockimg.cpp index c4c09098e..9d5b01734 100644 --- a/updater/blockimg.cpp +++ b/updater/blockimg.cpp @@ -178,14 +178,18 @@ static bool SetPartitionUpdatedMarker(const std::string& marker) { return true; } -static bool discard_blocks(int fd, off64_t offset, uint64_t size) { - // Don't discard blocks unless the update is a retry run. - if (!is_retry) { +static bool discard_blocks(int fd, off64_t offset, uint64_t size, bool force = false) { + // Don't discard blocks unless the update is a retry run or force == true + if (!is_retry && !force) { return true; } uint64_t args[2] = { static_cast<uint64_t>(offset), size }; if (ioctl(fd, BLKDISCARD, &args) == -1) { + // On devices that does not support BLKDISCARD, ignore the error. + if (errno == EOPNOTSUPP) { + return true; + } PLOG(ERROR) << "BLKDISCARD ioctl failed"; return false; } @@ -1448,14 +1452,9 @@ static int PerformCommandErase(CommandParameters& params) { LOG(INFO) << " erasing " << tgt.blocks() << " blocks"; for (const auto& [begin, end] : tgt) { - uint64_t blocks[2]; - // offset in bytes - blocks[0] = begin * static_cast<uint64_t>(BLOCKSIZE); - // length in bytes - blocks[1] = (end - begin) * static_cast<uint64_t>(BLOCKSIZE); - - if (ioctl(params.fd, BLKDISCARD, &blocks) == -1) { - PLOG(ERROR) << "BLKDISCARD ioctl failed"; + off64_t offset = static_cast<off64_t>(begin) * BLOCKSIZE; + size_t size = (end - begin) * BLOCKSIZE; + if (!discard_blocks(params.fd, offset, size, true /* force */)) { return -1; } } |