You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.0 KiB
90 lines
2.0 KiB
20 years ago
|
/*
|
||
|
FUSE: Filesystem in Userspace
|
||
|
Copyright (C) 2001-2005 Miklos Szeredi <miklos@szeredi.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/wait.h>
|
||
|
#include <linux/list.h>
|
||
|
#include <linux/spinlock.h>
|
||
|
#include <linux/mm.h>
|
||
|
#include <linux/backing-dev.h>
|
||
|
#include <asm/semaphore.h>
|
||
|
|
||
|
/** FUSE inode */
|
||
|
struct fuse_inode {
|
||
|
/** Inode data */
|
||
|
struct inode inode;
|
||
|
|
||
|
/** Unique ID, which identifies the inode between userspace
|
||
|
* and kernel */
|
||
|
u64 nodeid;
|
||
|
|
||
|
/** Time in jiffies until the file attributes are valid */
|
||
|
unsigned long i_time;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* A Fuse connection.
|
||
|
*
|
||
|
* This structure is created, when the filesystem is mounted, and is
|
||
|
* destroyed, when the client device is closed and the filesystem is
|
||
|
* unmounted.
|
||
|
*/
|
||
|
struct fuse_conn {
|
||
|
/** The superblock of the mounted filesystem */
|
||
|
struct super_block *sb;
|
||
|
|
||
|
/** The user id for this mount */
|
||
|
uid_t user_id;
|
||
|
|
||
|
/** Backing dev info */
|
||
|
struct backing_dev_info bdi;
|
||
|
};
|
||
|
|
||
|
static inline struct fuse_conn **get_fuse_conn_super_p(struct super_block *sb)
|
||
|
{
|
||
|
return (struct fuse_conn **) &sb->s_fs_info;
|
||
|
}
|
||
|
|
||
|
static inline struct fuse_conn *get_fuse_conn_super(struct super_block *sb)
|
||
|
{
|
||
|
return *get_fuse_conn_super_p(sb);
|
||
|
}
|
||
|
|
||
|
static inline struct fuse_conn *get_fuse_conn(struct inode *inode)
|
||
|
{
|
||
|
return get_fuse_conn_super(inode->i_sb);
|
||
|
}
|
||
|
|
||
|
static inline struct fuse_inode *get_fuse_inode(struct inode *inode)
|
||
|
{
|
||
|
return container_of(inode, struct fuse_inode, inode);
|
||
|
}
|
||
|
|
||
|
static inline u64 get_node_id(struct inode *inode)
|
||
|
{
|
||
|
return get_fuse_inode(inode)->nodeid;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This is the single global spinlock which protects FUSE's structures
|
||
|
*
|
||
|
* The following data is protected by this lock:
|
||
|
*
|
||
|
* - the s_fs_info field of the super block
|
||
|
* - the sb (super_block) field in fuse_conn
|
||
|
*/
|
||
|
extern spinlock_t fuse_lock;
|
||
|
|
||
|
/**
|
||
|
* Check if the connection can be released, and if yes, then free the
|
||
|
* connection structure
|
||
|
*/
|
||
|
void fuse_release_conn(struct fuse_conn *fc);
|
||
|
|