mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	Btrfs: do not reset last_snapshot after relocation
This was done to allow NO_COW to continue to be NO_COW after relocation but it is not right. When relocating we will convert blocks to FULL_BACKREF that we relocate. We can leave some of these full backref blocks behind if they are not cow'ed out during the relocation, like if we fail the relocation with ENOSPC and then just drop the reloc tree. Then when we go to cow the block again we won't lookup the extent flags because we won't think there has been a snapshot recently which means we will do our normal ref drop thing instead of adding back a tree ref and dropping the shared ref. This will cause btrfs_free_extent to blow up because it can't find the ref we are trying to free. This was found with my ref verifying tool. Thanks, Signed-off-by: Josef Bacik <jbacik@fb.com> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
		
							parent
							
								
									00fdf13a2e
								
							
						
					
					
						commit
						ba8b028933
					
				
					 1 changed files with 0 additions and 21 deletions
				
			
		|  | @ -2317,7 +2317,6 @@ void free_reloc_roots(struct list_head *list) | |||
| static noinline_for_stack | ||||
| int merge_reloc_roots(struct reloc_control *rc) | ||||
| { | ||||
| 	struct btrfs_trans_handle *trans; | ||||
| 	struct btrfs_root *root; | ||||
| 	struct btrfs_root *reloc_root; | ||||
| 	u64 last_snap; | ||||
|  | @ -2375,26 +2374,6 @@ int merge_reloc_roots(struct reloc_control *rc) | |||
| 				list_add_tail(&reloc_root->root_list, | ||||
| 					      &reloc_roots); | ||||
| 			goto out; | ||||
| 		} else if (!ret) { | ||||
| 			/*
 | ||||
| 			 * recover the last snapshot tranid to avoid | ||||
| 			 * the space balance break NOCOW. | ||||
| 			 */ | ||||
| 			root = read_fs_root(rc->extent_root->fs_info, | ||||
| 					    objectid); | ||||
| 			if (IS_ERR(root)) | ||||
| 				continue; | ||||
| 
 | ||||
| 			trans = btrfs_join_transaction(root); | ||||
| 			BUG_ON(IS_ERR(trans)); | ||||
| 
 | ||||
| 			/* Check if the fs/file tree was snapshoted or not. */ | ||||
| 			if (btrfs_root_last_snapshot(&root->root_item) == | ||||
| 			    otransid - 1) | ||||
| 				btrfs_set_root_last_snapshot(&root->root_item, | ||||
| 							     last_snap); | ||||
| 				 | ||||
| 			btrfs_end_transaction(trans, root); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Josef Bacik
						Josef Bacik