Blame view

fs/fuse/fuse_i.h 12.4 KB
d8a5ba454   Miklos Szeredi   [PATCH] FUSE - core
1
2
  /*
    FUSE: Filesystem in Userspace
d71331146   Miklos Szeredi   [PATCH] fuse: use...
3
    Copyright (C) 2001-2006  Miklos Szeredi <miklos@szeredi.hu>
d8a5ba454   Miklos Szeredi   [PATCH] FUSE - core
4
5
6
7
8
9
10
  
    This program can be distributed under the terms of the GNU GPL.
    See the file COPYING.
  */
  
  #include <linux/fuse.h>
  #include <linux/fs.h>
51eb01e73   Miklos Szeredi   [PATCH] fuse: no ...
11
  #include <linux/mount.h>
d8a5ba454   Miklos Szeredi   [PATCH] FUSE - core
12
13
14
15
16
  #include <linux/wait.h>
  #include <linux/list.h>
  #include <linux/spinlock.h>
  #include <linux/mm.h>
  #include <linux/backing-dev.h>
bafa96541   Miklos Szeredi   [PATCH] fuse: add...
17
  #include <linux/mutex.h>
d8a5ba454   Miklos Szeredi   [PATCH] FUSE - core
18

334f485df   Miklos Szeredi   [PATCH] FUSE - de...
19
20
  /** Max number of pages that can be used in a single read request */
  #define FUSE_MAX_PAGES_PER_REQ 32
08a53cdce   Miklos Szeredi   [PATCH] fuse: acc...
21
22
  /** Maximum number of outstanding background requests */
  #define FUSE_MAX_BACKGROUND 10
1d3d752b4   Miklos Szeredi   [PATCH] fuse: cle...
23
24
  /** It could be as large as PATH_MAX, but would that have any uses? */
  #define FUSE_NAME_MAX 1024
bafa96541   Miklos Szeredi   [PATCH] fuse: add...
25
26
  /** Number of dentries for each connection in the control filesystem */
  #define FUSE_CTL_NUM_DENTRIES 3
1e9a4ed93   Miklos Szeredi   [PATCH] FUSE - mo...
27
28
29
30
31
32
33
34
  /** If the FUSE_DEFAULT_PERMISSIONS flag is given, the filesystem
      module will check permissions based on the file mode.  Otherwise no
      permission checking is done in the kernel */
  #define FUSE_DEFAULT_PERMISSIONS (1 << 0)
  
  /** If the FUSE_ALLOW_OTHER flag is given, then not only the user
      doing the mount will be allowed to access the filesystem */
  #define FUSE_ALLOW_OTHER         (1 << 1)
bafa96541   Miklos Szeredi   [PATCH] fuse: add...
35
36
37
38
39
  /** List of active connections */
  extern struct list_head fuse_conn_list;
  
  /** Global mutex protecting fuse_conn_list and the control filesystem */
  extern struct mutex fuse_mutex;
413ef8cb3   Miklos Szeredi   [PATCH] FUSE - di...
40

d8a5ba454   Miklos Szeredi   [PATCH] FUSE - core
41
42
43
44
45
46
47
48
  /** FUSE inode */
  struct fuse_inode {
  	/** Inode data */
  	struct inode inode;
  
  	/** Unique ID, which identifies the inode between userspace
  	 * and kernel */
  	u64 nodeid;
9e6268db4   Miklos Szeredi   [PATCH] FUSE - re...
49
50
  	/** Number of lookups on this inode */
  	u64 nlookup;
e5e5558e9   Miklos Szeredi   [PATCH] FUSE - re...
51
52
  	/** The request used for sending the FORGET message */
  	struct fuse_req *forget_req;
d8a5ba454   Miklos Szeredi   [PATCH] FUSE - core
53
  	/** Time in jiffies until the file attributes are valid */
0a0898cf4   Miklos Szeredi   [PATCH] fuse: use...
54
  	u64 i_time;
d8a5ba454   Miklos Szeredi   [PATCH] FUSE - core
55
  };
