1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Copyright (c) 2021-2024 Oracle. All Rights Reserved. 4 * Author: Darrick J. Wong <djwong@kernel.org> 5 */ 6 #ifndef __XFS_SCRUB_ORPHANAGE_H__ 7 #define __XFS_SCRUB_ORPHANAGE_H__ 8 9 #ifdef CONFIG_XFS_ONLINE_REPAIR 10 int xrep_orphanage_create(struct xfs_scrub *sc); 11 12 /* 13 * If we're doing a repair, ensure that the orphanage exists and attach it to 14 * the scrub context. 15 */ 16 static inline int 17 xrep_orphanage_try_create( 18 struct xfs_scrub *sc) 19 { 20 int error; 21 22 ASSERT(sc->sm->sm_flags & XFS_SCRUB_IFLAG_REPAIR); 23 24 error = xrep_orphanage_create(sc); 25 switch (error) { 26 case 0: 27 case -ENOENT: 28 case -ENOTDIR: 29 case -ENOSPC: 30 /* 31 * If the orphanage can't be found or isn't a directory, we'll 32 * keep going, but we won't be able to attach the file to the 33 * orphanage if we can't find the parent. 34 */ 35 return 0; 36 } 37 38 return error; 39 } 40 41 int xrep_orphanage_iolock_two(struct xfs_scrub *sc); 42 43 void xrep_orphanage_ilock(struct xfs_scrub *sc, unsigned int ilock_flags); 44 bool xrep_orphanage_ilock_nowait(struct xfs_scrub *sc, 45 unsigned int ilock_flags); 46 void xrep_orphanage_iunlock(struct xfs_scrub *sc, unsigned int ilock_flags); 47 48 void xrep_orphanage_rele(struct xfs_scrub *sc); 49 50 /* Information about a request to add a file to the orphanage. */ 51 struct xrep_adoption { 52 struct xfs_scrub *sc; 53 54 /* Name used for the adoption. */ 55 struct xfs_name *xname; 56 57 /* Parent pointer context tracking */ 58 struct xfs_parent_args ppargs; 59 60 /* Block reservations for orphanage and child (if directory). */ 61 unsigned int orphanage_blkres; 62 unsigned int child_blkres; 63 64 /* 65 * Does the caller want us to bump the child link count? This is not 66 * needed when reattaching files that have become disconnected but have 67 * nlink > 1. It is necessary when changing the directory tree 68 * structure. 69 */ 70 bool bump_child_nlink:1; 71 }; 72 73 bool xrep_orphanage_can_adopt(struct xfs_scrub *sc); 74 75 int xrep_adoption_trans_alloc(struct xfs_scrub *sc, 76 struct xrep_adoption *adopt); 77 int xrep_adoption_compute_name(struct xrep_adoption *adopt, 78 struct xfs_name *xname); 79 int xrep_adoption_move(struct xrep_adoption *adopt); 80 int xrep_adoption_trans_roll(struct xrep_adoption *adopt); 81 #else 82 struct xrep_adoption { /* empty */ }; 83 # define xrep_orphanage_rele(sc) ((void)0) 84 #endif /* CONFIG_XFS_ONLINE_REPAIR */ 85 86 #endif /* __XFS_SCRUB_ORPHANAGE_H__ */ 87