Fix the error code and return logic for mmap failure
This commit is contained in:
parent
9f763f84b1
commit
d9845235d3
@ -92,7 +92,7 @@ impl Chunk {
|
||||
})
|
||||
}
|
||||
|
||||
pub fn new_single_vma_chunk(vm_range: VMRange, options: &VMMapOptions) -> Self {
|
||||
pub fn new_single_vma_chunk(vm_range: &VMRange, options: &VMMapOptions) -> Result<Self> {
|
||||
let writeback_file = options.writeback_file().clone();
|
||||
let vm_area = VMArea::new(
|
||||
vm_range.clone(),
|
||||
@ -103,13 +103,13 @@ impl Chunk {
|
||||
// Initialize the memory of the new range
|
||||
unsafe {
|
||||
let buf = vm_range.as_slice_mut();
|
||||
options.initializer().init_slice(buf);
|
||||
options.initializer().init_slice(buf)?;
|
||||
}
|
||||
// Set memory permissions
|
||||
if !options.perms().is_default() {
|
||||
VMPerms::apply_perms(&vm_area, vm_area.perms());
|
||||
}
|
||||
Self::new_chunk_with_vma(vm_area)
|
||||
Ok(Self::new_chunk_with_vma(vm_area))
|
||||
}
|
||||
|
||||
pub fn new_chunk_with_vma(vma: VMArea) -> Self {
|
||||
|
@ -121,10 +121,15 @@ impl ChunkManager {
|
||||
let new_vma = VMArea::new(new_range, *options.perms(), writeback_file, current_pid);
|
||||
|
||||
// Initialize the memory of the new range
|
||||
unsafe {
|
||||
let buf = new_vma.as_slice_mut();
|
||||
options.initializer().init_slice(buf)?;
|
||||
let buf = unsafe { new_vma.as_slice_mut() };
|
||||
let ret = options.initializer().init_slice(buf);
|
||||
if let Err(e) = ret {
|
||||
// Return the free range before return with error
|
||||
self.free_manager
|
||||
.add_range_back_to_free_manager(new_vma.range());
|
||||
return_errno!(e.errno(), "failed to mmap");
|
||||
}
|
||||
|
||||
// Set memory permissions
|
||||
if !options.perms().is_default() {
|
||||
VMPerms::apply_perms(&new_vma, new_vma.perms());
|
||||
|
@ -117,13 +117,13 @@ impl VMManager {
|
||||
// Allocate a new chunk with chunk default size.
|
||||
// Lock on ChunkManager.
|
||||
if let Ok(new_chunk) = self.internal().mmap_chunk_default(addr) {
|
||||
// Allocate in the new chunk
|
||||
let start = new_chunk.mmap(options);
|
||||
debug_assert!(start.is_ok()); // We just allocate a chunk for you. You must succeed.
|
||||
// Add this new chunk to process' chunk list
|
||||
// Add this new chunk to process' chunk list
|
||||
new_chunk.add_process(¤t);
|
||||
current.vm().add_mem_chunk(new_chunk);
|
||||
return start;
|
||||
current.vm().add_mem_chunk(new_chunk.clone());
|
||||
|
||||
// Allocate in the new chunk
|
||||
// This mmap could still fail due to invalid options
|
||||
return new_chunk.mmap(options);
|
||||
}
|
||||
|
||||
// Slow path: Sadly, there is no free chunk, iterate every chunk to find a range
|
||||
@ -548,7 +548,14 @@ impl InternalVMManager {
|
||||
let size = *options.size();
|
||||
let align = *options.align();
|
||||
let free_range = self.find_free_gaps(size, align, addr)?;
|
||||
let chunk = Arc::new(Chunk::new_single_vma_chunk(free_range, options));
|
||||
let free_chunk = Chunk::new_single_vma_chunk(&free_range, options);
|
||||
if let Err(e) = free_chunk {
|
||||
// Error when creating chunks. Must return the free space before returning error
|
||||
self.free_manager
|
||||
.add_range_back_to_free_manager(&free_range);
|
||||
return_errno!(e.errno(), "mmap_chunk failure");
|
||||
}
|
||||
let chunk = Arc::new(free_chunk.unwrap());
|
||||
trace!("allocate a new single vma chunk: {:?}", chunk);
|
||||
self.chunks.insert(chunk.clone());
|
||||
Ok(chunk)
|
||||
|
@ -59,7 +59,7 @@ impl VMInitializer {
|
||||
// TODO: make sure that read_at does not move file cursor
|
||||
let len = file
|
||||
.read_at(*offset, buf)
|
||||
.cause_err(|_| errno!(EIO, "failed to init memory from file"))?;
|
||||
.cause_err(|_| errno!(EACCES, "failed to init memory from file"))?;
|
||||
for b in &mut buf[len..] {
|
||||
*b = 0;
|
||||
}
|
||||
@ -77,7 +77,7 @@ impl VMInitializer {
|
||||
buf[..copy_len].copy_from_slice(&src_slice[..copy_len]);
|
||||
let len = file
|
||||
.read_at(*offset, &mut buf[copy_len..])
|
||||
.cause_err(|_| errno!(EIO, "failed to init memory from file"))?;
|
||||
.cause_err(|_| errno!(EACCES, "failed to init memory from file"))?;
|
||||
for b in &mut buf[(copy_len + len)..] {
|
||||
*b = 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user