]> Zhao Yanbai Git Server - minix.git/commitdiff
Revert "drivers/fbd/action.c: removed some 64-bit functions" 86/686/2
authorLionel Sambuc <lionel.sambuc@gmail.com>
Tue, 23 Jul 2013 15:49:11 +0000 (17:49 +0200)
committerGerrit Code Review <gerrit@gerrit>
Tue, 23 Jul 2013 17:19:53 +0000 (19:19 +0200)
This reverts commit 85e7d849c804ae9df50e29dc9c81057a83e16726.

This introduce a bug in position computing for disk bigger than 4GB.

Change-Id: I281e60e9644d995cc4643006b50c05693f939b44

drivers/fbd/action.c

index 624df263dd3e1a3a1e4aa7cedf9e6dfe0437349a..a4b9856200effe625681e10b80ec39d9570b571b 100644 (file)
@@ -49,14 +49,14 @@ static size_t get_range(struct fbd_rule *rule, u64_t pos, size_t *size,
        to_eof = cmp64(rule->start, rule->end) >= 0;
 
        if (cmp64(pos, rule->start) > 0) {
-               if (skip != NULL) *skip = pos - rule->start;
+               if (skip != NULL) *skip = sub64(pos, rule->start);
 
                off = 0;
        }
        else {
                if (skip != NULL) *skip = ((u64_t)(0));
 
-               delta = rule->start - pos;
+               delta = sub64(rule->start, pos);
 
                assert(ex64hi(delta) == 0);
 
@@ -66,7 +66,7 @@ static size_t get_range(struct fbd_rule *rule, u64_t pos, size_t *size,
        if (!to_eof) {
                assert(cmp64(pos, rule->end) < 0);
 
-               delta = rule->end - pos;
+               delta = sub64(rule->end, pos);
 
                if (cmp64u(delta, *size) < 0)
                        *size = ex64lo(delta);
@@ -186,16 +186,16 @@ static void action_pre_misdir(struct fbd_rule *rule, iovec_t *UNUSED(iov),
         * here, because we have no idea about the actual disk size, and the
         * resulting address must of course be valid..
         */
-       range = ((rule->params.misdir.end - rule->params.misdir.start) + 1)
-               / rule->params.misdir.align;
-       
+       range = div64u(add64u(sub64(rule->params.misdir.end,
+               rule->params.misdir.start), 1), rule->params.misdir.align);
+
        if (range > 0)
                choice = get_rand(range - 1);
        else
                choice = 0;
 
-       *pos = rule->params.misdir.start +
-               (u64_t)(choice * rule->params.misdir.align);
+       *pos = add64(rule->params.misdir.start,
+               mul64u(choice, rule->params.misdir.align));
 }
 
 /*===========================================================================*