#include <errno.h>
#include <assert.h>
#include <sys/poll.h>
-#include "fio.h"
-#include "os.h"
+
+#include "../fio.h"
+#include "../os.h"
#ifdef FIO_HAVE_SGIO
int ret;
sd = malloc(sizeof(*sd));
+ memset(sd, 0, sizeof(*sd));
sd->cmds = malloc(td->iodepth * sizeof(struct sgio_cmd));
+ memset(sd->cmds, 0, td->iodepth * sizeof(struct sgio_cmd));
sd->events = malloc(td->iodepth * sizeof(struct io_u *));
+ memset(sd->events, 0, td->iodepth * sizeof(struct io_u *));
td->io_ops->data = sd;
if (td->filetype == FIO_TYPE_BD) {
if (ioctl(f->fd, BLKSSZGET, &bs) < 0) {
td_verror(td, errno);
- return 1;
+ goto err;
}
} else if (td->filetype == FIO_TYPE_CHAR) {
int version;
if (ioctl(f->fd, SG_GET_VERSION_NUM, &version) < 0) {
td_verror(td, errno);
- return 1;
+ goto err;
}
ret = fio_sgio_get_bs(td, &bs);
if (ret)
- return ret;
+ goto err;
} else {
log_err("ioengine sgio only works on block devices\n");
- return 1;
+ goto err;
}
sd->bs = bs;
*/
td->override_sync = 1;
return 0;
+err:
+ free(sd->events);
+ free(sd->cmds);
+ free(sd);
+ return 1;
}
-struct ioengine_ops ioengine = {
+static struct ioengine_ops ioengine = {
.name = "sg",
.version = FIO_IOOPS_VERSION,
.init = fio_sgio_init,
return 1;
}
-struct ioengine_ops ioengine = {
+static struct ioengine_ops ioengine = {
.name = "sgio",
.version = FIO_IOOPS_VERSION,
.init = fio_sgio_init,
};
#endif
+
+static void fio_init fio_sgio_register(void)
+{
+ register_ioengine(&ioengine);
+}
+
+static void fio_exit fio_sgio_unregister(void)
+{
+ unregister_ioengine(&ioengine);
+}