diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2006-06-25 08:48:51 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-25 13:01:19 -0400 |
commit | bafa96541b250a7051e3fbc5de6e8369daf8ffec (patch) | |
tree | 9b758c424fcda2d263c71f25358bb65a0abc15d4 /fs/fuse/fuse_i.h | |
parent | 51eb01e73599efb88c6c20b1c226d20309a75450 (diff) |
[PATCH] fuse: add control filesystem
Add a control filesystem to fuse, replacing the attributes currently exported
through sysfs. An empty directory '/sys/fs/fuse/connections' is still created
in sysfs, and mounting the control filesystem here provides backward
compatibility.
Advantages of the control filesystem over the previous solution:
- allows the object directory and the attributes to be owned by the
filesystem owner, hence letting unpriviled users abort the
filesystem connection
- does not suffer from module unload race
[akpm@osdl.org: fix this fs for recent dhowells depredations]
[akpm@osdl.org: fix 64-bit printk warnings]
Signed-off-by: Miklos Szeredi <miklos@szeredi.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/fuse/fuse_i.h')
-rw-r--r-- | fs/fuse/fuse_i.h | 53 |
1 files changed, 46 insertions, 7 deletions
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index 25f8581a770c..ac12b01f4446 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/spinlock.h> | 14 | #include <linux/spinlock.h> |
15 | #include <linux/mm.h> | 15 | #include <linux/mm.h> |
16 | #include <linux/backing-dev.h> | 16 | #include <linux/backing-dev.h> |
17 | #include <linux/mutex.h> | ||
17 | 18 | ||
18 | /** Max number of pages that can be used in a single read request */ | 19 | /** Max number of pages that can be used in a single read request */ |
19 | #define FUSE_MAX_PAGES_PER_REQ 32 | 20 | #define FUSE_MAX_PAGES_PER_REQ 32 |
@@ -24,6 +25,9 @@ | |||
24 | /** It could be as large as PATH_MAX, but would that have any uses? */ | 25 | /** It could be as large as PATH_MAX, but would that have any uses? */ |
25 | #define FUSE_NAME_MAX 1024 | 26 | #define FUSE_NAME_MAX 1024 |
26 | 27 | ||
28 | /** Number of dentries for each connection in the control filesystem */ | ||
29 | #define FUSE_CTL_NUM_DENTRIES 3 | ||
30 | |||
27 | /** If the FUSE_DEFAULT_PERMISSIONS flag is given, the filesystem | 31 | /** If the FUSE_DEFAULT_PERMISSIONS flag is given, the filesystem |
28 | module will check permissions based on the file mode. Otherwise no | 32 | module will check permissions based on the file mode. Otherwise no |
29 | permission checking is done in the kernel */ | 33 | permission checking is done in the kernel */ |
@@ -33,6 +37,11 @@ | |||
33 | doing the mount will be allowed to access the filesystem */ | 37 | doing the mount will be allowed to access the filesystem */ |
34 | #define FUSE_ALLOW_OTHER (1 << 1) | 38 | #define FUSE_ALLOW_OTHER (1 << 1) |
35 | 39 | ||
40 | /** List of active connections */ | ||
41 | extern struct list_head fuse_conn_list; | ||
42 | |||
43 | /** Global mutex protecting fuse_conn_list and the control filesystem */ | ||
44 | extern struct mutex fuse_mutex; | ||
36 | 45 | ||
37 | /** FUSE inode */ | 46 | /** FUSE inode */ |
38 | struct fuse_inode { | 47 | struct fuse_inode { |
@@ -216,6 +225,9 @@ struct fuse_conn { | |||
216 | /** Lock protecting accessess to members of this structure */ | 225 | /** Lock protecting accessess to members of this structure */ |
217 | spinlock_t lock; | 226 | spinlock_t lock; |
218 | 227 | ||
228 | /** Refcount */ | ||
229 | atomic_t count; | ||
230 | |||
219 | /** The user id for this mount */ | 231 | /** The user id for this mount */ |
220 | uid_t user_id; | 232 | uid_t user_id; |
221 | 233 | ||
@@ -310,8 +322,17 @@ struct fuse_conn { | |||
310 | /** Backing dev info */ | 322 | /** Backing dev info */ |
311 | struct backing_dev_info bdi; | 323 | struct backing_dev_info bdi; |
312 | 324 | ||
313 | /** kobject */ | 325 | /** Entry on the fuse_conn_list */ |
314 | struct kobject kobj; | 326 | struct list_head entry; |
327 | |||
328 | /** Unique ID */ | ||
329 | u64 id; | ||
330 | |||
331 | /** Dentries in the control filesystem */ | ||
332 | struct dentry *ctl_dentry[FUSE_CTL_NUM_DENTRIES]; | ||
333 | |||
334 | /** number of dentries used in the above array */ | ||
335 | int ctl_ndents; | ||
315 | 336 | ||
316 | /** O_ASYNC requests */ | 337 | /** O_ASYNC requests */ |
317 | struct fasync_struct *fasync; | 338 | struct fasync_struct *fasync; |
@@ -327,11 +348,6 @@ static inline struct fuse_conn *get_fuse_conn(struct inode *inode) | |||
327 | return get_fuse_conn_super(inode->i_sb); | 348 | return get_fuse_conn_super(inode->i_sb); |
328 | } | 349 | } |
329 | 350 | ||
330 | static inline struct fuse_conn *get_fuse_conn_kobj(struct kobject *obj) | ||
331 | { | ||
332 | return container_of(obj, struct fuse_conn, kobj); | ||
333 | } | ||
334 | |||
335 | static inline struct fuse_inode *get_fuse_inode(struct inode *inode) | 351 | static inline struct fuse_inode *get_fuse_inode(struct inode *inode) |
336 | { | 352 | { |
337 | return container_of(inode, struct fuse_inode, inode); | 353 | return container_of(inode, struct fuse_inode, inode); |
@@ -422,6 +438,9 @@ int fuse_dev_init(void); | |||
422 | */ | 438 | */ |
423 | void fuse_dev_cleanup(void); | 439 | void fuse_dev_cleanup(void); |
424 | 440 | ||
441 | int fuse_ctl_init(void); | ||
442 | void fuse_ctl_cleanup(void); | ||
443 | |||
425 | /** | 444 | /** |
426 | * Allocate a request | 445 | * Allocate a request |
427 | */ | 446 | */ |
@@ -470,3 +489,23 @@ int fuse_do_getattr(struct inode *inode); | |||
470 | * Invalidate inode attributes | 489 | * Invalidate inode attributes |
471 | */ | 490 | */ |
472 | void fuse_invalidate_attr(struct inode *inode); | 491 | void fuse_invalidate_attr(struct inode *inode); |
492 | |||
493 | /** | ||
494 | * Acquire reference to fuse_conn | ||
495 | */ | ||
496 | struct fuse_conn *fuse_conn_get(struct fuse_conn *fc); | ||
497 | |||
498 | /** | ||
499 | * Release reference to fuse_conn | ||
500 | */ | ||
501 | void fuse_conn_put(struct fuse_conn *fc); | ||
502 | |||
503 | /** | ||
504 | * Add connection to control filesystem | ||
505 | */ | ||
506 | int fuse_ctl_add_conn(struct fuse_conn *fc); | ||
507 | |||
508 | /** | ||
509 | * Remove connection from control filesystem | ||
510 | */ | ||
511 | void fuse_ctl_remove_conn(struct fuse_conn *fc); | ||