Lines Matching refs:s

211 static int ctl_respond(struct tdremus_state *s, const char *response);
232 static int ramdisk_flush(td_driver_t *driver, struct tdremus_state* s);
239 struct tdremus_state *s = (struct tdremus_state *) treq.cb_data; in replicated_write_callback() local
256 s->ramdisk.inflight--; in replicated_write_callback()
259 hashtable_remove(s->ramdisk.inprogress, &start); in replicated_write_callback()
264 if (!s->ramdisk.inflight && !s->ramdisk.prev) { in replicated_write_callback()
504 static int ramdisk_flush(td_driver_t *driver, struct tdremus_state* s) in ramdisk_flush() argument
513 if ((count = ramdisk_get_sectors(s->ramdisk.prev, &sectors)) <= 0) in ramdisk_flush()
517 if (!s->ramdisk.inprogress) in ramdisk_flush()
518 s->ramdisk.inprogress = create_hashtable(RAMDISK_HASHSIZE, in ramdisk_flush()
535 j = merge_requests(&s->ramdisk, base, batchlen, &buf); in ramdisk_flush()
548 create_write_request(s, base, batchlen, buf); in ramdisk_flush()
551 s->ramdisk.inflight++; in ramdisk_flush()
554 buf = hashtable_search(s->ramdisk.prev, &base); in ramdisk_flush()
556 hashtable_remove(s->ramdisk.prev, &base); in ramdisk_flush()
561 if (!hashtable_count(s->ramdisk.prev)) { in ramdisk_flush()
563 hashtable_destroy(s->ramdisk.prev, 0); in ramdisk_flush()
564 s->ramdisk.prev = NULL; in ramdisk_flush()
576 struct tdremus_state *s = (struct tdremus_state *)driver->data; in ramdisk_start_flush() local
583 if (!hashtable_count(s->ramdisk.h)) { in ramdisk_start_flush()
590 if (s->ramdisk.prev) { in ramdisk_start_flush()
594 if ((count = ramdisk_get_sectors(s->ramdisk.h, &sectors)) < 0) in ramdisk_start_flush()
598 buf = hashtable_search(s->ramdisk.h, sectors + i); in ramdisk_start_flush()
599 ramdisk_write_hash(s->ramdisk.prev, sectors[i], buf, in ramdisk_start_flush()
600 s->ramdisk.sector_size); in ramdisk_start_flush()
604 hashtable_destroy (s->ramdisk.h, 0); in ramdisk_start_flush()
606 s->ramdisk.prev = s->ramdisk.h; in ramdisk_start_flush()
610 s->ramdisk.h = create_hashtable(RAMDISK_HASHSIZE, uint64_hash, in ramdisk_start_flush()
613 return ramdisk_flush(driver, s); in ramdisk_start_flush()
619 struct tdremus_state *s = (struct tdremus_state *)driver->data; in ramdisk_start() local
621 if (s->ramdisk.h) { in ramdisk_start()
626 s->ramdisk.sector_size = driver->info.sector_size; in ramdisk_start()
627 s->ramdisk.h = create_hashtable(RAMDISK_HASHSIZE, uint64_hash, in ramdisk_start()
630 DPRINTF("Ramdisk started, %zu bytes/sector\n", s->ramdisk.sector_size); in ramdisk_start()
731 static void inline close_stream_fd(struct tdremus_state *s) in close_stream_fd() argument
734 tapdisk_server_unregister_event(s->stream_fd.id); in close_stream_fd()
735 close(s->stream_fd.fd); in close_stream_fd()
736 s->stream_fd.fd = -2; in close_stream_fd()
846 struct tdremus_state *s = (struct tdremus_state *)driver->data; in primary_queue_write() local
855 if(s->stream_fd.fd == -1) { in primary_queue_write()
857 primary_blocking_connect(s); in primary_queue_write()
863 if (mwrite(s->stream_fd.fd, TDREMUS_WRITE, strlen(TDREMUS_WRITE)) < 0) in primary_queue_write()
865 if (mwrite(s->stream_fd.fd, header, sizeof(header)) < 0) in primary_queue_write()
868 if (mwrite(s->stream_fd.fd, treq.buf, treq.secs * driver->info.sector_size) < 0) in primary_queue_write()
878 switch_mode(s->tdremus_driver, mode_unprotected); in primary_queue_write()
885 struct tdremus_state *s = (struct tdremus_state *)driver->data; in client_flush() local
889 if (s->stream_fd.fd == -1) in client_flush()
893 if (mwrite(s->stream_fd.fd, TDREMUS_COMMIT, strlen(TDREMUS_COMMIT)) < 0) { in client_flush()
895 close_stream_fd(s); in client_flush()
904 struct tdremus_state *s = (struct tdremus_state *)driver->data; in server_flush() local
908 if (!s->ramdisk.prev) in server_flush()
911 return ramdisk_flush(driver, s); in server_flush()
916 struct tdremus_state *s = (struct tdremus_state *)driver->data; in primary_start() local
922 s->queue_flush = client_flush; in primary_start()
924 s->stream_fd.fd = -1; in primary_start()
925 s->stream_fd.id = -1; in primary_start()
933 struct tdremus_state *s = (struct tdremus_state *)private; in remus_retry_connect_event() local
936 if (connect(s->stream_fd.fd, (struct sockaddr *)&s->sa, sizeof(s->sa)) in remus_retry_connect_event()
942 tapdisk_server_unregister_event(s->stream_fd.id); in remus_retry_connect_event()
943 …r_register_event(SCHEDULER_POLL_TIMEOUT, s->stream_fd.fd, REMUS_CONNRETRY_TIMEOUT, remus_retry_con… in remus_retry_connect_event()
947 s->stream_fd.id = id; in remus_retry_connect_event()
960 tapdisk_server_unregister_event(s->stream_fd.id); in remus_retry_connect_event()
961 …tapdisk_server_register_event(SCHEDULER_POLL_WRITE_FD, s->stream_fd.fd, 0, remus_connect_event, s)… in remus_retry_connect_event()
965 s->stream_fd.id = id; in remus_retry_connect_event()
975 struct tdremus_state *s = (struct tdremus_state *)private; in remus_connect_event() local
979 if (getsockopt(s->stream_fd.fd, SOL_SOCKET, SO_ERROR, &socket_errno, &socket_errno_size)) { in remus_connect_event()
994 tapdisk_server_unregister_event(s->stream_fd.id); in remus_connect_event()
995 …r_register_event(SCHEDULER_POLL_TIMEOUT, s->stream_fd.fd, REMUS_CONNRETRY_TIMEOUT, remus_retry_con… in remus_connect_event()
999 s->stream_fd.id = id; in remus_connect_event()
1011 tapdisk_server_unregister_event(s->stream_fd.id); in remus_connect_event()
1012 …= tapdisk_server_register_event(SCHEDULER_POLL_READ_FD, s->stream_fd.fd, 0, remus_client_event, s)… in remus_connect_event()
1016 s->stream_fd.id = id; in remus_connect_event()
1019 switch_mode(s->tdremus_driver, mode_primary); in remus_connect_event()
1028 struct tdremus_state *s = (struct tdremus_state *)private; in remus_client_event() local
1032 if (mread(s->stream_fd.fd, req, sizeof(req) - 1) < 0) { in remus_client_event()
1035 close_stream_fd(s); in remus_client_event()
1043 ctl_respond(s, TDREMUS_DONE); in remus_client_event()
1046 close_stream_fd(s); in remus_client_event()
1058 struct tdremus_state* s = (struct tdremus_state *) private; in remus_server_accept() local
1064 if ((stream_fd = accept(s->server_fd.fd, NULL, NULL)) < 0) { in remus_server_accept()
1075 remus_server_event, s); in remus_server_accept()
1084 s->stream_fd.fd = stream_fd; in remus_server_accept()
1085 s->stream_fd.id = cid; in remus_server_accept()
1089 static int remus_bind(struct tdremus_state* s) in remus_bind() argument
1095 if ((s->server_fd.fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { in remus_bind()
1100 if (setsockopt(s->server_fd.fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) in remus_bind()
1101 RPRINTF("Error setting REUSEADDR on %d: %d\n", s->server_fd.fd, errno); in remus_bind()
1103 if (bind(s->server_fd.fd, (struct sockaddr *)&s->sa, sizeof(s->sa)) < 0) { in remus_bind()
1104 RPRINTF("could not bind server socket %d to %s:%d: %d %s\n", s->server_fd.fd, in remus_bind()
1105 inet_ntoa(s->sa.sin_addr), ntohs(s->sa.sin_port), errno, strerror(errno)); in remus_bind()
1110 if (listen(s->server_fd.fd, 10)) { in remus_bind()
1118 if((s->server_fd.id = tapdisk_server_register_event(SCHEDULER_POLL_READ_FD, in remus_bind()
1119 s->server_fd.fd, 0, in remus_bind()
1120 remus_server_accept, s)) < 0) { in remus_bind()
1122 strerror(s->server_fd.id)); in remus_bind()
1129 close(s->server_fd.fd); in remus_bind()
1130 s->server_fd.fd = -1; in remus_bind()
1138 struct tdremus_state *s = (struct tdremus_state *)driver->data; in server_writes_inflight() local
1140 if (!s->ramdisk.inflight && !s->ramdisk.prev) in server_writes_inflight()
1152 struct tdremus_state *s = (struct tdremus_state *)driver->data; in backup_queue_read() local
1158 if (ramdisk_read(&s->ramdisk, treq.sec, treq.secs, treq.buf)) { in backup_queue_read()
1170 struct tdremus_state *s = (struct tdremus_state *)driver->data; in backup_queue_write() local
1184 struct tdremus_state *s = (struct tdremus_state *)driver->data; in backup_start() local
1192 s->queue_flush = server_flush; in backup_start()
1199 struct tdremus_state *s = (struct tdremus_state *)driver->data; in server_do_wreq() local
1210 if (mread(s->stream_fd.fd, header, sizeof(header)) < 0) in server_do_wreq()
1224 if (mread(s->stream_fd.fd, buf, len) < 0) in server_do_wreq()
1227 if (ramdisk_write(&s->ramdisk, *sector, *sectors, buf) < 0) in server_do_wreq()
1235 close_stream_fd(s); in server_do_wreq()
1253 struct tdremus_state *s = (struct tdremus_state *)driver->data; in server_do_creq() local
1260 if (write(s->stream_fd.fd, TDREMUS_DONE, strlen(TDREMUS_DONE)) != 4) in server_do_creq()
1270 struct tdremus_state *s = (struct tdremus_state *)private; in remus_server_event() local
1271 td_driver_t *driver = s->tdremus_driver; in remus_server_event()
1279 if (mread(s->stream_fd.fd, req, sizeof(req) - 1) < 0) { in remus_server_event()
1304 struct tdremus_state *s = (struct tdremus_state *)driver->data; in unprotected_queue_read() local
1312 if(!s->ramdisk.inflight) /* nothing in inprogress */ in unprotected_queue_read()
1313 ramdisk_flush(driver, s); in unprotected_queue_read()
1326 struct tdremus_state *s = (struct tdremus_state *)driver->data; in unprotected_queue_write() local
1331 if(!s->ramdisk.inflight) /* nothing in inprogress. Kick prev */ in unprotected_queue_write()
1332 ramdisk_flush(driver, s); in unprotected_queue_write()
1344 struct tdremus_state *s = (struct tdremus_state *)driver->data; in unprotected_start() local
1349 close_stream_fd(s); in unprotected_start()
1352 tapdisk_server_unregister_event(s->server_fd.id); in unprotected_start()
1355 close(s->server_fd.fd); in unprotected_start()
1356 s->server_fd.fd = -1; in unprotected_start()
1453 struct tdremus_state *s = (struct tdremus_state *)driver->data; in switch_mode() local
1456 if (mode == s->mode) in switch_mode()
1459 if (s->queue_flush) in switch_mode()
1460 if ((rc = s->queue_flush(driver)) < 0) { in switch_mode()
1462 RPRINTF("switch_mode: error flushing queue (old: %d, new: %d)", s->mode, mode); in switch_mode()
1478 s->mode = mode; in switch_mode()
1485 struct tdremus_state *s = (struct tdremus_state *)private; in ctl_request() local
1486 td_driver_t *driver = s->tdremus_driver; in ctl_request()
1492 if (!(rc = read(s->ctl_fd.fd, msg, sizeof(msg) - 1 /* append nul */))) { in ctl_request()
1495 close(s->ctl_fd.fd); in ctl_request()
1497 if ((s->ctl_fd.fd = open(s->ctl_path, O_RDWR)) < 0) { in ctl_request()
1511 if (s->queue_flush) in ctl_request()
1512 if ((rc = s->queue_flush(driver))) { in ctl_request()
1514 ctl_respond(s, TDREMUS_FAIL); in ctl_request()
1521 static int ctl_respond(struct tdremus_state *s, const char *response) in ctl_respond() argument
1525 if ((rc = write(s->msg_fd.fd, response, strlen(response))) < 0) { in ctl_respond()
1527 close(s->msg_fd.fd); in ctl_respond()
1528 if ((s->msg_fd.fd = open(s->msg_path, O_RDWR)) < 0) in ctl_respond()
1538 struct tdremus_state *s = (struct tdremus_state *)driver->data; in ctl_open() local
1549 if (asprintf(&s->ctl_path, BLKTAP_CTRL_DIR "/remus_%s", name) < 0) in ctl_open()
1552 for (i = strlen(BLKTAP_CTRL_DIR) + 1, l = strlen(s->ctl_path); i < l; i++) { in ctl_open()
1553 if (strchr(":/", s->ctl_path[i])) in ctl_open()
1554 s->ctl_path[i] = '_'; in ctl_open()
1556 if (asprintf(&s->msg_path, "%s.msg", s->ctl_path) < 0) in ctl_open()
1559 if (mkfifo(s->ctl_path, S_IRWXU|S_IRWXG|S_IRWXO) && errno != EEXIST) { in ctl_open()
1560 RPRINTF("error creating control FIFO %s: %d\n", s->ctl_path, errno); in ctl_open()
1564 if (mkfifo(s->msg_path, S_IRWXU|S_IRWXG|S_IRWXO) && errno != EEXIST) { in ctl_open()
1565 RPRINTF("error creating message FIFO %s: %d\n", s->msg_path, errno); in ctl_open()
1570 if ((s->ctl_fd.fd = open(s->ctl_path, O_RDWR)) < 0) { in ctl_open()
1571 RPRINTF("error opening control FIFO %s: %d\n", s->ctl_path, errno); in ctl_open()
1575 if ((s->msg_fd.fd = open(s->msg_path, O_RDWR)) < 0) { in ctl_open()
1576 RPRINTF("error opening message FIFO %s: %d\n", s->msg_path, errno); in ctl_open()
1580 RPRINTF("control FIFO %s\n", s->ctl_path); in ctl_open()
1581 RPRINTF("message FIFO %s\n", s->msg_path); in ctl_open()
1586 close(s->ctl_fd.fd); in ctl_open()
1588 free(s->msg_path); in ctl_open()
1589 s->msg_path = NULL; in ctl_open()
1591 free(s->ctl_path); in ctl_open()
1592 s->ctl_path = NULL; in ctl_open()
1598 struct tdremus_state *s = (struct tdremus_state *)driver->data; in ctl_close() local
1602 if(s->ctl_fd.fd) in ctl_close()
1603 close(s->ctl_fd.fd); in ctl_close()
1605 if (s->ctl_path) { in ctl_close()
1606 unlink(s->ctl_path); in ctl_close()
1607 free(s->ctl_path); in ctl_close()
1608 s->ctl_path = NULL; in ctl_close()
1610 if (s->msg_path) { in ctl_close()
1611 unlink(s->msg_path); in ctl_close()
1612 free(s->msg_path); in ctl_close()
1613 s->msg_path = NULL; in ctl_close()
1617 static int ctl_register(struct tdremus_state *s) in ctl_register() argument
1622s->ctl_fd.id = tapdisk_server_register_event(SCHEDULER_POLL_READ_FD, s->ctl_fd.fd, 0, ctl_request,… in ctl_register()
1624 if (s->ctl_fd.id < 0) { in ctl_register()
1625 RPRINTF("error registering ctrl FIFO %s: %d\n", s->ctl_path, s->ctl_fd.id); in ctl_register()
1637 struct tdremus_state *s = (struct tdremus_state *)driver->data; in tdremus_open() local
1648 memset(s, 0, sizeof(*s)); in tdremus_open()
1649 s->server_fd.fd = -1; in tdremus_open()
1650 s->stream_fd.fd = -1; in tdremus_open()
1651 s->ctl_fd.fd = -1; in tdremus_open()
1652 s->msg_fd.fd = -1; in tdremus_open()
1656 s->tdremus_driver = driver; in tdremus_open()
1664 free(s->driver_data); in tdremus_open()
1668 if ((rc = ctl_register(s))) { in tdremus_open()
1670 free(s->driver_data); in tdremus_open()
1674 if (!(rc = remus_bind(s))) in tdremus_open()
1688 struct tdremus_state *s = (struct tdremus_state *)driver->data; in tdremus_close() local
1691 if (s->ramdisk.inprogress) in tdremus_close()
1692 hashtable_destroy(s->ramdisk.inprogress, 0); in tdremus_close()
1694 if (s->driver_data) { in tdremus_close()
1695 free(s->driver_data); in tdremus_close()
1696 s->driver_data = NULL; in tdremus_close()
1698 if (s->server_fd.fd >= 0) { in tdremus_close()
1699 close(s->server_fd.fd); in tdremus_close()
1700 s->server_fd.fd = -1; in tdremus_close()
1702 if (s->stream_fd.fd >= 0) in tdremus_close()
1703 close_stream_fd(s); in tdremus_close()