fix possibility of endless loop when divisor > 0x80000000
authorFrank Mori Hess <fmhess@speakeasy.net>
Sun, 3 Nov 2002 16:33:15 +0000 (16:33 +0000)
committerFrank Mori Hess <fmhess@speakeasy.net>
Sun, 3 Nov 2002 16:33:15 +0000 (16:33 +0000)
include/asm/div64.h

index 778f61ed03ba43efcb31b03bb44195cba7ec6703..e9f9e5a27f5d95a4d70f8a2663b882a4365e7670 100644 (file)
@@ -23,7 +23,7 @@
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 0)
 
-extern inline u64 my_ull_div(u64 numerator, unsigned long denominator)
+static inline u64 my_ull_div(u64 numerator, unsigned long denominator)
 {
        u32 value;
        u64 remainder, temp, answer = 0;
@@ -37,13 +37,20 @@ extern inline u64 my_ull_div(u64 numerator, unsigned long denominator)
                shift = 0;
                numerator = remainder;
                // shift most significant bits into 32 bit variable
-               while(numerator > max_u32)
+               while( numerator > max_u32 )
                {
                        numerator >>= 1;
                        shift++;
                }
-               value = numerator;
-               value /= denominator;
+               if( numerator < denominator )
+               {
+                       shift--;
+                       value = 1;
+               }else
+               {
+                       value = numerator;
+                       value /= denominator;
+               }
                temp = ((u64) value) << shift;
                answer += temp;
                remainder -= temp * denominator;