fix "block cache" layer to handle allocation failure
This commit is contained in:
parent
adf965e92a
commit
5efe7001d6
|
@ -85,13 +85,22 @@ static ssize_t block_cache_free(BlockCache* bc) {
|
||||||
static block_desc *bc_alloc_std_block(block_group *bg) {
|
static block_desc *bc_alloc_std_block(block_group *bg) {
|
||||||
int this_block_size = bg->block_size;
|
int this_block_size = bg->block_size;
|
||||||
void *r = os_alloc_pages(this_block_size);
|
void *r = os_alloc_pages(this_block_size);
|
||||||
void *ps = align_up_ptr(r, APAGE_SIZE);
|
block_desc *bd;
|
||||||
|
void *ps;
|
||||||
|
|
||||||
|
if (!r) return NULL;
|
||||||
|
|
||||||
|
ps = align_up_ptr(r, APAGE_SIZE);
|
||||||
|
|
||||||
if (this_block_size < BC_MAX_BLOCK_SIZE) {
|
if (this_block_size < BC_MAX_BLOCK_SIZE) {
|
||||||
bg->block_size <<= 1;
|
bg->block_size <<= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
block_desc *bd = (block_desc*) ofm_malloc(sizeof(block_desc));
|
bd = (block_desc*) ofm_malloc(sizeof(block_desc));
|
||||||
|
if (!bd) {
|
||||||
|
os_free_pages(r, this_block_size);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
bd->block = r;
|
bd->block = r;
|
||||||
bd->free = ps;
|
bd->free = ps;
|
||||||
bd->size = this_block_size;
|
bd->size = this_block_size;
|
||||||
|
@ -151,8 +160,10 @@ static void *bc_alloc_std_page(BlockCache *bc, int dirty_ok, int expect_mprotect
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
block_desc *bd;
|
||||||
newbl = 1;
|
newbl = 1;
|
||||||
block_desc *bd = bc_alloc_std_block(bg);
|
bd = bc_alloc_std_block(bg);
|
||||||
|
if (!bd) return NULL;
|
||||||
gclist_add(free_head, &(bd->gclist));
|
gclist_add(free_head, &(bd->gclist));
|
||||||
(*size_diff) += bd->size;
|
(*size_diff) += bd->size;
|
||||||
/* printf("ALLOC BLOCK %i %p %p-%p size %li %p\n", expect_mprotect, bg, bd->block, bd->block + bd->size, bd->size, bd->free); */
|
/* printf("ALLOC BLOCK %i %p %p-%p size %li %p\n", expect_mprotect, bg, bd->block, bd->block + bd->size, bd->size, bd->free); */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user