Messages in this thread | | | Date | Sat, 28 Jan 2023 11:35:34 +0800 | Subject | Re: [PATCH 1/2 v2] f2fs: fix wrong calculation of block age | From | Chao Yu <> |
| |
On 2023/1/16 11:08, qixiaoyu1 wrote: > Currently we wrongly calculate the new block age to > old * LAST_AGE_WEIGHT / 100. > > Fix it to new * (100 - LAST_AGE_WEIGHT) / 100 > + old * LAST_AGE_WEIGHT / 100. > > Signed-off-by: qixiaoyu1 <qixiaoyu1@xiaomi.com> > Signed-off-by: xiongping1 <xiongping1@xiaomi.com> > --- > Change log v1 -> v2: > - fix udiv > > fs/f2fs/extent_cache.c | 7 ++----- > 1 file changed, 2 insertions(+), 5 deletions(-) > > diff --git a/fs/f2fs/extent_cache.c b/fs/f2fs/extent_cache.c > index 342af24b2f8c..ad5533f178fd 100644 > --- a/fs/f2fs/extent_cache.c > +++ b/fs/f2fs/extent_cache.c > @@ -874,11 +874,8 @@ void f2fs_update_read_extent_tree_range_compressed(struct inode *inode, > static unsigned long long __calculate_block_age(unsigned long long new, > unsigned long long old) > { > - unsigned long long diff; > - > - diff = (new >= old) ? new - (new - old) : new + (old - new); > - > - return div_u64(diff * LAST_AGE_WEIGHT, 100); > + return div_u64(new, 100) * (100 - LAST_AGE_WEIGHT) > + + div_u64(old, 100) * LAST_AGE_WEIGHT;
How about updating as below to avoid lossing accuracy if new is less than 100?
return div_u64(new * (100 - LAST_AGE_WEIGHT), 100) + div_u64(old * LAST_AGE_WEIGHT, 100);
Thanks,
> } > > /* This returns a new age and allocated blocks in ei */
| |