blob: de0a9e65d8a31ec750432718363f3894e78b08e9 [file] [log] [blame]
/*
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;
/**
* Initialize inode
*/
void fuse_init_inode(struct inode *inode, struct fuse_attr *attr);
/**
* 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
*/