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