Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 159d267c authored by Yifan Hong's avatar Yifan Hong Committed by android-build-merger
Browse files

Merge "updater: erase ignores EOPNOTSUPP for BLKDISCARD"

am: 08a8b40c

Change-Id: Iee6860b0dbeaafc06ca881148ca4ea99abaf4b3a
parents 29578b11 08a8b40c
Loading
Loading
Loading
Loading
+10 −11
Original line number Diff line number Diff line
@@ -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;
      }
    }