Lines Matching refs:bc
83 #define BHASH(bc, blkno) ((blkno) & ((bc)->bcache_nblks - 1)) argument
84 #define BCACHE_LOOKUP(bc, blkno) \ argument
85 ((bc)->bcache_ctl[BHASH((bc), (blkno))].bc_blkno != (blkno))
89 static void bcache_invalidate(struct bcache *bc, daddr_t blkno);
90 static void bcache_insert(struct bcache *bc, daddr_t blkno);
91 static void bcache_free_instance(struct bcache *bc);
122 struct bcache *bc = malloc(sizeof (struct bcache)); in bcache_allocate() local
128 if (bc == NULL) { in bcache_allocate()
130 return (bc); in bcache_allocate()
140 bc->bcache_nblks = bcache_total_nblks >> i; in bcache_allocate()
141 bcache_unit_nblks = bc->bcache_nblks; in bcache_allocate()
142 bc->bcache_data = malloc(bc->bcache_nblks * bcache_blksize); in bcache_allocate()
143 if (bc->bcache_data == NULL) { in bcache_allocate()
145 bc->bcache_nblks = 32; in bcache_allocate()
146 bc->bcache_data = malloc(bc->bcache_nblks * bcache_blksize + in bcache_allocate()
150 bc->bcache_ctl = malloc(bc->bcache_nblks * sizeof (struct bcachectl)); in bcache_allocate()
152 if ((bc->bcache_data == NULL) || (bc->bcache_ctl == NULL)) { in bcache_allocate()
153 bcache_free_instance(bc); in bcache_allocate()
159 for (i = 0; i < bc->bcache_nblks; i++) { in bcache_allocate()
160 bc->bcache_ctl[i].bc_count = -1; in bcache_allocate()
161 bc->bcache_ctl[i].bc_blkno = -1; in bcache_allocate()
164 bc->ra = BCACHE_READAHEAD; /* optimistic read ahead */ in bcache_allocate()
165 return (bc); in bcache_allocate()
171 struct bcache *bc = cache; in bcache_free() local
173 if (bc == NULL) in bcache_free()
176 bcache_free_instance(bc); in bcache_free()
189 struct bcache *bc = dd->dv_cache; in write_strategy() local
196 bcache_invalidate(bc, blk + i); in write_strategy()
213 struct bcache *bc = dd->dv_cache; in read_strategy() local
219 if (bc == NULL) { in read_strategy()
235 if (BCACHE_LOOKUP(bc, (daddr_t)(blk + i))) { in read_strategy()
239 bc->ra > BCACHE_MINREADAHEAD) in read_strategy()
240 bc->ra >>= 1; /* reduce read ahead */ in read_strategy()
248 if (bc->ra < BCACHE_READAHEAD) in read_strategy()
249 bc->ra <<= 1; /* increase read ahead */ in read_strategy()
250 bcopy(bc->bcache_data + (bcache_blksize * BHASH(bc, blk)), in read_strategy()
261 p_buf = bc->bcache_data + (bcache_blksize * BHASH(bc, p_blk)); in read_strategy()
262 r_size = bc->bcache_nblks - BHASH(bc, p_blk); /* remaining blocks */ in read_strategy()
294 ra = bc->bcache_nblks - BHASH(bc, p_blk + p_size); in read_strategy()
296 if (ra != 0 && ra != bc->bcache_nblks) { /* do we have RA space? */ in read_strategy()
297 ra = MIN(bc->ra, ra - 1); in read_strategy()
304 bcache_invalidate(bc, p_blk + i); in read_strategy()
322 bcache_insert(bc, p_blk + i); in read_strategy()
334 if (BCACHE_LOOKUP(bc, (daddr_t)(blk + i))) in read_strategy()
342 bcopy(bc->bcache_data + (bcache_blksize * BHASH(bc, blk)), in read_strategy()
362 struct bcache *bc = dd->dv_cache; in bcache_strategy() local
369 if (bc != NULL) in bcache_strategy()
370 bcache_nblks = bc->bcache_nblks; in bcache_strategy()
373 if (bc == NULL || in bcache_strategy()
393 cblk = bcache_nblks - BHASH(bc, blk); in bcache_strategy()
434 bcache_free_instance(struct bcache *bc) in bcache_free_instance() argument
436 if (bc != NULL) { in bcache_free_instance()
437 free(bc->bcache_ctl); in bcache_free_instance()
438 free(bc->bcache_data); in bcache_free_instance()
439 free(bc); in bcache_free_instance()
447 bcache_insert(struct bcache *bc, daddr_t blkno) in bcache_insert() argument
451 cand = BHASH(bc, blkno); in bcache_insert()
455 bc->bcache_ctl[cand].bc_blkno = blkno; in bcache_insert()
456 bc->bcache_ctl[cand].bc_count = bcache_bcount++; in bcache_insert()
463 bcache_invalidate(struct bcache *bc, daddr_t blkno) in bcache_invalidate() argument
467 i = BHASH(bc, blkno); in bcache_invalidate()
468 if (bc->bcache_ctl[i].bc_blkno == blkno) { in bcache_invalidate()
469 bc->bcache_ctl[i].bc_count = -1; in bcache_invalidate()
470 bc->bcache_ctl[i].bc_blkno = -1; in bcache_invalidate()