Merge "updater: erase ignores EOPNOTSUPP for BLKDISCARD"
am: 08a8b40c91

Change-Id: Iee6860b0dbeaafc06ca881148ca4ea99abaf4b3a
diff --git a/updater/blockimg.cpp b/updater/blockimg.cpp
index c4c0909..9d5b017 100644
--- a/updater/blockimg.cpp
+++ b/updater/blockimg.cpp
@@ -178,14 +178,18 @@
   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 @@
     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;
       }
     }