blob: da11b5dcabdc07594b495ffde598e9f03e9a051b [file] [log] [blame]
#ifndef __INTERMEZZO_KML_H
#define __INTERMEZZO_KML_H
#include <linux/version.h>
#include <linux/intermezzo_psdev.h>
#include <linux/fs.h>
#include <linux/intermezzo_journal.h>
#define PRESTO_KML_MAJOR_VERSION 0x00010000
#define PRESTO_KML_MINOR_VERSION 0x00002001
#define PRESTO_OP_NOOP 0
#define PRESTO_OP_CREATE 1
#define PRESTO_OP_MKDIR 2
#define PRESTO_OP_UNLINK 3
#define PRESTO_OP_RMDIR 4
#define PRESTO_OP_CLOSE 5
#define PRESTO_OP_SYMLINK 6
#define PRESTO_OP_RENAME 7
#define PRESTO_OP_SETATTR 8
#define PRESTO_OP_LINK 9
#define PRESTO_OP_OPEN 10
#define PRESTO_OP_MKNOD 11
#define PRESTO_OP_WRITE 12
#define PRESTO_OP_RELEASE 13
#define PRESTO_OP_TRUNC 14
#define PRESTO_OP_SETEXTATTR 15
#define PRESTO_OP_DELEXTATTR 16
#define PRESTO_LML_DONE 1 /* flag to get first write to do LML */
#define KML_KOP_MARK 0xffff
struct presto_lml_data {
loff_t rec_offset;
};
struct big_journal_prefix {
u32 len;
u32 version;
u32 pid;
u32 uid;
u32 fsuid;
u32 fsgid;
u32 opcode;
u32 ngroups;
u32 groups[NGROUPS_MAX];
};
enum kml_opcode {
KML_CREATE = 1,
KML_MKDIR,
KML_UNLINK,
KML_RMDIR,
KML_CLOSE,
KML_SYMLINK,
KML_RENAME,
KML_SETATTR,
KML_LINK,
KML_OPEN,
KML_MKNOD,
KML_ENDMARK = 0xff
};
struct kml_create {
char *path;
struct presto_version new_objectv,
old_parentv,
new_parentv;
int mode;
int uid;
int gid;
};
struct kml_open {
};
struct kml_mkdir {
char *path;
struct presto_version new_objectv,
old_parentv,
new_parentv;
int mode;
int uid;
int gid;
};
struct kml_unlink {
char *path,
*name;
struct presto_version old_tgtv,
old_parentv,
new_parentv;
};
struct kml_rmdir {
char *path,
*name;
struct presto_version old_tgtv,
old_parentv,
new_parentv;
};
struct kml_close {
int open_mode,
open_uid,
open_gid;
char *path;
struct presto_version new_objectv;
__u64 ino;
int generation;
};
struct kml_symlink {
char *sourcepath,
*targetpath;
struct presto_version new_objectv,
old_parentv,
new_parentv;
int uid;
int gid;
};
struct kml_rename {
char *sourcepath,
*targetpath;
struct presto_version old_objectv,
new_objectv,
old_tgtv,
new_tgtv;
};
struct kml_setattr {
char *path;
struct presto_version old_objectv;
struct iattr iattr;
};
struct kml_link {
char *sourcepath,
*targetpath;
struct presto_version new_objectv,
old_parentv,
new_parentv;
};
struct kml_mknod {
char *path;
struct presto_version new_objectv,
old_parentv,
new_parentv;
int mode;
int uid;
int gid;
int major;
int minor;
};
/* kml record items for optimizing */
struct kml_kop_node
{
u32 kml_recno;
u32 kml_flag;
u32 kml_op;
nlink_t i_nlink;
u32 i_ino;
};
struct kml_kop_lnode
{
struct list_head chains;
struct kml_kop_node node;
};
struct kml_endmark {
u32 total;
struct kml_kop_node *kop;
};
/* kml_flag */
#define KML_REC_DELETE 1
#define KML_REC_EXIST 0
struct kml_optimize {
struct list_head kml_chains;
u32 kml_flag;
u32 kml_op;
nlink_t i_nlink;
u32 i_ino;
};
struct kml_rec {
/* attribute of this record */
int rec_size;
int rec_kml_offset;
struct big_journal_prefix rec_head;
union {
struct kml_create create;
struct kml_open open;
struct kml_mkdir mkdir;
struct kml_unlink unlink;
struct kml_rmdir rmdir;
struct kml_close close;
struct kml_symlink symlink;
struct kml_rename rename;
struct kml_setattr setattr;
struct kml_mknod mknod;
struct kml_link link;
struct kml_endmark endmark;
} rec_kml;
struct journal_suffix rec_tail;
/* for kml optimize only */
struct kml_optimize kml_optimize;
};
/* kml record items for optimizing */
extern void kml_kop_init (struct presto_file_set *fset);
extern void kml_kop_addrec (struct presto_file_set *fset,
struct inode *ino, u32 op, u32 flag);
extern int kml_kop_flush (struct presto_file_set *fset);
/* defined in kml_setup.c */
extern int kml_init (struct presto_file_set *fset);
extern int kml_cleanup (struct presto_file_set *fset);
/* defined in kml.c */
extern int begin_kml_reint (struct file *file, unsigned long arg);
extern int do_kml_reint (struct file *file, unsigned long arg);
extern int end_kml_reint (struct file *file, unsigned long arg);
/* kml_utils.c */
extern char *dlogit (void *tbuf, const void *sbuf, int size);
extern char * bdup_printf (char *format, ...);
/* defined in kml_decode.c */
/* printop */
#define PRINT_KML_PREFIX 0x1
#define PRINT_KML_SUFFIX 0x2
#define PRINT_KML_REC 0x4
#define PRINT_KML_OPTIMIZE 0x8
#define PRINT_KML_EXIST 0x10
#define PRINT_KML_DELETE 0x20
extern void kml_printrec (struct kml_rec *rec, int printop);
extern int print_allkmlrec (struct list_head *head, int printop);
extern int delete_kmlrec (struct list_head *head);
extern int kml_decoderec (char *buf, int pos, int buflen, int *size,
struct kml_rec **newrec);
extern int decode_kmlrec (struct list_head *head, char *kml_buf, int buflen);
extern void kml_freerec (struct kml_rec *rec);
/* defined in kml_reint.c */
#define KML_CLOSE_BACKFETCH 1
extern int kml_reintbuf (struct kml_fsdata *kml_fsdata,
char *mtpt, struct kml_rec **rec);
/* defined in kml_setup.c */
extern int kml_init (struct presto_file_set *fset);
extern int kml_cleanup (struct presto_file_set *fset);
#endif