b6aeadeda   Miklos Szeredi   [PATCH] FUSE - fi...
56
57
58
  /** FUSE specific file data */
  struct fuse_file {
  	/** Request reserved for flush and release */
33649c91a   Miklos Szeredi   [PATCH] fuse: ens...
59
  	struct fuse_req *reserved_req;
b6aeadeda   Miklos Szeredi   [PATCH] FUSE - fi...
60
61
62
63
  
  	/** File handle used by userspace */
  	u64 fh;
  };
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
  /** One input argument of a request */
  struct fuse_in_arg {
  	unsigned size;
  	const void *value;
  };
  
  /** The request input */
  struct fuse_in {
  	/** The request header */
  	struct fuse_in_header h;
  
  	/** True if the data for the last argument is in req->pages */
  	unsigned argpages:1;
  
  	/** Number of arguments */
  	unsigned numargs;
  
  	/** Array of arguments */
  	struct fuse_in_arg args[3];
  };
  
  /** One output argument of a request */
  struct fuse_arg {
  	unsigned size;
  	void *value;
  };
  
  /** The request output */
  struct fuse_out {
  	/** Header returned from userspace */
  	struct fuse_out_header h;
095da6cbb   Miklos Szeredi   [PATCH] fuse: fix...
95
96
97
98
  	/*
  	 * The following bitfields are not changed during the request
  	 * processing
  	 */
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
  	/** Last argument is variable length (can be shorter than
  	    arg->size) */
  	unsigned argvar:1;
  
  	/** Last argument is a list of pages to copy data to */
  	unsigned argpages:1;
  
  	/** Zero partially or not copied pages */
  	unsigned page_zeroing:1;
  
  	/** Number or arguments */
  	unsigned numargs;
  
  	/** Array of arguments */
  	struct fuse_arg args[3];
  };
83cfd4935   Miklos Szeredi   [PATCH] fuse: int...
115
116
117
118
119
120
  /** The request state */
  enum fuse_req_state {
  	FUSE_REQ_INIT = 0,
  	FUSE_REQ_PENDING,
  	FUSE_REQ_READING,
  	FUSE_REQ_SENT,
a4d27e75f   Miklos Szeredi   [PATCH] fuse: add...
121
  	FUSE_REQ_WRITING,
83cfd4935   Miklos Szeredi   [PATCH] fuse: int...
122
123
  	FUSE_REQ_FINISHED
  };
64c6d8ed4   Miklos Szeredi   [PATCH] fuse: add...
124
  struct fuse_conn;
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
125
126
127
128
  /**
   * A request to the client
   */
  struct fuse_req {
ce1d5a491   Miklos Szeredi   [PATCH] fuse: cle...
129
130
  	/** This can be on either pending processing or io lists in
  	    fuse_conn */
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
131
  	struct list_head list;
a4d27e75f   Miklos Szeredi   [PATCH] fuse: add...
132
133
  	/** Entry on the interrupts list  */
  	struct list_head intr_entry;
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
134
135
  	/** refcount */
  	atomic_t count;
a4d27e75f   Miklos Szeredi   [PATCH] fuse: add...
136
137
  	/** Unique ID for the interrupt request */
  	u64 intr_unique;
095da6cbb   Miklos Szeredi   [PATCH] fuse: fix...
138
139
140
  	/*
  	 * The following bitfields are either set once before the
  	 * request is queued or setting/clearing them is protected by
d71331146   Miklos Szeredi   [PATCH] fuse: use...
141
  	 * fuse_conn->lock
095da6cbb   Miklos Szeredi   [PATCH] fuse: fix...
142
  	 */
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
143
144
  	/** True if the request has reply */
  	unsigned isreply:1;
51eb01e73   Miklos Szeredi   [PATCH] fuse: no ...
145
146
  	/** Force sending of the request even if interrupted */
  	unsigned force:1;
f9a2842e5   Miklos Szeredi   [PATCH] fuse: ren...
147
148
  	/** The request was aborted */
  	unsigned aborted:1;
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
149
150
151
  
  	/** Request is sent in the background */
  	unsigned background:1;
a4d27e75f   Miklos Szeredi   [PATCH] fuse: add...
152
153
  	/** The request has been interrupted */
  	unsigned interrupted:1;
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
154
155
  	/** Data is being copied to/from the request */
  	unsigned locked:1;
9bc5dddad   Miklos Szeredi   [fuse] Fix accoun...
156
157
  	/** Request is counted as "waiting" */
  	unsigned waiting:1;
83cfd4935   Miklos Szeredi   [PATCH] fuse: int...
158
159
  	/** State of the request */
  	enum fuse_req_state state;
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
160
161
162
163
164
165
166
167
168
169
170
171
  
  	/** The request input */
  	struct fuse_in in;
  
  	/** The request output */
  	struct fuse_out out;
  
  	/** Used to wake up the task waiting for completion of request*/
  	wait_queue_head_t waitq;
  
  	/** Data for asynchronous requests */
  	union {
e5e5558e9   Miklos Szeredi   [PATCH] FUSE - re...
172
  		struct fuse_forget_in forget_in;
b6aeadeda   Miklos Szeredi   [PATCH] FUSE - fi...
173
  		struct fuse_release_in release_in;
3ec870d52   Miklos Szeredi   [PATCH] fuse: mak...
174
175
  		struct fuse_init_in init_in;
  		struct fuse_init_out init_out;
361b1eb55   Miklos Szeredi   [PATCH] fuse: REA...
176
  		struct fuse_read_in read_in;
714212593   Miklos Szeredi   [PATCH] fuse: add...
177
  		struct fuse_lk_in lk_in;
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
178
179
180
181
182
183
184
185
186
187
  	} misc;
  
  	/** page vector */
  	struct page *pages[FUSE_MAX_PAGES_PER_REQ];
  
  	/** number of pages in vector */
  	unsigned num_pages;
  
  	/** offset of data on first page */
  	unsigned page_offset;
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
188
189
  	/** File used in the request (or NULL) */
  	struct file *file;
64c6d8ed4   Miklos Szeredi   [PATCH] fuse: add...
190

51eb01e73   Miklos Szeredi   [PATCH] fuse: no ...
191
192
193
194
195
  	/** vfsmount used in release */
  	struct vfsmount *vfsmount;
  
  	/** dentry used in release */
  	struct dentry *dentry;
64c6d8ed4   Miklos Szeredi   [PATCH] fuse: add...
196
197
  	/** Request completion callback */
  	void (*end)(struct fuse_conn *, struct fuse_req *);
33649c91a   Miklos Szeredi   [PATCH] fuse: ens...
198
199
200
  
  	/** Request is stolen from fuse_file->reserved_req */
  	struct file *stolen_file;
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
201
  };
