2 FUSE: Filesystem in Userspace
3 Copyright (C) 2001-2004 Miklos Szeredi <miklos@szeredi.hu>
5 This program can be distributed under the terms of the GNU GPL.
10 #include <linux/pagemap.h>
11 #include <linux/slab.h>
12 #include <asm/uaccess.h>
14 #include <linux/backing-dev.h>
15 #include <linux/writeback.h>
19 #define PageUptodate(page) Page_Uptodate(page)
24 #include <linux/moduleparam.h>
25 module_param(user_mmap
, int, 0644);
27 MODULE_PARM(user_mmap
, "i");
30 MODULE_PARM_DESC(user_mmap
, "Allow non root user to create a shared writable mapping");
33 static int fuse_open(struct inode
*inode
, struct file
*file
)
35 struct fuse_conn
*fc
= INO_FC(inode
);
37 struct fuse_open_in inarg
;
38 struct fuse_open_out outarg
;
42 err
= generic_file_open(inode
, file
);
46 /* If opening the root node, no lookup has been performed on
47 it, so the attributes must be refreshed */
48 if (inode
->i_ino
== FUSE_ROOT_INO
) {
49 int err
= fuse_do_getattr(inode
);
56 req
= fuse_get_request(fc
);
61 ff
= kmalloc(sizeof(struct fuse_file
), GFP_KERNEL
);
65 ff
->release_req
= fuse_request_alloc();
66 if (!ff
->release_req
) {
72 memset(&inarg
, 0, sizeof(inarg
));
73 inarg
.flags
= file
->f_flags
& ~O_EXCL
;
74 req
->in
.h
.opcode
= FUSE_OPEN
;
75 req
->in
.h
.ino
= inode
->i_ino
;
77 req
->in
.args
[0].size
= sizeof(inarg
);
78 req
->in
.args
[0].value
= &inarg
;
80 req
->out
.args
[0].size
= sizeof(outarg
);
81 req
->out
.args
[0].value
= &outarg
;
82 request_send(fc
, req
);
83 err
= req
->out
.h
.error
;
84 if (!err
&& !(fc
->flags
& FUSE_KERNEL_CACHE
)) {
86 invalidate_inode_pages(inode
->i_mapping
);
88 invalidate_inode_pages(inode
);
92 fuse_request_free(ff
->release_req
);
97 file
->private_data
= ff
;
98 INIT_LIST_HEAD(&ff
->ff_list
);
102 fuse_put_request(fc
, req
);
108 void fuse_sync_inode(struct inode
*inode
)
111 filemap_fdatawrite(inode
->i_mapping
);
112 filemap_fdatawait(inode
->i_mapping
);
115 filemap_fdatasync(inode
->i_mapping
);
116 filemap_fdatawait(inode
->i_mapping
);
121 static int fuse_release(struct inode
*inode
, struct file
*file
)
123 struct fuse_conn
*fc
= INO_FC(inode
);
124 struct fuse_inode
*fi
= INO_FI(inode
);
125 struct fuse_release_in
*inarg
;
126 struct fuse_file
*ff
= file
->private_data
;
127 struct fuse_req
*req
= ff
->release_req
;
130 if (file
->f_mode
& FMODE_WRITE
)
131 fuse_sync_inode(inode
);
133 if (!list_empty(&ff
->ff_list
)) {
134 down_write(&fi
->write_sem
);
135 list_del(&ff
->ff_list
);
136 up_write(&fi
->write_sem
);
139 inarg
= &req
->misc
.release_in
;
141 inarg
->flags
= file
->f_flags
& ~O_EXCL
;
142 req
->in
.h
.opcode
= FUSE_RELEASE
;
143 req
->in
.h
.ino
= inode
->i_ino
;
145 req
->in
.args
[0].size
= sizeof(struct fuse_release_in
);
146 req
->in
.args
[0].value
= inarg
;
147 request_send_nonint(fc
, req
);
148 fuse_put_request(fc
, req
);
152 /* Return value is ignored by VFS */
156 static int fuse_flush(struct file
*file
)
158 struct inode
*inode
= file
->f_dentry
->d_inode
;
159 struct fuse_conn
*fc
= INO_FC(inode
);
160 struct fuse_file
*ff
= file
->private_data
;
161 struct fuse_req
*req
= ff
->release_req
;
162 struct fuse_flush_in inarg
;
169 memset(&inarg
, 0, sizeof(inarg
));
171 req
->in
.h
.opcode
= FUSE_FLUSH
;
172 req
->in
.h
.ino
= inode
->i_ino
;
174 req
->in
.args
[0].size
= sizeof(inarg
);
175 req
->in
.args
[0].value
= &inarg
;
176 request_send_nonint(fc
, req
);
177 err
= req
->out
.h
.error
;
178 fuse_reset_request(req
);
180 if (err
== -ENOSYS
) {
187 static int fuse_fsync(struct file
*file
, struct dentry
*de
, int datasync
)
189 struct inode
*inode
= de
->d_inode
;
190 struct fuse_inode
*fi
= INO_FI(inode
);
191 struct fuse_conn
*fc
= INO_FC(inode
);
192 struct fuse_file
*ff
= file
->private_data
;
193 struct fuse_req
*req
;
194 struct fuse_fsync_in inarg
;
200 req
= fuse_get_request(fc
);
204 /* Make sure all writes to this inode are completed before
205 issuing the FSYNC request */
206 down_write(&fi
->write_sem
);
207 up_write(&fi
->write_sem
);
209 memset(&inarg
, 0, sizeof(inarg
));
211 inarg
.datasync
= datasync
;
212 req
->in
.h
.opcode
= FUSE_FSYNC
;
213 req
->in
.h
.ino
= inode
->i_ino
;
215 req
->in
.args
[0].size
= sizeof(inarg
);
216 req
->in
.args
[0].value
= &inarg
;
217 request_send(fc
, req
);
218 err
= req
->out
.h
.error
;
219 if (err
== -ENOSYS
) {
223 fuse_put_request(fc
, req
);
227 static ssize_t
fuse_send_read(struct file
*file
, struct inode
*inode
,
228 char *buf
, loff_t pos
, size_t count
)
230 struct fuse_conn
*fc
= INO_FC(inode
);
231 struct fuse_file
*ff
= file
->private_data
;
232 struct fuse_req
*req
;
233 struct fuse_read_in inarg
;
236 req
= fuse_get_request_nonint(fc
);
237 memset(&inarg
, 0, sizeof(inarg
));
241 req
->in
.h
.opcode
= FUSE_READ
;
242 req
->in
.h
.ino
= inode
->i_ino
;
244 req
->in
.args
[0].size
= sizeof(inarg
);
245 req
->in
.args
[0].value
= &inarg
;
247 req
->out
.numargs
= 1;
248 req
->out
.args
[0].size
= count
;
249 req
->out
.args
[0].value
= buf
;
250 request_send(fc
, req
);
251 res
= req
->out
.h
.error
;
253 res
= req
->out
.args
[0].size
;
254 fuse_put_request(fc
, req
);
259 static int fuse_readpage(struct file
*file
, struct page
*page
)
261 struct inode
*inode
= page
->mapping
->host
;
266 pos
= (loff_t
) page
->index
<< PAGE_CACHE_SHIFT
;
268 res
= fuse_send_read(file
, inode
, buffer
, pos
, PAGE_CACHE_SIZE
);
270 if (res
< PAGE_CACHE_SIZE
)
271 memset(buffer
+ res
, 0, PAGE_CACHE_SIZE
- res
);
272 flush_dcache_page(page
);
273 SetPageUptodate(page
);
283 static int read_pages_copyout(struct fuse_req
*req
, const char *buf
,
287 unsigned long base_index
= req
->pages
[0]->index
;
288 for (i
= 0; i
< req
->num_pages
; i
++) {
289 struct page
*page
= req
->pages
[i
];
290 unsigned long offset
;
295 offset
= (page
->index
- base_index
) * PAGE_CACHE_SIZE
;
296 if (offset
>= nbytes
)
298 else if (offset
+ PAGE_CACHE_SIZE
<= nbytes
)
299 count
= PAGE_CACHE_SIZE
;
301 count
= nbytes
- offset
;
306 err
= copy_from_user(tmpbuf
, buf
+ offset
, count
);
307 if (count
< PAGE_CACHE_SIZE
)
308 memset(tmpbuf
+ count
, 0, PAGE_CACHE_SIZE
- count
);
313 flush_dcache_page(page
);
314 SetPageUptodate(page
);
319 static void read_pages_end(struct fuse_conn
*fc
, struct fuse_req
*req
)
323 for (i
= 0; i
< req
->num_pages
; i
++)
324 unlock_page(req
->pages
[i
]);
326 fuse_put_request(fc
, req
);
329 static void fuse_send_readpages(struct fuse_req
*req
, struct file
*file
,
332 struct fuse_conn
*fc
= INO_FC(inode
);
333 struct fuse_file
*ff
= file
->private_data
;
334 struct fuse_read_in
*inarg
;
338 pos
= (loff_t
) req
->pages
[0]->index
<< PAGE_CACHE_SHIFT
;
339 /* Allow for holes between the pages */
340 numpages
= req
->pages
[req
->num_pages
- 1]->index
+ 1
341 - req
->pages
[0]->index
;
343 inarg
= &req
->misc
.read_in
;
346 inarg
->size
= numpages
* PAGE_CACHE_SIZE
;
347 req
->in
.h
.opcode
= FUSE_READ
;
348 req
->in
.h
.ino
= inode
->i_ino
;
350 req
->in
.args
[0].size
= sizeof(struct fuse_read_in
);
351 req
->in
.args
[0].value
= inarg
;
352 req
->copy_out
= read_pages_copyout
;
353 request_send_nonblock(fc
, req
, read_pages_end
, NULL
);
356 struct fuse_readpages_data
{
357 struct fuse_req
*req
;
362 static int fuse_readpages_fill(void *_data
, struct page
*page
)
364 struct fuse_readpages_data
*data
= _data
;
365 struct fuse_req
*req
= data
->req
;
366 struct inode
*inode
= data
->inode
;
367 struct fuse_conn
*fc
= INO_FC(inode
);
369 if (req
->num_pages
&&
370 (req
->num_pages
== FUSE_MAX_PAGES_PER_REQ
||
371 (req
->num_pages
+ 1) * PAGE_CACHE_SIZE
> fc
->max_read
||
372 req
->pages
[req
->num_pages
- 1]->index
+ 1 != page
->index
)) {
373 struct fuse_conn
*fc
= INO_FC(page
->mapping
->host
);
374 fuse_send_readpages(req
, data
->file
, inode
);
375 data
->req
= req
= fuse_get_request_nonint(fc
);
377 req
->pages
[req
->num_pages
] = page
;
382 static int fuse_readpages(struct file
*file
, struct address_space
*mapping
,
383 struct list_head
*pages
, unsigned nr_pages
)
385 struct inode
*inode
= mapping
->host
;
386 struct fuse_conn
*fc
= INO_FC(inode
);
387 struct fuse_readpages_data data
;
389 data
.req
= fuse_get_request_nonint(fc
);
393 read_cache_pages(mapping
, pages
, fuse_readpages_fill
, &data
);
394 if (data
.req
->num_pages
)
395 fuse_send_readpages(data
.req
, file
, inode
);
397 fuse_put_request(fc
, data
.req
);
404 static int fuse_is_block_uptodate(struct inode
*inode
, size_t bl_index
)
406 size_t index
= bl_index
<< FUSE_BLOCK_PAGE_SHIFT
;
407 size_t end_index
= ((bl_index
+ 1) << FUSE_BLOCK_PAGE_SHIFT
) - 1;
408 size_t file_end_index
= i_size_read(inode
) >> PAGE_CACHE_SHIFT
;
410 if (end_index
> file_end_index
)
411 end_index
= file_end_index
;
413 for (; index
<= end_index
; index
++) {
414 struct page
*page
= find_get_page(inode
->i_mapping
, index
);
419 if (!PageUptodate(page
)) {
420 page_cache_release(page
);
424 page_cache_release(page
);
431 static int fuse_cache_block(struct inode
*inode
, char *bl_buf
,
434 size_t start_index
= bl_index
<< FUSE_BLOCK_PAGE_SHIFT
;
435 size_t end_index
= ((bl_index
+ 1) << FUSE_BLOCK_PAGE_SHIFT
) - 1;
436 size_t file_end_index
= i_size_read(inode
) >> PAGE_CACHE_SHIFT
;
440 if (end_index
> file_end_index
)
441 end_index
= file_end_index
;
443 for (i
= 0; start_index
+ i
<= end_index
; i
++) {
444 size_t index
= start_index
+ i
;
448 page
= grab_cache_page(inode
->i_mapping
, index
);
452 if (!PageUptodate(page
)) {
454 memcpy(buffer
, bl_buf
+ i
* PAGE_CACHE_SIZE
,
456 flush_dcache_page(page
);
457 SetPageUptodate(page
);
462 page_cache_release(page
);
468 static int fuse_file_read_block(struct file
*file
, struct inode
*inode
,
469 char *bl_buf
, size_t bl_index
)
474 offset
= (loff_t
) bl_index
<< FUSE_BLOCK_SHIFT
;
475 res
= fuse_send_read(file
, inode
, bl_buf
, offset
, FUSE_BLOCK_SIZE
);
477 if (res
< FUSE_BLOCK_SIZE
)
478 memset(bl_buf
+ res
, 0, FUSE_BLOCK_SIZE
- res
);
484 static void fuse_file_bigread(struct file
*file
, struct inode
*inode
,
485 loff_t pos
, size_t count
)
487 size_t bl_index
= pos
>> FUSE_BLOCK_SHIFT
;
488 size_t bl_end_index
= (pos
+ count
) >> FUSE_BLOCK_SHIFT
;
489 size_t bl_file_end_index
= i_size_read(inode
) >> FUSE_BLOCK_SHIFT
;
491 if (bl_end_index
> bl_file_end_index
)
492 bl_end_index
= bl_file_end_index
;
494 while (bl_index
<= bl_end_index
) {
496 char *bl_buf
= kmalloc(FUSE_BLOCK_SIZE
, GFP_KERNEL
);
499 res
= fuse_is_block_uptodate(inode
, bl_index
);
501 res
= fuse_file_read_block(file
, inode
, bl_buf
,
504 fuse_cache_block(inode
, bl_buf
, bl_index
);
511 static ssize_t
fuse_read(struct file
*file
, char *buf
, size_t count
,
514 struct inode
*inode
= file
->f_dentry
->d_inode
;
515 struct fuse_conn
*fc
= INO_FC(inode
);
519 unsigned int max_read
= count
< fc
->max_read
? count
: fc
->max_read
;
522 tmpbuf
= kmalloc(max_read
, GFP_KERNEL
);
527 } while (max_read
> PAGE_CACHE_SIZE
/ 4);
532 size_t nbytes
= count
< max_read
? count
: max_read
;
534 res1
= fuse_send_read(file
, inode
, tmpbuf
, pos
, nbytes
);
541 if (copy_to_user(buf
, tmpbuf
, res1
)) {
559 static ssize_t
fuse_file_read(struct file
*file
, char *buf
,
560 size_t count
, loff_t
* ppos
)
562 struct inode
*inode
= file
->f_dentry
->d_inode
;
563 struct fuse_conn
*fc
= INO_FC(inode
);
566 if (fc
->flags
& FUSE_DIRECT_IO
) {
567 res
= fuse_read(file
, buf
, count
, ppos
);
571 if (fc
->flags
& FUSE_LARGE_READ
) {
573 fuse_file_bigread(file
, inode
, *ppos
, count
);
577 res
= generic_file_read(file
, buf
, count
, ppos
);
583 static ssize_t
fuse_send_write(struct fuse_req
*req
, int writepage
,
584 struct fuse_file
*ff
, struct inode
*inode
,
585 const char *buf
, loff_t pos
, size_t count
)
587 struct fuse_conn
*fc
= INO_FC(inode
);
588 struct fuse_write_in inarg
;
589 struct fuse_write_out outarg
;
592 memset(&inarg
, 0, sizeof(inarg
));
593 inarg
.writepage
= writepage
;
597 req
->in
.h
.opcode
= FUSE_WRITE
;
598 req
->in
.h
.ino
= inode
->i_ino
;
605 req
->in
.args
[0].size
= sizeof(inarg
);
606 req
->in
.args
[0].value
= &inarg
;
607 req
->in
.args
[1].size
= count
;
608 req
->in
.args
[1].value
= buf
;
609 req
->out
.numargs
= 1;
610 req
->out
.args
[0].size
= sizeof(outarg
);
611 req
->out
.args
[0].value
= &outarg
;
612 request_send(fc
, req
);
613 res
= req
->out
.h
.error
;
615 if (outarg
.size
> count
)
624 static int write_buffer(struct inode
*inode
, struct file
*file
,
625 struct page
*page
, unsigned offset
, size_t count
)
627 struct fuse_conn
*fc
= INO_FC(inode
);
628 struct fuse_file
*ff
= file
->private_data
;
632 struct fuse_req
*req
;
634 req
= fuse_get_request(fc
);
638 pos
= ((loff_t
) page
->index
<< PAGE_CACHE_SHIFT
) + offset
;
640 res
= fuse_send_write(req
, 0, ff
, inode
, buffer
+ offset
, pos
, count
);
641 fuse_put_request(fc
, req
);
644 printk("fuse: short write\n");
655 static int get_write_count(struct inode
*inode
, struct page
*page
)
657 unsigned long end_index
;
658 loff_t size
= i_size_read(inode
);
661 end_index
= size
>> PAGE_CACHE_SHIFT
;
662 if (page
->index
< end_index
)
663 count
= PAGE_CACHE_SIZE
;
665 count
= size
& (PAGE_CACHE_SIZE
- 1);
666 if (page
->index
> end_index
|| count
== 0)
673 static int write_page_block(struct inode
*inode
, struct page
*page
)
675 struct fuse_conn
*fc
= INO_FC(inode
);
676 struct fuse_inode
*fi
= INO_FI(inode
);
681 struct fuse_req
*req
;
683 req
= fuse_get_request(fc
);
687 down_read(&fi
->write_sem
);
688 count
= get_write_count(inode
, page
);
691 struct fuse_file
*ff
;
692 BUG_ON(list_empty(&fi
->write_files
));
693 ff
= list_entry(fi
->write_files
.next
, struct fuse_file
, ff_list
);
694 pos
= ((loff_t
) page
->index
<< PAGE_CACHE_SHIFT
);
696 res
= fuse_send_write(req
, 1, ff
, inode
, buffer
, pos
, count
);
699 printk("fuse: short write\n");
705 up_read(&fi
->write_sem
);
706 fuse_put_request(fc
, req
);
717 static void write_page_nonblock_end(struct fuse_conn
*fc
, struct fuse_req
*req
)
719 struct page
*page
= (struct page
*) req
->data
;
720 struct inode
*inode
= page
->mapping
->host
;
721 struct fuse_inode
*fi
= INO_FI(inode
);
722 struct fuse_write_out
*outarg
= req
->out
.args
[0].value
;
723 if (!req
->out
.h
.error
&& outarg
->size
!= req
->in
.args
[1].size
) {
724 printk("fuse: short write\n");
725 req
->out
.h
.error
= -EPROTO
;
728 if (req
->out
.h
.error
) {
730 if (req
->out
.h
.error
== -ENOSPC
)
731 set_bit(AS_ENOSPC
, &page
->mapping
->flags
);
733 set_bit(AS_EIO
, &page
->mapping
->flags
);
735 up_read(&fi
->write_sem
);
737 end_page_writeback(page
);
739 fuse_put_request(fc
, req
);
742 static void send_write_nonblock(struct fuse_req
*req
, struct inode
*inode
,
743 struct page
*page
, unsigned count
)
745 struct fuse_conn
*fc
= INO_FC(inode
);
746 struct fuse_inode
*fi
= INO_FI(inode
);
747 struct fuse_write_in
*inarg
;
748 struct fuse_file
*ff
;
751 BUG_ON(list_empty(&fi
->write_files
));
752 ff
= list_entry(fi
->write_files
.next
, struct fuse_file
, ff_list
);
754 inarg
= &req
->misc
.write
.in
;
756 inarg
->writepage
= 1;
758 inarg
->offset
= ((loff_t
) page
->index
<< PAGE_CACHE_SHIFT
);
760 req
->in
.h
.opcode
= FUSE_WRITE
;
761 req
->in
.h
.ino
= inode
->i_ino
;
766 req
->in
.args
[0].size
= sizeof(struct fuse_write_in
);
767 req
->in
.args
[0].value
= inarg
;
768 req
->in
.args
[1].size
= count
;
769 req
->in
.args
[1].value
= buffer
;
770 req
->out
.numargs
= 1;
771 req
->out
.args
[0].size
= sizeof(struct fuse_write_out
);
772 req
->out
.args
[0].value
= &req
->misc
.write
.out
;
773 request_send_nonblock(fc
, req
, write_page_nonblock_end
, page
);
776 static int write_page_nonblock(struct inode
*inode
, struct page
*page
)
778 struct fuse_conn
*fc
= INO_FC(inode
);
779 struct fuse_inode
*fi
= INO_FI(inode
);
780 struct fuse_req
*req
;
784 req
= fuse_get_request_nonblock(fc
);
786 if (down_read_trylock(&fi
->write_sem
)) {
789 count
= get_write_count(inode
, page
);
791 SetPageWriteback(page
);
792 send_write_nonblock(req
, inode
, page
, count
);
795 up_read(&fi
->write_sem
);
797 fuse_put_request(fc
, req
);
802 static int fuse_writepage(struct page
*page
, struct writeback_control
*wbc
)
805 struct inode
*inode
= page
->mapping
->host
;
807 if (wbc
->nonblocking
) {
808 err
= write_page_nonblock(inode
, page
);
809 if (err
== -EWOULDBLOCK
) {
810 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,6)
811 redirty_page_for_writepage(wbc
, page
);
813 __set_page_dirty_nobuffers(page
);
818 err
= write_page_block(inode
, page
);
824 static int fuse_writepage(struct page
*page
)
826 int err
= write_page_block(page
->mapping
->host
, page
);
832 static int fuse_prepare_write(struct file
*file
, struct page
*page
,
833 unsigned offset
, unsigned to
)
839 static int fuse_commit_write(struct file
*file
, struct page
*page
,
840 unsigned offset
, unsigned to
)
843 struct inode
*inode
= page
->mapping
->host
;
845 err
= write_buffer(inode
, file
, page
, offset
, to
- offset
);
847 loff_t pos
= (page
->index
<< PAGE_CACHE_SHIFT
) + to
;
848 if (pos
> i_size_read(inode
))
849 i_size_write(inode
, pos
);
851 if (offset
== 0 && to
== PAGE_CACHE_SIZE
) {
853 clear_page_dirty(page
);
855 ClearPageDirty(page
);
857 SetPageUptodate(page
);
864 static ssize_t
fuse_write(struct file
*file
, const char *buf
, size_t count
,
867 struct inode
*inode
= file
->f_dentry
->d_inode
;
868 struct fuse_conn
*fc
= INO_FC(inode
);
869 struct fuse_file
*ff
= file
->private_data
;
873 struct fuse_req
*req
;
875 req
= fuse_get_request(fc
);
879 tmpbuf
= kmalloc(count
< fc
->max_write
? count
: fc
->max_write
,
882 fuse_put_request(fc
, req
);
887 size_t nbytes
= count
< fc
->max_write
? count
: fc
->max_write
;
889 if (copy_from_user(tmpbuf
, buf
, nbytes
)) {
893 res1
= fuse_send_write(req
, 0, ff
, inode
, tmpbuf
, pos
, nbytes
);
906 fuse_reset_request(req
);
909 fuse_put_request(fc
, req
);
912 if (pos
> i_size_read(inode
))
913 i_size_write(inode
, pos
);
920 static ssize_t
fuse_file_write(struct file
*file
, const char *buf
,
921 size_t count
, loff_t
*ppos
)
923 struct inode
*inode
= file
->f_dentry
->d_inode
;
924 struct fuse_conn
*fc
= INO_FC(inode
);
926 if (fc
->flags
& FUSE_DIRECT_IO
) {
929 res
= fuse_write(file
, buf
, count
, ppos
);
934 return generic_file_write(file
, buf
, count
, ppos
);
937 static int fuse_file_mmap(struct file
*file
, struct vm_area_struct
*vma
)
939 struct inode
*inode
= file
->f_dentry
->d_inode
;
940 struct fuse_conn
*fc
= INO_FC(inode
);
942 if (fc
->flags
& FUSE_DIRECT_IO
)
945 if ((vma
->vm_flags
& (VM_WRITE
| VM_SHARED
)) ==
946 (VM_WRITE
| VM_SHARED
)) {
947 struct fuse_inode
*fi
= INO_FI(inode
);
948 struct fuse_file
*ff
= file
->private_data
;
950 if (!user_mmap
&& current
->uid
!= 0)
953 down_write(&fi
->write_sem
);
954 if (list_empty(&ff
->ff_list
))
955 list_add(&ff
->ff_list
, &fi
->write_files
);
956 up_write(&fi
->write_sem
);
958 return generic_file_mmap(file
, vma
);
962 static struct file_operations fuse_file_operations
= {
963 .read
= fuse_file_read
,
964 .write
= fuse_file_write
,
965 .mmap
= fuse_file_mmap
,
968 .release
= fuse_release
,
971 .sendfile
= generic_file_sendfile
,
975 static struct address_space_operations fuse_file_aops
= {
976 .readpage
= fuse_readpage
,
977 .writepage
= fuse_writepage
,
978 .prepare_write
= fuse_prepare_write
,
979 .commit_write
= fuse_commit_write
,
981 .readpages
= fuse_readpages
,
982 .set_page_dirty
= __set_page_dirty_nobuffers
,
986 void fuse_init_file_inode(struct inode
*inode
)
988 inode
->i_fop
= &fuse_file_operations
;
989 inode
->i_data
.a_ops
= &fuse_file_aops
;
994 * indent-tabs-mode: t