Lines Matching refs:bc
161 blockif_enqueue(struct blockif_ctxt *bc, struct blockif_req *breq, in blockif_enqueue() argument
168 be = TAILQ_FIRST(&bc->bc_freeq); in blockif_enqueue()
171 TAILQ_REMOVE(&bc->bc_freeq, be, be_link); in blockif_enqueue()
189 TAILQ_FOREACH(tbe, &bc->bc_pendq, be_link) { in blockif_enqueue()
194 TAILQ_FOREACH(tbe, &bc->bc_busyq, be_link) { in blockif_enqueue()
203 TAILQ_INSERT_TAIL(&bc->bc_pendq, be, be_link); in blockif_enqueue()
208 blockif_dequeue(struct blockif_ctxt *bc, pthread_t t, struct blockif_elem **bep) in blockif_dequeue() argument
212 TAILQ_FOREACH(be, &bc->bc_pendq, be_link) { in blockif_dequeue()
219 TAILQ_REMOVE(&bc->bc_pendq, be, be_link); in blockif_dequeue()
222 TAILQ_INSERT_TAIL(&bc->bc_busyq, be, be_link); in blockif_dequeue()
228 blockif_complete(struct blockif_ctxt *bc, struct blockif_elem *be) in blockif_complete() argument
233 TAILQ_REMOVE(&bc->bc_busyq, be, be_link); in blockif_complete()
235 TAILQ_REMOVE(&bc->bc_pendq, be, be_link); in blockif_complete()
236 TAILQ_FOREACH(tbe, &bc->bc_pendq, be_link) { in blockif_complete()
243 TAILQ_INSERT_TAIL(&bc->bc_freeq, be, be_link); in blockif_complete()
247 blockif_flush_bc(struct blockif_ctxt *bc) in blockif_flush_bc() argument
250 if (bc->bc_ischr) { in blockif_flush_bc()
251 if (ioctl(bc->bc_fd, DIOCGFLUSH)) in blockif_flush_bc()
253 } else if (fsync(bc->bc_fd)) in blockif_flush_bc()
262 if (fsync(bc->bc_fd)) in blockif_flush_bc()
270 blockif_proc(struct blockif_ctxt *bc, struct blockif_elem *be, uint8_t *buf) in blockif_proc() argument
292 if ((n = preadv(bc->bc_fd, br->br_iov, br->br_iovcnt, in blockif_proc()
303 n = pread(bc->bc_fd, buf, len, br->br_offset + off); in blockif_proc()
328 if (bc->bc_rdonly) { in blockif_proc()
333 if ((n = pwritev(bc->bc_fd, br->br_iov, br->br_iovcnt, in blockif_proc()
360 n = pwrite(bc->bc_fd, buf, len, br->br_offset + off); in blockif_proc()
370 err = blockif_flush_bc(bc); in blockif_proc()
373 if (!bc->bc_candelete) in blockif_proc()
375 else if (bc->bc_rdonly) in blockif_proc()
378 else if (bc->bc_ischr) { in blockif_proc()
381 if (ioctl(bc->bc_fd, DIOCGDELETE, arg)) in blockif_proc()
390 if (fspacectl(bc->bc_fd, SPACECTL_DEALLOC, in blockif_proc()
400 else if (bc->bc_ischr) { in blockif_proc()
413 if (ioctl(bc->bc_fd, DKIOCFREE, &dfl)) in blockif_proc()
425 if (fcntl(bc->bc_fd, F_FREESP, &fl)) in blockif_proc()
443 blockif_empty(const struct blockif_ctxt *bc) in blockif_empty() argument
445 return (TAILQ_EMPTY(&bc->bc_pendq) && TAILQ_EMPTY(&bc->bc_busyq)); in blockif_empty()
451 struct blockif_ctxt *bc; in blockif_thr() local
456 bc = arg; in blockif_thr()
457 if (bc->bc_isgeom) in blockif_thr()
463 pthread_mutex_lock(&bc->bc_mtx); in blockif_thr()
465 while (blockif_dequeue(bc, t, &be)) { in blockif_thr()
466 pthread_mutex_unlock(&bc->bc_mtx); in blockif_thr()
467 blockif_proc(bc, be, buf); in blockif_thr()
468 pthread_mutex_lock(&bc->bc_mtx); in blockif_thr()
469 blockif_complete(bc, be); in blockif_thr()
472 if (bc->bc_closing) in blockif_thr()
475 pthread_cond_wait(&bc->bc_cond, &bc->bc_mtx); in blockif_thr()
477 pthread_mutex_unlock(&bc->bc_mtx); in blockif_thr()
548 struct blockif_ctxt *const bc) in blockif_add_boot_device() argument
550 if (bc->bc_bootindex < 0) in blockif_add_boot_device()
553 return (pci_emul_add_boot_device(pi, bc->bc_bootindex)); in blockif_add_boot_device()
565 struct blockif_ctxt *bc; in blockif_open() local
803 bc = calloc(1, sizeof(struct blockif_ctxt)); in blockif_open()
804 if (bc == NULL) { in blockif_open()
809 bc->bc_magic = BLOCKIF_SIG; in blockif_open()
810 bc->bc_fd = fd; in blockif_open()
811 bc->bc_ischr = S_ISCHR(sbuf.st_mode); in blockif_open()
812 bc->bc_isgeom = geom; in blockif_open()
813 bc->bc_candelete = candelete; in blockif_open()
815 bc->bc_wce = wce; in blockif_open()
817 bc->bc_rdonly = ro; in blockif_open()
818 bc->bc_size = size; in blockif_open()
819 bc->bc_sectsz = sectsz; in blockif_open()
820 bc->bc_psectsz = psectsz; in blockif_open()
821 bc->bc_psectoff = psectoff; in blockif_open()
822 pthread_mutex_init(&bc->bc_mtx, NULL); in blockif_open()
823 pthread_cond_init(&bc->bc_cond, NULL); in blockif_open()
824 TAILQ_INIT(&bc->bc_freeq); in blockif_open()
825 TAILQ_INIT(&bc->bc_pendq); in blockif_open()
826 TAILQ_INIT(&bc->bc_busyq); in blockif_open()
827 bc->bc_bootindex = bootindex; in blockif_open()
829 bc->bc_reqs[i].be_status = BST_FREE; in blockif_open()
830 TAILQ_INSERT_HEAD(&bc->bc_freeq, &bc->bc_reqs[i], be_link); in blockif_open()
834 pthread_create(&bc->bc_btid[i], NULL, blockif_thr, bc); in blockif_open()
836 pthread_set_name_np(bc->bc_btid[i], tname); in blockif_open()
839 return (bc); in blockif_open()
849 struct blockif_ctxt *bc; in blockif_resized() local
875 bc = arg; in blockif_resized()
876 pthread_mutex_lock(&bc->bc_mtx); in blockif_resized()
877 if (mediasize != bc->bc_size) { in blockif_resized()
878 bc->bc_size = mediasize; in blockif_resized()
879 bc->bc_resize_cb(bc, bc->bc_resize_cb_arg, bc->bc_size); in blockif_resized()
881 pthread_mutex_unlock(&bc->bc_mtx); in blockif_resized()
885 blockif_register_resize_callback(struct blockif_ctxt *bc, blockif_resize_cb *cb, in blockif_register_resize_callback() argument
896 pthread_mutex_lock(&bc->bc_mtx); in blockif_register_resize_callback()
897 if (bc->bc_resize_cb != NULL) { in blockif_register_resize_callback()
902 assert(bc->bc_closing == 0); in blockif_register_resize_callback()
904 if (fstat(bc->bc_fd, &sb) != 0) { in blockif_register_resize_callback()
909 bc->bc_resize_event = mevent_add_flags(bc->bc_fd, EVF_VNODE, in blockif_register_resize_callback()
910 EVFF_ATTRIB, blockif_resized, bc); in blockif_register_resize_callback()
911 if (bc->bc_resize_event == NULL) { in blockif_register_resize_callback()
916 bc->bc_resize_cb = cb; in blockif_register_resize_callback()
917 bc->bc_resize_cb_arg = cb_arg; in blockif_register_resize_callback()
919 pthread_mutex_unlock(&bc->bc_mtx); in blockif_register_resize_callback()
925 blockif_request(struct blockif_ctxt *bc, struct blockif_req *breq, in blockif_request() argument
932 pthread_mutex_lock(&bc->bc_mtx); in blockif_request()
933 if (!TAILQ_EMPTY(&bc->bc_freeq)) { in blockif_request()
938 if (blockif_enqueue(bc, breq, op)) in blockif_request()
939 pthread_cond_signal(&bc->bc_cond); in blockif_request()
949 pthread_mutex_unlock(&bc->bc_mtx); in blockif_request()
955 blockif_read(struct blockif_ctxt *bc, struct blockif_req *breq) in blockif_read() argument
957 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_read()
958 return (blockif_request(bc, breq, BOP_READ)); in blockif_read()
962 blockif_write(struct blockif_ctxt *bc, struct blockif_req *breq) in blockif_write() argument
964 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_write()
965 return (blockif_request(bc, breq, BOP_WRITE)); in blockif_write()
969 blockif_flush(struct blockif_ctxt *bc, struct blockif_req *breq) in blockif_flush() argument
971 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_flush()
972 return (blockif_request(bc, breq, BOP_FLUSH)); in blockif_flush()
976 blockif_delete(struct blockif_ctxt *bc, struct blockif_req *breq) in blockif_delete() argument
978 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_delete()
979 return (blockif_request(bc, breq, BOP_DELETE)); in blockif_delete()
983 blockif_cancel(struct blockif_ctxt *bc, struct blockif_req *breq) in blockif_cancel() argument
987 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_cancel()
989 pthread_mutex_lock(&bc->bc_mtx); in blockif_cancel()
993 TAILQ_FOREACH(be, &bc->bc_pendq, be_link) { in blockif_cancel()
1001 blockif_complete(bc, be); in blockif_cancel()
1002 pthread_mutex_unlock(&bc->bc_mtx); in blockif_cancel()
1010 TAILQ_FOREACH(be, &bc->bc_busyq, be_link) { in blockif_cancel()
1018 pthread_mutex_unlock(&bc->bc_mtx); in blockif_cancel()
1049 pthread_mutex_unlock(&bc->bc_mtx); in blockif_cancel()
1059 blockif_close(struct blockif_ctxt *bc) in blockif_close() argument
1064 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_close()
1069 pthread_mutex_lock(&bc->bc_mtx); in blockif_close()
1070 bc->bc_closing = 1; in blockif_close()
1071 if (bc->bc_resize_event != NULL) in blockif_close()
1072 mevent_disable(bc->bc_resize_event); in blockif_close()
1073 pthread_mutex_unlock(&bc->bc_mtx); in blockif_close()
1074 pthread_cond_broadcast(&bc->bc_cond); in blockif_close()
1076 pthread_join(bc->bc_btid[i], &jval); in blockif_close()
1083 bc->bc_magic = 0; in blockif_close()
1084 close(bc->bc_fd); in blockif_close()
1085 free(bc); in blockif_close()
1095 blockif_chs(struct blockif_ctxt *bc, uint16_t *c, uint8_t *h, uint8_t *s) in blockif_chs() argument
1102 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_chs()
1104 sectors = bc->bc_size / bc->bc_sectsz; in blockif_chs()
1143 blockif_size(struct blockif_ctxt *bc) in blockif_size() argument
1145 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_size()
1146 return (bc->bc_size); in blockif_size()
1150 blockif_sectsz(struct blockif_ctxt *bc) in blockif_sectsz() argument
1152 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_sectsz()
1153 return (bc->bc_sectsz); in blockif_sectsz()
1157 blockif_psectsz(struct blockif_ctxt *bc, int *size, int *off) in blockif_psectsz() argument
1159 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_psectsz()
1160 *size = bc->bc_psectsz; in blockif_psectsz()
1161 *off = bc->bc_psectoff; in blockif_psectsz()
1165 blockif_queuesz(struct blockif_ctxt *bc) in blockif_queuesz() argument
1167 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_queuesz()
1172 blockif_is_ro(struct blockif_ctxt *bc) in blockif_is_ro() argument
1174 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_is_ro()
1175 return (bc->bc_rdonly); in blockif_is_ro()
1179 blockif_candelete(struct blockif_ctxt *bc) in blockif_candelete() argument
1181 assert(bc->bc_magic == BLOCKIF_SIG); in blockif_candelete()
1182 return (bc->bc_candelete); in blockif_candelete()
1187 blockif_set_wce(struct blockif_ctxt *bc, int wc_enable) in blockif_set_wce() argument
1192 (void) pthread_mutex_lock(&bc->bc_mtx); in blockif_set_wce()
1193 switch (bc->bc_wce) { in blockif_set_wce()
1195 res = ioctl(bc->bc_fd, DKIOCSETWCE, &clean_val); in blockif_set_wce()
1198 if ((flags = fcntl(bc->bc_fd, F_GETFL)) >= 0) { in blockif_set_wce()
1204 if (fcntl(bc->bc_fd, F_SETFL, flags) == -1) { in blockif_set_wce()
1220 res = fsync(bc->bc_fd); in blockif_set_wce()
1222 (void) pthread_mutex_unlock(&bc->bc_mtx); in blockif_set_wce()