| Index: content/child/blob_storage/blob_transport_controller.cc
 | 
| diff --git a/content/child/blob_storage/blob_transport_controller.cc b/content/child/blob_storage/blob_transport_controller.cc
 | 
| index 5db46a24726647bcf614777b5eb9322ae038a877..1b01792079edee0775759258403c09ecddfb653d 100644
 | 
| --- a/content/child/blob_storage/blob_transport_controller.cc
 | 
| +++ b/content/child/blob_storage/blob_transport_controller.cc
 | 
| @@ -90,27 +90,23 @@ bool WriteSingleChunk(base::File* file, const char* memory, size_t size) {
 | 
|    return true;
 | 
|  }
 | 
|  
 | 
| -base::Optional<base::Time> WriteSingleRequestToDisk(
 | 
| -    const BlobConsolidation* consolidation,
 | 
| -    const BlobItemBytesRequest& request,
 | 
| -    File* file) {
 | 
| +bool WriteSingleRequestToDisk(const BlobConsolidation* consolidation,
 | 
| +                              const BlobItemBytesRequest& request,
 | 
| +                              File* file) {
 | 
|    if (!file->IsValid())
 | 
| -    return base::nullopt;
 | 
| +    return false;
 | 
|    int64_t seek_distance = file->Seek(
 | 
|        File::FROM_BEGIN, base::checked_cast<int64_t>(request.handle_offset));
 | 
|    bool seek_failed = seek_distance < 0;
 | 
|    UMA_HISTOGRAM_BOOLEAN("Storage.Blob.RendererFileSeekFailed", seek_failed);
 | 
| -  if (seek_failed) {
 | 
| -    return base::nullopt;
 | 
| -  }
 | 
| +  if (seek_failed)
 | 
| +    return false;
 | 
|    BlobConsolidation::ReadStatus status = consolidation->VisitMemory(
 | 
|        request.renderer_item_index, request.renderer_item_offset, request.size,
 | 
|        base::Bind(&WriteSingleChunk, file));
 | 
|    if (status != BlobConsolidation::ReadStatus::OK)
 | 
| -    return base::nullopt;
 | 
| -  File::Info info;
 | 
| -  file->GetInfo(&info);
 | 
| -  return base::make_optional(info.last_modified);
 | 
| +    return false;
 | 
| +  return true;
 | 
|  }
 | 
|  
 | 
|  base::Optional<std::vector<BlobItemBytesResponse>> WriteDiskRequests(
 | 
| @@ -118,8 +114,6 @@ base::Optional<std::vector<BlobItemBytesResponse>> WriteDiskRequests(
 | 
|      std::unique_ptr<std::vector<BlobItemBytesRequest>> requests,
 | 
|      const std::vector<IPC::PlatformFileForTransit>& file_handles) {
 | 
|    std::vector<BlobItemBytesResponse> responses;
 | 
| -  std::vector<base::Time> last_modified_times;
 | 
| -  last_modified_times.resize(file_handles.size());
 | 
|    // We grab ownership of the file handles here. When this vector is destroyed
 | 
|    // it will close the files.
 | 
|    std::vector<File> files;
 | 
| @@ -128,13 +122,24 @@ base::Optional<std::vector<BlobItemBytesResponse>> WriteDiskRequests(
 | 
|      files.emplace_back(IPC::PlatformFileForTransitToFile(file_handle));
 | 
|    }
 | 
|    for (const auto& request : *requests) {
 | 
| -    base::Optional<base::Time> last_modified = WriteSingleRequestToDisk(
 | 
| -        consolidation.get(), request, &files[request.handle_index]);
 | 
| -    if (!last_modified) {
 | 
| +    if (!WriteSingleRequestToDisk(consolidation.get(), request,
 | 
| +                                  &files[request.handle_index])) {
 | 
|        return base::nullopt;
 | 
|      }
 | 
| -    last_modified_times[request.handle_index] = last_modified.value();
 | 
|    }
 | 
| +  // The last modified time needs to be collected after we flush the file.
 | 
| +  std::vector<base::Time> last_modified_times;
 | 
| +  last_modified_times.resize(file_handles.size());
 | 
| +  for (size_t i = 0; i < files.size(); ++i) {
 | 
| +    auto& file = files[i];
 | 
| +    if (!file.Flush())
 | 
| +      return base::nullopt;
 | 
| +    File::Info info;
 | 
| +    if (!file.GetInfo(&info))
 | 
| +      return base::nullopt;
 | 
| +    last_modified_times[i] = info.last_modified;
 | 
| +  }
 | 
| +
 | 
|    for (const auto& request : *requests) {
 | 
|      responses.push_back(BlobItemBytesResponse(request.request_number));
 | 
|      responses.back().time_file_modified =
 | 
| 
 |