1a07b4557SDarrick J. Wong /* SPDX-License-Identifier: GPL-2.0-or-later */ 2a07b4557SDarrick J. Wong /* 3a07b4557SDarrick J. Wong * Copyright (c) 2020-2024 Oracle. All Rights Reserved. 4a07b4557SDarrick J. Wong * Author: Darrick J. Wong <djwong@kernel.org> 5a07b4557SDarrick J. Wong */ 6a07b4557SDarrick J. Wong #ifndef __XFS_SCRUB_FINDPARENT_H__ 7a07b4557SDarrick J. Wong #define __XFS_SCRUB_FINDPARENT_H__ 8a07b4557SDarrick J. Wong 9a07b4557SDarrick J. Wong struct xrep_parent_scan_info { 10a07b4557SDarrick J. Wong struct xfs_scrub *sc; 11a07b4557SDarrick J. Wong 12a07b4557SDarrick J. Wong /* Inode scan cursor. */ 13a07b4557SDarrick J. Wong struct xchk_iscan iscan; 14a07b4557SDarrick J. Wong 15a07b4557SDarrick J. Wong /* Hook to capture directory entry updates. */ 16a07b4557SDarrick J. Wong struct xfs_dir_hook dhook; 17a07b4557SDarrick J. Wong 18a07b4557SDarrick J. Wong /* Lock protecting parent_ino. */ 19a07b4557SDarrick J. Wong struct mutex lock; 20a07b4557SDarrick J. Wong 21a07b4557SDarrick J. Wong /* Parent inode that we've found. */ 22a07b4557SDarrick J. Wong xfs_ino_t parent_ino; 23a07b4557SDarrick J. Wong 24a07b4557SDarrick J. Wong bool lookup_parent; 25a07b4557SDarrick J. Wong }; 26a07b4557SDarrick J. Wong 27*8559b21aSDarrick J. Wong int __xrep_findparent_scan_start(struct xfs_scrub *sc, 28*8559b21aSDarrick J. Wong struct xrep_parent_scan_info *pscan, 29*8559b21aSDarrick J. Wong notifier_fn_t custom_fn); 30*8559b21aSDarrick J. Wong static inline int xrep_findparent_scan_start(struct xfs_scrub *sc, 31*8559b21aSDarrick J. Wong struct xrep_parent_scan_info *pscan) 32*8559b21aSDarrick J. Wong { 33*8559b21aSDarrick J. Wong return __xrep_findparent_scan_start(sc, pscan, NULL); 34*8559b21aSDarrick J. Wong } 35a07b4557SDarrick J. Wong int xrep_findparent_scan(struct xrep_parent_scan_info *pscan); 36a07b4557SDarrick J. Wong void xrep_findparent_scan_teardown(struct xrep_parent_scan_info *pscan); 37a07b4557SDarrick J. Wong 38a07b4557SDarrick J. Wong static inline void 39a07b4557SDarrick J. Wong xrep_findparent_scan_found( 40a07b4557SDarrick J. Wong struct xrep_parent_scan_info *pscan, 41a07b4557SDarrick J. Wong xfs_ino_t ino) 42a07b4557SDarrick J. Wong { 43a07b4557SDarrick J. Wong mutex_lock(&pscan->lock); 44a07b4557SDarrick J. Wong pscan->parent_ino = ino; 45a07b4557SDarrick J. Wong mutex_unlock(&pscan->lock); 46a07b4557SDarrick J. Wong } 47a07b4557SDarrick J. Wong 48a07b4557SDarrick J. Wong void xrep_findparent_scan_finish_early(struct xrep_parent_scan_info *pscan, 49a07b4557SDarrick J. Wong xfs_ino_t ino); 50a07b4557SDarrick J. Wong 51a07b4557SDarrick J. Wong int xrep_findparent_confirm(struct xfs_scrub *sc, xfs_ino_t *parent_ino); 52a07b4557SDarrick J. Wong 53a07b4557SDarrick J. Wong xfs_ino_t xrep_findparent_self_reference(struct xfs_scrub *sc); 5434c9382cSDarrick J. Wong xfs_ino_t xrep_findparent_from_dcache(struct xfs_scrub *sc); 55a07b4557SDarrick J. Wong 56a07b4557SDarrick J. Wong #endif /* __XFS_SCRUB_FINDPARENT_H__ */ 57