mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 19:22:45 +00:00 
			
		
		
		
	Kernel: Make DiskCache::ensure OOM-fallible using ErrorOr
This commit is contained in:
		
							parent
							
								
									b509d8a2f7
								
							
						
					
					
						commit
						f39e9b19c6
					
				
					 1 changed files with 13 additions and 13 deletions
				
			
		|  | @ -63,10 +63,10 @@ public: | |||
|         return &entry; | ||||
|     } | ||||
| 
 | ||||
|     CacheEntry& ensure(BlockBasedFileSystem::BlockIndex block_index) const | ||||
|     ErrorOr<CacheEntry*> ensure(BlockBasedFileSystem::BlockIndex block_index) const | ||||
|     { | ||||
|         if (auto* entry = get(block_index)) | ||||
|             return *entry; | ||||
|             return entry; | ||||
| 
 | ||||
|         if (m_clean_list.is_empty()) { | ||||
|             // Not a single clean entry! Flush writes and try again.
 | ||||
|  | @ -81,12 +81,12 @@ public: | |||
|         m_clean_list.prepend(new_entry); | ||||
| 
 | ||||
|         m_hash.remove(new_entry.block_index); | ||||
|         m_hash.set(block_index, &new_entry); | ||||
|         TRY(m_hash.try_set(block_index, &new_entry)); | ||||
| 
 | ||||
|         new_entry.block_index = block_index; | ||||
|         new_entry.has_data = false; | ||||
| 
 | ||||
|         return new_entry; | ||||
|         return &new_entry; | ||||
|     } | ||||
| 
 | ||||
|     const CacheEntry* entries() const { return (const CacheEntry*)m_entries->data(); } | ||||
|  | @ -156,15 +156,15 @@ ErrorOr<void> BlockBasedFileSystem::write_block(BlockIndex index, const UserOrKe | |||
|             return {}; | ||||
|         } | ||||
| 
 | ||||
|         auto& entry = cache->ensure(index); | ||||
|         auto entry = TRY(cache->ensure(index)); | ||||
|         if (count < block_size()) { | ||||
|             // Fill the cache first.
 | ||||
|             TRY(read_block(index, nullptr, block_size())); | ||||
|         } | ||||
|         memcpy(entry.data + offset, buffered_data.data(), count); | ||||
|         memcpy(entry->data + offset, buffered_data.data(), count); | ||||
| 
 | ||||
|         cache->mark_dirty(entry); | ||||
|         entry.has_data = true; | ||||
|         cache->mark_dirty(*entry); | ||||
|         entry->has_data = true; | ||||
|         return {}; | ||||
|     }); | ||||
| } | ||||
|  | @ -230,16 +230,16 @@ ErrorOr<void> BlockBasedFileSystem::read_block(BlockIndex index, UserOrKernelBuf | |||
|             return {}; | ||||
|         } | ||||
| 
 | ||||
|         auto& entry = cache->ensure(index); | ||||
|         if (!entry.has_data) { | ||||
|         auto* entry = TRY(cache->ensure(index)); | ||||
|         if (!entry->has_data) { | ||||
|             auto base_offset = index.value() * block_size(); | ||||
|             auto entry_data_buffer = UserOrKernelBuffer::for_kernel_buffer(entry.data); | ||||
|             auto entry_data_buffer = UserOrKernelBuffer::for_kernel_buffer(entry->data); | ||||
|             auto nread = TRY(file_description().read(entry_data_buffer, base_offset, block_size())); | ||||
|             VERIFY(nread == block_size()); | ||||
|             entry.has_data = true; | ||||
|             entry->has_data = true; | ||||
|         } | ||||
|         if (buffer) | ||||
|             TRY(buffer->write(entry.data + offset, count)); | ||||
|             TRY(buffer->write(entry->data + offset, count)); | ||||
|         return {}; | ||||
|     }); | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Idan Horowitz
						Idan Horowitz