Lines Matching defs:bc

119 blockif_enqueue(struct blockif_ctxt *bc, struct blockif_req *breq,
126 be = TAILQ_FIRST(&bc->bc_freeq);
129 TAILQ_REMOVE(&bc->bc_freeq, be, be_link);
144 TAILQ_FOREACH(tbe, &bc->bc_pendq, be_link) {
149 TAILQ_FOREACH(tbe, &bc->bc_busyq, be_link) {
158 TAILQ_INSERT_TAIL(&bc->bc_pendq, be, be_link);
163 blockif_dequeue(struct blockif_ctxt *bc, pthread_t t, struct blockif_elem **bep)
167 TAILQ_FOREACH(be, &bc->bc_pendq, be_link) {
174 TAILQ_REMOVE(&bc->bc_pendq, be, be_link);
177 TAILQ_INSERT_TAIL(&bc->bc_busyq, be, be_link);
183 blockif_complete(struct blockif_ctxt *bc, struct blockif_elem *be)
188 TAILQ_REMOVE(&bc->bc_busyq, be, be_link);
190 TAILQ_REMOVE(&bc->bc_pendq, be, be_link);
191 TAILQ_FOREACH(tbe, &bc->bc_pendq, be_link) {
198 TAILQ_INSERT_TAIL(&bc->bc_freeq, be, be_link);
202 blockif_proc(struct blockif_ctxt *bc, struct blockif_elem *be, uint8_t *buf)
216 if ((len = preadv(bc->bc_fd, br->br_iov, br->br_iovcnt,
227 if (pread(bc->bc_fd, buf, len, br->br_offset +
251 if (bc->bc_rdonly) {
256 if ((len = pwritev(bc->bc_fd, br->br_iov, br->br_iovcnt,
281 if (pwrite(bc->bc_fd, buf, len, br->br_offset +
291 if (bc->bc_ischr) {
292 if (ioctl(bc->bc_fd, DIOCGFLUSH))
294 } else if (fsync(bc->bc_fd))
298 if (!bc->bc_candelete)
300 else if (bc->bc_rdonly)
302 else if (bc->bc_ischr) {
305 if (ioctl(bc->bc_fd, DIOCGDELETE, arg))
325 struct blockif_ctxt *bc;
330 bc = arg;
331 if (bc->bc_isgeom)
337 pthread_mutex_lock(&bc->bc_mtx);
339 while (blockif_dequeue(bc, t, &be)) {
340 pthread_mutex_unlock(&bc->bc_mtx);
341 blockif_proc(bc, be, buf);
342 pthread_mutex_lock(&bc->bc_mtx);
343 blockif_complete(bc, be);
346 if (bc->bc_closing)
348 pthread_cond_wait(&bc->bc_cond, &bc->bc_mtx);
350 pthread_mutex_unlock(&bc->bc_mtx);
396 struct blockif_ctxt *bc;
514 bc = calloc(1, sizeof(struct blockif_ctxt));
515 if (bc == NULL) {
520 bc->bc_magic = BLOCKIF_SIG;
521 bc->bc_fd = fd;
522 bc->bc_ischr = S_ISCHR(sbuf.st_mode);
523 bc->bc_isgeom = geom;
524 bc->bc_candelete = candelete;
525 bc->bc_rdonly = ro;
526 bc->bc_size = size;
527 bc->bc_sectsz = sectsz;
528 bc->bc_psectsz = psectsz;
529 bc->bc_psectoff = psectoff;
530 pthread_mutex_init(&bc->bc_mtx, NULL);
531 pthread_cond_init(&bc->bc_cond, NULL);
532 TAILQ_INIT(&bc->bc_freeq);
533 TAILQ_INIT(&bc->bc_pendq);
534 TAILQ_INIT(&bc->bc_busyq);
536 bc->bc_reqs[i].be_status = BST_FREE;
537 TAILQ_INSERT_HEAD(&bc->bc_freeq, &bc->bc_reqs[i], be_link);
541 pthread_create(&bc->bc_btid[i], NULL, blockif_thr, bc);
543 pthread_set_name_np(bc->bc_btid[i], tname);
546 return (bc);
554 blockif_request(struct blockif_ctxt *bc, struct blockif_req *breq,
561 pthread_mutex_lock(&bc->bc_mtx);
562 if (!TAILQ_EMPTY(&bc->bc_freeq)) {
567 if (blockif_enqueue(bc, breq, op))
568 pthread_cond_signal(&bc->bc_cond);
578 pthread_mutex_unlock(&bc->bc_mtx);
584 blockif_read(struct blockif_ctxt *bc, struct blockif_req *breq)
587 assert(bc->bc_magic == BLOCKIF_SIG);
588 return (blockif_request(bc, breq, BOP_READ));
592 blockif_write(struct blockif_ctxt *bc, struct blockif_req *breq)
595 assert(bc->bc_magic == BLOCKIF_SIG);
596 return (blockif_request(bc, breq, BOP_WRITE));
600 blockif_flush(struct blockif_ctxt *bc, struct blockif_req *breq)
603 assert(bc->bc_magic == BLOCKIF_SIG);
604 return (blockif_request(bc, breq, BOP_FLUSH));
608 blockif_delete(struct blockif_ctxt *bc, struct blockif_req *breq)
611 assert(bc->bc_magic == BLOCKIF_SIG);
612 return (blockif_request(bc, breq, BOP_DELETE));
616 blockif_cancel(struct blockif_ctxt *bc, struct blockif_req *breq)
620 assert(bc->bc_magic == BLOCKIF_SIG);
622 pthread_mutex_lock(&bc->bc_mtx);
626 TAILQ_FOREACH(be, &bc->bc_pendq, be_link) {
634 blockif_complete(bc, be);
635 pthread_mutex_unlock(&bc->bc_mtx);
643 TAILQ_FOREACH(be, &bc->bc_busyq, be_link) {
651 pthread_mutex_unlock(&bc->bc_mtx);
682 pthread_mutex_unlock(&bc->bc_mtx);
692 blockif_close(struct blockif_ctxt *bc)
699 assert(bc->bc_magic == BLOCKIF_SIG);
704 pthread_mutex_lock(&bc->bc_mtx);
705 bc->bc_closing = 1;
706 pthread_mutex_unlock(&bc->bc_mtx);
707 pthread_cond_broadcast(&bc->bc_cond);
709 pthread_join(bc->bc_btid[i], &jval);
716 bc->bc_magic = 0;
717 close(bc->bc_fd);
718 free(bc);
728 blockif_chs(struct blockif_ctxt *bc, uint16_t *c, uint8_t *h, uint8_t *s)
735 assert(bc->bc_magic == BLOCKIF_SIG);
737 sectors = bc->bc_size / bc->bc_sectsz;
776 blockif_size(struct blockif_ctxt *bc)
779 assert(bc->bc_magic == BLOCKIF_SIG);
780 return (bc->bc_size);
784 blockif_sectsz(struct blockif_ctxt *bc)
787 assert(bc->bc_magic == BLOCKIF_SIG);
788 return (bc->bc_sectsz);
792 blockif_psectsz(struct blockif_ctxt *bc, int *size, int *off)
795 assert(bc->bc_magic == BLOCKIF_SIG);
796 *size = bc->bc_psectsz;
797 *off = bc->bc_psectoff;
801 blockif_queuesz(struct blockif_ctxt *bc)
804 assert(bc->bc_magic == BLOCKIF_SIG);
809 blockif_is_ro(struct blockif_ctxt *bc)
812 assert(bc->bc_magic == BLOCKIF_SIG);
813 return (bc->bc_rdonly);
817 blockif_candelete(struct blockif_ctxt *bc)
820 assert(bc->bc_magic == BLOCKIF_SIG);
821 return (bc->bc_candelete);