blob: eed6e89ce01f7d42fbaa3372758191e7c169d63d [file] [log] [blame]
Miklos Szeredid8a5ba42005-09-09 13:10:26 -07001/*
2 FUSE: Filesystem in Userspace
3 Copyright (C) 2001-2005 Miklos Szeredi <miklos@szeredi.hu>
4
5 This program can be distributed under the terms of the GNU GPL.
6 See the file COPYING.
7*/
8
9#include <linux/fuse.h>
10#include <linux/fs.h>
11#include <linux/wait.h>
12#include <linux/list.h>
13#include <linux/spinlock.h>
14#include <linux/mm.h>
15#include <linux/backing-dev.h>
16#include <asm/semaphore.h>
17
18/** FUSE inode */
19struct fuse_inode {
20 /** Inode data */
21 struct inode inode;
22
23 /** Unique ID, which identifies the inode between userspace
24 * and kernel */
25 u64 nodeid;
26
27 /** Time in jiffies until the file attributes are valid */
28 unsigned long i_time;
29};
30
31/**
32 * A Fuse connection.
33 *
34 * This structure is created, when the filesystem is mounted, and is
35 * destroyed, when the client device is closed and the filesystem is
36 * unmounted.
37 */
38struct fuse_conn {
39 /** The superblock of the mounted filesystem */
40 struct super_block *sb;
41
42 /** The user id for this mount */
43 uid_t user_id;
44
45 /** Backing dev info */
46 struct backing_dev_info bdi;
47};
48
49static inline struct fuse_conn **get_fuse_conn_super_p(struct super_block *sb)
50{
51 return (struct fuse_conn **) &sb->s_fs_info;
52}
53
54static inline struct fuse_conn *get_fuse_conn_super(struct super_block *sb)
55{
56 return *get_fuse_conn_super_p(sb);
57}
58
59static inline struct fuse_conn *get_fuse_conn(struct inode *inode)
60{
61 return get_fuse_conn_super(inode->i_sb);
62}
63
64static inline struct fuse_inode *get_fuse_inode(struct inode *inode)
65{
66 return container_of(inode, struct fuse_inode, inode);
67}
68
69static inline u64 get_node_id(struct inode *inode)
70{
71 return get_fuse_inode(inode)->nodeid;
72}
73
74/**
75 * This is the single global spinlock which protects FUSE's structures
76 *
77 * The following data is protected by this lock:
78 *
79 * - the s_fs_info field of the super block
80 * - the sb (super_block) field in fuse_conn
81 */
82extern spinlock_t fuse_lock;
83
84/**
85 * Check if the connection can be released, and if yes, then free the
86 * connection structure
87 */
88void fuse_release_conn(struct fuse_conn *fc);
89