0,0 → 1,76 |
/* Basic methods for reading blocks. */ |
|
/* Methods: |
* init_block: Allocates memory for working block |
* get_block: Returns requested block according its number |
* read_block: Process reading of requested block |
*/ |
|
|
#include <stdio.h> |
#include <async.h> |
#include <sysinfo.h> |
#include "fs.h" |
#include "block.h" |
#include "super.h" |
#include "../rd/rd.h" |
|
|
block_t* work_block; |
|
int init_block() |
{ |
|
/* Allocating free space for working block. */ |
work_block = (block_t*)malloc(sizeof(block_t)); |
if (work_block != NULL) |
return TRUE; |
|
return FALSE; |
} |
|
block_t *get_block(register block_num_t block_nr) |
{ |
|
if (block_nr == NO_BLOCK) |
return (get_zero_block()); |
|
work_block->b_blocknr = block_nr; |
read_block(work_block); |
|
return work_block; |
} |
|
block_t *get_zero_block() |
{ |
|
/* Setting all bytes inside block to 0 */ |
memset(work_block->b.b__data, 0, BLOCK_SIZE); |
|
return work_block; |
} |
|
void read_block(register block_t *bp) |
{ |
|
int r; |
offset_t pos, header_size; |
|
header_size = sysinfo_value("rd.header_size"); |
pos = header_size + (offset_t)bp->b_blocknr * BLOCK_SIZE; |
|
/* Reading a block with specified number from ramdisk into shared buffer. */ |
r = async_req_2(rd_phone, RD_READ_BLOCK, pos, BLOCK_SIZE, NULL, NULL); |
if (r < 0) { |
print_console_int("Unrecoverable disk error on RAMDISK, block: %d\n", bp->b_blocknr); |
print_console_int("Error number: %d\n", r); |
status = FS_EIO; |
return; |
} |
|
/* Copy retrieved data from buffer into work block. */ |
memcpy((void *)(bp->b.b__data), (void *)buffer, BLOCK_SIZE); |
status = BLOCK_SIZE; |
} |
|
|