Lines Matching +full:blocking +full:- +full:io
3 Copyright (C) 2001-2008 Miklos Szeredi <miklos@szeredi.hu>
42 inarg.flags = file->f_flags & ~(O_CREAT | O_EXCL | O_NOCTTY); in fuse_send_open()
43 if (!fm->fc->atomic_o_trunc) in fuse_send_open()
71 ff->fm = fm; in fuse_file_alloc()
72 ff->release_args = kzalloc(sizeof(*ff->release_args), in fuse_file_alloc()
74 if (!ff->release_args) { in fuse_file_alloc()
79 INIT_LIST_HEAD(&ff->write_entry); in fuse_file_alloc()
80 mutex_init(&ff->readdir.lock); in fuse_file_alloc()
81 refcount_set(&ff->count, 1); in fuse_file_alloc()
82 RB_CLEAR_NODE(&ff->polled_node); in fuse_file_alloc()
83 init_waitqueue_head(&ff->poll_wait); in fuse_file_alloc()
85 ff->kh = atomic64_inc_return(&fm->fc->khctr); in fuse_file_alloc()
92 kfree(ff->release_args); in fuse_file_free()
93 mutex_destroy(&ff->readdir.lock); in fuse_file_free()
99 refcount_inc(&ff->count); in fuse_file_get()
108 iput(ra->inode); in fuse_release_end()
114 if (refcount_dec_and_test(&ff->count)) { in fuse_file_put()
115 struct fuse_args *args = &ff->release_args->args; in fuse_file_put()
117 if (isdir ? ff->fm->fc->no_opendir : ff->fm->fc->no_open) { in fuse_file_put()
119 fuse_release_end(ff->fm, args, 0); in fuse_file_put()
121 fuse_simple_request(ff->fm, args); in fuse_file_put()
122 fuse_release_end(ff->fm, args, 0); in fuse_file_put()
124 args->end = fuse_release_end; in fuse_file_put()
125 if (fuse_simple_background(ff->fm, args, in fuse_file_put()
127 fuse_release_end(ff->fm, args, -ENOTCONN); in fuse_file_put()
136 struct fuse_conn *fc = fm->fc; in fuse_do_open()
142 return -ENOMEM; in fuse_do_open()
144 ff->fh = 0; in fuse_do_open()
145 /* Default for no-open */ in fuse_do_open()
146 ff->open_flags = FOPEN_KEEP_CACHE | (isdir ? FOPEN_CACHE_DIR : 0); in fuse_do_open()
147 if (isdir ? !fc->no_opendir : !fc->no_open) { in fuse_do_open()
153 ff->fh = outarg.fh; in fuse_do_open()
154 ff->open_flags = outarg.open_flags; in fuse_do_open()
156 } else if (err != -ENOSYS) { in fuse_do_open()
161 fc->no_opendir = 1; in fuse_do_open()
163 fc->no_open = 1; in fuse_do_open()
168 ff->open_flags &= ~FOPEN_DIRECT_IO; in fuse_do_open()
170 ff->nodeid = nodeid; in fuse_do_open()
171 file->private_data = ff; in fuse_do_open()
181 struct fuse_file *ff = file->private_data; in fuse_link_write_file()
186 spin_lock(&fi->lock); in fuse_link_write_file()
187 if (list_empty(&ff->write_entry)) in fuse_link_write_file()
188 list_add(&ff->write_entry, &fi->write_files); in fuse_link_write_file()
189 spin_unlock(&fi->lock); in fuse_link_write_file()
194 struct fuse_file *ff = file->private_data; in fuse_finish_open()
197 if (ff->open_flags & FOPEN_STREAM) in fuse_finish_open()
199 else if (ff->open_flags & FOPEN_NONSEEKABLE) in fuse_finish_open()
202 if (fc->atomic_o_trunc && (file->f_flags & O_TRUNC)) { in fuse_finish_open()
205 spin_lock(&fi->lock); in fuse_finish_open()
206 fi->attr_version = atomic64_inc_return(&fc->attr_version); in fuse_finish_open()
208 spin_unlock(&fi->lock); in fuse_finish_open()
211 if (fc->writeback_cache) in fuse_finish_open()
213 } else if (!(ff->open_flags & FOPEN_KEEP_CACHE)) { in fuse_finish_open()
214 invalidate_inode_pages2(inode->i_mapping); in fuse_finish_open()
217 if ((file->f_mode & FMODE_WRITE) && fc->writeback_cache) in fuse_finish_open()
224 struct fuse_conn *fc = fm->fc; in fuse_open_common()
226 bool is_wb_truncate = (file->f_flags & O_TRUNC) && in fuse_open_common()
227 fc->atomic_o_trunc && in fuse_open_common()
228 fc->writeback_cache; in fuse_open_common()
229 bool dax_truncate = (file->f_flags & O_TRUNC) && in fuse_open_common()
230 fc->atomic_o_trunc && FUSE_IS_DAX(inode); in fuse_open_common()
233 return -EIO; in fuse_open_common()
245 down_write(&get_fuse_inode(inode)->i_mmap_sem); in fuse_open_common()
257 up_write(&get_fuse_inode(inode)->i_mmap_sem); in fuse_open_common()
270 struct fuse_conn *fc = ff->fm->fc; in fuse_prepare_release()
271 struct fuse_release_args *ra = ff->release_args; in fuse_prepare_release()
275 spin_lock(&fi->lock); in fuse_prepare_release()
276 list_del(&ff->write_entry); in fuse_prepare_release()
277 spin_unlock(&fi->lock); in fuse_prepare_release()
279 spin_lock(&fc->lock); in fuse_prepare_release()
280 if (!RB_EMPTY_NODE(&ff->polled_node)) in fuse_prepare_release()
281 rb_erase(&ff->polled_node, &fc->polled_files); in fuse_prepare_release()
282 spin_unlock(&fc->lock); in fuse_prepare_release()
284 wake_up_interruptible_all(&ff->poll_wait); in fuse_prepare_release()
286 ra->inarg.fh = ff->fh; in fuse_prepare_release()
287 ra->inarg.flags = flags; in fuse_prepare_release()
288 ra->args.in_numargs = 1; in fuse_prepare_release()
289 ra->args.in_args[0].size = sizeof(struct fuse_release_in); in fuse_prepare_release()
290 ra->args.in_args[0].value = &ra->inarg; in fuse_prepare_release()
291 ra->args.opcode = opcode; in fuse_prepare_release()
292 ra->args.nodeid = ff->nodeid; in fuse_prepare_release()
293 ra->args.force = true; in fuse_prepare_release()
294 ra->args.nocreds = true; in fuse_prepare_release()
300 struct fuse_file *ff = file->private_data; in fuse_release_common()
301 struct fuse_release_args *ra = ff->release_args; in fuse_release_common()
304 fuse_prepare_release(fi, ff, file->f_flags, opcode); in fuse_release_common()
306 if (ff->flock) { in fuse_release_common()
307 ra->inarg.release_flags |= FUSE_RELEASE_FLOCK_UNLOCK; in fuse_release_common()
308 ra->inarg.lock_owner = fuse_lock_owner_id(ff->fm->fc, in fuse_release_common()
312 ra->inode = igrab(file_inode(file)); in fuse_release_common()
323 fuse_file_put(ff, ff->fm->fc->destroy, isdir); in fuse_release_common()
336 if (fc->writeback_cache) in fuse_release()
347 WARN_ON(refcount_read(&ff->count) > 1); in fuse_sync_release()
350 * iput(NULL) is a no-op and since the refcount is 1 and everything's in fuse_sync_release()
363 u32 *k = fc->scramble_key; in fuse_lock_owner_id()
392 n = fi->writepages.rb_node; in fuse_find_writeback()
399 WARN_ON(get_fuse_inode(wpa->inode) != fi); in fuse_find_writeback()
400 curr_index = wpa->ia.write.in.offset >> PAGE_SHIFT; in fuse_find_writeback()
401 if (idx_from >= curr_index + wpa->ia.ap.num_pages) in fuse_find_writeback()
402 n = n->rb_right; in fuse_find_writeback()
404 n = n->rb_left; in fuse_find_writeback()
423 spin_lock(&fi->lock); in fuse_range_is_writeback()
425 spin_unlock(&fi->lock); in fuse_range_is_writeback()
445 wait_event(fi->page_waitq, !fuse_page_is_writeback(inode, index)); in fuse_wait_on_page_writeback()
451 * This is currently done by blocking further writes with FUSE_NOWRITE
467 struct fuse_file *ff = file->private_data; in fuse_flush()
473 return -EIO; in fuse_flush()
483 err = filemap_check_errors(file->f_mapping); in fuse_flush()
488 if (fm->fc->no_flush) in fuse_flush()
492 inarg.fh = ff->fh; in fuse_flush()
493 inarg.lock_owner = fuse_lock_owner_id(fm->fc, id); in fuse_flush()
502 if (err == -ENOSYS) { in fuse_flush()
503 fm->fc->no_flush = 1; in fuse_flush()
512 if (!err && fm->fc->writeback_cache) in fuse_flush()
520 struct inode *inode = file->f_mapping->host; in fuse_fsync_common()
522 struct fuse_file *ff = file->private_data; in fuse_fsync_common()
527 inarg.fh = ff->fh; in fuse_fsync_common()
540 struct inode *inode = file->f_mapping->host; in fuse_fsync()
545 return -EIO; in fuse_fsync()
573 if (fc->no_fsync) in fuse_fsync()
577 if (err == -ENOSYS) { in fuse_fsync()
578 fc->no_fsync = 1; in fuse_fsync()
590 struct fuse_file *ff = file->private_data; in fuse_read_args_fill()
591 struct fuse_args *args = &ia->ap.args; in fuse_read_args_fill()
593 ia->read.in.fh = ff->fh; in fuse_read_args_fill()
594 ia->read.in.offset = pos; in fuse_read_args_fill()
595 ia->read.in.size = count; in fuse_read_args_fill()
596 ia->read.in.flags = file->f_flags; in fuse_read_args_fill()
597 args->opcode = opcode; in fuse_read_args_fill()
598 args->nodeid = ff->nodeid; in fuse_read_args_fill()
599 args->in_numargs = 1; in fuse_read_args_fill()
600 args->in_args[0].size = sizeof(ia->read.in); in fuse_read_args_fill()
601 args->in_args[0].value = &ia->read.in; in fuse_read_args_fill()
602 args->out_argvar = true; in fuse_read_args_fill()
603 args->out_numargs = 1; in fuse_read_args_fill()
604 args->out_args[0].size = count; in fuse_read_args_fill()
612 for (i = 0; i < ap->num_pages; i++) { in fuse_release_user_pages()
614 set_page_dirty_lock(ap->pages[i]); in fuse_release_user_pages()
615 put_page(ap->pages[i]); in fuse_release_user_pages()
624 static ssize_t fuse_get_res_by_io(struct fuse_io_priv *io) in fuse_get_res_by_io() argument
626 if (io->err) in fuse_get_res_by_io()
627 return io->err; in fuse_get_res_by_io()
629 if (io->bytes >= 0 && io->write) in fuse_get_res_by_io()
630 return -EIO; in fuse_get_res_by_io()
632 return io->bytes < 0 ? io->size : io->bytes; in fuse_get_res_by_io()
637 * actual end of fuse request in IO request. Otherwise, if bytes_requested
638 * == bytes_transferred or rw == WRITE, the caller sets 'pos' to -1.
643 * fully completed (req->out.args[0].size == 32K) resulting in pos == -1. The
647 * Thus, when all fuse requests are completed, the minimal non-negative 'pos'
649 * transferred data starting from the beginning of IO request.
651 static void fuse_aio_complete(struct fuse_io_priv *io, int err, ssize_t pos) in fuse_aio_complete() argument
655 spin_lock(&io->lock); in fuse_aio_complete()
657 io->err = io->err ? : err; in fuse_aio_complete()
658 else if (pos >= 0 && (io->bytes < 0 || pos < io->bytes)) in fuse_aio_complete()
659 io->bytes = pos; in fuse_aio_complete()
661 left = --io->reqs; in fuse_aio_complete()
662 if (!left && io->blocking) in fuse_aio_complete()
663 complete(io->done); in fuse_aio_complete()
664 spin_unlock(&io->lock); in fuse_aio_complete()
666 if (!left && !io->blocking) { in fuse_aio_complete()
667 ssize_t res = fuse_get_res_by_io(io); in fuse_aio_complete()
670 struct inode *inode = file_inode(io->iocb->ki_filp); in fuse_aio_complete()
674 spin_lock(&fi->lock); in fuse_aio_complete()
675 fi->attr_version = atomic64_inc_return(&fc->attr_version); in fuse_aio_complete()
676 spin_unlock(&fi->lock); in fuse_aio_complete()
679 io->iocb->ki_complete(io->iocb, res, 0); in fuse_aio_complete()
682 kref_put(&io->refcnt, fuse_io_release); in fuse_aio_complete()
685 static struct fuse_io_args *fuse_io_alloc(struct fuse_io_priv *io, in fuse_io_alloc() argument
692 ia->io = io; in fuse_io_alloc()
693 ia->ap.pages = fuse_pages_alloc(npages, GFP_KERNEL, in fuse_io_alloc()
694 &ia->ap.descs); in fuse_io_alloc()
695 if (!ia->ap.pages) { in fuse_io_alloc()
705 kfree(ia->ap.pages); in fuse_io_free()
713 struct fuse_io_priv *io = ia->io; in fuse_aio_complete_req() local
714 ssize_t pos = -1; in fuse_aio_complete_req()
716 fuse_release_user_pages(&ia->ap, io->should_dirty); in fuse_aio_complete_req()
720 } else if (io->write) { in fuse_aio_complete_req()
721 if (ia->write.out.size > ia->write.in.size) { in fuse_aio_complete_req()
722 err = -EIO; in fuse_aio_complete_req()
723 } else if (ia->write.in.size != ia->write.out.size) { in fuse_aio_complete_req()
724 pos = ia->write.in.offset - io->offset + in fuse_aio_complete_req()
725 ia->write.out.size; in fuse_aio_complete_req()
728 u32 outsize = args->out_args[0].size; in fuse_aio_complete_req()
730 if (ia->read.in.size != outsize) in fuse_aio_complete_req()
731 pos = ia->read.in.offset - io->offset + outsize; in fuse_aio_complete_req()
734 fuse_aio_complete(io, err, pos); in fuse_aio_complete_req()
742 struct fuse_io_priv *io = ia->io; in fuse_async_req_send() local
744 spin_lock(&io->lock); in fuse_async_req_send()
745 kref_get(&io->refcnt); in fuse_async_req_send()
746 io->size += num_bytes; in fuse_async_req_send()
747 io->reqs++; in fuse_async_req_send()
748 spin_unlock(&io->lock); in fuse_async_req_send()
750 ia->ap.args.end = fuse_aio_complete_req; in fuse_async_req_send()
751 ia->ap.args.may_block = io->should_dirty; in fuse_async_req_send()
752 err = fuse_simple_background(fm, &ia->ap.args, GFP_KERNEL); in fuse_async_req_send()
754 fuse_aio_complete_req(fm, &ia->ap.args, err); in fuse_async_req_send()
762 struct file *file = ia->io->iocb->ki_filp; in fuse_send_read()
763 struct fuse_file *ff = file->private_data; in fuse_send_read()
764 struct fuse_mount *fm = ff->fm; in fuse_send_read()
768 ia->read.in.read_flags |= FUSE_READ_LOCKOWNER; in fuse_send_read()
769 ia->read.in.lock_owner = fuse_lock_owner_id(fm->fc, owner); in fuse_send_read()
772 if (ia->io->async) in fuse_send_read()
775 return fuse_simple_request(fm, &ia->ap.args); in fuse_send_read()
784 spin_lock(&fi->lock); in fuse_read_update_size()
785 if (attr_ver == fi->attr_version && size < inode->i_size && in fuse_read_update_size()
786 !test_bit(FUSE_I_SIZE_UNSTABLE, &fi->state)) { in fuse_read_update_size()
787 fi->attr_version = atomic64_inc_return(&fc->attr_version); in fuse_read_update_size()
790 spin_unlock(&fi->lock); in fuse_read_update_size()
798 if (fc->writeback_cache) { in fuse_short_read()
806 size_t off = num_read & (PAGE_SIZE - 1); in fuse_short_read()
808 for (i = start_idx; i < ap->num_pages; i++) { in fuse_short_read()
809 zero_user_segment(ap->pages[i], off, PAGE_SIZE); in fuse_short_read()
813 loff_t pos = page_offset(ap->pages[0]) + num_read; in fuse_short_read()
820 struct inode *inode = page->mapping->host; in fuse_do_readpage()
836 * page-cache page, so make sure we read a properly synced in fuse_do_readpage()
839 fuse_wait_on_page_writeback(inode, page->index); in fuse_do_readpage()
841 attr_ver = fuse_get_attr_version(fm->fc); in fuse_do_readpage()
844 if (pos + (desc.length - 1) == LLONG_MAX) in fuse_do_readpage()
845 desc.length--; in fuse_do_readpage()
864 struct inode *inode = page->mapping->host; in fuse_readpage()
867 err = -EIO; in fuse_readpage()
883 struct fuse_args_pages *ap = &ia->ap; in fuse_readpages_end()
884 size_t count = ia->read.in.size; in fuse_readpages_end()
885 size_t num_read = args->out_args[0].size; in fuse_readpages_end()
888 for (i = 0; mapping == NULL && i < ap->num_pages; i++) in fuse_readpages_end()
889 mapping = ap->pages[i]->mapping; in fuse_readpages_end()
892 struct inode *inode = mapping->host; in fuse_readpages_end()
898 fuse_short_read(inode, ia->read.attr_ver, num_read, ap); in fuse_readpages_end()
903 for (i = 0; i < ap->num_pages; i++) { in fuse_readpages_end()
904 struct page *page = ap->pages[i]; in fuse_readpages_end()
913 if (ia->ff) in fuse_readpages_end()
914 fuse_file_put(ia->ff, false, false); in fuse_readpages_end()
921 struct fuse_file *ff = file->private_data; in fuse_send_readpages()
922 struct fuse_mount *fm = ff->fm; in fuse_send_readpages()
923 struct fuse_args_pages *ap = &ia->ap; in fuse_send_readpages()
924 loff_t pos = page_offset(ap->pages[0]); in fuse_send_readpages()
925 size_t count = ap->num_pages << PAGE_SHIFT; in fuse_send_readpages()
929 ap->args.out_pages = true; in fuse_send_readpages()
930 ap->args.page_zeroing = true; in fuse_send_readpages()
931 ap->args.page_replace = true; in fuse_send_readpages()
934 if (pos + (count - 1) == LLONG_MAX) { in fuse_send_readpages()
935 count--; in fuse_send_readpages()
936 ap->descs[ap->num_pages - 1].length--; in fuse_send_readpages()
941 ia->read.attr_ver = fuse_get_attr_version(fm->fc); in fuse_send_readpages()
942 if (fm->fc->async_read) { in fuse_send_readpages()
943 ia->ff = fuse_file_get(ff); in fuse_send_readpages()
944 ap->args.end = fuse_readpages_end; in fuse_send_readpages()
945 err = fuse_simple_background(fm, &ap->args, GFP_KERNEL); in fuse_send_readpages()
949 res = fuse_simple_request(fm, &ap->args); in fuse_send_readpages()
952 fuse_readpages_end(fm, &ap->args, err); in fuse_send_readpages()
957 struct inode *inode = rac->mapping->host; in fuse_readahead()
964 max_pages = min_t(unsigned int, fc->max_pages, in fuse_readahead()
965 fc->max_read / PAGE_SIZE); in fuse_readahead()
971 nr_pages = readahead_count(rac) - nr_pages; in fuse_readahead()
979 ap = &ia->ap; in fuse_readahead()
980 nr_pages = __readahead_batch(rac, ap->pages, nr_pages); in fuse_readahead()
984 ap->descs[i].length = PAGE_SIZE; in fuse_readahead()
986 ap->num_pages = nr_pages; in fuse_readahead()
987 fuse_send_readpages(ia, rac->file); in fuse_readahead()
993 struct inode *inode = iocb->ki_filp->f_mapping->host; in fuse_cache_read_iter()
1001 if (fc->auto_inval_data || in fuse_cache_read_iter()
1002 (iocb->ki_pos + iov_iter_count(to) > i_size_read(inode))) { in fuse_cache_read_iter()
1004 err = fuse_update_attributes(inode, iocb->ki_filp); in fuse_cache_read_iter()
1015 struct fuse_args *args = &ia->ap.args; in fuse_write_args_fill()
1017 ia->write.in.fh = ff->fh; in fuse_write_args_fill()
1018 ia->write.in.offset = pos; in fuse_write_args_fill()
1019 ia->write.in.size = count; in fuse_write_args_fill()
1020 args->opcode = FUSE_WRITE; in fuse_write_args_fill()
1021 args->nodeid = ff->nodeid; in fuse_write_args_fill()
1022 args->in_numargs = 2; in fuse_write_args_fill()
1023 if (ff->fm->fc->minor < 9) in fuse_write_args_fill()
1024 args->in_args[0].size = FUSE_COMPAT_WRITE_IN_SIZE; in fuse_write_args_fill()
1026 args->in_args[0].size = sizeof(ia->write.in); in fuse_write_args_fill()
1027 args->in_args[0].value = &ia->write.in; in fuse_write_args_fill()
1028 args->in_args[1].size = count; in fuse_write_args_fill()
1029 args->out_numargs = 1; in fuse_write_args_fill()
1030 args->out_args[0].size = sizeof(ia->write.out); in fuse_write_args_fill()
1031 args->out_args[0].value = &ia->write.out; in fuse_write_args_fill()
1036 unsigned int flags = iocb->ki_filp->f_flags; in fuse_write_flags()
1038 if (iocb->ki_flags & IOCB_DSYNC) in fuse_write_flags()
1040 if (iocb->ki_flags & IOCB_SYNC) in fuse_write_flags()
1049 struct kiocb *iocb = ia->io->iocb; in fuse_send_write()
1050 struct file *file = iocb->ki_filp; in fuse_send_write()
1051 struct fuse_file *ff = file->private_data; in fuse_send_write()
1052 struct fuse_mount *fm = ff->fm; in fuse_send_write()
1053 struct fuse_write_in *inarg = &ia->write.in; in fuse_send_write()
1057 inarg->flags = fuse_write_flags(iocb); in fuse_send_write()
1059 inarg->write_flags |= FUSE_WRITE_LOCKOWNER; in fuse_send_write()
1060 inarg->lock_owner = fuse_lock_owner_id(fm->fc, owner); in fuse_send_write()
1063 if (ia->io->async) in fuse_send_write()
1066 err = fuse_simple_request(fm, &ia->ap.args); in fuse_send_write()
1067 if (!err && ia->write.out.size > count) in fuse_send_write()
1068 err = -EIO; in fuse_send_write()
1070 return err ?: ia->write.out.size; in fuse_send_write()
1079 spin_lock(&fi->lock); in fuse_write_update_size()
1080 fi->attr_version = atomic64_inc_return(&fc->attr_version); in fuse_write_update_size()
1081 if (pos > inode->i_size) { in fuse_write_update_size()
1085 spin_unlock(&fi->lock); in fuse_write_update_size()
1094 struct fuse_args_pages *ap = &ia->ap; in fuse_send_write_pages()
1095 struct file *file = iocb->ki_filp; in fuse_send_write_pages()
1096 struct fuse_file *ff = file->private_data; in fuse_send_write_pages()
1097 struct fuse_mount *fm = ff->fm; in fuse_send_write_pages()
1102 for (i = 0; i < ap->num_pages; i++) in fuse_send_write_pages()
1103 fuse_wait_on_page_writeback(inode, ap->pages[i]->index); in fuse_send_write_pages()
1106 ia->write.in.flags = fuse_write_flags(iocb); in fuse_send_write_pages()
1108 err = fuse_simple_request(fm, &ap->args); in fuse_send_write_pages()
1109 if (!err && ia->write.out.size > count) in fuse_send_write_pages()
1110 err = -EIO; in fuse_send_write_pages()
1112 short_write = ia->write.out.size < count; in fuse_send_write_pages()
1113 offset = ap->descs[0].offset; in fuse_send_write_pages()
1114 count = ia->write.out.size; in fuse_send_write_pages()
1115 for (i = 0; i < ap->num_pages; i++) { in fuse_send_write_pages()
1116 struct page *page = ap->pages[i]; in fuse_send_write_pages()
1121 if (count >= PAGE_SIZE - offset) in fuse_send_write_pages()
1122 count -= PAGE_SIZE - offset; in fuse_send_write_pages()
1130 if (ia->write.page_locked && (i == ap->num_pages - 1)) in fuse_send_write_pages()
1143 struct fuse_args_pages *ap = &ia->ap; in fuse_fill_write_pages()
1144 struct fuse_conn *fc = get_fuse_conn(mapping->host); in fuse_fill_write_pages()
1145 unsigned offset = pos & (PAGE_SIZE - 1); in fuse_fill_write_pages()
1149 ap->args.in_pages = true; in fuse_fill_write_pages()
1150 ap->descs[0].offset = offset; in fuse_fill_write_pages()
1156 size_t bytes = min_t(size_t, PAGE_SIZE - offset, in fuse_fill_write_pages()
1159 bytes = min_t(size_t, bytes, fc->max_write - count); in fuse_fill_write_pages()
1162 err = -EFAULT; in fuse_fill_write_pages()
1166 err = -ENOMEM; in fuse_fill_write_pages()
1186 ap->pages[ap->num_pages] = page; in fuse_fill_write_pages()
1187 ap->descs[ap->num_pages].length = tmp; in fuse_fill_write_pages()
1188 ap->num_pages++; in fuse_fill_write_pages()
1203 ia->write.page_locked = true; in fuse_fill_write_pages()
1206 if (!fc->big_writes) in fuse_fill_write_pages()
1208 } while (iov_iter_count(ii) && count < fc->max_write && in fuse_fill_write_pages()
1209 ap->num_pages < max_pages && offset == 0); in fuse_fill_write_pages()
1218 ((pos + len - 1) >> PAGE_SHIFT) - in fuse_wr_pages()
1227 struct inode *inode = mapping->host; in fuse_perform_write()
1233 if (inode->i_size < pos + iov_iter_count(ii)) in fuse_perform_write()
1234 set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); in fuse_perform_write()
1241 fc->max_pages); in fuse_perform_write()
1243 ap->pages = fuse_pages_alloc(nr_pages, GFP_KERNEL, &ap->descs); in fuse_perform_write()
1244 if (!ap->pages) { in fuse_perform_write()
1245 err = -ENOMEM; in fuse_perform_write()
1263 err = -EIO; in fuse_perform_write()
1266 kfree(ap->pages); in fuse_perform_write()
1272 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); in fuse_perform_write()
1280 struct file *file = iocb->ki_filp; in fuse_cache_write_iter()
1281 struct address_space *mapping = file->f_mapping; in fuse_cache_write_iter()
1284 struct inode *inode = mapping->host; in fuse_cache_write_iter()
1288 if (get_fuse_conn(inode)->writeback_cache) { in fuse_cache_write_iter()
1290 err = fuse_update_attributes(mapping->host, file); in fuse_cache_write_iter()
1300 current->backing_dev_info = inode_to_bdi(inode); in fuse_cache_write_iter()
1314 if (iocb->ki_flags & IOCB_DIRECT) { in fuse_cache_write_iter()
1315 loff_t pos = iocb->ki_pos; in fuse_cache_write_iter()
1327 endbyte = pos + written_buffered - 1; in fuse_cache_write_iter()
1329 err = filemap_write_and_wait_range(file->f_mapping, pos, in fuse_cache_write_iter()
1334 invalidate_mapping_pages(file->f_mapping, in fuse_cache_write_iter()
1339 iocb->ki_pos = pos + written_buffered; in fuse_cache_write_iter()
1341 written = fuse_perform_write(iocb, mapping, from, iocb->ki_pos); in fuse_cache_write_iter()
1343 iocb->ki_pos += written; in fuse_cache_write_iter()
1346 current->backing_dev_info = NULL; in fuse_cache_write_iter()
1361 descs[i].length = PAGE_SIZE - descs[i].offset; in fuse_page_descs_length_init()
1366 return (unsigned long)ii->iov->iov_base + ii->iov_offset; in fuse_get_user_addr()
1388 ap->args.in_args[1].value = (void *) user_addr; in fuse_get_user_pages()
1390 ap->args.out_args[0].value = (void *) user_addr; in fuse_get_user_pages()
1397 while (nbytes < *nbytesp && ap->num_pages < max_pages) { in fuse_get_user_pages()
1400 ret = iov_iter_get_pages(ii, &ap->pages[ap->num_pages], in fuse_get_user_pages()
1401 *nbytesp - nbytes, in fuse_get_user_pages()
1402 max_pages - ap->num_pages, in fuse_get_user_pages()
1411 npages = (ret + PAGE_SIZE - 1) / PAGE_SIZE; in fuse_get_user_pages()
1413 ap->descs[ap->num_pages].offset = start; in fuse_get_user_pages()
1414 fuse_page_descs_length_init(ap->descs, ap->num_pages, npages); in fuse_get_user_pages()
1416 ap->num_pages += npages; in fuse_get_user_pages()
1417 ap->descs[ap->num_pages - 1].length -= in fuse_get_user_pages()
1418 (PAGE_SIZE - ret) & (PAGE_SIZE - 1); in fuse_get_user_pages()
1421 ap->args.user_pages = true; in fuse_get_user_pages()
1423 ap->args.in_pages = true; in fuse_get_user_pages()
1425 ap->args.out_pages = true; in fuse_get_user_pages()
1432 ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter, in fuse_direct_io() argument
1437 struct file *file = io->iocb->ki_filp; in fuse_direct_io()
1438 struct inode *inode = file->f_mapping->host; in fuse_direct_io()
1439 struct fuse_file *ff = file->private_data; in fuse_direct_io()
1440 struct fuse_conn *fc = ff->fm->fc; in fuse_direct_io()
1441 size_t nmax = write ? fc->max_write : fc->max_read; in fuse_direct_io()
1445 pgoff_t idx_to = (pos + count - 1) >> PAGE_SHIFT; in fuse_direct_io()
1451 max_pages = iov_iter_npages(iter, fc->max_pages); in fuse_direct_io()
1452 ia = fuse_io_alloc(io, max_pages); in fuse_direct_io()
1454 return -ENOMEM; in fuse_direct_io()
1456 ia->io = io; in fuse_direct_io()
1465 io->should_dirty = !write && iter_is_iovec(iter); in fuse_direct_io()
1468 fl_owner_t owner = current->files; in fuse_direct_io()
1471 err = fuse_get_user_pages(&ia->ap, iter, &nbytes, write, in fuse_direct_io()
1478 ia->write.in.write_flags |= FUSE_WRITE_KILL_PRIV; in fuse_direct_io()
1485 if (!io->async || nres < 0) { in fuse_direct_io()
1486 fuse_release_user_pages(&ia->ap, io->should_dirty); in fuse_direct_io()
1497 count -= nres; in fuse_direct_io()
1501 iov_iter_revert(iter, nbytes - nres); in fuse_direct_io()
1505 max_pages = iov_iter_npages(iter, fc->max_pages); in fuse_direct_io()
1506 ia = fuse_io_alloc(io, max_pages); in fuse_direct_io()
1520 static ssize_t __fuse_direct_read(struct fuse_io_priv *io, in __fuse_direct_read() argument
1525 struct inode *inode = file_inode(io->iocb->ki_filp); in __fuse_direct_read()
1527 res = fuse_direct_io(io, iter, ppos, 0); in __fuse_direct_read()
1540 if (!is_sync_kiocb(iocb) && iocb->ki_flags & IOCB_DIRECT) { in fuse_direct_read_iter()
1543 struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb); in fuse_direct_read_iter() local
1545 res = __fuse_direct_read(&io, to, &iocb->ki_pos); in fuse_direct_read_iter()
1553 struct inode *inode = file_inode(iocb->ki_filp); in fuse_direct_write_iter()
1554 struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb); in fuse_direct_write_iter() local
1561 if (!is_sync_kiocb(iocb) && iocb->ki_flags & IOCB_DIRECT) { in fuse_direct_write_iter()
1564 res = fuse_direct_io(&io, from, &iocb->ki_pos, in fuse_direct_write_iter()
1570 fuse_write_update_size(inode, iocb->ki_pos); in fuse_direct_write_iter()
1578 struct file *file = iocb->ki_filp; in fuse_file_read_iter()
1579 struct fuse_file *ff = file->private_data; in fuse_file_read_iter()
1583 return -EIO; in fuse_file_read_iter()
1588 if (!(ff->open_flags & FOPEN_DIRECT_IO)) in fuse_file_read_iter()
1596 struct file *file = iocb->ki_filp; in fuse_file_write_iter()
1597 struct fuse_file *ff = file->private_data; in fuse_file_write_iter()
1601 return -EIO; in fuse_file_write_iter()
1606 if (!(ff->open_flags & FOPEN_DIRECT_IO)) in fuse_file_write_iter()
1614 struct fuse_args_pages *ap = &wpa->ia.ap; in fuse_writepage_free()
1617 for (i = 0; i < ap->num_pages; i++) in fuse_writepage_free()
1618 __free_page(ap->pages[i]); in fuse_writepage_free()
1620 if (wpa->ia.ff) in fuse_writepage_free()
1621 fuse_file_put(wpa->ia.ff, false, false); in fuse_writepage_free()
1623 kfree(ap->pages); in fuse_writepage_free()
1630 struct fuse_args_pages *ap = &wpa->ia.ap; in fuse_writepage_finish()
1631 struct inode *inode = wpa->inode; in fuse_writepage_finish()
1636 for (i = 0; i < ap->num_pages; i++) { in fuse_writepage_finish()
1637 dec_wb_stat(&bdi->wb, WB_WRITEBACK); in fuse_writepage_finish()
1638 dec_node_page_state(ap->pages[i], NR_WRITEBACK_TEMP); in fuse_writepage_finish()
1639 wb_writeout_inc(&bdi->wb); in fuse_writepage_finish()
1641 wake_up(&fi->page_waitq); in fuse_writepage_finish()
1644 /* Called under fi->lock, may release and reacquire it */
1647 __releases(fi->lock) in fuse_send_writepage()
1648 __acquires(fi->lock) in fuse_send_writepage()
1651 struct fuse_inode *fi = get_fuse_inode(wpa->inode); in fuse_send_writepage()
1652 struct fuse_write_in *inarg = &wpa->ia.write.in; in fuse_send_writepage()
1653 struct fuse_args *args = &wpa->ia.ap.args; in fuse_send_writepage()
1654 __u64 data_size = wpa->ia.ap.num_pages * PAGE_SIZE; in fuse_send_writepage()
1657 fi->writectr++; in fuse_send_writepage()
1658 if (inarg->offset + data_size <= size) { in fuse_send_writepage()
1659 inarg->size = data_size; in fuse_send_writepage()
1660 } else if (inarg->offset < size) { in fuse_send_writepage()
1661 inarg->size = size - inarg->offset; in fuse_send_writepage()
1667 args->in_args[1].size = inarg->size; in fuse_send_writepage()
1668 args->force = true; in fuse_send_writepage()
1669 args->nocreds = true; in fuse_send_writepage()
1672 if (err == -ENOMEM) { in fuse_send_writepage()
1673 spin_unlock(&fi->lock); in fuse_send_writepage()
1675 spin_lock(&fi->lock); in fuse_send_writepage()
1685 fi->writectr--; in fuse_send_writepage()
1686 rb_erase(&wpa->writepages_entry, &fi->writepages); in fuse_send_writepage()
1688 spin_unlock(&fi->lock); in fuse_send_writepage()
1691 for (aux = wpa->next; aux; aux = next) { in fuse_send_writepage()
1692 next = aux->next; in fuse_send_writepage()
1693 aux->next = NULL; in fuse_send_writepage()
1698 spin_lock(&fi->lock); in fuse_send_writepage()
1702 * If fi->writectr is positive (no truncate or fsync going on) send
1705 * Called with fi->lock
1708 __releases(fi->lock) in fuse_flush_writepages()
1709 __acquires(fi->lock) in fuse_flush_writepages()
1716 while (fi->writectr >= 0 && !list_empty(&fi->queued_writes)) { in fuse_flush_writepages()
1717 wpa = list_entry(fi->queued_writes.next, in fuse_flush_writepages()
1719 list_del_init(&wpa->queue_entry); in fuse_flush_writepages()
1727 pgoff_t idx_from = wpa->ia.write.in.offset >> PAGE_SHIFT; in fuse_insert_writeback()
1728 pgoff_t idx_to = idx_from + wpa->ia.ap.num_pages - 1; in fuse_insert_writeback()
1729 struct rb_node **p = &root->rb_node; in fuse_insert_writeback()
1732 WARN_ON(!wpa->ia.ap.num_pages); in fuse_insert_writeback()
1740 WARN_ON(curr->inode != wpa->inode); in fuse_insert_writeback()
1741 curr_index = curr->ia.write.in.offset >> PAGE_SHIFT; in fuse_insert_writeback()
1743 if (idx_from >= curr_index + curr->ia.ap.num_pages) in fuse_insert_writeback()
1744 p = &(*p)->rb_right; in fuse_insert_writeback()
1746 p = &(*p)->rb_left; in fuse_insert_writeback()
1751 rb_link_node(&wpa->writepages_entry, parent, p); in fuse_insert_writeback()
1752 rb_insert_color(&wpa->writepages_entry, root); in fuse_insert_writeback()
1766 struct inode *inode = wpa->inode; in fuse_writepage_end()
1770 mapping_set_error(inode->i_mapping, error); in fuse_writepage_end()
1777 if (!fc->writeback_cache) in fuse_writepage_end()
1779 spin_lock(&fi->lock); in fuse_writepage_end()
1780 rb_erase(&wpa->writepages_entry, &fi->writepages); in fuse_writepage_end()
1781 while (wpa->next) { in fuse_writepage_end()
1783 struct fuse_write_in *inarg = &wpa->ia.write.in; in fuse_writepage_end()
1784 struct fuse_writepage_args *next = wpa->next; in fuse_writepage_end()
1786 wpa->next = next->next; in fuse_writepage_end()
1787 next->next = NULL; in fuse_writepage_end()
1788 next->ia.ff = fuse_file_get(wpa->ia.ff); in fuse_writepage_end()
1789 tree_insert(&fi->writepages, next); in fuse_writepage_end()
1801 * now for completion of all in-flight requests. This happens in fuse_writepage_end()
1807 * that fuse_set_nowrite returned implies that all in-flight in fuse_writepage_end()
1810 * writectr. Hence there cannot be any in-flight requests and in fuse_writepage_end()
1814 fuse_send_writepage(fm, next, inarg->offset + inarg->size); in fuse_writepage_end()
1816 fi->writectr--; in fuse_writepage_end()
1818 spin_unlock(&fi->lock); in fuse_writepage_end()
1827 spin_lock(&fi->lock); in __fuse_write_file_get()
1828 if (!list_empty(&fi->write_files)) { in __fuse_write_file_get()
1829 ff = list_entry(fi->write_files.next, struct fuse_file, in __fuse_write_file_get()
1833 spin_unlock(&fi->lock); in __fuse_write_file_get()
1862 WARN_ON(wbc->for_reclaim); in fuse_write_inode()
1879 ap = &wpa->ia.ap; in fuse_writepage_args_alloc()
1880 ap->num_pages = 0; in fuse_writepage_args_alloc()
1881 ap->pages = fuse_pages_alloc(1, GFP_NOFS, &ap->descs); in fuse_writepage_args_alloc()
1882 if (!ap->pages) { in fuse_writepage_args_alloc()
1893 struct address_space *mapping = page->mapping; in fuse_writepage_locked()
1894 struct inode *inode = mapping->host; in fuse_writepage_locked()
1900 int error = -ENOMEM; in fuse_writepage_locked()
1907 ap = &wpa->ia.ap; in fuse_writepage_locked()
1913 error = -EIO; in fuse_writepage_locked()
1914 wpa->ia.ff = fuse_write_file_get(fc, fi); in fuse_writepage_locked()
1915 if (!wpa->ia.ff) in fuse_writepage_locked()
1918 fuse_write_args_fill(&wpa->ia, wpa->ia.ff, page_offset(page), 0); in fuse_writepage_locked()
1921 wpa->ia.write.in.write_flags |= FUSE_WRITE_CACHE; in fuse_writepage_locked()
1922 wpa->next = NULL; in fuse_writepage_locked()
1923 ap->args.in_pages = true; in fuse_writepage_locked()
1924 ap->num_pages = 1; in fuse_writepage_locked()
1925 ap->pages[0] = tmp_page; in fuse_writepage_locked()
1926 ap->descs[0].offset = 0; in fuse_writepage_locked()
1927 ap->descs[0].length = PAGE_SIZE; in fuse_writepage_locked()
1928 ap->args.end = fuse_writepage_end; in fuse_writepage_locked()
1929 wpa->inode = inode; in fuse_writepage_locked()
1931 inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK); in fuse_writepage_locked()
1934 spin_lock(&fi->lock); in fuse_writepage_locked()
1935 tree_insert(&fi->writepages, wpa); in fuse_writepage_locked()
1936 list_add_tail(&wpa->queue_entry, &fi->queued_writes); in fuse_writepage_locked()
1938 spin_unlock(&fi->lock); in fuse_writepage_locked()
1949 mapping_set_error(page->mapping, error); in fuse_writepage_locked()
1958 if (fuse_page_is_writeback(page->mapping->host, page->index)) { in fuse_writepage()
1960 * ->writepages() should be called for sync() and friends. We in fuse_writepage()
1964 WARN_ON(wbc->sync_mode == WB_SYNC_ALL); in fuse_writepage()
1987 struct fuse_args_pages *ap = &data->wpa->ia.ap; in fuse_pages_realloc()
1988 struct fuse_conn *fc = get_fuse_conn(data->inode); in fuse_pages_realloc()
1992 max_t(unsigned int, data->max_pages * 2, in fuse_pages_realloc()
1994 fc->max_pages); in fuse_pages_realloc()
1995 WARN_ON(npages <= data->max_pages); in fuse_pages_realloc()
2001 memcpy(pages, ap->pages, sizeof(struct page *) * ap->num_pages); in fuse_pages_realloc()
2002 memcpy(descs, ap->descs, sizeof(struct fuse_page_desc) * ap->num_pages); in fuse_pages_realloc()
2003 kfree(ap->pages); in fuse_pages_realloc()
2004 ap->pages = pages; in fuse_pages_realloc()
2005 ap->descs = descs; in fuse_pages_realloc()
2006 data->max_pages = npages; in fuse_pages_realloc()
2013 struct fuse_writepage_args *wpa = data->wpa; in fuse_writepages_send()
2014 struct inode *inode = data->inode; in fuse_writepages_send()
2016 int num_pages = wpa->ia.ap.num_pages; in fuse_writepages_send()
2019 wpa->ia.ff = fuse_file_get(data->ff); in fuse_writepages_send()
2020 spin_lock(&fi->lock); in fuse_writepages_send()
2021 list_add_tail(&wpa->queue_entry, &fi->queued_writes); in fuse_writepages_send()
2023 spin_unlock(&fi->lock); in fuse_writepages_send()
2026 end_page_writeback(data->orig_pages[i]); in fuse_writepages_send()
2030 * Check under fi->lock if the page is under writeback, and insert it onto the
2039 struct fuse_inode *fi = get_fuse_inode(new_wpa->inode); in fuse_writepage_add()
2042 struct fuse_args_pages *new_ap = &new_wpa->ia.ap; in fuse_writepage_add()
2044 WARN_ON(new_ap->num_pages != 0); in fuse_writepage_add()
2045 new_ap->num_pages = 1; in fuse_writepage_add()
2047 spin_lock(&fi->lock); in fuse_writepage_add()
2048 old_wpa = fuse_insert_writeback(&fi->writepages, new_wpa); in fuse_writepage_add()
2050 spin_unlock(&fi->lock); in fuse_writepage_add()
2054 for (tmp = old_wpa->next; tmp; tmp = tmp->next) { in fuse_writepage_add()
2057 WARN_ON(tmp->inode != new_wpa->inode); in fuse_writepage_add()
2058 curr_index = tmp->ia.write.in.offset >> PAGE_SHIFT; in fuse_writepage_add()
2059 if (curr_index == page->index) { in fuse_writepage_add()
2060 WARN_ON(tmp->ia.ap.num_pages != 1); in fuse_writepage_add()
2061 swap(tmp->ia.ap.pages[0], new_ap->pages[0]); in fuse_writepage_add()
2067 new_wpa->next = old_wpa->next; in fuse_writepage_add()
2068 old_wpa->next = new_wpa; in fuse_writepage_add()
2071 spin_unlock(&fi->lock); in fuse_writepage_add()
2074 struct backing_dev_info *bdi = inode_to_bdi(new_wpa->inode); in fuse_writepage_add()
2076 dec_wb_stat(&bdi->wb, WB_WRITEBACK); in fuse_writepage_add()
2077 dec_node_page_state(new_ap->pages[0], NR_WRITEBACK_TEMP); in fuse_writepage_add()
2078 wb_writeout_inc(&bdi->wb); in fuse_writepage_add()
2089 WARN_ON(!ap->num_pages); in fuse_writepage_need_send()
2097 if (fuse_page_is_writeback(data->inode, page->index)) in fuse_writepage_need_send()
2101 if (ap->num_pages == fc->max_pages) in fuse_writepage_need_send()
2105 if ((ap->num_pages + 1) * PAGE_SIZE > fc->max_write) in fuse_writepage_need_send()
2109 if (data->orig_pages[ap->num_pages - 1]->index + 1 != page->index) in fuse_writepage_need_send()
2113 if (ap->num_pages == data->max_pages && !fuse_pages_realloc(data)) in fuse_writepage_need_send()
2123 struct fuse_writepage_args *wpa = data->wpa; in fuse_writepages_fill()
2124 struct fuse_args_pages *ap = &wpa->ia.ap; in fuse_writepages_fill()
2125 struct inode *inode = data->inode; in fuse_writepages_fill()
2131 if (!data->ff) { in fuse_writepages_fill()
2132 err = -EIO; in fuse_writepages_fill()
2133 data->ff = fuse_write_file_get(fc, fi); in fuse_writepages_fill()
2134 if (!data->ff) in fuse_writepages_fill()
2140 data->wpa = NULL; in fuse_writepages_fill()
2143 err = -ENOMEM; in fuse_writepages_fill()
2157 * request to the fi->writepages list and increment ap->num_pages. in fuse_writepages_fill()
2161 if (data->wpa == NULL) { in fuse_writepages_fill()
2162 err = -ENOMEM; in fuse_writepages_fill()
2168 data->max_pages = 1; in fuse_writepages_fill()
2170 ap = &wpa->ia.ap; in fuse_writepages_fill()
2171 fuse_write_args_fill(&wpa->ia, data->ff, page_offset(page), 0); in fuse_writepages_fill()
2172 wpa->ia.write.in.write_flags |= FUSE_WRITE_CACHE; in fuse_writepages_fill()
2173 wpa->next = NULL; in fuse_writepages_fill()
2174 ap->args.in_pages = true; in fuse_writepages_fill()
2175 ap->args.end = fuse_writepage_end; in fuse_writepages_fill()
2176 ap->num_pages = 0; in fuse_writepages_fill()
2177 wpa->inode = inode; in fuse_writepages_fill()
2182 ap->pages[ap->num_pages] = tmp_page; in fuse_writepages_fill()
2183 ap->descs[ap->num_pages].offset = 0; in fuse_writepages_fill()
2184 ap->descs[ap->num_pages].length = PAGE_SIZE; in fuse_writepages_fill()
2185 data->orig_pages[ap->num_pages] = page; in fuse_writepages_fill()
2187 inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK); in fuse_writepages_fill()
2191 if (data->wpa) { in fuse_writepages_fill()
2193 * Protected by fi->lock against concurrent access by in fuse_writepages_fill()
2196 spin_lock(&fi->lock); in fuse_writepages_fill()
2197 ap->num_pages++; in fuse_writepages_fill()
2198 spin_unlock(&fi->lock); in fuse_writepages_fill()
2200 data->wpa = wpa; in fuse_writepages_fill()
2213 struct inode *inode = mapping->host; in fuse_writepages()
2218 err = -EIO; in fuse_writepages()
2226 err = -ENOMEM; in fuse_writepages()
2227 data.orig_pages = kcalloc(fc->max_pages, in fuse_writepages()
2235 WARN_ON(!data.wpa->ia.ap.num_pages); in fuse_writepages()
2258 int err = -ENOMEM; in fuse_write_begin()
2260 WARN_ON(!fc->writeback_cache); in fuse_write_begin()
2266 fuse_wait_on_page_writeback(mapping->host, page->index); in fuse_write_begin()
2274 fsize = i_size_read(mapping->host); in fuse_write_begin()
2299 struct inode *inode = page->mapping->host; in fuse_write_end()
2327 struct inode *inode = page->mapping->host; in fuse_launder_page()
2330 fuse_wait_on_page_writeback(inode, page->index); in fuse_launder_page()
2341 filemap_write_and_wait(vma->vm_file->f_mapping); in fuse_vma_close()
2349 * Block here, instead of in ->writepage(), so that the userspace fs
2355 * - page migration
2356 * - sync(2)
2357 * - try_to_free_pages() with order > PAGE_ALLOC_COSTLY_ORDER
2361 struct page *page = vmf->page; in fuse_page_mkwrite()
2362 struct inode *inode = file_inode(vmf->vma->vm_file); in fuse_page_mkwrite()
2364 file_update_time(vmf->vma->vm_file); in fuse_page_mkwrite()
2366 if (page->mapping != inode->i_mapping) { in fuse_page_mkwrite()
2371 fuse_wait_on_page_writeback(inode, page->index); in fuse_page_mkwrite()
2384 struct fuse_file *ff = file->private_data; in fuse_file_mmap()
2390 if (ff->open_flags & FOPEN_DIRECT_IO) { in fuse_file_mmap()
2392 if (vma->vm_flags & VM_MAYSHARE) in fuse_file_mmap()
2393 return -ENODEV; in fuse_file_mmap()
2395 invalidate_inode_pages2(file->f_mapping); in fuse_file_mmap()
2400 if ((vma->vm_flags & VM_SHARED) && (vma->vm_flags & VM_MAYWRITE)) in fuse_file_mmap()
2404 vma->vm_ops = &fuse_file_vm_ops; in fuse_file_mmap()
2412 switch (ffl->type) { in convert_fuse_file_lock()
2418 if (ffl->start > OFFSET_MAX || ffl->end > OFFSET_MAX || in convert_fuse_file_lock()
2419 ffl->end < ffl->start) in convert_fuse_file_lock()
2420 return -EIO; in convert_fuse_file_lock()
2422 fl->fl_start = ffl->start; in convert_fuse_file_lock()
2423 fl->fl_end = ffl->end; in convert_fuse_file_lock()
2430 fl->fl_pid = pid_nr_ns(find_pid_ns(ffl->pid, fc->pid_ns), &init_pid_ns); in convert_fuse_file_lock()
2435 return -EIO; in convert_fuse_file_lock()
2437 fl->fl_type = ffl->type; in convert_fuse_file_lock()
2447 struct fuse_file *ff = file->private_data; in fuse_lk_fill()
2450 inarg->fh = ff->fh; in fuse_lk_fill()
2451 inarg->owner = fuse_lock_owner_id(fc, fl->fl_owner); in fuse_lk_fill()
2452 inarg->lk.start = fl->fl_start; in fuse_lk_fill()
2453 inarg->lk.end = fl->fl_end; in fuse_lk_fill()
2454 inarg->lk.type = fl->fl_type; in fuse_lk_fill()
2455 inarg->lk.pid = pid; in fuse_lk_fill()
2457 inarg->lk_flags |= FUSE_LK_FLOCK; in fuse_lk_fill()
2458 args->opcode = opcode; in fuse_lk_fill()
2459 args->nodeid = get_node_id(inode); in fuse_lk_fill()
2460 args->in_numargs = 1; in fuse_lk_fill()
2461 args->in_args[0].size = sizeof(*inarg); in fuse_lk_fill()
2462 args->in_args[0].value = inarg; in fuse_lk_fill()
2480 err = convert_fuse_file_lock(fm->fc, &outarg.lk, fl); in fuse_getlk()
2491 int opcode = (fl->fl_flags & FL_SLEEP) ? FUSE_SETLKW : FUSE_SETLK; in fuse_setlk()
2492 struct pid *pid = fl->fl_type != F_UNLCK ? task_tgid(current) : NULL; in fuse_setlk()
2493 pid_t pid_nr = pid_nr_ns(pid, fm->fc->pid_ns); in fuse_setlk()
2496 if (fl->fl_lmops && fl->fl_lmops->lm_grant) { in fuse_setlk()
2498 return -ENOLCK; in fuse_setlk()
2502 if ((fl->fl_flags & FL_CLOSE_POSIX) == FL_CLOSE_POSIX) in fuse_setlk()
2509 if (err == -EINTR) in fuse_setlk()
2510 err = -ERESTARTSYS; in fuse_setlk()
2524 if (fc->no_lock) { in fuse_file_lock()
2530 if (fc->no_lock) in fuse_file_lock()
2544 if (fc->no_flock) { in fuse_file_flock()
2547 struct fuse_file *ff = file->private_data; in fuse_file_flock()
2550 ff->flock = true; in fuse_file_flock()
2559 struct inode *inode = mapping->host; in fuse_bmap()
2566 if (!inode->i_sb->s_bdev || fm->fc->no_bmap) in fuse_bmap()
2571 inarg.blocksize = inode->i_sb->s_blocksize; in fuse_bmap()
2581 if (err == -ENOSYS) in fuse_bmap()
2582 fm->fc->no_bmap = 1; in fuse_bmap()
2589 struct inode *inode = file->f_mapping->host; in fuse_lseek()
2591 struct fuse_file *ff = file->private_data; in fuse_lseek()
2594 .fh = ff->fh, in fuse_lseek()
2601 if (fm->fc->no_lseek) in fuse_lseek()
2605 args.nodeid = ff->nodeid; in fuse_lseek()
2614 if (err == -ENOSYS) { in fuse_lseek()
2615 fm->fc->no_lseek = 1; in fuse_lseek()
2621 return vfs_setpos(file, outarg.offset, inode->i_sb->s_maxbytes); in fuse_lseek()
2656 retval = -EINVAL; in fuse_file_llseek()
2679 * non-compat (i.e. ones coming from 64bit apps) ioctl in fuse_copy_ioctl_iovec_old()
2683 return -EINVAL; in fuse_copy_ioctl_iovec_old()
2694 return -EIO; in fuse_copy_ioctl_iovec_old()
2705 u32 max = fc->max_pages << PAGE_SHIFT; in fuse_verify_ioctl_iov()
2708 if (iov->iov_len > (size_t) max) in fuse_verify_ioctl_iov()
2709 return -ENOMEM; in fuse_verify_ioctl_iov()
2710 max -= iov->iov_len; in fuse_verify_ioctl_iov()
2722 if (fc->minor < 16) { in fuse_copy_ioctl_iovec()
2728 return -EIO; in fuse_copy_ioctl_iovec()
2734 return -EIO; in fuse_copy_ioctl_iovec()
2743 return -EIO; in fuse_copy_ioctl_iovec()
2767 * On the first callout to FUSE server, inarg->in_size and
2768 * inarg->out_size will be NULL; then, the server completes the ioctl
2769 * with FUSE_IOCTL_RETRY set in out->flags, out->in_iovs set to 1 and
2777 * it sets FUSE_IOCTL_RETRY, out->in_iovs to 2 and iov array to
2794 * limits ioctl data transfers to well-formed ioctls and is the forced
2800 struct fuse_file *ff = file->private_data; in fuse_do_ioctl()
2801 struct fuse_mount *fm = ff->fm; in fuse_do_ioctl()
2803 .fh = ff->fh, in fuse_do_ioctl()
2833 err = -ENOMEM; in fuse_do_ioctl()
2834 ap.pages = fuse_pages_alloc(fm->fc->max_pages, GFP_KERNEL, &ap.descs); in fuse_do_ioctl()
2839 fuse_page_descs_length_init(ap.descs, 0, fm->fc->max_pages); in fuse_do_ioctl()
2842 * If restricted, initialize IO parameters as encoded in @cmd. in fuse_do_ioctl()
2848 iov->iov_base = (void __user *)arg; in fuse_do_ioctl()
2853 iov->iov_len = sizeof(int); in fuse_do_ioctl()
2856 iov->iov_len = _IOC_SIZE(cmd); in fuse_do_ioctl()
2883 err = -ENOMEM; in fuse_do_ioctl()
2884 if (max_pages > fm->fc->max_pages) in fuse_do_ioctl()
2896 ap.args.nodeid = ff->nodeid; in fuse_do_ioctl()
2905 err = -EFAULT; in fuse_do_ioctl()
2931 err = -EIO; in fuse_do_ioctl()
2942 err = -ENOMEM; in fuse_do_ioctl()
2949 err = fuse_copy_ioctl_iovec(fm->fc, iov_page, vaddr, in fuse_do_ioctl()
2959 err = fuse_verify_ioctl_iov(fm->fc, in_iov, in_iovs); in fuse_do_ioctl()
2963 err = fuse_verify_ioctl_iov(fm->fc, out_iov, out_iovs); in fuse_do_ioctl()
2970 err = -EIO; in fuse_do_ioctl()
2974 err = -EFAULT; in fuse_do_ioctl()
2985 __free_page(ap.pages[--ap.num_pages]); in fuse_do_ioctl()
2999 return -EACCES; in fuse_ioctl_common()
3002 return -EIO; in fuse_ioctl_common()
3021 * fuse_conn->polled_files which is indexed by kh. Walk the tree and
3027 struct rb_node **link = &fc->polled_files.rb_node; in fuse_find_polled_node()
3036 if (kh < ff->kh) in fuse_find_polled_node()
3037 link = &last->rb_left; in fuse_find_polled_node()
3038 else if (kh > ff->kh) in fuse_find_polled_node()
3039 link = &last->rb_right; in fuse_find_polled_node()
3058 spin_lock(&fc->lock); in fuse_register_polled_file()
3059 if (RB_EMPTY_NODE(&ff->polled_node)) { in fuse_register_polled_file()
3062 link = fuse_find_polled_node(fc, ff->kh, &parent); in fuse_register_polled_file()
3064 rb_link_node(&ff->polled_node, parent, link); in fuse_register_polled_file()
3065 rb_insert_color(&ff->polled_node, &fc->polled_files); in fuse_register_polled_file()
3067 spin_unlock(&fc->lock); in fuse_register_polled_file()
3072 struct fuse_file *ff = file->private_data; in fuse_file_poll()
3073 struct fuse_mount *fm = ff->fm; in fuse_file_poll()
3074 struct fuse_poll_in inarg = { .fh = ff->fh, .kh = ff->kh }; in fuse_file_poll()
3079 if (fm->fc->no_poll) in fuse_file_poll()
3082 poll_wait(file, &ff->poll_wait, wait); in fuse_file_poll()
3089 if (waitqueue_active(&ff->poll_wait)) { in fuse_file_poll()
3091 fuse_register_polled_file(fm->fc, ff); in fuse_file_poll()
3095 args.nodeid = ff->nodeid; in fuse_file_poll()
3106 if (err == -ENOSYS) { in fuse_file_poll()
3107 fm->fc->no_poll = 1; in fuse_file_poll()
3121 u64 kh = outarg->kh; in fuse_notify_poll_wakeup()
3124 spin_lock(&fc->lock); in fuse_notify_poll_wakeup()
3131 wake_up_interruptible_sync(&ff->poll_wait); in fuse_notify_poll_wakeup()
3134 spin_unlock(&fc->lock); in fuse_notify_poll_wakeup()
3140 struct inode *inode = file->f_mapping->host; in fuse_do_truncate()
3154 return round_up(off, fc->max_pages << PAGE_SHIFT); in fuse_round_up()
3162 struct file *file = iocb->ki_filp; in fuse_direct_IO()
3163 struct fuse_file *ff = file->private_data; in fuse_direct_IO()
3168 loff_t offset = iocb->ki_pos; in fuse_direct_IO()
3169 struct fuse_io_priv *io; in fuse_direct_IO() local
3172 inode = file->f_mapping->host; in fuse_direct_IO()
3178 io = kmalloc(sizeof(struct fuse_io_priv), GFP_KERNEL); in fuse_direct_IO()
3179 if (!io) in fuse_direct_IO()
3180 return -ENOMEM; in fuse_direct_IO()
3181 spin_lock_init(&io->lock); in fuse_direct_IO()
3182 kref_init(&io->refcnt); in fuse_direct_IO()
3183 io->reqs = 1; in fuse_direct_IO()
3184 io->bytes = -1; in fuse_direct_IO()
3185 io->size = 0; in fuse_direct_IO()
3186 io->offset = offset; in fuse_direct_IO()
3187 io->write = (iov_iter_rw(iter) == WRITE); in fuse_direct_IO()
3188 io->err = 0; in fuse_direct_IO()
3193 io->async = ff->fm->fc->async_dio; in fuse_direct_IO()
3194 io->iocb = iocb; in fuse_direct_IO()
3195 io->blocking = is_sync_kiocb(iocb); in fuse_direct_IO()
3198 if (io->async && !io->write && offset + count > i_size) { in fuse_direct_IO()
3199 iov_iter_truncate(iter, fuse_round_up(ff->fm->fc, i_size - offset)); in fuse_direct_IO()
3200 shortened = count - iov_iter_count(iter); in fuse_direct_IO()
3201 count -= shortened; in fuse_direct_IO()
3206 * In such case the aio will behave exactly like sync io. in fuse_direct_IO()
3208 if ((offset + count > i_size) && io->write) in fuse_direct_IO()
3209 io->blocking = true; in fuse_direct_IO()
3211 if (io->async && io->blocking) { in fuse_direct_IO()
3213 * Additional reference to keep io around after in fuse_direct_IO()
3216 kref_get(&io->refcnt); in fuse_direct_IO()
3217 io->done = &wait; in fuse_direct_IO()
3221 ret = fuse_direct_io(io, iter, &pos, FUSE_DIO_WRITE); in fuse_direct_IO()
3224 ret = __fuse_direct_read(io, iter, &pos); in fuse_direct_IO()
3228 if (io->async) { in fuse_direct_IO()
3229 bool blocking = io->blocking; in fuse_direct_IO() local
3231 fuse_aio_complete(io, ret < 0 ? ret : 0, -1); in fuse_direct_IO()
3233 /* we have a non-extending, async request, so return */ in fuse_direct_IO()
3234 if (!blocking) in fuse_direct_IO()
3235 return -EIOCBQUEUED; in fuse_direct_IO()
3238 ret = fuse_get_res_by_io(io); in fuse_direct_IO()
3241 kref_put(&io->refcnt, fuse_io_release); in fuse_direct_IO()
3255 int err = filemap_write_and_wait_range(inode->i_mapping, start, LLONG_MAX); in fuse_writeback_range()
3266 struct fuse_file *ff = file->private_data; in fuse_file_fallocate()
3269 struct fuse_mount *fm = ff->fm; in fuse_file_fallocate()
3272 .fh = ff->fh, in fuse_file_fallocate()
3284 return -EOPNOTSUPP; in fuse_file_fallocate()
3286 if (fm->fc->no_fallocate) in fuse_file_fallocate()
3287 return -EOPNOTSUPP; in fuse_file_fallocate()
3292 down_write(&fi->i_mmap_sem); in fuse_file_fallocate()
3299 loff_t endbyte = offset + length - 1; in fuse_file_fallocate()
3315 set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); in fuse_file_fallocate()
3318 args.nodeid = ff->nodeid; in fuse_file_fallocate()
3323 if (err == -ENOSYS) { in fuse_file_fallocate()
3324 fm->fc->no_fallocate = 1; in fuse_file_fallocate()
3325 err = -EOPNOTSUPP; in fuse_file_fallocate()
3334 if (changed && fm->fc->writeback_cache) in fuse_file_fallocate()
3339 truncate_pagecache_range(inode, offset, offset + length - 1); in fuse_file_fallocate()
3345 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); in fuse_file_fallocate()
3348 up_write(&fi->i_mmap_sem); in fuse_file_fallocate()
3362 struct fuse_file *ff_in = file_in->private_data; in __fuse_copy_file_range()
3363 struct fuse_file *ff_out = file_out->private_data; in __fuse_copy_file_range()
3367 struct fuse_mount *fm = ff_in->fm; in __fuse_copy_file_range()
3368 struct fuse_conn *fc = fm->fc; in __fuse_copy_file_range()
3371 .fh_in = ff_in->fh, in __fuse_copy_file_range()
3373 .nodeid_out = ff_out->nodeid, in __fuse_copy_file_range()
3374 .fh_out = ff_out->fh, in __fuse_copy_file_range()
3381 /* mark unstable when write-back is not used, and file_out gets in __fuse_copy_file_range()
3383 bool is_unstable = (!fc->writeback_cache) && in __fuse_copy_file_range()
3384 ((pos_out + len) > inode_out->i_size); in __fuse_copy_file_range()
3386 if (fc->no_copy_file_range) in __fuse_copy_file_range()
3387 return -EOPNOTSUPP; in __fuse_copy_file_range()
3389 if (file_inode(file_in)->i_sb != file_inode(file_out)->i_sb) in __fuse_copy_file_range()
3390 return -EXDEV; in __fuse_copy_file_range()
3393 err = fuse_writeback_range(inode_in, pos_in, pos_in + len - 1); in __fuse_copy_file_range()
3422 err = fuse_writeback_range(inode_out, pos_out, pos_out + len - 1); in __fuse_copy_file_range()
3427 set_bit(FUSE_I_SIZE_UNSTABLE, &fi_out->state); in __fuse_copy_file_range()
3430 args.nodeid = ff_in->nodeid; in __fuse_copy_file_range()
3438 if (err == -ENOSYS) { in __fuse_copy_file_range()
3439 fc->no_copy_file_range = 1; in __fuse_copy_file_range()
3440 err = -EOPNOTSUPP; in __fuse_copy_file_range()
3445 truncate_inode_pages_range(inode_out->i_mapping, in __fuse_copy_file_range()
3447 ALIGN(pos_out + outarg.size, PAGE_SIZE) - 1); in __fuse_copy_file_range()
3449 if (fc->writeback_cache) { in __fuse_copy_file_range()
3459 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi_out->state); in __fuse_copy_file_range()
3478 if (ret == -EOPNOTSUPP || ret == -EXDEV) in fuse_copy_file_range()
3522 inode->i_fop = &fuse_file_operations; in fuse_init_file_inode()
3523 inode->i_data.a_ops = &fuse_file_aops; in fuse_init_file_inode()
3525 INIT_LIST_HEAD(&fi->write_files); in fuse_init_file_inode()
3526 INIT_LIST_HEAD(&fi->queued_writes); in fuse_init_file_inode()
3527 fi->writectr = 0; in fuse_init_file_inode()
3528 init_waitqueue_head(&fi->page_waitq); in fuse_init_file_inode()
3529 fi->writepages = RB_ROOT; in fuse_init_file_inode()