mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-11-01 09:13:37 +00:00 
			
		
		
		
	bcachefs: check_subvol_path() now prints subvol root inode
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
		
							parent
							
								
									0b0f0ad93c
								
							
						
					
					
						commit
						3a5895e3ac
					
				
					 2 changed files with 14 additions and 20 deletions
				
			
		| 
						 | 
					@ -2371,22 +2371,6 @@ static bool darray_u32_has(darray_u32 *d, u32 v)
 | 
				
			||||||
	return false;
 | 
						return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * We've checked that inode backpointers point to valid dirents; here, it's
 | 
					 | 
				
			||||||
 * sufficient to check that the subvolume root has a dirent:
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static int subvol_has_dirent(struct btree_trans *trans, struct bkey_s_c_subvolume s)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct bch_inode_unpacked inode;
 | 
					 | 
				
			||||||
	int ret = bch2_inode_find_by_inum_trans(trans,
 | 
					 | 
				
			||||||
				(subvol_inum) { s.k->p.offset, le64_to_cpu(s.v->inode) },
 | 
					 | 
				
			||||||
				&inode);
 | 
					 | 
				
			||||||
	if (ret)
 | 
					 | 
				
			||||||
		return ret;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return inode.bi_dir != 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int check_subvol_path(struct btree_trans *trans, struct btree_iter *iter, struct bkey_s_c k)
 | 
					static int check_subvol_path(struct btree_trans *trans, struct btree_iter *iter, struct bkey_s_c k)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct bch_fs *c = trans->c;
 | 
						struct bch_fs *c = trans->c;
 | 
				
			||||||
| 
						 | 
					@ -2405,14 +2389,24 @@ static int check_subvol_path(struct btree_trans *trans, struct btree_iter *iter,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		struct bkey_s_c_subvolume s = bkey_s_c_to_subvolume(k);
 | 
							struct bkey_s_c_subvolume s = bkey_s_c_to_subvolume(k);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ret = subvol_has_dirent(trans, s);
 | 
							struct bch_inode_unpacked subvol_root;
 | 
				
			||||||
		if (ret < 0)
 | 
							ret = bch2_inode_find_by_inum_trans(trans,
 | 
				
			||||||
 | 
										(subvol_inum) { s.k->p.offset, le64_to_cpu(s.v->inode) },
 | 
				
			||||||
 | 
										&subvol_root);
 | 
				
			||||||
 | 
							if (ret)
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (fsck_err_on(!ret,
 | 
							/*
 | 
				
			||||||
 | 
							 * We've checked that inode backpointers point to valid dirents;
 | 
				
			||||||
 | 
							 * here, it's sufficient to check that the subvolume root has a
 | 
				
			||||||
 | 
							 * dirent:
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							if (fsck_err_on(!subvol_root.bi_dir,
 | 
				
			||||||
				trans, subvol_unreachable,
 | 
									trans, subvol_unreachable,
 | 
				
			||||||
				"unreachable subvolume %s",
 | 
									"unreachable subvolume %s",
 | 
				
			||||||
				(bch2_bkey_val_to_text(&buf, c, s.s_c),
 | 
									(bch2_bkey_val_to_text(&buf, c, s.s_c),
 | 
				
			||||||
 | 
									 prt_newline(&buf),
 | 
				
			||||||
 | 
									 bch2_inode_unpacked_to_text(&buf, &subvol_root),
 | 
				
			||||||
				 buf.buf))) {
 | 
									 buf.buf))) {
 | 
				
			||||||
			ret = reattach_subvol(trans, s);
 | 
								ret = reattach_subvol(trans, s);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -271,7 +271,7 @@ enum bch_fsck_flags {
 | 
				
			||||||
	x(subvol_children_not_set,				256,	0)		\
 | 
						x(subvol_children_not_set,				256,	0)		\
 | 
				
			||||||
	x(subvol_children_bad,					257,	0)		\
 | 
						x(subvol_children_bad,					257,	0)		\
 | 
				
			||||||
	x(subvol_loop,						258,	0)		\
 | 
						x(subvol_loop,						258,	0)		\
 | 
				
			||||||
	x(subvol_unreachable,					259,	0)		\
 | 
						x(subvol_unreachable,					259,	FSCK_AUTOFIX)	\
 | 
				
			||||||
	x(btree_node_bkey_bad_u64s,				260,	0)		\
 | 
						x(btree_node_bkey_bad_u64s,				260,	0)		\
 | 
				
			||||||
	x(btree_node_topology_empty_interior_node,		261,	0)		\
 | 
						x(btree_node_topology_empty_interior_node,		261,	0)		\
 | 
				
			||||||
	x(btree_ptr_v2_min_key_bad,				262,	0)		\
 | 
						x(btree_ptr_v2_min_key_bad,				262,	0)		\
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue