unsigned long bdi_dirty_limit(struct backing_dev_info *bdi, unsigned long dirty)
Above function return type is unsigned long, but return value is
kept in "u64 bdi_dirty".
It can return incorrect value by type casting.
Signed-off-by: Namjae Jeon <[email protected]>
---
mm/page-writeback.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 49133b6..73a7a06 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -546,7 +546,7 @@ static unsigned long hard_dirty_limit(unsigned long thresh)
*/
unsigned long bdi_dirty_limit(struct backing_dev_info *bdi, unsigned long dirty)
{
- u64 bdi_dirty;
+ unsigned long bdi_dirty;
long numerator, denominator;
/*
--
1.7.9.5
On Sat, Aug 18, 2012 at 05:49:21AM -0400, Namjae Jeon wrote:
> unsigned long bdi_dirty_limit(struct backing_dev_info *bdi, unsigned long dirty)
>
> Above function return type is unsigned long, but return value is
> kept in "u64 bdi_dirty".
> It can return incorrect value by type casting.
I don't see how the cast can return wrong value.
The u64 is necessary for the intermediate calculations.
Thanks,
Fengguang
> Signed-off-by: Namjae Jeon <[email protected]>
> ---
> mm/page-writeback.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/mm/page-writeback.c b/mm/page-writeback.c
> index 49133b6..73a7a06 100644
> --- a/mm/page-writeback.c
> +++ b/mm/page-writeback.c
> @@ -546,7 +546,7 @@ static unsigned long hard_dirty_limit(unsigned long thresh)
> */
> unsigned long bdi_dirty_limit(struct backing_dev_info *bdi, unsigned long dirty)
> {
> - u64 bdi_dirty;
> + unsigned long bdi_dirty;
> long numerator, denominator;
>
> /*
> --
> 1.7.9.5
Il 19/08/2012 04:17, Fengguang Wu ha scritto:
> On Sat, Aug 18, 2012 at 05:49:21AM -0400, Namjae Jeon wrote:
>> unsigned long bdi_dirty_limit(struct backing_dev_info *bdi, unsigned long dirty)
>>
>> Above function return type is unsigned long, but return value is
>> kept in "u64 bdi_dirty".
>> It can return incorrect value by type casting.
>
> I don't see how the cast can return wrong value.
> The u64 is necessary for the intermediate calculations.
>
> Thanks,
> Fengguang
>
We are sure u64 is 8byte long, but unsigned long is 4byte long on 32-bit
machine, so if bdi_dirty can assume values bigger than 2^32 there is an
implicit truncate of its value, isn't it?
Marco
Il 19/08/2012 12:23, Marco Stornelli ha scritto:
> Il 19/08/2012 04:17, Fengguang Wu ha scritto:
>> On Sat, Aug 18, 2012 at 05:49:21AM -0400, Namjae Jeon wrote:
>>> unsigned long bdi_dirty_limit(struct backing_dev_info *bdi, unsigned
>>> long dirty)
>>>
>>> Above function return type is unsigned long, but return value is
>>> kept in "u64 bdi_dirty".
>>> It can return incorrect value by type casting.
>>
>> I don't see how the cast can return wrong value.
>> The u64 is necessary for the intermediate calculations.
>>
>> Thanks,
>> Fengguang
>>
>
> We are sure u64 is 8byte long, but unsigned long is 4byte long on 32-bit
> machine, so if bdi_dirty can assume values bigger than 2^32 there is an
> implicit truncate of its value, isn't it?
>
> Marco
Sorry but I didn't see the code, it seems not possible so the wrong
situation can't happen. Maybe we can simply add a comment, nothing more.
Marco
2012/8/19, Marco Stornelli <[email protected]>:
> Il 19/08/2012 04:17, Fengguang Wu ha scritto:
>> On Sat, Aug 18, 2012 at 05:49:21AM -0400, Namjae Jeon wrote:
>>> unsigned long bdi_dirty_limit(struct backing_dev_info *bdi, unsigned long
>>> dirty)
>>>
>>> Above function return type is unsigned long, but return value is
>>> kept in "u64 bdi_dirty".
>>> It can return incorrect value by type casting.
>>
>> I don't see how the cast can return wrong value.
>> The u64 is necessary for the intermediate calculations.
>>
>> Thanks,
>> Fengguang
>>
>
> We are sure u64 is 8byte long, but unsigned long is 4byte long on 32-bit
> machine, so if bdi_dirty can assume values bigger than 2^32 there is an
> implicit truncate of its value, isn't it?
Yes, right.
Thanks.
>
> Marco
>
2012/8/19, Fengguang Wu <[email protected]>:
> On Sat, Aug 18, 2012 at 05:49:21AM -0400, Namjae Jeon wrote:
>> unsigned long bdi_dirty_limit(struct backing_dev_info *bdi, unsigned long
>> dirty)
>>
>> Above function return type is unsigned long, but return value is
>> kept in "u64 bdi_dirty".
>> It can return incorrect value by type casting.
>
> I don't see how the cast can return wrong value.
> The u64 is necessary for the intermediate calculations.
>
> Thanks,
> Fengguang
Hi Wu.
I understand.
Thanks for your reply.
>
>> Signed-off-by: Namjae Jeon <[email protected]>
>> ---
>> mm/page-writeback.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/mm/page-writeback.c b/mm/page-writeback.c
>> index 49133b6..73a7a06 100644
>> --- a/mm/page-writeback.c
>> +++ b/mm/page-writeback.c
>> @@ -546,7 +546,7 @@ static unsigned long hard_dirty_limit(unsigned long
>> thresh)
>> */
>> unsigned long bdi_dirty_limit(struct backing_dev_info *bdi, unsigned long
>> dirty)
>> {
>> - u64 bdi_dirty;
>> + unsigned long bdi_dirty;
>> long numerator, denominator;
>>
>> /*
>> --
>> 1.7.9.5
>