1#ifndef __INTERMEZZO_KML_H 2#define __INTERMEZZO_KML_H 3 4#include <linux/version.h> 5#include <linux/intermezzo_psdev.h> 6#include <linux/fs.h> 7#include <linux/intermezzo_journal.h> 8 9#define PRESTO_KML_MAJOR_VERSION 0x00010000 10#define PRESTO_KML_MINOR_VERSION 0x00002001 11#define PRESTO_OP_NOOP 0 12#define PRESTO_OP_CREATE 1 13#define PRESTO_OP_MKDIR 2 14#define PRESTO_OP_UNLINK 3 15#define PRESTO_OP_RMDIR 4 16#define PRESTO_OP_CLOSE 5 17#define PRESTO_OP_SYMLINK 6 18#define PRESTO_OP_RENAME 7 19#define PRESTO_OP_SETATTR 8 20#define PRESTO_OP_LINK 9 21#define PRESTO_OP_OPEN 10 22#define PRESTO_OP_MKNOD 11 23#define PRESTO_OP_WRITE 12 24#define PRESTO_OP_RELEASE 13 25#define PRESTO_OP_TRUNC 14 26#define PRESTO_OP_SETEXTATTR 15 27#define PRESTO_OP_DELEXTATTR 16 28 29#define PRESTO_LML_DONE 1 /* flag to get first write to do LML */ 30#define KML_KOP_MARK 0xffff 31 32struct presto_lml_data { 33 loff_t rec_offset; 34}; 35 36struct big_journal_prefix { 37 u32 len; 38 u32 version; 39 u32 pid; 40 u32 uid; 41 u32 fsuid; 42 u32 fsgid; 43 u32 opcode; 44 u32 ngroups; 45 u32 groups[NGROUPS_MAX]; 46}; 47 48enum kml_opcode { 49 KML_CREATE = 1, 50 KML_MKDIR, 51 KML_UNLINK, 52 KML_RMDIR, 53 KML_CLOSE, 54 KML_SYMLINK, 55 KML_RENAME, 56 KML_SETATTR, 57 KML_LINK, 58 KML_OPEN, 59 KML_MKNOD, 60 KML_ENDMARK = 0xff 61}; 62 63struct kml_create { 64 char *path; 65 struct presto_version new_objectv, 66 old_parentv, 67 new_parentv; 68 int mode; 69 int uid; 70 int gid; 71}; 72 73struct kml_open { 74}; 75 76struct kml_mkdir { 77 char *path; 78 struct presto_version new_objectv, 79 old_parentv, 80 new_parentv; 81 int mode; 82 int uid; 83 int gid; 84}; 85 86struct kml_unlink { 87 char *path, 88 *name; 89 struct presto_version old_tgtv, 90 old_parentv, 91 new_parentv; 92}; 93 94struct kml_rmdir { 95 char *path, 96 *name; 97 struct presto_version old_tgtv, 98 old_parentv, 99 new_parentv; 100}; 101 102struct kml_close { 103 int open_mode, 104 open_uid, 105 open_gid; 106 char *path; 107 struct presto_version new_objectv; 108 __u64 ino; 109 int generation; 110}; 111 112struct kml_symlink { 113 char *sourcepath, 114 *targetpath; 115 struct presto_version new_objectv, 116 old_parentv, 117 new_parentv; 118 int uid; 119 int gid; 120}; 121 122struct kml_rename { 123 char *sourcepath, 124 *targetpath; 125 struct presto_version old_objectv, 126 new_objectv, 127 old_tgtv, 128 new_tgtv; 129}; 130 131struct kml_setattr { 132 char *path; 133 struct presto_version old_objectv; 134 struct iattr iattr; 135}; 136 137struct kml_link { 138 char *sourcepath, 139 *targetpath; 140 struct presto_version new_objectv, 141 old_parentv, 142 new_parentv; 143}; 144 145struct kml_mknod { 146 char *path; 147 struct presto_version new_objectv, 148 old_parentv, 149 new_parentv; 150 int mode; 151 int uid; 152 int gid; 153 int major; 154 int minor; 155}; 156 157/* kml record items for optimizing */ 158struct kml_kop_node 159{ 160 u32 kml_recno; 161 u32 kml_flag; 162 u32 kml_op; 163 nlink_t i_nlink; 164 u32 i_ino; 165}; 166 167struct kml_kop_lnode 168{ 169 struct list_head chains; 170 struct kml_kop_node node; 171}; 172 173struct kml_endmark { 174 u32 total; 175 struct kml_kop_node *kop; 176}; 177 178/* kml_flag */ 179#define KML_REC_DELETE 1 180#define KML_REC_EXIST 0 181 182struct kml_optimize { 183 struct list_head kml_chains; 184 u32 kml_flag; 185 u32 kml_op; 186 nlink_t i_nlink; 187 u32 i_ino; 188}; 189 190struct kml_rec { 191 /* attribute of this record */ 192 int rec_size; 193 int rec_kml_offset; 194 195 struct big_journal_prefix rec_head; 196 union { 197 struct kml_create create; 198 struct kml_open open; 199 struct kml_mkdir mkdir; 200 struct kml_unlink unlink; 201 struct kml_rmdir rmdir; 202 struct kml_close close; 203 struct kml_symlink symlink; 204 struct kml_rename rename; 205 struct kml_setattr setattr; 206 struct kml_mknod mknod; 207 struct kml_link link; 208 struct kml_endmark endmark; 209 } rec_kml; 210 struct journal_suffix rec_tail; 211 212 /* for kml optimize only */ 213 struct kml_optimize kml_optimize; 214}; 215 216/* kml record items for optimizing */ 217extern void kml_kop_init (struct presto_file_set *fset); 218extern void kml_kop_addrec (struct presto_file_set *fset, 219 struct inode *ino, u32 op, u32 flag); 220extern int kml_kop_flush (struct presto_file_set *fset); 221 222/* defined in kml_setup.c */ 223extern int kml_init (struct presto_file_set *fset); 224extern int kml_cleanup (struct presto_file_set *fset); 225 226/* defined in kml.c */ 227extern int begin_kml_reint (struct file *file, unsigned long arg); 228extern int do_kml_reint (struct file *file, unsigned long arg); 229extern int end_kml_reint (struct file *file, unsigned long arg); 230 231/* kml_utils.c */ 232extern char *dlogit (void *tbuf, const void *sbuf, int size); 233extern char * bdup_printf (char *format, ...); 234 235/* defined in kml_decode.c */ 236/* printop */ 237#define PRINT_KML_PREFIX 0x1 238#define PRINT_KML_SUFFIX 0x2 239#define PRINT_KML_REC 0x4 240#define PRINT_KML_OPTIMIZE 0x8 241#define PRINT_KML_EXIST 0x10 242#define PRINT_KML_DELETE 0x20 243extern void kml_printrec (struct kml_rec *rec, int printop); 244extern int print_allkmlrec (struct list_head *head, int printop); 245extern int delete_kmlrec (struct list_head *head); 246extern int kml_decoderec (char *buf, int pos, int buflen, int *size, 247 struct kml_rec **newrec); 248extern int decode_kmlrec (struct list_head *head, char *kml_buf, int buflen); 249extern void kml_freerec (struct kml_rec *rec); 250 251/* defined in kml_reint.c */ 252#define KML_CLOSE_BACKFETCH 1 253extern int kml_reintbuf (struct kml_fsdata *kml_fsdata, 254 char *mtpt, struct kml_rec **rec); 255 256/* defined in kml_setup.c */ 257extern int kml_init (struct presto_file_set *fset); 258extern int kml_cleanup (struct presto_file_set *fset); 259 260#endif 261 262