-
Notifications
You must be signed in to change notification settings - Fork 1
/
node.h
96 lines (74 loc) · 2.46 KB
/
node.h
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
90
91
92
93
94
95
96
/*
* node.h
*
* Copyright (C) 2014
* Maxime Lorrillere <[email protected]>
* LIP6 - Laboratoire d'Informatique de Paris 6
*/
#ifndef NODE_H
#define NODE_H
#include <linux/kref.h>
#include <linux/list.h>
#include <linux/spinlock.h>
#include <linux/uuid.h>
#include <linux/timer.h>
#include "messenger.h"
#include "stats.h"
struct address_space;
struct buffer_head;
extern unsigned short remotecache_port;
extern ulong remotecache_max_size;
extern bool remotecache_strategy;
struct remotecache_node {
struct kref kref;
struct rc_stats stats; /* sysfs statistics */
/* local metadata */
struct list_head metadata;
struct mutex m_lock; /* lock to protect ->metadata */
/* Remote connections */
struct rc_connection con; /* Listen connection */
struct list_head sessions;
struct mutex s_lock; /* lock to protect ->sessions */
struct timer_list suspend_timer;
unsigned long flags;
};
enum remotecache_node_flags {
REMOTECACHE_NODE_SUSPENDED,
REMOTECACHE_NODE_CLOSED
};
extern struct remotecache_node *this_node;
extern mempool_t *remotecache_page_pool;
extern struct rc_msgpool remotecache_get_cachep;
extern struct rc_msgpool remotecache_get_response_cachep;
extern struct rc_msgpool remotecache_put_cachep;
extern struct rc_msgpool remotecache_inv_cachep;
void remotecache_node_last_put(struct kref *ref);
static inline void remotecache_node_get(struct remotecache_node *node)
{
kref_get(&node->kref);
}
static inline void remotecache_node_put(struct remotecache_node *node)
{
kref_put(&node->kref, remotecache_node_last_put);
}
struct remotecache *remotecache_node_metadata(struct remotecache_node *node,
int pool_id, uuid_le uuid);
void remotecache_node_resume(struct remotecache_node *);
void remotecache_node_suspend(struct remotecache_node *, unsigned long);
static inline bool remotecache_node_is_suspended(struct remotecache_node *node)
{
return test_bit(REMOTECACHE_NODE_SUSPENDED, &node->flags);
}
/* Returns a session to be used.
*
* This is transitionnal code, we have to choose the best suited session
*/
struct remotecache_session *remotecache_node_session(
struct remotecache_node *node);
int remotecache_node_readpages(struct file *file,
struct address_space *mapping, struct list_head *pages,
unsigned nr_pages);
int remotecache_node_readpage(struct file *file, struct page *page);
void remotecache_node_readpage_sync(struct file *file, struct page *page);
void remotecache_node_ll_rw_block(int rw, struct buffer_head *bh);
#endif //NODE_H