|  | // SPDX-License-Identifier: GPL-2.0+ | 
|  | /* | 
|  | * Copyright (C) 2018 Oracle.  All Rights Reserved. | 
|  | * Author: Darrick J. Wong <darrick.wong@oracle.com> | 
|  | */ | 
|  | #ifndef XFS_SCRUB_XFS_SCRUB_H_ | 
|  | #define XFS_SCRUB_XFS_SCRUB_H_ | 
|  |  | 
|  | #include "libfrog/fsgeom.h" | 
|  |  | 
|  | extern char *progname; | 
|  |  | 
|  | #define _PATH_PROC_MOUNTS	"/proc/mounts" | 
|  |  | 
|  | extern unsigned int		force_nr_threads; | 
|  | extern unsigned int		bg_mode; | 
|  | extern unsigned int		debug; | 
|  | extern bool			verbose; | 
|  | extern long			page_size; | 
|  | extern bool			want_fstrim; | 
|  | extern bool			stderr_isatty; | 
|  | extern bool			stdout_isatty; | 
|  | extern bool			is_service; | 
|  |  | 
|  | enum scrub_mode { | 
|  | SCRUB_MODE_DRY_RUN, | 
|  | SCRUB_MODE_REPAIR, | 
|  | }; | 
|  |  | 
|  | enum error_action { | 
|  | ERRORS_CONTINUE, | 
|  | ERRORS_SHUTDOWN, | 
|  | }; | 
|  |  | 
|  | struct scrub_ctx { | 
|  | /* Immutable scrub state. */ | 
|  |  | 
|  | /* Strings we need for presentation */ | 
|  | char			*mntpoint; | 
|  |  | 
|  | /* Mountpoint info */ | 
|  | struct stat		mnt_sb; | 
|  | struct statvfs		mnt_sv; | 
|  | struct statfs		mnt_sf; | 
|  |  | 
|  | /* Open block devices */ | 
|  | struct disk		*datadev; | 
|  | struct disk		*logdev; | 
|  | struct disk		*rtdev; | 
|  |  | 
|  | /* What does the user want us to do? */ | 
|  | enum scrub_mode		mode; | 
|  |  | 
|  | /* How does the user want us to react to errors? */ | 
|  | enum error_action	error_action; | 
|  |  | 
|  | /* xfrog context for the mount point */ | 
|  | struct xfs_fd		mnt; | 
|  |  | 
|  | /* Number of threads for metadata scrubbing */ | 
|  | unsigned int		nr_io_threads; | 
|  |  | 
|  | /* XFS specific geometry */ | 
|  | struct fs_path		fsinfo; | 
|  | void			*fshandle; | 
|  | size_t			fshandle_len; | 
|  |  | 
|  | /* Data block read verification buffer */ | 
|  | void			*readbuf; | 
|  |  | 
|  | /* Mutable scrub state; use lock. */ | 
|  | pthread_mutex_t		lock; | 
|  | struct action_list	*action_lists; | 
|  | unsigned long long	max_errors; | 
|  | unsigned long long	runtime_errors; | 
|  | unsigned long long	corruptions_found; | 
|  | unsigned long long	unfixable_errors; | 
|  | unsigned long long	warnings_found; | 
|  | unsigned long long	inodes_checked; | 
|  | unsigned long long	bytes_checked; | 
|  | unsigned long long	naming_warnings; | 
|  | unsigned long long	repairs; | 
|  | unsigned long long	preens; | 
|  | bool			scrub_setup_succeeded; | 
|  | bool			preen_triggers[XFS_SCRUB_TYPE_NR]; | 
|  | }; | 
|  |  | 
|  | /* Phase helper functions */ | 
|  | void xfs_shutdown_fs(struct scrub_ctx *ctx); | 
|  | int scrub_cleanup(struct scrub_ctx *ctx); | 
|  | int phase1_func(struct scrub_ctx *ctx); | 
|  | int phase2_func(struct scrub_ctx *ctx); | 
|  | int phase3_func(struct scrub_ctx *ctx); | 
|  | int phase4_func(struct scrub_ctx *ctx); | 
|  | int phase5_func(struct scrub_ctx *ctx); | 
|  | int phase6_func(struct scrub_ctx *ctx); | 
|  | int phase7_func(struct scrub_ctx *ctx); | 
|  |  | 
|  | /* Progress estimator functions */ | 
|  | unsigned int scrub_estimate_ag_work(struct scrub_ctx *ctx); | 
|  | int phase2_estimate(struct scrub_ctx *ctx, uint64_t *items, | 
|  | unsigned int *nr_threads, int *rshift); | 
|  | int phase3_estimate(struct scrub_ctx *ctx, uint64_t *items, | 
|  | unsigned int *nr_threads, int *rshift); | 
|  | int phase4_estimate(struct scrub_ctx *ctx, uint64_t *items, | 
|  | unsigned int *nr_threads, int *rshift); | 
|  | int phase5_estimate(struct scrub_ctx *ctx, uint64_t *items, | 
|  | unsigned int *nr_threads, int *rshift); | 
|  | int phase6_estimate(struct scrub_ctx *ctx, uint64_t *items, | 
|  | unsigned int *nr_threads, int *rshift); | 
|  |  | 
|  | #endif /* XFS_SCRUB_XFS_SCRUB_H_ */ |