The following changes since commit 7fa085eaed61cf6ffe26a010d5b115cd1c84867c:

  verify: cleanup (2014-12-04 16:49:53 -0700)

are available in the git repository at:

  git://git.kernel.dk/fio.git master

for you to fetch changes up to 74a92cdd178ac5434d2bbbc1649fe66ff341c1d0:

  lib/rand: cleanup __fill_random_buffer() (2014-12-05 11:04:19 -0700)

----------------------------------------------------------------
Jens Axboe (4):
      sync: use io_u_log_error() for more detailed error messages
      parse: make suggestions for unknown options
      lib/rand: fix bug with non uint64_t aligned random buffer fill
      lib/rand: cleanup __fill_random_buffer()

 engines/sync.c |    4 +++-
 init.c         |   25 +++++++++++++++++++++++++
 lib/rand.c     |   27 +++++++++++++++++++++++----
 parse.c        |    2 +-
 parse.h        |    2 ++
 5 files changed, 54 insertions(+), 6 deletions(-)

---

Diff of recent changes:

diff --git a/engines/sync.c b/engines/sync.c
index 41612df..48aafff 100644
--- a/engines/sync.c
+++ b/engines/sync.c
@@ -63,8 +63,10 @@ static int fio_io_end(struct thread_data *td, struct io_u 
*io_u, int ret)
                        io_u->error = errno;
        }
 
-       if (io_u->error)
+       if (io_u->error) {
+               io_u_log_error(td, io_u);
                td_verror(td, io_u->error, "xfer");
+       }
 
        return FIO_Q_COMPLETED;
 }
diff --git a/init.c b/init.c
index 4f66759..9fbc477 100644
--- a/init.c
+++ b/init.c
@@ -1875,6 +1875,30 @@ static void parse_cmd_client(void *client, char *opt)
        fio_client_add_cmd_option(client, opt);
 }
 
+static void show_closest_option(const char *name)
+{
+       int best_option, best_distance;
+       int i, distance;
+
+       while (*name == '-')
+               name++;
+
+       best_option = -1;
+       best_distance = INT_MAX;
+       i = 0;
+       while (l_opts[i].name) {
+               distance = string_distance(name, l_opts[i].name);
+               if (distance < best_distance) {
+                       best_distance = distance;
+                       best_option = i;
+               }
+               i++;
+       }
+
+       if (best_option != -1)
+               log_err("Did you mean %s?\n", l_opts[best_option].name);
+}
+
 int parse_cmd_line(int argc, char *argv[], int client_type)
 {
        struct thread_data *td = NULL;
@@ -2237,6 +2261,7 @@ int parse_cmd_line(int argc, char *argv[], int 
client_type)
                case '?':
                        log_err("%s: unrecognized option '%s'\n", argv[0],
                                                        argv[optind - 1]);
+                       show_closest_option(argv[optind - 1]);
                default:
                        do_exit++;
                        exit_val = 1;
diff --git a/lib/rand.c b/lib/rand.c
index 618a2f0..185b679 100644
--- a/lib/rand.c
+++ b/lib/rand.c
@@ -69,11 +69,26 @@ void init_rand_seed(struct frand_state *state, unsigned int 
seed)
 
 void __fill_random_buf(void *buf, unsigned int len, unsigned long seed)
 {
-       long *ptr = buf;
+       void *ptr = buf;
 
-       while ((void *) ptr - buf < len) {
-               *ptr = seed;
-               ptr++;
+       while (len) {
+               int this_len;
+
+               if (len >= sizeof(int64_t)) {
+                       *((int64_t *) ptr) = seed;
+                       this_len = sizeof(int64_t);
+               } else if (len >= sizeof(int32_t)) {
+                       *((int32_t *) ptr) = seed;
+                       this_len = sizeof(int32_t);
+               } else if (len >= sizeof(int16_t)) {
+                       *((int16_t *) ptr) = seed;
+                       this_len = sizeof(int16_t);
+               } else {
+                       *((int8_t *) ptr) = seed;
+                       this_len = sizeof(int8_t);
+               }
+               ptr += this_len;
+               len -= this_len;
                seed *= GOLDEN_RATIO_PRIME;
                seed >>= 3;
        }
@@ -146,10 +161,14 @@ void __fill_random_buf_percentage(unsigned long seed, 
void *buf,
                __fill_random_buf(buf, this_len, seed);
 
                len -= this_len;
+               if (!len)
+                       break;
                buf += this_len;
 
                if (this_len > len)
                        this_len = len;
+               else if (len - this_len <= sizeof(long))
+                       this_len = len;
 
                if (pbytes)
                        fill_pattern(buf, this_len, pattern, pbytes);
diff --git a/parse.c b/parse.c
index 4209647..141f4b2 100644
--- a/parse.c
+++ b/parse.c
@@ -1068,7 +1068,7 @@ int parse_option(char *opt, const char *input,
  * Option match, levenshtein distance. Handy for not quite remembering what
  * the option name is.
  */
-static int string_distance(const char *s1, const char *s2)
+int string_distance(const char *s1, const char *s2)
 {
        unsigned int s1_len = strlen(s1);
        unsigned int s2_len = strlen(s2);
diff --git a/parse.h b/parse.h
index a9d726d..15f2e06 100644
--- a/parse.h
+++ b/parse.h
@@ -95,6 +95,8 @@ extern int check_str_bytes(const char *p, long long *val, 
void *data);
 extern int check_str_time(const char *p, long long *val, int);
 extern int str_to_float(const char *str, double *val, int is_time);
 
+extern int string_distance(const char *s1, const char *s2);
+
 /*
  * Handlers for the options
  */
--
To unsubscribe from this list: send the line "unsubscribe fio" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to