Changeset View
Changeset View
Standalone View
Standalone View
sbin/ggate/ggated/ggated.c
Show First 20 Lines • Show All 720 Lines • ▼ Show 20 Lines | for (;;) { | ||||
} | } | ||||
TAILQ_REMOVE(&inqueue, req, r_next); | TAILQ_REMOVE(&inqueue, req, r_next); | ||||
error = pthread_mutex_unlock(&inqueue_mtx); | error = pthread_mutex_unlock(&inqueue_mtx); | ||||
assert(error == 0); | assert(error == 0); | ||||
/* | /* | ||||
* Check the request. | * Check the request. | ||||
*/ | */ | ||||
assert(req->r_cmd == GGATE_CMD_READ || req->r_cmd == GGATE_CMD_WRITE); | |||||
assert(req->r_offset + req->r_length <= (uintmax_t)conn->c_mediasize); | assert(req->r_offset + req->r_length <= (uintmax_t)conn->c_mediasize); | ||||
assert((req->r_offset % conn->c_sectorsize) == 0); | assert((req->r_offset % conn->c_sectorsize) == 0); | ||||
assert((req->r_length % conn->c_sectorsize) == 0); | assert((req->r_length % conn->c_sectorsize) == 0); | ||||
g_gate_log(LOG_DEBUG, "%s: offset=%" PRIu64 " length=%" PRIu32, | g_gate_log(LOG_DEBUG, "%s: offset=%" PRIu64 " length=%" PRIu32, | ||||
__func__, req->r_offset, req->r_length); | __func__, req->r_offset, req->r_length); | ||||
/* | /* | ||||
* Do the request. | * Do the request. | ||||
*/ | */ | ||||
data = 0; | data = 0; | ||||
switch (req->r_cmd) { | switch (req->r_cmd) { | ||||
case GGATE_CMD_READ: | case GGATE_CMD_READ: | ||||
data = pread(fd, req->r_data, req->r_length, | data = pread(fd, req->r_data, req->r_length, | ||||
req->r_offset); | req->r_offset); | ||||
break; | break; | ||||
case GGATE_CMD_WRITE: | case GGATE_CMD_WRITE: | ||||
data = pwrite(fd, req->r_data, req->r_length, | data = pwrite(fd, req->r_data, req->r_length, | ||||
req->r_offset); | req->r_offset); | ||||
/* Free data memory here - better sooner. */ | /* Free data memory here - better sooner. */ | ||||
free(req->r_data); | free(req->r_data); | ||||
req->r_data = NULL; | req->r_data = NULL; | ||||
break; | |||||
case GGATE_CMD_FLUSH: | |||||
data = fsync(fd); | |||||
jo_bruelltuete.com: this seems prudent.
otherwise unsupported requests (like maybe flush or trim from a newer… | |||||
if (data != 0) | |||||
req->r_error = errno; | |||||
break; | |||||
default: | |||||
g_gate_log(LOG_DEBUG, "Unsupported request: %i", req->r_cmd); | |||||
req->r_error = EOPNOTSUPP; | |||||
if (req->r_data != NULL) { | |||||
free(req->r_data); | |||||
req->r_data = NULL; | |||||
} | |||||
break; | break; | ||||
} | } | ||||
if (data != (ssize_t)req->r_length) { | if (data != (ssize_t)req->r_length) { | ||||
/* Report short reads/writes as I/O errors. */ | /* Report short reads/writes as I/O errors. */ | ||||
if (errno == 0) | if (errno == 0) | ||||
errno = EIO; | errno = EIO; | ||||
g_gate_log(LOG_ERR, "Disk error: %s", strerror(errno)); | g_gate_log(LOG_ERR, "Disk error: %s", strerror(errno)); | ||||
req->r_error = errno; | req->r_error = errno; | ||||
▲ Show 20 Lines • Show All 322 Lines • Show Last 20 Lines |
this seems prudent.
otherwise unsupported requests (like maybe flush or trim from a newer version of ggatec) would get EIO, but in a not so obvious way.