#ifndef __XFS_HEALTHMON_H__
#define __XFS_HEALTHMON_H__
struct xfs_healthmon {
uintptr_t mount_cookie;
dev_t dev;
refcount_t ref;
struct mutex lock;
struct xfs_healthmon_event *first_event;
struct xfs_healthmon_event *last_event;
struct xfs_healthmon_event *unmount_event;
unsigned int events;
bool verbose:1;
struct wait_queue_head wait;
char *buffer;
size_t bufsize;
size_t bufhead;
size_t buftail;
unsigned long long lost_prev_event;
unsigned long long total_events;
unsigned long long total_lost;
};
void xfs_healthmon_unmount(struct xfs_mount *mp);
enum xfs_healthmon_type {
XFS_HEALTHMON_RUNNING,
XFS_HEALTHMON_LOST,
XFS_HEALTHMON_UNMOUNT,
XFS_HEALTHMON_SHUTDOWN,
XFS_HEALTHMON_SICK,
XFS_HEALTHMON_CORRUPT,
XFS_HEALTHMON_HEALTHY,
XFS_HEALTHMON_MEDIA_ERROR,
XFS_HEALTHMON_BUFREAD,
XFS_HEALTHMON_BUFWRITE,
XFS_HEALTHMON_DIOREAD,
XFS_HEALTHMON_DIOWRITE,
XFS_HEALTHMON_DATALOST,
};
enum xfs_healthmon_domain {
XFS_HEALTHMON_MOUNT,
XFS_HEALTHMON_FS,
XFS_HEALTHMON_AG,
XFS_HEALTHMON_INODE,
XFS_HEALTHMON_RTGROUP,
XFS_HEALTHMON_DATADEV,
XFS_HEALTHMON_RTDEV,
XFS_HEALTHMON_LOGDEV,
XFS_HEALTHMON_FILERANGE,
};
struct xfs_healthmon_event {
struct xfs_healthmon_event *next;
enum xfs_healthmon_type type;
enum xfs_healthmon_domain domain;
uint64_t time_ns;
union {
struct {
uint64_t lostcount;
};
struct {
unsigned int fsmask;
};
struct {
unsigned int grpmask;
unsigned int group;
};
struct {
unsigned int imask;
uint32_t gen;
xfs_ino_t ino;
};
struct {
unsigned int flags;
};
struct {
xfs_daddr_t daddr;
uint64_t bbcount;
};
struct {
xfs_ino_t fino;
loff_t fpos;
uint64_t flen;
uint32_t fgen;
int error;
};
};
};
void xfs_healthmon_report_fs(struct xfs_mount *mp,
enum xfs_healthmon_type type, unsigned int old_mask,
unsigned int new_mask);
void xfs_healthmon_report_group(struct xfs_group *xg,
enum xfs_healthmon_type type, unsigned int old_mask,
unsigned int new_mask);
void xfs_healthmon_report_inode(struct xfs_inode *ip,
enum xfs_healthmon_type type, unsigned int old_mask,
unsigned int new_mask);
void xfs_healthmon_report_shutdown(struct xfs_mount *mp, uint32_t flags);
void xfs_healthmon_report_media(struct xfs_mount *mp, enum xfs_device fdev,
xfs_daddr_t daddr, uint64_t bbcount);
void xfs_healthmon_report_file_ioerror(struct xfs_inode *ip,
const struct fserror_event *p);
long xfs_ioc_health_monitor(struct file *file,
struct xfs_health_monitor __user *arg);
#endif