cleaner.h revision 1.6 1 #ifndef CLEANER_H_
2 #define CLEANER_H_
3
4 /*
5 * An abbreviated version of the SEGUSE data structure.
6 */
7 struct clfs_seguse {
8 u_int32_t nbytes;
9 u_int32_t nsums;
10 u_int32_t flags;
11 u_int64_t lastmod;
12 u_int64_t priority;
13 };
14
15 /*
16 * The cleaner's view of the superblock data structure.
17 */
18 struct clfs {
19 struct dlfs lfs_dlfs;
20
21 /* Ifile */
22 int clfs_ifilefd; /* Ifile file descriptor */
23 struct uvnode *lfs_ivnode; /* Ifile vnode */
24 struct lfs_fhandle clfs_ifilefh; /* Ifile file handle */
25
26 /* Device */
27 int clfs_devfd; /* Device file descriptor */
28 struct uvnode *clfs_devvp; /* Device vnode */
29 char *clfs_dev; /* Name of device */
30
31 /* Cache of segment status */
32 struct clfs_seguse *clfs_segtab; /* Abbreviated seguse table */
33 struct clfs_seguse **clfs_segtabp; /* pointers to same */
34
35 /* Progress status */
36 int clfs_nactive; /* How many segments' blocks we have */
37 int clfs_onhold; /* If cleaning this fs is on hold */
38 };
39
40 /* ugh... */
41 #define CLFS_DEF_SB_ACCESSOR(type, field) \
42 static __unused inline type \
43 clfs_sb_get##field(struct clfs *fs) \
44 { \
45 return fs->lfs_dlfs.dlfs_##field; \
46 } \
47 static __unused inline void \
48 clfs_sb_set##field(struct clfs *fs, type val) \
49 { \
50 fs->lfs_dlfs.dlfs_##field = val; \
51 } \
52 static __unused inline void \
53 clfs_sb_add##field(struct clfs *fs, type val) \
54 { \
55 fs->lfs_dlfs.dlfs_##field += val; \
56 }
57
58 /* more ugh... */
59 CLFS_DEF_SB_ACCESSOR(u_int32_t, ssize);
60 CLFS_DEF_SB_ACCESSOR(u_int32_t, bsize);
61 CLFS_DEF_SB_ACCESSOR(u_int32_t, fsize);
62 CLFS_DEF_SB_ACCESSOR(u_int32_t, frag);
63 CLFS_DEF_SB_ACCESSOR(u_int32_t, ifile);
64 CLFS_DEF_SB_ACCESSOR(u_int32_t, ifpb);
65 CLFS_DEF_SB_ACCESSOR(u_int32_t, sepb);
66 CLFS_DEF_SB_ACCESSOR(u_int32_t, nseg);
67 CLFS_DEF_SB_ACCESSOR(u_int32_t, cleansz);
68 CLFS_DEF_SB_ACCESSOR(u_int32_t, segtabsz);
69
70 /* still more ugh... */
71 #define lfs_sb_getssize(fs) clfs_sb_getssize(fs)
72 #define lfs_sb_getbsize(fs) clfs_sb_getbsize(fs)
73 #define lfs_sb_getfsize(fs) clfs_sb_getfsize(fs)
74 #define lfs_sb_getfrag(fs) clfs_sb_getfrag(fs)
75 #define lfs_sb_getifpb(fs) clfs_sb_getifpb(fs)
76 #define lfs_sb_getsepb(fs) clfs_sb_getsepb(fs)
77 #define lfs_sb_getnseg(fs) clfs_sb_getnseg(fs)
78 #define lfs_sb_getcleansz(fs) clfs_sb_getcleansz(fs)
79 #define lfs_sb_getsegtabsz(fs) clfs_sb_getsegtabsz(fs)
80
81 /*
82 * Fraction of the could-be-clean segments required to be clean.
83 */
84 #define BUSY_LIM 0.5
85 #define IDLE_LIM 0.9
86
87 __BEGIN_DECLS
88
89 /* lfs_cleanerd.c */
90 void pwarn(const char *, ...);
91 void calc_cb(struct clfs *, int, struct clfs_seguse *);
92 int clean_fs(struct clfs *, CLEANERINFO *);
93 void dlog(const char *, ...);
94 void handle_error(struct clfs **, int);
95 int init_fs(struct clfs *, char *);
96 int invalidate_segment(struct clfs *, int);
97 void lfs_ientry(IFILE **, struct clfs *, ino_t, struct ubuf **);
98 int load_segment(struct clfs *, int, BLOCK_INFO **, int *);
99 int needs_cleaning(struct clfs *, CLEANERINFO *);
100 int32_t parse_pseg(struct clfs *, daddr_t, BLOCK_INFO **, int *);
101 int reinit_fs(struct clfs *);
102 void reload_ifile(struct clfs *);
103 void toss_old_blocks(struct clfs *, BLOCK_INFO **, int *, int *);
104
105 /* cleansrv.c */
106 void check_control_socket(void);
107 void try_to_become_master(int, char **);
108
109 /* coalesce.c */
110 int log2int(int);
111 int clean_all_inodes(struct clfs *);
112 int fork_coalesce(struct clfs *);
113
114 __END_DECLS
115
116 #endif /* CLEANER_H_ */
117