|
@@ -79,18 +79,7 @@ static void sg_proc_cleanup(void);
|
|
*/
|
|
*/
|
|
#define SG_MAX_CDB_SIZE 252
|
|
#define SG_MAX_CDB_SIZE 252
|
|
|
|
|
|
-/*
|
|
|
|
- * Suppose you want to calculate the formula muldiv(x,m,d)=int(x * m / d)
|
|
|
|
- * Then when using 32 bit integers x * m may overflow during the calculation.
|
|
|
|
- * Replacing muldiv(x) by muldiv(x)=((x % d) * m) / d + int(x / d) * m
|
|
|
|
- * calculates the same, but prevents the overflow when both m and d
|
|
|
|
- * are "small" numbers (like HZ and USER_HZ).
|
|
|
|
- * Of course an overflow is inavoidable if the result of muldiv doesn't fit
|
|
|
|
- * in 32 bits.
|
|
|
|
- */
|
|
|
|
-#define MULDIV(X,MUL,DIV) ((((X % DIV) * MUL) / DIV) + ((X / DIV) * MUL))
|
|
|
|
-
|
|
|
|
-#define SG_DEFAULT_TIMEOUT MULDIV(SG_DEFAULT_TIMEOUT_USER, HZ, USER_HZ)
|
|
|
|
|
|
+#define SG_DEFAULT_TIMEOUT mult_frac(SG_DEFAULT_TIMEOUT_USER, HZ, USER_HZ)
|
|
|
|
|
|
int sg_big_buff = SG_DEF_RESERVED_SIZE;
|
|
int sg_big_buff = SG_DEF_RESERVED_SIZE;
|
|
/* N.B. This variable is readable and writeable via
|
|
/* N.B. This variable is readable and writeable via
|
|
@@ -884,11 +873,11 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
|
|
return result;
|
|
return result;
|
|
if (val < 0)
|
|
if (val < 0)
|
|
return -EIO;
|
|
return -EIO;
|
|
- if (val >= MULDIV((s64)INT_MAX, USER_HZ, HZ))
|
|
|
|
- val = min_t(s64, MULDIV((s64)INT_MAX, USER_HZ, HZ),
|
|
|
|
|
|
+ if (val >= mult_frac((s64)INT_MAX, USER_HZ, HZ))
|
|
|
|
+ val = min_t(s64, mult_frac((s64)INT_MAX, USER_HZ, HZ),
|
|
INT_MAX);
|
|
INT_MAX);
|
|
sfp->timeout_user = val;
|
|
sfp->timeout_user = val;
|
|
- sfp->timeout = MULDIV (val, HZ, USER_HZ);
|
|
|
|
|
|
+ sfp->timeout = mult_frac(val, HZ, USER_HZ);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
case SG_GET_TIMEOUT: /* N.B. User receives timeout as return value */
|
|
case SG_GET_TIMEOUT: /* N.B. User receives timeout as return value */
|