aboutsummaryrefslogtreecommitdiffstats
path: root/fuse_i.h
blob: 5f80620f1e1ecc3a630fe863fc4a2fe819f805f5 (plain) (blame)
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
    FUSE: Filesystem in Userspace
    Copyright (C) 2001  Miklos Szeredi (mszeredi@inf.bme.hu)

    This program can be distributed under the terms of the GNU GPL.
    See the file COPYING.
*/

#include "fuse.h"

#include <linux/fs.h>
#include <linux/list.h>
#include <linux/spinlock.h>

#define FUSE_VERSION "0.1"

/**
 * A Fuse connection.
 *
 * This structure is created, when the client device is opened, and is
 * destroyed, when the client device is closed _and_ the filesystem is
 * umounted.
 */
struct fuse_conn {
	/** The superblock of the mounted filesystem */
	struct super_block *sb;
	
	/** The opened client device */
	struct file *file;

	/** The client wait queue */
	wait_queue_head_t waitq;

	/** The list of pending requests */
	struct list_head pending;

	/** The list of requests being processed */
	struct list_head processing;

	/** The number of outstanding requests */
	int outstanding;

	/** Connnection number (for debuging) */
	int id;

	/** The request id */
	int reqctr;
};

/**
 * A request to the client
 */
struct fuse_req {
	/** The request list */
	struct list_head list;

	/** The request input parameters */
	struct fuse_in *in;

	/** The request result */
	struct fuse_out *out;

	/** The file returned by open */
	struct file *file;

	/** The request wait queue */
	wait_queue_head_t waitq;

	/** True if the request is finished */
	int done;
};

struct fuse_out_open_internal {
	file *file;
};


/**
 * The proc entry for the client device ("/proc/fs/fuse/dev")
 */
extern struct proc_dir_entry *proc_fuse_dev;

/**
 * The lock to protect fuses structures
 */
extern spinlock_t fuse_lock;

/**
 * Fill in the directory operations
 */
void fuse_dir_init(struct inode *inode);

/**
 * Fill in the file operations
 */
void fuse_file_init(struct inode *inode);

/**
 * Fill in the symlink operations
 */
void fuse_symlink_init(struct inode *inode);

/**
 * Check if the connection can be released, and if yes, then free the
 * connection structure
 */
void fuse_release_conn(struct fuse_conn *fc);

/**
 * Initialize the client device
 */
int fuse_dev_init(void);

/**
 * Cleanup the client device
 */
void fuse_dev_cleanup(void);

/**
 * Initialize the fuse filesystem 
 */
int fuse_fs_init(void);

/**
 * Cleanup the fuse filesystem
 */
void fuse_fs_cleanup(void);

/**
 * Send a request
 *
 */
void request_send(struct fuse_conn *fc, struct fuse_in *in,
		  struct fuse_out *out);

/*
 * Local Variables:
 * indent-tabs-mode: t
 * c-basic-offset: 8
 */