Lines Matching full:bc
135 blockif_enqueue(struct blockif_ctxt *bc, struct blockif_req *breq, in blockif_enqueue() argument
142 be = TAILQ_FIRST(&bc->bc_freeq); in blockif_enqueue()
145 TAILQ_REMOVE(&bc->bc_freeq, be, be_link); in blockif_enqueue()
160 TAILQ_FOREACH(tbe, &bc->bc_pendq, be_link) { in blockif_enqueue()
165 TAILQ_FOREACH(tbe, &bc->bc_busyq, be_link) { in blockif_enqueue()
174 TAILQ_INSERT_TAIL(&bc->bc_pendq, be, be_link); in blockif_enqueue()
179 blockif_dequeue(struct blockif_ctxt *bc, pthread_t t, struct blockif_elem **bep) in blockif_dequeue() argument
183 TAILQ_FOREACH(be, &bc->bc_pendq, be_link) { in blockif_dequeue()
190 TAILQ_REMOVE(&bc->bc_pendq, be, be_link); in blockif_dequeue()
193 TAILQ_INSERT_TAIL(&bc->bc_busyq, be, be_link); in blockif_dequeue()
199 blockif_complete(struct blockif_ctxt *bc, struct blockif_elem *be) in blockif_complete() argument
204 TAILQ_REMOVE(&bc->bc_busyq, be, be_link); in blockif_complete()
206 TAILQ_REMOVE(&bc->bc_pendq, be, be_link); in blockif_complete()
207 TAILQ_FOREACH(tbe, &bc->bc_pendq, be_link) { in blockif_complete()
214 TAILQ_INSERT_TAIL(&bc->bc_freeq, be, be_link); in blockif_complete()
218 blockif_flush_bc(struct blockif_ctxt *bc) in blockif_flush_bc() argument
220 if (bc->bc_ischr) { in blockif_flush_bc()
221 if (ioctl(bc->bc_fd, DIOCGFLUSH)) in blockif_flush_bc()
223 } else if (fsync(bc->bc_fd)) in blockif_flush_bc()
230 blockif_proc(struct blockif_ctxt *bc, struct blockif_elem *be, uint8_t *buf) in blockif_proc() argument
248 if ((n = preadv(bc->bc_fd, br->br_iov, br->br_iovcnt, in blockif_proc()
259 n = pread(bc->bc_fd, buf, len, br->br_offset + off); in blockif_proc()
284 if (bc->bc_rdonly) { in blockif_proc()
289 if ((n = pwritev(bc->bc_fd, br->br_iov, br->br_iovcnt, in blockif_proc()
316 n = pwrite(bc->bc_fd, buf, len, br->br_offset + off); in blockif_proc()
326 err = blockif_flush_bc(bc); in blockif_proc()
329 if (!bc->bc_candelete) in blockif_proc()
331 else if (bc->bc_rdonly) in blockif_proc()
333 else if (bc->bc_ischr) { in blockif_proc()
336 if (ioctl(bc->bc_fd, DIOCGDELETE, arg)) in blockif_proc()
345 if (fspacectl(bc->bc_fd, SPACECTL_DEALLOC, in blockif_proc()
366 blockif_empty(const struct blockif_ctxt *bc) in blockif_empty() argument
368 return (TAILQ_EMPTY(&bc->bc_pendq) && TAILQ_EMPTY(&bc->bc_busyq)); in blockif_empty()
374 struct blockif_ctxt *bc; in blockif_thr() local
379 bc = arg; in blockif_thr()
380 if (bc->bc_isgeom) in blockif_thr()
386 pthread_mutex_lock(&bc->bc_mtx); in blockif_thr()
388 while (blockif_dequeue(bc, t, &be)) { in blockif_thr()
389 pthread_mutex_unlock(&bc->bc_mtx); in blockif_thr()
390 blockif_proc(bc, be, buf); in blockif_thr()
391 pthread_mutex_lock(&bc->bc_mtx); in blockif_thr()
392 blockif_complete(bc, be); in blockif_thr()
396 if (blockif_empty(bc)) in blockif_thr()
397 pthread_cond_broadcast(&bc->bc_work_done_cond); in blockif_thr()
400 if (bc->bc_closing) in blockif_thr()
403 pthread_cond_wait(&bc->bc_cond, &bc->bc_mtx); in blockif_thr()
405 pthread_mutex_unlock(&bc->bc_mtx); in blockif_thr()
467 struct blockif_ctxt *const bc) in blockif_add_boot_device() argument
469 if (bc->bc_bootindex < 0) in blockif_add_boot_device()
472 return (pci_emul_add_boot_device(pi, bc->bc_bootindex)); in blockif_add_boot_device()
482 struct blockif_ctxt *bc; in blockif_open() local
637 bc = calloc(1, sizeof(struct blockif_ctxt)); in blockif_open()
638 if (bc == NULL) { in blockif_open()
643 bc->bc_magic = BLOCKIF_SIG; in blockif_open()
644 bc->bc_fd = fd; in blockif_open()
645 bc->bc_ischr = S_ISCHR(sbuf.st_mode); in blockif_open()
646 bc->bc_isgeom = geom; in blockif_open()
647 bc->bc_candelete = candelete; in blockif_open()
648 bc->bc_rdonly = ro; in blockif_open()
649 bc->bc_size = size; in blockif_open()
650 bc->bc_sectsz = sectsz; in blockif_open()
651 bc->bc_psectsz = psectsz; in blockif_open()
652 bc->bc_psectoff = psectoff; in blockif_open()
653 pthread_mutex_init(&bc->bc_mtx, NULL); in blockif_open()
654 pthread_cond_init(&bc->bc_cond, NULL); in blockif_open()
655 bc->bc_paused = 0; in blockif_open()
656 pthread_cond_init(&bc->bc_work_done_cond, NULL); in blockif_open()
657 TAILQ_INIT(&bc->bc_freeq); in blockif_open()
658 TAILQ_INIT(&bc->bc_pendq); in blockif_open()
659 TAILQ_INIT(&bc->bc_busyq); in blockif_open()
660 bc->bc_bootindex = bootindex; in blockif_open()
662 bc->bc_reqs[i].be_status = BST_FREE; in blockif_open()
663 TAILQ_INSERT_HEAD(&bc->bc_freeq, &bc->bc_reqs[i], be_link); in blockif_open()
667 pthread_create(&bc->bc_btid[i], NULL, blockif_thr, bc); in blockif_open()
669 pthread_set_name_np(bc->bc_btid[i], tname); in blockif_open()
672 return (bc); in blockif_open()
682 struct blockif_ctxt *bc; in blockif_resized() local
698 bc = arg; in blockif_resized()
699 pthread_mutex_lock(&bc->bc_mtx); in blockif_resized()
700 if (mediasize != bc->bc_size) { in blockif_resized()
701 bc->bc_size = mediasize; in blockif_resized()
702 bc->bc_resize_cb(bc, bc->bc_resize_cb_arg, bc->bc_size); in blockif_resized()
704 pthread_mutex_unlock(&bc->bc_mtx); in blockif_resized()
708 blockif_register_resize_callback(struct blockif_ctxt *bc, blockif_resize_cb *cb, in blockif_register_resize_callback() argument
719 pthread_mutex_lock(&bc->bc_mtx); in blockif_register_resize_callback()
720 if (bc->bc_resize_cb != NULL) { in blockif_register_resize_callback()
725 assert(bc->bc_closing == 0); in blockif_register_resize_callback()
727 if (fstat(bc->bc_fd, &sb) != 0) { in blockif_register_resize_callback()
732 bc->bc_resize_event = mevent_add_flags(bc->bc_fd, EVF_VNODE, in blockif_register_resize_callback()
733 EVFF_ATTRIB, blockif_resized, bc); in blockif_register_resize_callback()
734 if (bc->bc_resize_event == NULL) { in blockif_register_resize_callback()
739 bc->bc_resize_cb = cb; in blockif_register_resize_callback()
740 bc->bc_resize_cb_arg = cb_arg; in blockif_register_resize_callback()
742 pthread_mutex_unlock(&bc->bc_mtx); in blockif_register_resize_callback()
748 blockif_request(struct blockif_ctxt *bc, struct blockif_req *breq, in blockif_request() argument
755 pthread_mutex_lock(&bc->bc_mtx); in blockif_request()
756 assert(!bc->bc_paused); in blockif_request()
757 if (!TAILQ_EMPTY(&bc->bc_freeq)) { in blockif_request()
762 if (blockif_enqueue(bc, breq, op)) in blockif_request()
763 pthread_cond_signal(&bc->bc_cond); in blockif_request()
773 pthread_mutex_unlock(&bc->bc_mtx); in blockif_request()
779 blockif_read(struct blockif_ctxt *bc, struct blockif_req *breq) in blockif_read() argument
781 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_read()
782 return (blockif_request(bc, breq, BOP_READ)); in blockif_read()
786 blockif_write(struct blockif_ctxt *bc, struct blockif_req *breq) in blockif_write() argument
788 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_write()
789 return (blockif_request(bc, breq, BOP_WRITE)); in blockif_write()
793 blockif_flush(struct blockif_ctxt *bc, struct blockif_req *breq) in blockif_flush() argument
795 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_flush()
796 return (blockif_request(bc, breq, BOP_FLUSH)); in blockif_flush()
800 blockif_delete(struct blockif_ctxt *bc, struct blockif_req *breq) in blockif_delete() argument
802 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_delete()
803 return (blockif_request(bc, breq, BOP_DELETE)); in blockif_delete()
807 blockif_cancel(struct blockif_ctxt *bc, struct blockif_req *breq) in blockif_cancel() argument
811 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_cancel()
813 pthread_mutex_lock(&bc->bc_mtx); in blockif_cancel()
819 TAILQ_FOREACH(be, &bc->bc_pendq, be_link) { in blockif_cancel()
827 blockif_complete(bc, be); in blockif_cancel()
828 pthread_mutex_unlock(&bc->bc_mtx); in blockif_cancel()
836 TAILQ_FOREACH(be, &bc->bc_busyq, be_link) { in blockif_cancel()
844 pthread_mutex_unlock(&bc->bc_mtx); in blockif_cancel()
875 pthread_mutex_unlock(&bc->bc_mtx); in blockif_cancel()
885 blockif_close(struct blockif_ctxt *bc) in blockif_close() argument
890 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_close()
895 pthread_mutex_lock(&bc->bc_mtx); in blockif_close()
896 bc->bc_closing = 1; in blockif_close()
897 if (bc->bc_resize_event != NULL) in blockif_close()
898 mevent_disable(bc->bc_resize_event); in blockif_close()
899 pthread_mutex_unlock(&bc->bc_mtx); in blockif_close()
900 pthread_cond_broadcast(&bc->bc_cond); in blockif_close()
902 pthread_join(bc->bc_btid[i], &jval); in blockif_close()
909 bc->bc_magic = 0; in blockif_close()
910 close(bc->bc_fd); in blockif_close()
911 free(bc); in blockif_close()
921 blockif_chs(struct blockif_ctxt *bc, uint16_t *c, uint8_t *h, uint8_t *s) in blockif_chs() argument
928 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_chs()
930 sectors = bc->bc_size / bc->bc_sectsz; in blockif_chs()
969 blockif_size(struct blockif_ctxt *bc) in blockif_size() argument
971 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_size()
972 return (bc->bc_size); in blockif_size()
976 blockif_sectsz(struct blockif_ctxt *bc) in blockif_sectsz() argument
978 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_sectsz()
979 return (bc->bc_sectsz); in blockif_sectsz()
983 blockif_psectsz(struct blockif_ctxt *bc, int *size, int *off) in blockif_psectsz() argument
985 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_psectsz()
986 *size = bc->bc_psectsz; in blockif_psectsz()
987 *off = bc->bc_psectoff; in blockif_psectsz()
991 blockif_queuesz(struct blockif_ctxt *bc) in blockif_queuesz() argument
993 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_queuesz()
998 blockif_is_ro(struct blockif_ctxt *bc) in blockif_is_ro() argument
1000 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_is_ro()
1001 return (bc->bc_rdonly); in blockif_is_ro()
1005 blockif_candelete(struct blockif_ctxt *bc) in blockif_candelete() argument
1007 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_candelete()
1008 return (bc->bc_candelete); in blockif_candelete()
1013 blockif_pause(struct blockif_ctxt *bc) in blockif_pause() argument
1015 assert(bc != NULL); in blockif_pause()
1016 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_pause()
1018 pthread_mutex_lock(&bc->bc_mtx); in blockif_pause()
1019 bc->bc_paused = 1; in blockif_pause()
1022 while (!blockif_empty(bc)) in blockif_pause()
1023 pthread_cond_wait(&bc->bc_work_done_cond, &bc->bc_mtx); in blockif_pause()
1024 pthread_mutex_unlock(&bc->bc_mtx); in blockif_pause()
1026 if (!bc->bc_rdonly && blockif_flush_bc(bc)) in blockif_pause()
1032 blockif_resume(struct blockif_ctxt *bc) in blockif_resume() argument
1034 assert(bc != NULL); in blockif_resume()
1035 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_resume()
1037 pthread_mutex_lock(&bc->bc_mtx); in blockif_resume()
1038 bc->bc_paused = 0; in blockif_resume()
1039 pthread_mutex_unlock(&bc->bc_mtx); in blockif_resume()