Home | History | Annotate | Line # | Download | only in lfs_cleanerd
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