File: logfs.h

package info (click to toggle)
logfs-tools 20100501-2
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 156 kB
  • ctags: 499
  • sloc: ansic: 2,202; makefile: 49
file content (89 lines) | stat: -rw-r--r-- 1,975 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#ifndef LOGFS_H
#define LOGFS_H

#include <asm/types.h>
#include <zlib.h>

#include "btree.h"
#include "kerncompat.h"
#include "logfs_abi.h"

struct super_block;
struct logfs_device_operations {
	int (*prepare_sb)(struct super_block *sb);
	int (*write)(struct super_block *sb, u64 ofs, size_t size, void *buf);
	int (*erase)(struct super_block *sb, u64 ofs, size_t size);
	s64 (*scan_super)(struct super_block *sb);
};

struct logfs_area {
	u32 segno;
	u32 used_bytes;
	void *buf;
};

struct super_block {
	int fd;

	u64 fssize;
	u32 segsize;
	u32 erasesize;
	u32 blocksize;
	int blocksize_bits;
	u32 writesize;
	u32 no_segs;
	u32 journal_seg[LOGFS_JOURNAL_SEGS];
	u64 used_bytes;

	u32 lastseg;
	struct logfs_area area[LOGFS_NO_AREAS];
	struct logfs_segment_entry *segment_entry;

	void *erase_buf;
	u64 sb_ofs1;
	u64 sb_ofs2;
	struct btree_head64 ino_tree;
	struct btree_head128 block_tree[LOGFS_NO_AREAS];
	const struct logfs_device_operations *dev_ops;
};

struct inode {
	struct btree_head64 block_tree[LOGFS_MAX_LEVELS];
	struct logfs_disk_inode di;
};

void check_crc32(void);
void fail(const char *s) __attribute__ ((__noreturn__));
struct super_block *open_device(const char *name);

static inline __be32 logfs_crc32(void *data, size_t len, size_t skip)
{
	return cpu_to_be32(~crc32(0, data+skip, len-skip));
}

static inline void *zalloc(size_t bytes)
{
	void *p = malloc(bytes);

	memset(p, 0, bytes);
	return p;
}

/* readwrite.c */
struct inode *find_or_create_inode(struct super_block *sb, u64 ino);
int logfs_file_write(struct super_block *sb, u64 ino, u64 bix, u8 level,
		u8 type, void *buf);
int logfs_file_flush(struct super_block *sb, u64 ino);

/* segment.c */
u32 get_segment(struct super_block *sb);
s64 logfs_segment_write(struct super_block *sb, void *buf, u8 type,
		u64 ino, u64 bix, u8 level);
int flush_segments(struct super_block *sb);

static inline __be32 ec_level(u32 ec, u8 level)
{
	return cpu_to_be32((ec << 4) | (level & 0xf));
}

#endif