Fix module probe failure on 32-bit systems
authorYing Zhu <casualfisher@gmail.com>
Thu, 27 Jun 2013 11:41:30 +0000 (19:41 +0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 27 Jun 2013 17:01:25 +0000 (10:01 -0700)
Previous commit 7ef5e54e2e28884a04dc800657967b891239e933 caused
module probe failure on 32-bit systems, dmesg showed

  Unknown symbol __moddi3

This was caused by the modulo operation 'gethrtime() % tqs->stqs_count'
in the committed code.  Instead of implementing __moddi3 for all 32-bit
systems, Behlendorf advised we can just cast the return value of
gethrtime() into a uint64_t, since gethrtime does not return negative
value on all circumstances we need not care about the potential overflow.

Signed-off-by: Ying Zhu <casualfisher@gmail.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #1551

module/zfs/spa.c

index ba376fb..c885e3e 100644 (file)
@@ -920,7 +920,7 @@ spa_taskq_dispatch_ent(spa_t *spa, zio_type_t t, zio_taskq_type_t q,
        if (tqs->stqs_count == 1) {
                tq = tqs->stqs_taskq[0];
        } else {
-               tq = tqs->stqs_taskq[gethrtime() % tqs->stqs_count];
+               tq = tqs->stqs_taskq[((uint64_t)gethrtime()) % tqs->stqs_count];
        }
 
        taskq_dispatch_ent(tq, func, arg, flags, ent);
@@ -943,7 +943,7 @@ spa_taskq_dispatch_sync(spa_t *spa, zio_type_t t, zio_taskq_type_t q,
        if (tqs->stqs_count == 1) {
                tq = tqs->stqs_taskq[0];
        } else {
-               tq = tqs->stqs_taskq[gethrtime() % tqs->stqs_count];
+               tq = tqs->stqs_taskq[((uint64_t)gethrtime()) % tqs->stqs_count];
        }
 
        id = taskq_dispatch(tq, func, arg, flags);