diff options
Diffstat (limited to 'kernel/fuse_i.h')
-rw-r--r-- | kernel/fuse_i.h | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/kernel/fuse_i.h b/kernel/fuse_i.h new file mode 100644 index 0000000..1eb0bb4 --- /dev/null +++ b/kernel/fuse_i.h @@ -0,0 +1,169 @@ +/* + 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 <linux/fuse.h> +#include <linux/fs.h> +#include <linux/list.h> +#include <linux/spinlock.h> + +#define FUSE_VERSION "0.1" + +#define MAX_CLEARED 256 + +/** + * 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 cleared inodes */ + unsigned int numcleared; + + /** The array of cleared inode numbers */ + unsigned long *cleared; + + /** 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 ID */ + int unique; + + /** The opcode */ + enum fuse_opcode opcode; + + /** The request input size */ + unsigned int insize; + + /** The request input */ + char *in; + + /** The maximum request output size, if zero, then the request is + asynchronous */ + unsigned int outsize; + + /** The request output */ + char *out; + + /** The request wait queue */ + wait_queue_head_t waitq; +}; + + +struct fuse_in { + struct fuse_in_header h; + unsigned int argsize; + const void *arg; +}; + +struct fuse_out { + struct fuse_out_header h; + unsigned int argsize; + unsigned int argvar; + void *arg; +}; + +#define FUSE_IN_INIT { {0, 0, 0}, 0, 0 } +#define FUSE_OUT_INIT { {0, 0}, 0, 0, 0 } + + +/** + * 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); + +/** + * Fill in the special inode operaions + */ +void fuse_special_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 + */ |