d8a5ba454   Miklos Szeredi   [PATCH] FUSE - core
202
203
204
205
206
207
208
209
  /**
   * 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 {
d71331146   Miklos Szeredi   [PATCH] fuse: use...
210
211
  	/** Lock protecting accessess to  members of this structure */
  	spinlock_t lock;
d2a85164a   Miklos Szeredi   [PATCH] fuse: fix...
212
213
  	/** Mutex protecting against directory alias creation */
  	struct mutex inst_mutex;
bafa96541   Miklos Szeredi   [PATCH] fuse: add...
214
215
  	/** Refcount */
  	atomic_t count;
d8a5ba454   Miklos Szeredi   [PATCH] FUSE - core
216
217
  	/** The user id for this mount */
  	uid_t user_id;
87729a551   Miklos Szeredi   [PATCH] FUSE: tig...
218
219
  	/** The group id for this mount */
  	gid_t group_id;
1e9a4ed93   Miklos Szeredi   [PATCH] FUSE - mo...
220
221
  	/** The fuse mount flags for this mount */
  	unsigned flags;
db50b96c0   Miklos Szeredi   [PATCH] FUSE - re...
222
223
  	/** Maximum read size */
  	unsigned max_read;
413ef8cb3   Miklos Szeredi   [PATCH] FUSE - di...
224
225
  	/** Maximum write size */
  	unsigned max_write;
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
226
227
228
229
230
231
232
233
  	/** Readers of the connection are waiting on this */
  	wait_queue_head_t waitq;
  
  	/** The list of pending requests */
  	struct list_head pending;
  
  	/** The list of requests being processed */
  	struct list_head processing;
d77a1d5b6   Miklos Szeredi   [PATCH] fuse: int...
234
235
  	/** The list of requests under I/O */
  	struct list_head io;
08a53cdce   Miklos Szeredi   [PATCH] fuse: acc...
236
237
  	/** Number of requests currently in the background */
  	unsigned num_background;
a4d27e75f   Miklos Szeredi   [PATCH] fuse: add...
238
239
  	/** Pending interrupts */
  	struct list_head interrupts;
08a53cdce   Miklos Szeredi   [PATCH] fuse: acc...
240
241
242
243
244
245
246
  	/** Flag indicating if connection is blocked.  This will be
  	    the case before the INIT reply is received, and if there
  	    are too many outstading backgrounds requests */
  	int blocked;
  
  	/** waitq for blocked connection */
  	wait_queue_head_t blocked_waitq;
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
247
248
  	/** The next unique request id */
  	u64 reqctr;
