@@ -1982,7 +1982,6 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
19821982 DEFINE_WAIT (wait );
19831983 prepare_to_wait (& log -> fs_info -> tree_log_wait , & wait ,
19841984 TASK_UNINTERRUPTIBLE );
1985- batch = log -> fs_info -> tree_log_batch ;
19861985 mutex_unlock (& log -> fs_info -> tree_log_mutex );
19871986 if (atomic_read (& log -> fs_info -> tree_log_writers ))
19881987 schedule ();
@@ -2024,8 +2023,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
20242023
20252024}
20262025
2027- /*
2028- * free all the extents used by the tree log. This should be called
2026+ /* * free all the extents used by the tree log. This should be called
20292027 * at commit time of the full transaction
20302028 */
20312029int btrfs_free_log (struct btrfs_trans_handle * trans , struct btrfs_root * root )
@@ -2107,6 +2105,9 @@ int btrfs_del_dir_entries_in_log(struct btrfs_trans_handle *trans,
21072105 int ret ;
21082106 int bytes_del = 0 ;
21092107
2108+ if (BTRFS_I (dir )-> logged_trans < trans -> transid )
2109+ return 0 ;
2110+
21102111 ret = join_running_log_trans (root );
21112112 if (ret )
21122113 return 0 ;
@@ -2178,6 +2179,9 @@ int btrfs_del_inode_ref_in_log(struct btrfs_trans_handle *trans,
21782179 u64 index ;
21792180 int ret ;
21802181
2182+ if (BTRFS_I (inode )-> logged_trans < trans -> transid )
2183+ return 0 ;
2184+
21812185 ret = join_running_log_trans (root );
21822186 if (ret )
21832187 return 0 ;
@@ -2484,6 +2488,7 @@ static int __btrfs_log_inode(struct btrfs_trans_handle *trans,
24842488 struct btrfs_inode_item * inode_item ;
24852489 u32 size ;
24862490 int ret ;
2491+ int nritems ;
24872492
24882493 log = root -> log_root ;
24892494
@@ -2541,12 +2546,11 @@ static int __btrfs_log_inode(struct btrfs_trans_handle *trans,
25412546 path , 0 , trans -> transid );
25422547 if (ret != 0 )
25432548 break ;
2544-
2549+ again :
25452550 if (min_key .objectid != inode -> i_ino )
25462551 break ;
25472552 if (min_key .type > max_key .type )
25482553 break ;
2549-
25502554 src = path -> nodes [0 ];
25512555 size = btrfs_item_size_nr (src , path -> slots [0 ]);
25522556 ret = btrfs_insert_empty_item (trans , log , dst_path , & min_key ,
@@ -2606,9 +2610,17 @@ static int __btrfs_log_inode(struct btrfs_trans_handle *trans,
26062610 }
26072611
26082612 btrfs_mark_buffer_dirty (dst_path -> nodes [0 ]);
2609- btrfs_release_path (root , path );
26102613 btrfs_release_path (log , dst_path );
26112614
2615+ nritems = btrfs_header_nritems (path -> nodes [0 ]);
2616+ path -> slots [0 ]++ ;
2617+ if (path -> slots [0 ] < nritems ) {
2618+ btrfs_item_key_to_cpu (path -> nodes [0 ], & min_key ,
2619+ path -> slots [0 ]);
2620+ goto again ;
2621+ }
2622+ btrfs_release_path (root , path );
2623+
26122624 if (min_key .offset < (u64 )- 1 )
26132625 min_key .offset ++ ;
26142626 else if (min_key .type < (u8 )- 1 )
@@ -2626,6 +2638,7 @@ static int __btrfs_log_inode(struct btrfs_trans_handle *trans,
26262638 ret = log_directory_changes (trans , root , inode , path , dst_path );
26272639 BUG_ON (ret );
26282640 }
2641+ BTRFS_I (inode )-> logged_trans = trans -> transid ;
26292642 mutex_unlock (& BTRFS_I (inode )-> log_mutex );
26302643
26312644 btrfs_free_path (path );
0 commit comments