X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=fio.c;h=2aeb6f72a5b196e3052876b27c24fd266db90cfe;hp=cc54c837fd806d59caacd7a858879dd3fd35c5ef;hb=bca4ed4de445a07af393ac8bfcb9dd6aad09e5df;hpb=29d610e110cf1e6326185d2c50c846813152fe21 diff --git a/fio.c b/fio.c index cc54c837..2aeb6f72 100644 --- a/fio.c +++ b/fio.c @@ -26,12 +26,11 @@ #include #include #include -#include +#include #include #include #include #include -#include #include #include "fio.h" @@ -82,11 +81,6 @@ static void sig_handler(int sig) disk_util_timer_arm(); print_thread_status(); break; - case SIGSEGV: - fprintf(stderr, "fio: got segfault, aborting\n"); - terminate_threads(TERMINATE_ALL, 1); - fio_abort = 1; - exit(0); default: printf("\nfio: terminating on signal %d\n", sig); fflush(stdout); @@ -406,11 +400,21 @@ static void do_io(struct thread_data *td) memcpy(&s, &io_u->start_time, sizeof(s)); +requeue: ret = td_io_queue(td, io_u); if (ret) { - td_verror(td, io_u->error); - put_io_u(td, io_u); - break; + if (ret > 0 && (io_u->xfer_buflen != io_u->resid) && + io_u->resid) { + /* + * short read/write. requeue. + */ + io_u->xfer_buflen = io_u->resid; + io_u->xfer_buf += ret; + goto requeue; + } else { + put_io_u(td, io_u); + break; + } } add_slat_sample(td, io_u->ddir, mtime_since(&io_u->start_time, &io_u->issue_time)); @@ -684,8 +688,10 @@ static void *thread_main(void *data) if (td_io_init(td)) goto err; - if (td->exec_prerun) - system(td->exec_prerun); + if (td->exec_prerun) { + if (system(td->exec_prerun) < 0) + goto err; + } fio_gettime(&td->epoch, NULL); getrusage(RUSAGE_SELF, &td->ru_start); @@ -740,8 +746,10 @@ static void *thread_main(void *data) finish_log(td, td->clat_log, "clat"); if (td->write_iolog_file) write_iolog_close(td); - if (td->exec_postrun) - system(td->exec_postrun); + if (td->exec_postrun) { + if (system(td->exec_postrun) < 0) + log_err("fio: postrun %s failed\n", td->exec_postrun); + } if (exitall_on_terminate) terminate_threads(td->groupid, 0); @@ -841,7 +849,6 @@ static void run_threads(void) signal(SIGINT, sig_handler); signal(SIGALRM, sig_handler); - signal(SIGSEGV, sig_handler); todo = thread_number; nr_running = 0; @@ -998,6 +1005,13 @@ int main(int argc, char *argv[]) { long ps; + /* + * We need locale for number printing, if it isn't set then just + * go with the US format. + */ + if (!getenv("LC_NUMERIC")) + setlocale(LC_NUMERIC, "en_US"); + if (parse_options(argc, argv)) return 1;