69a53bf26   Miklos Szeredi   [PATCH] fuse: add...
249
250
  	/** Connection established, cleared on umount, connection
  	    abort and device release */
095da6cbb   Miklos Szeredi   [PATCH] fuse: fix...
251
  	unsigned connected;
1e9a4ed93   Miklos Szeredi   [PATCH] FUSE - mo...
252

095da6cbb   Miklos Szeredi   [PATCH] fuse: fix...
253
254
255
  	/** Connection failed (version mismatch).  Cannot race with
  	    setting other bitfields since it is only set once in INIT
  	    reply, before any other request, and never cleared */
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
256
  	unsigned conn_error : 1;
0ec7ca41f   Miklos Szeredi   [PATCH] fuse: add...
257
258
  	/** Connection successful.  Only set in INIT */
  	unsigned conn_init : 1;
9cd684551   Miklos Szeredi   [PATCH] fuse: fix...
259
260
  	/** Do readpages asynchronously?  Only set in INIT */
  	unsigned async_read : 1;
095da6cbb   Miklos Szeredi   [PATCH] fuse: fix...
261
262
263
264
  	/*
  	 * The following bitfields are only for optimization purposes
  	 * and hence races in setting them will not cause malfunction
  	 */
b6aeadeda   Miklos Szeredi   [PATCH] FUSE - fi...
265
266
  	/** Is fsync not implemented by fs? */
  	unsigned no_fsync : 1;
825479819   Miklos Szeredi   [PATCH] FUSE: add...
267
268
  	/** Is fsyncdir not implemented by fs? */
  	unsigned no_fsyncdir : 1;
b6aeadeda   Miklos Szeredi   [PATCH] FUSE - fi...
269
270
  	/** Is flush not implemented by fs? */
  	unsigned no_flush : 1;
92a8780e1   Miklos Szeredi   [PATCH] FUSE - ex...
271
272
273
274
275
276
277
278
279
280
281
  	/** Is setxattr not implemented by fs? */
  	unsigned no_setxattr : 1;
  
  	/** Is getxattr not implemented by fs? */
  	unsigned no_getxattr : 1;
  
  	/** Is listxattr not implemented by fs? */
  	unsigned no_listxattr : 1;
  
  	/** Is removexattr not implemented by fs? */
  	unsigned no_removexattr : 1;
714212593   Miklos Szeredi   [PATCH] fuse: add...
282
283
  	/** Are file locking primitives not implemented by fs? */
  	unsigned no_lock : 1;
31d40d74b   Miklos Szeredi   [PATCH] FUSE: add...
284
285
  	/** Is access not implemented by fs? */
  	unsigned no_access : 1;
fd72faac9   Miklos Szeredi   [PATCH] FUSE: ato...
286
287
  	/** Is create not implemented by fs? */
  	unsigned no_create : 1;
a4d27e75f   Miklos Szeredi   [PATCH] fuse: add...
288
289
  	/** Is interrupt not implemented by fs? */
  	unsigned no_interrupt : 1;
b2d2272fa   Miklos Szeredi   [PATCH] fuse: add...
290
291
  	/** Is bmap not implemented by fs? */
  	unsigned no_bmap : 1;
0cd5b8855   Miklos Szeredi   [PATCH] fuse: add...
292
293
  	/** The number of requests waiting for completion */
  	atomic_t num_waiting;
45714d656   Miklos Szeredi   [PATCH] fuse: bum...
294
295
  	/** Negotiated minor version */
  	unsigned minor;
d8a5ba454   Miklos Szeredi   [PATCH] FUSE - core
296
297
  	/** Backing dev info */
  	struct backing_dev_info bdi;
f543f253f   Miklos Szeredi   [PATCH] fuse: mak...
298

bafa96541   Miklos Szeredi   [PATCH] fuse: add...
299
300
301
302
303
304
305
306
307
308
309
  	/** Entry on the fuse_conn_list */
  	struct list_head entry;
  
  	/** Unique ID */
  	u64 id;
  
  	/** Dentries in the control filesystem */
  	struct dentry *ctl_dentry[FUSE_CTL_NUM_DENTRIES];
  
  	/** number of dentries used in the above array */
  	int ctl_ndents;
