xref: /linux/fs/xfs/scrub/orphanage.h (revision c771600c6af14749609b49565ffb4cac2959710d)
11e58a8ccSDarrick J. Wong // SPDX-License-Identifier: GPL-2.0-or-later
21e58a8ccSDarrick J. Wong /*
31e58a8ccSDarrick J. Wong  * Copyright (c) 2021-2024 Oracle.  All Rights Reserved.
41e58a8ccSDarrick J. Wong  * Author: Darrick J. Wong <djwong@kernel.org>
51e58a8ccSDarrick J. Wong  */
61e58a8ccSDarrick J. Wong #ifndef __XFS_SCRUB_ORPHANAGE_H__
71e58a8ccSDarrick J. Wong #define __XFS_SCRUB_ORPHANAGE_H__
81e58a8ccSDarrick J. Wong 
91e58a8ccSDarrick J. Wong #ifdef CONFIG_XFS_ONLINE_REPAIR
101e58a8ccSDarrick J. Wong int xrep_orphanage_create(struct xfs_scrub *sc);
111e58a8ccSDarrick J. Wong 
121e58a8ccSDarrick J. Wong /*
131e58a8ccSDarrick J. Wong  * If we're doing a repair, ensure that the orphanage exists and attach it to
141e58a8ccSDarrick J. Wong  * the scrub context.
151e58a8ccSDarrick J. Wong  */
161e58a8ccSDarrick J. Wong static inline int
171e58a8ccSDarrick J. Wong xrep_orphanage_try_create(
181e58a8ccSDarrick J. Wong 	struct xfs_scrub	*sc)
191e58a8ccSDarrick J. Wong {
201e58a8ccSDarrick J. Wong 	int			error;
211e58a8ccSDarrick J. Wong 
221e58a8ccSDarrick J. Wong 	ASSERT(sc->sm->sm_flags & XFS_SCRUB_IFLAG_REPAIR);
231e58a8ccSDarrick J. Wong 
241e58a8ccSDarrick J. Wong 	error = xrep_orphanage_create(sc);
251e58a8ccSDarrick J. Wong 	switch (error) {
261e58a8ccSDarrick J. Wong 	case 0:
271e58a8ccSDarrick J. Wong 	case -ENOENT:
281e58a8ccSDarrick J. Wong 	case -ENOTDIR:
291e58a8ccSDarrick J. Wong 	case -ENOSPC:
301e58a8ccSDarrick J. Wong 		/*
311e58a8ccSDarrick J. Wong 		 * If the orphanage can't be found or isn't a directory, we'll
321e58a8ccSDarrick J. Wong 		 * keep going, but we won't be able to attach the file to the
331e58a8ccSDarrick J. Wong 		 * orphanage if we can't find the parent.
341e58a8ccSDarrick J. Wong 		 */
351e58a8ccSDarrick J. Wong 		return 0;
361e58a8ccSDarrick J. Wong 	}
371e58a8ccSDarrick J. Wong 
381e58a8ccSDarrick J. Wong 	return error;
391e58a8ccSDarrick J. Wong }
401e58a8ccSDarrick J. Wong 
411e58a8ccSDarrick J. Wong int xrep_orphanage_iolock_two(struct xfs_scrub *sc);
421e58a8ccSDarrick J. Wong 
431e58a8ccSDarrick J. Wong void xrep_orphanage_ilock(struct xfs_scrub *sc, unsigned int ilock_flags);
441e58a8ccSDarrick J. Wong bool xrep_orphanage_ilock_nowait(struct xfs_scrub *sc,
451e58a8ccSDarrick J. Wong 		unsigned int ilock_flags);
461e58a8ccSDarrick J. Wong void xrep_orphanage_iunlock(struct xfs_scrub *sc, unsigned int ilock_flags);
471e58a8ccSDarrick J. Wong 
481e58a8ccSDarrick J. Wong void xrep_orphanage_rele(struct xfs_scrub *sc);
491e58a8ccSDarrick J. Wong 
501e58a8ccSDarrick J. Wong /* Information about a request to add a file to the orphanage. */
511e58a8ccSDarrick J. Wong struct xrep_adoption {
521e58a8ccSDarrick J. Wong 	struct xfs_scrub	*sc;
531e58a8ccSDarrick J. Wong 
541e58a8ccSDarrick J. Wong 	/* Name used for the adoption. */
551e58a8ccSDarrick J. Wong 	struct xfs_name		*xname;
561e58a8ccSDarrick J. Wong 
577be3d20bSDarrick J. Wong 	/* Parent pointer context tracking */
587be3d20bSDarrick J. Wong 	struct xfs_parent_args	ppargs;
597be3d20bSDarrick J. Wong 
601e58a8ccSDarrick J. Wong 	/* Block reservations for orphanage and child (if directory). */
611e58a8ccSDarrick J. Wong 	unsigned int		orphanage_blkres;
621e58a8ccSDarrick J. Wong 	unsigned int		child_blkres;
63*3f31406aSDarrick J. Wong 
64*3f31406aSDarrick J. Wong 	/*
65*3f31406aSDarrick J. Wong 	 * Does the caller want us to bump the child link count?  This is not
66*3f31406aSDarrick J. Wong 	 * needed when reattaching files that have become disconnected but have
67*3f31406aSDarrick J. Wong 	 * nlink > 1.  It is necessary when changing the directory tree
68*3f31406aSDarrick J. Wong 	 * structure.
69*3f31406aSDarrick J. Wong 	 */
70*3f31406aSDarrick J. Wong 	bool			bump_child_nlink:1;
711e58a8ccSDarrick J. Wong };
721e58a8ccSDarrick J. Wong 
731e58a8ccSDarrick J. Wong bool xrep_orphanage_can_adopt(struct xfs_scrub *sc);
741e58a8ccSDarrick J. Wong 
751e58a8ccSDarrick J. Wong int xrep_adoption_trans_alloc(struct xfs_scrub *sc,
761e58a8ccSDarrick J. Wong 		struct xrep_adoption *adopt);
771e58a8ccSDarrick J. Wong int xrep_adoption_compute_name(struct xrep_adoption *adopt,
781e58a8ccSDarrick J. Wong 		struct xfs_name *xname);
791e58a8ccSDarrick J. Wong int xrep_adoption_move(struct xrep_adoption *adopt);
801e58a8ccSDarrick J. Wong int xrep_adoption_trans_roll(struct xrep_adoption *adopt);
811e58a8ccSDarrick J. Wong #else
821e58a8ccSDarrick J. Wong struct xrep_adoption { /* empty */ };
831e58a8ccSDarrick J. Wong # define xrep_orphanage_rele(sc)	((void)0)
841e58a8ccSDarrick J. Wong #endif /* CONFIG_XFS_ONLINE_REPAIR */
851e58a8ccSDarrick J. Wong 
861e58a8ccSDarrick J. Wong #endif /* __XFS_SCRUB_ORPHANAGE_H__ */
87