X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=engines%2Fe4defrag.c;h=0a0004d0477fc795dd415d417a6c935f4cfb3131;hb=1e30d8d005a568169c0749f5fc6fb2d5f09dcc97;hp=4d87f676a128f1ab6cda8c826a9479098190d5b9;hpb=4e0a8fa2593006505b7f4e18931a201d221b49e9;p=fio.git diff --git a/engines/e4defrag.c b/engines/e4defrag.c index 4d87f676..0a0004d0 100644 --- a/engines/e4defrag.c +++ b/engines/e4defrag.c @@ -9,14 +9,11 @@ #include #include #include -#include -#include -#include #include -#include #include #include "../fio.h" +#include "../optgroup.h" #ifndef EXT4_IOC_MOVE_EXT #define EXT4_IOC_MOVE_EXT _IOWR('f', 15, struct move_extent) @@ -36,7 +33,7 @@ struct e4defrag_data { }; struct e4defrag_options { - struct thread_data *td; + void *pad; unsigned int inplace; char * donor_name; }; @@ -44,6 +41,7 @@ struct e4defrag_options { static struct fio_option options[] = { { .name = "donorname", + .lname = "Donor Name", .type = FIO_OPT_STR_STORE, .off1 = offsetof(struct e4defrag_options, donor_name), .help = "File used as a block donor", @@ -52,6 +50,7 @@ static struct fio_option options[] = { }, { .name = "inplace", + .lname = "In Place", .type = FIO_OPT_INT, .off1 = offsetof(struct e4defrag_options, inplace), .minval = 0, @@ -73,14 +72,14 @@ static int fio_e4defrag_init(struct thread_data *td) struct stat stub; char donor_name[PATH_MAX]; - if (!strlen(o->donor_name)) { + if (!o->donor_name || !strlen(o->donor_name)) { log_err("'donorname' options required\n"); return 1; } ed = malloc(sizeof(*ed)); if (!ed) { - td_verror(td, -ENOMEM, "io_queue_init"); + td_verror(td, ENOMEM, "io_queue_init"); return 1; } memset(ed, 0 ,sizeof(*ed)); @@ -91,15 +90,15 @@ static int fio_e4defrag_init(struct thread_data *td) ed->donor_fd = open(donor_name, O_CREAT|O_WRONLY, 0644); if (ed->donor_fd < 0) { - td_verror(td, ed->donor_fd, "io_queue_init"); - log_err("Can't open donor file %s err:%d", donor_name, ed->donor_fd); + td_verror(td, errno, "io_queue_init"); + log_err("Can't open donor file %s err:%d\n", donor_name, ed->donor_fd); free(ed); return 1; } if (!o->inplace) { - long long len = td->o.file_size_high - td->o.start_offset; - r = fallocate(ed->donor_fd, 0, td->o.start_offset, len); + long long __len = td->o.file_size_high - td->o.start_offset; + r = fallocate(ed->donor_fd, 0, td->o.start_offset, __len); if (r) goto err; } @@ -108,7 +107,7 @@ static int fio_e4defrag_init(struct thread_data *td) goto err; ed->bsz = stub.st_blksize; - td->io_ops->data = ed; + td->io_ops_data = ed; return 0; err: td_verror(td, errno, "io_queue_init"); @@ -119,7 +118,7 @@ err: static void fio_e4defrag_cleanup(struct thread_data *td) { - struct e4defrag_data *ed = td->io_ops->data; + struct e4defrag_data *ed = td->io_ops_data; if (ed) { if (ed->donor_fd >= 0) close(ed->donor_fd); @@ -128,14 +127,15 @@ static void fio_e4defrag_cleanup(struct thread_data *td) } -static int fio_e4defrag_queue(struct thread_data *td, struct io_u *io_u) +static enum fio_q_status fio_e4defrag_queue(struct thread_data *td, + struct io_u *io_u) { int ret; unsigned long long len; struct move_extent me; struct fio_file *f = io_u->file; - struct e4defrag_data *ed = td->io_ops->data; + struct e4defrag_data *ed = td->io_ops_data; struct e4defrag_options *o = td->eo; fio_ro_check(td, io_u); @@ -169,8 +169,13 @@ static int fio_e4defrag_queue(struct thread_data *td, struct io_u *io_u) len = io_u->xfer_buflen; if (len != io_u->xfer_buflen) { - io_u->resid = io_u->xfer_buflen - len; - io_u->error = 0; + if (len) { + io_u->resid = io_u->xfer_buflen - len; + io_u->error = 0; + } else { + /* access beyond i_size */ + io_u->error = EINVAL; + } } if (ret) io_u->error = errno;