385a17bfc   Jeff Dike   [PATCH] fuse: add...
310
311
312
  
  	/** O_ASYNC requests */
  	struct fasync_struct *fasync;
9c8ef5614   Miklos Szeredi   [PATCH] fuse: scr...
313
314
315
  
  	/** Key for lock owner ID scrambling */
  	u32 scramble_key[4];
0ec7ca41f   Miklos Szeredi   [PATCH] fuse: add...
316
317
318
  
  	/** Reserved request for the DESTROY message */
  	struct fuse_req *destroy_req;
d8a5ba454   Miklos Szeredi   [PATCH] FUSE - core
319
  };
d8a5ba454   Miklos Szeredi   [PATCH] FUSE - core
320
321
  static inline struct fuse_conn *get_fuse_conn_super(struct super_block *sb)
  {
6383bdaa2   Miklos Szeredi   [PATCH] fuse: mis...
322
  	return sb->s_fs_info;
d8a5ba454   Miklos Szeredi   [PATCH] FUSE - core
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
  }
  
  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;
  }
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
339
  /** Device operations */
4b6f5d20b   Arjan van de Ven   [PATCH] Make most...
340
  extern const struct file_operations fuse_dev_operations;
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
341

d8a5ba454   Miklos Szeredi   [PATCH] FUSE - core
342
  /**
e5e5558e9   Miklos Szeredi   [PATCH] FUSE - re...
343
344
345
   * Get a filled in inode
   */
  struct inode *fuse_iget(struct super_block *sb, unsigned long nodeid,
9e6268db4   Miklos Szeredi   [PATCH] FUSE - re...
346
  			int generation, struct fuse_attr *attr);
e5e5558e9   Miklos Szeredi   [PATCH] FUSE - re...
347
348
349
350
351
  
  /**
   * Send FORGET command
   */
  void fuse_send_forget(struct fuse_conn *fc, struct fuse_req *req,
9e6268db4   Miklos Szeredi   [PATCH] FUSE - re...
352
  		      unsigned long nodeid, u64 nlookup);
e5e5558e9   Miklos Szeredi   [PATCH] FUSE - re...
353
354
  
  /**
361b1eb55   Miklos Szeredi   [PATCH] fuse: REA...
355
   * Initialize READ or READDIR request
04730fef1   Miklos Szeredi   [PATCH] fuse: tra...
356
   */
361b1eb55   Miklos Szeredi   [PATCH] fuse: REA...
357
358
  void fuse_read_fill(struct fuse_req *req, struct file *file,
  		    struct inode *inode, loff_t pos, size_t count, int opcode);
04730fef1   Miklos Szeredi   [PATCH] fuse: tra...
359
360
361
362
363
  
  /**
   * Send OPEN or OPENDIR request
   */
  int fuse_open_common(struct inode *inode, struct file *file, int isdir);
fd72faac9   Miklos Szeredi   [PATCH] FUSE: ato...
364
365
366
367
  struct fuse_file *fuse_file_alloc(void);
  void fuse_file_free(struct fuse_file *ff);
  void fuse_finish_open(struct inode *inode, struct file *file,
  		      struct fuse_file *ff, struct fuse_open_out *outarg);
51eb01e73   Miklos Szeredi   [PATCH] fuse: no ...
368
369
370
  /** */
  struct fuse_req *fuse_release_fill(struct fuse_file *ff, u64 nodeid, int flags,
  				   int opcode);
