@@ -170,8 +170,10 @@ static void __drop_largest_extent(struct inode *inode,
170170{
171171 struct extent_info * largest = & F2FS_I (inode )-> extent_tree -> largest ;
172172
173- if (fofs < largest -> fofs + largest -> len && fofs + len > largest -> fofs )
173+ if (fofs < largest -> fofs + largest -> len && fofs + len > largest -> fofs ) {
174174 largest -> len = 0 ;
175+ mark_inode_dirty_sync (inode );
176+ }
175177}
176178
177179/* return true, if inode page is changed */
@@ -335,11 +337,12 @@ static struct extent_node *__lookup_extent_tree_ret(struct extent_tree *et,
335337 return en ;
336338}
337339
338- static struct extent_node * __try_merge_extent_node (struct f2fs_sb_info * sbi ,
340+ static struct extent_node * __try_merge_extent_node (struct inode * inode ,
339341 struct extent_tree * et , struct extent_info * ei ,
340342 struct extent_node * prev_ex ,
341343 struct extent_node * next_ex )
342344{
345+ struct f2fs_sb_info * sbi = F2FS_I_SB (inode );
343346 struct extent_node * en = NULL ;
344347
345348 if (prev_ex && __is_back_mergeable (ei , & prev_ex -> ei )) {
@@ -360,7 +363,7 @@ static struct extent_node *__try_merge_extent_node(struct f2fs_sb_info *sbi,
360363 if (!en )
361364 return NULL ;
362365
363- __try_update_largest_extent (et , en );
366+ __try_update_largest_extent (inode , et , en );
364367
365368 spin_lock (& sbi -> extent_lock );
366369 if (!list_empty (& en -> list )) {
@@ -371,11 +374,12 @@ static struct extent_node *__try_merge_extent_node(struct f2fs_sb_info *sbi,
371374 return en ;
372375}
373376
374- static struct extent_node * __insert_extent_tree (struct f2fs_sb_info * sbi ,
377+ static struct extent_node * __insert_extent_tree (struct inode * inode ,
375378 struct extent_tree * et , struct extent_info * ei ,
376379 struct rb_node * * insert_p ,
377380 struct rb_node * insert_parent )
378381{
382+ struct f2fs_sb_info * sbi = F2FS_I_SB (inode );
379383 struct rb_node * * p = & et -> root .rb_node ;
380384 struct rb_node * parent = NULL ;
381385 struct extent_node * en = NULL ;
@@ -402,7 +406,7 @@ static struct extent_node *__insert_extent_tree(struct f2fs_sb_info *sbi,
402406 if (!en )
403407 return NULL ;
404408
405- __try_update_largest_extent (et , en );
409+ __try_update_largest_extent (inode , et , en );
406410
407411 /* update in global extent list */
408412 spin_lock (& sbi -> extent_lock );
@@ -473,7 +477,7 @@ static unsigned int f2fs_update_extent_tree_range(struct inode *inode,
473477 set_extent_info (& ei , end ,
474478 end - dei .fofs + dei .blk ,
475479 org_end - end );
476- en1 = __insert_extent_tree (sbi , et , & ei ,
480+ en1 = __insert_extent_tree (inode , et , & ei ,
477481 NULL , NULL );
478482 next_en = en1 ;
479483 } else {
@@ -494,7 +498,7 @@ static unsigned int f2fs_update_extent_tree_range(struct inode *inode,
494498 }
495499
496500 if (parts )
497- __try_update_largest_extent (et , en );
501+ __try_update_largest_extent (inode , et , en );
498502 else
499503 __release_extent_node (sbi , et , en );
500504
@@ -514,15 +518,15 @@ static unsigned int f2fs_update_extent_tree_range(struct inode *inode,
514518 if (blkaddr ) {
515519
516520 set_extent_info (& ei , fofs , blkaddr , len );
517- if (!__try_merge_extent_node (sbi , et , & ei , prev_en , next_en ))
518- __insert_extent_tree (sbi , et , & ei ,
521+ if (!__try_merge_extent_node (inode , et , & ei , prev_en , next_en ))
522+ __insert_extent_tree (inode , et , & ei ,
519523 insert_p , insert_parent );
520524
521525 /* give up extent_cache, if split and small updates happen */
522526 if (dei .len >= 1 &&
523527 prev .len < F2FS_MIN_EXTENT_LEN &&
524528 et -> largest .len < F2FS_MIN_EXTENT_LEN ) {
525- et -> largest . len = 0 ;
529+ __drop_largest_extent ( inode , 0 , UINT_MAX ) ;
526530 set_inode_flag (inode , FI_NO_EXTENT );
527531 }
528532 }
0 commit comments