blob: b564c0d7bd0f555621fd0c50cd349c3f23e63ada [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (c) 2019 Oracle, Inc.
* All Rights Reserved.
*/
#ifndef __LIBFROG_SCRUB_H__
#define __LIBFROG_SCRUB_H__
/* Group the scrub types by principal filesystem object. */
enum xfrog_scrub_group {
XFROG_SCRUB_GROUP_NONE, /* not metadata */
XFROG_SCRUB_GROUP_AGHEADER, /* per-AG header */
XFROG_SCRUB_GROUP_PERAG, /* per-AG metadata */
XFROG_SCRUB_GROUP_FS, /* per-FS metadata */
XFROG_SCRUB_GROUP_INODE, /* per-inode metadata */
XFROG_SCRUB_GROUP_ISCAN, /* metadata requiring full inode scan */
XFROG_SCRUB_GROUP_SUMMARY, /* summary metadata */
};
/* Catalog of scrub types and names, indexed by XFS_SCRUB_TYPE_* */
struct xfrog_scrub_descr {
const char *name;
const char *descr;
enum xfrog_scrub_group group;
};
extern const struct xfrog_scrub_descr xfrog_scrubbers[XFS_SCRUB_TYPE_NR];
int xfrog_scrub_metadata(struct xfs_fd *xfd, struct xfs_scrub_metadata *meta);
/*
* Allow enough space to call all scrub types with a barrier between each.
* This is overkill for every caller in xfsprogs.
*/
#define XFROG_SCRUBV_MAX_VECTORS (XFS_SCRUB_TYPE_NR * 2)
struct xfrog_scrubv {
struct xfs_scrub_vec_head head;
struct xfs_scrub_vec vectors[XFROG_SCRUBV_MAX_VECTORS];
};
/* Initialize a scrubv structure; callers must have zeroed @scrubv. */
static inline void
xfrog_scrubv_init(struct xfrog_scrubv *scrubv)
{
scrubv->head.svh_vectors = (uintptr_t)scrubv->vectors;
}
/* Return the next free vector from the scrubv structure. */
static inline struct xfs_scrub_vec *
xfrog_scrubv_next_vector(struct xfrog_scrubv *scrubv)
{
if (scrubv->head.svh_nr >= XFROG_SCRUBV_MAX_VECTORS)
return NULL;
return &scrubv->vectors[scrubv->head.svh_nr++];
}
#define foreach_xfrog_scrubv_vec(scrubv, i, vec) \
for ((i) = 0, (vec) = (scrubv)->vectors; \
(i) < (scrubv)->head.svh_nr; \
(i)++, (vec)++)
int xfrog_scrubv_metadata(struct xfs_fd *xfd, struct xfrog_scrubv *scrubv);
#endif /* __LIBFROG_SCRUB_H__ */