04730fef1   Miklos Szeredi   [PATCH] fuse: tra...
371
372
373
374
375
376
  /**
   * Send RELEASE or RELEASEDIR request
   */
  int fuse_release_common(struct inode *inode, struct file *file, int isdir);
  
  /**
825479819   Miklos Szeredi   [PATCH] FUSE: add...
377
378
379
380
381
382
   * Send FSYNC or FSYNCDIR request
   */
  int fuse_fsync_common(struct file *file, struct dentry *de, int datasync,
  		      int isdir);
  
  /**
1779381de   Miklos Szeredi   [PATCH] fuse: spe...
383
   * Initialize file operations on a regular file
b6aeadeda   Miklos Szeredi   [PATCH] FUSE - fi...
384
385
386
387
   */
  void fuse_init_file_inode(struct inode *inode);
  
  /**
1779381de   Miklos Szeredi   [PATCH] fuse: spe...
388
   * Initialize inode operations on regular files and special files
e5e5558e9   Miklos Szeredi   [PATCH] FUSE - re...
389
390
391
392
   */
  void fuse_init_common(struct inode *inode);
  
  /**
1779381de   Miklos Szeredi   [PATCH] fuse: spe...
393
   * Initialize inode and file operations on a directory
e5e5558e9   Miklos Szeredi   [PATCH] FUSE - re...
394
395
396
397
   */
  void fuse_init_dir(struct inode *inode);
  
  /**
1779381de   Miklos Szeredi   [PATCH] fuse: spe...
398
   * Initialize inode operations on a symlink
e5e5558e9   Miklos Szeredi   [PATCH] FUSE - re...
399
400
401
402
403
404
405
406
407
   */
  void fuse_init_symlink(struct inode *inode);
  
  /**
   * Change attributes of an inode
   */
  void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr);
  
  /**
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
408
409
410
411
412
413
414
415
   * Initialize the client device
   */
  int fuse_dev_init(void);
  
  /**
   * Cleanup the client device
   */
  void fuse_dev_cleanup(void);
bafa96541   Miklos Szeredi   [PATCH] fuse: add...
416
417
  int fuse_ctl_init(void);
  void fuse_ctl_cleanup(void);
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
418
419
420
421
422
423
424
425
426
427
428
  /**
   * Allocate a request
   */
  struct fuse_req *fuse_request_alloc(void);
  
  /**
   * Free a request
   */
  void fuse_request_free(struct fuse_req *req);
  
  /**
33649c91a   Miklos Szeredi   [PATCH] fuse: ens...
429
   * Get a request, may fail with -ENOMEM
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
430
   */
ce1d5a491   Miklos Szeredi   [PATCH] fuse: cle...
431
  struct fuse_req *fuse_get_req(struct fuse_conn *fc);
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
432
433
  
  /**
33649c91a   Miklos Szeredi   [PATCH] fuse: ens...
434
435
436
437
438
   * Gets a requests for a file operation, always succeeds
   */
  struct fuse_req *fuse_get_req_nofail(struct fuse_conn *fc, struct file *file);
  
  /**
ce1d5a491   Miklos Szeredi   [PATCH] fuse: cle...
439
440
   * Decrement reference count of a request.  If count goes to zero free
   * the request.
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
441
442
443
444
   */
  void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req);
  
  /**
7c352bdf0   Miklos Szeredi   [PATCH] FUSE: don...
445
   * Send a request (synchronous)
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
446
447
448
449
   */
  void request_send(struct fuse_conn *fc, struct fuse_req *req);
  
  /**
334f485df   Miklos Szeredi   [PATCH] FUSE - de...
450
451
452
453
454
455
456
457
   * Send a request with no reply
   */
  void request_send_noreply(struct fuse_conn *fc, struct fuse_req *req);
  
  /**
   * Send a request in the background
   */
  void request_send_background(struct fuse_conn *fc, struct fuse_req *req);
5a5fb1ea7   Miklos Szeredi   Revert "[fuse] fi...
458
  /* Abort all requests */
69a53bf26   Miklos Szeredi   [PATCH] fuse: add...
459
  void fuse_abort_conn(struct fuse_conn *fc);
1e9a4ed93   Miklos Szeredi   [PATCH] FUSE - mo...
460
  /**
e5e5558e9   Miklos Szeredi   [PATCH] FUSE - re...
461
462
463
464
465
466
467
468
   * Get the attributes of a file
   */
  int fuse_do_getattr(struct inode *inode);
  
  /**
   * Invalidate inode attributes
   */
  void fuse_invalidate_attr(struct inode *inode);
bafa96541   Miklos Szeredi   [PATCH] fuse: add...
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
  
  /**
   * Acquire reference to fuse_conn
   */
  struct fuse_conn *fuse_conn_get(struct fuse_conn *fc);
  
  /**
   * Release reference to fuse_conn
   */
  void fuse_conn_put(struct fuse_conn *fc);
  
  /**
   * Add connection to control filesystem
   */
  int fuse_ctl_add_conn(struct fuse_conn *fc);
  
  /**
   * Remove connection from control filesystem
   */
  void fuse_ctl_remove_conn(struct fuse_conn *fc);
a5bfffac6   Timo Savola   [PATCH] fuse: val...
489
490
491
492
493
  
  /**
   * Is file type valid?
   */
  int fuse_valid_type(int m);