Changeset View
Changeset View
Standalone View
Standalone View
common/bcache.c
Context not available. | |||||
((bc)->bcache_ctl[BHASH((bc), (blkno))].bc_blkno != (blkno)) | ((bc)->bcache_ctl[BHASH((bc), (blkno))].bc_blkno != (blkno)) | ||||
#define BCACHE_READAHEAD 256 | #define BCACHE_READAHEAD 256 | ||||
#define BCACHE_MINREADAHEAD 32 | #define BCACHE_MINREADAHEAD 32 | ||||
#define BCACHE_MARKER 0xdeadbeef | |||||
static void bcache_invalidate(struct bcache *bc, daddr_t blkno); | static void bcache_invalidate(struct bcache *bc, daddr_t blkno); | ||||
static void bcache_insert(struct bcache *bc, daddr_t blkno); | static void bcache_insert(struct bcache *bc, daddr_t blkno); | ||||
Context not available. | |||||
u_int i; | u_int i; | ||||
struct bcache *bc = malloc(sizeof (struct bcache)); | struct bcache *bc = malloc(sizeof (struct bcache)); | ||||
int disks = bcache_numdev; | int disks = bcache_numdev; | ||||
uint32_t *marker; | |||||
if (disks == 0) | if (disks == 0) | ||||
disks = 1; /* safe guard */ | disks = 1; /* safe guard */ | ||||
Context not available. | |||||
bc->bcache_nblks = bcache_total_nblks >> i; | bc->bcache_nblks = bcache_total_nblks >> i; | ||||
bcache_unit_nblks = bc->bcache_nblks; | bcache_unit_nblks = bc->bcache_nblks; | ||||
bc->bcache_data = malloc(bc->bcache_nblks * bcache_blksize + | bc->bcache_data = malloc(bc->bcache_nblks * bcache_blksize); | ||||
sizeof(uint32_t)); | |||||
if (bc->bcache_data == NULL) { | if (bc->bcache_data == NULL) { | ||||
/* dont error out yet. fall back to 32 blocks and try again */ | /* dont error out yet. fall back to 32 blocks and try again */ | ||||
bc->bcache_nblks = 32; | bc->bcache_nblks = 32; | ||||
Context not available. | |||||
errno = ENOMEM; | errno = ENOMEM; | ||||
return (NULL); | return (NULL); | ||||
} | } | ||||
/* Insert cache end marker. */ | |||||
marker = (uint32_t *)(bc->bcache_data + bc->bcache_nblks * bcache_blksize); | |||||
*marker = BCACHE_MARKER; | |||||
/* Flush the cache */ | /* Flush the cache */ | ||||
for (i = 0; i < bc->bcache_nblks; i++) { | for (i = 0; i < bc->bcache_nblks; i++) { | ||||
Context not available. | |||||
int result; | int result; | ||||
daddr_t p_blk; | daddr_t p_blk; | ||||
caddr_t p_buf; | caddr_t p_buf; | ||||
uint32_t *marker; | |||||
if (bc == NULL) { | if (bc == NULL) { | ||||
errno = ENODEV; | errno = ENODEV; | ||||
Context not available. | |||||
return (-1); | return (-1); | ||||
} | } | ||||
marker = (uint32_t *)(bc->bcache_data + bc->bcache_nblks * bcache_blksize); | |||||
if (rsize != NULL) | if (rsize != NULL) | ||||
*rsize = 0; | *rsize = 0; | ||||
Context not available. | |||||
result = 0; | result = 0; | ||||
} | } | ||||
if (*marker != BCACHE_MARKER) { | |||||
printf("BUG: bcache corruption detected: nblks: %zu p_blk: %lu, " | |||||
"p_size: %zu, ra: %zu\n", bc->bcache_nblks, | |||||
(long unsigned)BHASH(bc, p_blk), p_size, ra); | |||||
} | |||||
done: | done: | ||||
if ((result == 0) && (rsize != NULL)) | if ((result == 0) && (rsize != NULL)) | ||||
*rsize = size; | *rsize = size; | ||||
Context not available. |