• Home
  • Raw
  • Download

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()
210 if (fc->writeback_cache) in fuse_finish_open()
213 if ((file->f_mode & FMODE_WRITE) && fc->writeback_cache) in fuse_finish_open()
220 struct fuse_conn *fc = fm->fc; in fuse_open_common()
222 bool is_wb_truncate = (file->f_flags & O_TRUNC) && in fuse_open_common()
223 fc->atomic_o_trunc && in fuse_open_common()
224 fc->writeback_cache; in fuse_open_common()
225 bool dax_truncate = (file->f_flags & O_TRUNC) && in fuse_open_common()
226 fc->atomic_o_trunc && FUSE_IS_DAX(inode); in fuse_open_common()
229 return -EIO; in fuse_open_common()
239 down_write(&get_fuse_inode(inode)->i_mmap_sem); in fuse_open_common()
255 struct fuse_file *ff = file->private_data; in fuse_open_common()
257 if (fc->atomic_o_trunc && (file->f_flags & O_TRUNC)) in fuse_open_common()
259 else if (!(ff->open_flags & FOPEN_KEEP_CACHE)) in fuse_open_common()
260 invalidate_inode_pages2(inode->i_mapping); in fuse_open_common()
263 up_write(&get_fuse_inode(inode)->i_mmap_sem); in fuse_open_common()
275 struct fuse_conn *fc = ff->fm->fc; in fuse_prepare_release()
276 struct fuse_release_args *ra = ff->release_args; in fuse_prepare_release()
280 spin_lock(&fi->lock); in fuse_prepare_release()
281 list_del(&ff->write_entry); in fuse_prepare_release()
282 spin_unlock(&fi->lock); in fuse_prepare_release()
284 spin_lock(&fc->lock); in fuse_prepare_release()
285 if (!RB_EMPTY_NODE(&ff->polled_node)) in fuse_prepare_release()
286 rb_erase(&ff->polled_node, &fc->polled_files); in fuse_prepare_release()
287 spin_unlock(&fc->lock); in fuse_prepare_release()
289 wake_up_interruptible_all(&ff->poll_wait); in fuse_prepare_release()
291 ra->inarg.fh = ff->fh; in fuse_prepare_release()
292 ra->inarg.flags = flags; in fuse_prepare_release()
293 ra->args.in_numargs = 1; in fuse_prepare_release()
294 ra->args.in_args[0].size = sizeof(struct fuse_release_in); in fuse_prepare_release()
295 ra->args.in_args[0].value = &ra->inarg; in fuse_prepare_release()
296 ra->args.opcode = opcode; in fuse_prepare_release()
297 ra->args.nodeid = ff->nodeid; in fuse_prepare_release()
298 ra->args.force = true; in fuse_prepare_release()
299 ra->args.nocreds = true; in fuse_prepare_release()
305 struct fuse_file *ff = file->private_data; in fuse_release_common()
306 struct fuse_release_args *ra = ff->release_args; in fuse_release_common()
309 fuse_prepare_release(fi, ff, file->f_flags, opcode); in fuse_release_common()
311 if (ff->flock) { in fuse_release_common()
312 ra->inarg.release_flags |= FUSE_RELEASE_FLOCK_UNLOCK; in fuse_release_common()
313 ra->inarg.lock_owner = fuse_lock_owner_id(ff->fm->fc, in fuse_release_common()
317 ra->inode = igrab(file_inode(file)); in fuse_release_common()
328 fuse_file_put(ff, ff->fm->fc->destroy, isdir); in fuse_release_common()
341 if (fc->writeback_cache) in fuse_release()
352 WARN_ON(refcount_read(&ff->count) > 1); in fuse_sync_release()
355 * iput(NULL) is a no-op and since the refcount is 1 and everything's in fuse_sync_release()
368 u32 *k = fc->scramble_key; in fuse_lock_owner_id()
397 n = fi->writepages.rb_node; in fuse_find_writeback()
404 WARN_ON(get_fuse_inode(wpa->inode) != fi); in fuse_find_writeback()
405 curr_index = wpa->ia.write.in.offset >> PAGE_SHIFT; in fuse_find_writeback()
406 if (idx_from >= curr_index + wpa->ia.ap.num_pages) in fuse_find_writeback()
407 n = n->rb_right; in fuse_find_writeback()
409 n = n->rb_left; in fuse_find_writeback()
428 spin_lock(&fi->lock); in fuse_range_is_writeback()
430 spin_unlock(&fi->lock); in fuse_range_is_writeback()
450 wait_event(fi->page_waitq, !fuse_page_is_writeback(inode, index)); in fuse_wait_on_page_writeback()
456 * This is currently done by blocking further writes with FUSE_NOWRITE
472 struct fuse_file *ff = file->private_data; in fuse_flush()
478 return -EIO; in fuse_flush()
488 err = filemap_check_errors(file->f_mapping); in fuse_flush()
493 if (fm->fc->no_flush) in fuse_flush()
497 inarg.fh = ff->fh; in fuse_flush()
498 inarg.lock_owner = fuse_lock_owner_id(fm->fc, id); in fuse_flush()
507 if (err == -ENOSYS) { in fuse_flush()
508 fm->fc->no_flush = 1; in fuse_flush()
517 if (!err && fm->fc->writeback_cache) in fuse_flush()
525 struct inode *inode = file->f_mapping->host; in fuse_fsync_common()
527 struct fuse_file *ff = file->private_data; in fuse_fsync_common()
532 inarg.fh = ff->fh; in fuse_fsync_common()
545 struct inode *inode = file->f_mapping->host; in fuse_fsync()
550 return -EIO; in fuse_fsync()
578 if (fc->no_fsync) in fuse_fsync()
582 if (err == -ENOSYS) { in fuse_fsync()
583 fc->no_fsync = 1; in fuse_fsync()
595 struct fuse_file *ff = file->private_data; in fuse_read_args_fill()
596 struct fuse_args *args = &ia->ap.args; in fuse_read_args_fill()
598 ia->read.in.fh = ff->fh; in fuse_read_args_fill()
599 ia->read.in.offset = pos; in fuse_read_args_fill()
600 ia->read.in.size = count; in fuse_read_args_fill()
601 ia->read.in.flags = file->f_flags; in fuse_read_args_fill()
602 args->opcode = opcode; in fuse_read_args_fill()
603 args->nodeid = ff->nodeid; in fuse_read_args_fill()
604 args->in_numargs = 1; in fuse_read_args_fill()
605 args->in_args[0].size = sizeof(ia->read.in); in fuse_read_args_fill()
606 args->in_args[0].value = &ia->read.in; in fuse_read_args_fill()
607 args->out_argvar = true; in fuse_read_args_fill()
608 args->out_numargs = 1; in fuse_read_args_fill()
609 args->out_args[0].size = count; in fuse_read_args_fill()
617 for (i = 0; i < ap->num_pages; i++) { in fuse_release_user_pages()
619 set_page_dirty_lock(ap->pages[i]); in fuse_release_user_pages()
620 put_page(ap->pages[i]); in fuse_release_user_pages()
629 static ssize_t fuse_get_res_by_io(struct fuse_io_priv *io) in fuse_get_res_by_io() argument
631 if (io->err) in fuse_get_res_by_io()
632 return io->err; in fuse_get_res_by_io()
634 if (io->bytes >= 0 && io->write) in fuse_get_res_by_io()
635 return -EIO; in fuse_get_res_by_io()
637 return io->bytes < 0 ? io->size : io->bytes; in fuse_get_res_by_io()
642 * actual end of fuse request in IO request. Otherwise, if bytes_requested
643 * == bytes_transferred or rw == WRITE, the caller sets 'pos' to -1.
648 * fully completed (req->out.args[0].size == 32K) resulting in pos == -1. The
652 * Thus, when all fuse requests are completed, the minimal non-negative 'pos'
654 * transferred data starting from the beginning of IO request.
656 static void fuse_aio_complete(struct fuse_io_priv *io, int err, ssize_t pos) in fuse_aio_complete() argument
660 spin_lock(&io->lock); in fuse_aio_complete()
662 io->err = io->err ? : err; in fuse_aio_complete()
663 else if (pos >= 0 && (io->bytes < 0 || pos < io->bytes)) in fuse_aio_complete()
664 io->bytes = pos; in fuse_aio_complete()
666 left = --io->reqs; in fuse_aio_complete()
667 if (!left && io->blocking) in fuse_aio_complete()
668 complete(io->done); in fuse_aio_complete()
669 spin_unlock(&io->lock); in fuse_aio_complete()
671 if (!left && !io->blocking) { in fuse_aio_complete()
672 ssize_t res = fuse_get_res_by_io(io); in fuse_aio_complete()
675 struct inode *inode = file_inode(io->iocb->ki_filp); in fuse_aio_complete()
679 spin_lock(&fi->lock); in fuse_aio_complete()
680 fi->attr_version = atomic64_inc_return(&fc->attr_version); in fuse_aio_complete()
681 spin_unlock(&fi->lock); in fuse_aio_complete()
684 io->iocb->ki_complete(io->iocb, res, 0); in fuse_aio_complete()
687 kref_put(&io->refcnt, fuse_io_release); in fuse_aio_complete()
690 static struct fuse_io_args *fuse_io_alloc(struct fuse_io_priv *io, in fuse_io_alloc() argument
697 ia->io = io; in fuse_io_alloc()
698 ia->ap.pages = fuse_pages_alloc(npages, GFP_KERNEL, in fuse_io_alloc()
699 &ia->ap.descs); in fuse_io_alloc()
700 if (!ia->ap.pages) { in fuse_io_alloc()
710 kfree(ia->ap.pages); in fuse_io_free()
718 struct fuse_io_priv *io = ia->io; in fuse_aio_complete_req() local
719 ssize_t pos = -1; in fuse_aio_complete_req()
721 fuse_release_user_pages(&ia->ap, io->should_dirty); in fuse_aio_complete_req()
725 } else if (io->write) { in fuse_aio_complete_req()
726 if (ia->write.out.size > ia->write.in.size) { in fuse_aio_complete_req()
727 err = -EIO; in fuse_aio_complete_req()
728 } else if (ia->write.in.size != ia->write.out.size) { in fuse_aio_complete_req()
729 pos = ia->write.in.offset - io->offset + in fuse_aio_complete_req()
730 ia->write.out.size; in fuse_aio_complete_req()
733 u32 outsize = args->out_args[0].size; in fuse_aio_complete_req()
735 if (ia->read.in.size != outsize) in fuse_aio_complete_req()
736 pos = ia->read.in.offset - io->offset + outsize; in fuse_aio_complete_req()
739 fuse_aio_complete(io, err, pos); in fuse_aio_complete_req()
747 struct fuse_io_priv *io = ia->io; in fuse_async_req_send() local
749 spin_lock(&io->lock); in fuse_async_req_send()
750 kref_get(&io->refcnt); in fuse_async_req_send()
751 io->size += num_bytes; in fuse_async_req_send()
752 io->reqs++; in fuse_async_req_send()
753 spin_unlock(&io->lock); in fuse_async_req_send()
755 ia->ap.args.end = fuse_aio_complete_req; in fuse_async_req_send()
756 ia->ap.args.may_block = io->should_dirty; in fuse_async_req_send()
757 err = fuse_simple_background(fm, &ia->ap.args, GFP_KERNEL); in fuse_async_req_send()
759 fuse_aio_complete_req(fm, &ia->ap.args, err); in fuse_async_req_send()
767 struct file *file = ia->io->iocb->ki_filp; in fuse_send_read()
768 struct fuse_file *ff = file->private_data; in fuse_send_read()
769 struct fuse_mount *fm = ff->fm; in fuse_send_read()
773 ia->read.in.read_flags |= FUSE_READ_LOCKOWNER; in fuse_send_read()
774 ia->read.in.lock_owner = fuse_lock_owner_id(fm->fc, owner); in fuse_send_read()
777 if (ia->io->async) in fuse_send_read()
780 return fuse_simple_request(fm, &ia->ap.args); in fuse_send_read()
789 spin_lock(&fi->lock); in fuse_read_update_size()
790 if (attr_ver >= fi->attr_version && size < inode->i_size && in fuse_read_update_size()
791 !test_bit(FUSE_I_SIZE_UNSTABLE, &fi->state)) { in fuse_read_update_size()
792 fi->attr_version = atomic64_inc_return(&fc->attr_version); in fuse_read_update_size()
795 spin_unlock(&fi->lock); in fuse_read_update_size()
803 if (fc->writeback_cache) { in fuse_short_read()
811 size_t off = num_read & (PAGE_SIZE - 1); in fuse_short_read()
813 for (i = start_idx; i < ap->num_pages; i++) { in fuse_short_read()
814 zero_user_segment(ap->pages[i], off, PAGE_SIZE); in fuse_short_read()
818 loff_t pos = page_offset(ap->pages[0]) + num_read; in fuse_short_read()
825 struct inode *inode = page->mapping->host; in fuse_do_readpage()
841 * page-cache page, so make sure we read a properly synced in fuse_do_readpage()
844 fuse_wait_on_page_writeback(inode, page->index); in fuse_do_readpage()
846 attr_ver = fuse_get_attr_version(fm->fc); in fuse_do_readpage()
849 if (pos + (desc.length - 1) == LLONG_MAX) in fuse_do_readpage()
850 desc.length--; in fuse_do_readpage()
869 struct inode *inode = page->mapping->host; in fuse_readpage()
872 err = -EIO; in fuse_readpage()
888 struct fuse_args_pages *ap = &ia->ap; in fuse_readpages_end()
889 size_t count = ia->read.in.size; in fuse_readpages_end()
890 size_t num_read = args->out_args[0].size; in fuse_readpages_end()
893 for (i = 0; mapping == NULL && i < ap->num_pages; i++) in fuse_readpages_end()
894 mapping = ap->pages[i]->mapping; in fuse_readpages_end()
897 struct inode *inode = mapping->host; in fuse_readpages_end()
903 fuse_short_read(inode, ia->read.attr_ver, num_read, ap); in fuse_readpages_end()
908 for (i = 0; i < ap->num_pages; i++) { in fuse_readpages_end()
909 struct page *page = ap->pages[i]; in fuse_readpages_end()
918 if (ia->ff) in fuse_readpages_end()
919 fuse_file_put(ia->ff, false, false); in fuse_readpages_end()
926 struct fuse_file *ff = file->private_data; in fuse_send_readpages()
927 struct fuse_mount *fm = ff->fm; in fuse_send_readpages()
928 struct fuse_args_pages *ap = &ia->ap; in fuse_send_readpages()
929 loff_t pos = page_offset(ap->pages[0]); in fuse_send_readpages()
930 size_t count = ap->num_pages << PAGE_SHIFT; in fuse_send_readpages()
934 ap->args.out_pages = true; in fuse_send_readpages()
935 ap->args.page_zeroing = true; in fuse_send_readpages()
936 ap->args.page_replace = true; in fuse_send_readpages()
939 if (pos + (count - 1) == LLONG_MAX) { in fuse_send_readpages()
940 count--; in fuse_send_readpages()
941 ap->descs[ap->num_pages - 1].length--; in fuse_send_readpages()
946 ia->read.attr_ver = fuse_get_attr_version(fm->fc); in fuse_send_readpages()
947 if (fm->fc->async_read) { in fuse_send_readpages()
948 ia->ff = fuse_file_get(ff); in fuse_send_readpages()
949 ap->args.end = fuse_readpages_end; in fuse_send_readpages()
950 err = fuse_simple_background(fm, &ap->args, GFP_KERNEL); in fuse_send_readpages()
954 res = fuse_simple_request(fm, &ap->args); in fuse_send_readpages()
957 fuse_readpages_end(fm, &ap->args, err); in fuse_send_readpages()
962 struct inode *inode = rac->mapping->host; in fuse_readahead()
969 max_pages = min_t(unsigned int, fc->max_pages, in fuse_readahead()
970 fc->max_read / PAGE_SIZE); in fuse_readahead()
976 nr_pages = readahead_count(rac) - nr_pages; in fuse_readahead()
984 ap = &ia->ap; in fuse_readahead()
985 nr_pages = __readahead_batch(rac, ap->pages, nr_pages); in fuse_readahead()
989 ap->descs[i].length = PAGE_SIZE; in fuse_readahead()
991 ap->num_pages = nr_pages; in fuse_readahead()
992 fuse_send_readpages(ia, rac->file); in fuse_readahead()
998 struct inode *inode = iocb->ki_filp->f_mapping->host; in fuse_cache_read_iter()
1006 if (fc->auto_inval_data || in fuse_cache_read_iter()
1007 (iocb->ki_pos + iov_iter_count(to) > i_size_read(inode))) { in fuse_cache_read_iter()
1009 err = fuse_update_attributes(inode, iocb->ki_filp); in fuse_cache_read_iter()
1020 struct fuse_args *args = &ia->ap.args; in fuse_write_args_fill()
1022 ia->write.in.fh = ff->fh; in fuse_write_args_fill()
1023 ia->write.in.offset = pos; in fuse_write_args_fill()
1024 ia->write.in.size = count; in fuse_write_args_fill()
1025 args->opcode = FUSE_WRITE; in fuse_write_args_fill()
1026 args->nodeid = ff->nodeid; in fuse_write_args_fill()
1027 args->in_numargs = 2; in fuse_write_args_fill()
1028 if (ff->fm->fc->minor < 9) in fuse_write_args_fill()
1029 args->in_args[0].size = FUSE_COMPAT_WRITE_IN_SIZE; in fuse_write_args_fill()
1031 args->in_args[0].size = sizeof(ia->write.in); in fuse_write_args_fill()
1032 args->in_args[0].value = &ia->write.in; in fuse_write_args_fill()
1033 args->in_args[1].size = count; in fuse_write_args_fill()
1034 args->out_numargs = 1; in fuse_write_args_fill()
1035 args->out_args[0].size = sizeof(ia->write.out); in fuse_write_args_fill()
1036 args->out_args[0].value = &ia->write.out; in fuse_write_args_fill()
1041 unsigned int flags = iocb->ki_filp->f_flags; in fuse_write_flags()
1043 if (iocb->ki_flags & IOCB_DSYNC) in fuse_write_flags()
1045 if (iocb->ki_flags & IOCB_SYNC) in fuse_write_flags()
1054 struct kiocb *iocb = ia->io->iocb; in fuse_send_write()
1055 struct file *file = iocb->ki_filp; in fuse_send_write()
1056 struct fuse_file *ff = file->private_data; in fuse_send_write()
1057 struct fuse_mount *fm = ff->fm; in fuse_send_write()
1058 struct fuse_write_in *inarg = &ia->write.in; in fuse_send_write()
1062 inarg->flags = fuse_write_flags(iocb); in fuse_send_write()
1064 inarg->write_flags |= FUSE_WRITE_LOCKOWNER; in fuse_send_write()
1065 inarg->lock_owner = fuse_lock_owner_id(fm->fc, owner); in fuse_send_write()
1068 if (ia->io->async) in fuse_send_write()
1071 err = fuse_simple_request(fm, &ia->ap.args); in fuse_send_write()
1072 if (!err && ia->write.out.size > count) in fuse_send_write()
1073 err = -EIO; in fuse_send_write()
1075 return err ?: ia->write.out.size; in fuse_send_write()
1084 spin_lock(&fi->lock); in fuse_write_update_size()
1085 fi->attr_version = atomic64_inc_return(&fc->attr_version); in fuse_write_update_size()
1086 if (pos > inode->i_size) { in fuse_write_update_size()
1090 spin_unlock(&fi->lock); in fuse_write_update_size()
1099 struct fuse_args_pages *ap = &ia->ap; in fuse_send_write_pages()
1100 struct file *file = iocb->ki_filp; in fuse_send_write_pages()
1101 struct fuse_file *ff = file->private_data; in fuse_send_write_pages()
1102 struct fuse_mount *fm = ff->fm; in fuse_send_write_pages()
1107 for (i = 0; i < ap->num_pages; i++) in fuse_send_write_pages()
1108 fuse_wait_on_page_writeback(inode, ap->pages[i]->index); in fuse_send_write_pages()
1111 ia->write.in.flags = fuse_write_flags(iocb); in fuse_send_write_pages()
1113 err = fuse_simple_request(fm, &ap->args); in fuse_send_write_pages()
1114 if (!err && ia->write.out.size > count) in fuse_send_write_pages()
1115 err = -EIO; in fuse_send_write_pages()
1117 short_write = ia->write.out.size < count; in fuse_send_write_pages()
1118 offset = ap->descs[0].offset; in fuse_send_write_pages()
1119 count = ia->write.out.size; in fuse_send_write_pages()
1120 for (i = 0; i < ap->num_pages; i++) { in fuse_send_write_pages()
1121 struct page *page = ap->pages[i]; in fuse_send_write_pages()
1126 if (count >= PAGE_SIZE - offset) in fuse_send_write_pages()
1127 count -= PAGE_SIZE - offset; in fuse_send_write_pages()
1135 if (ia->write.page_locked && (i == ap->num_pages - 1)) in fuse_send_write_pages()
1148 struct fuse_args_pages *ap = &ia->ap; in fuse_fill_write_pages()
1149 struct fuse_conn *fc = get_fuse_conn(mapping->host); in fuse_fill_write_pages()
1150 unsigned offset = pos & (PAGE_SIZE - 1); in fuse_fill_write_pages()
1154 ap->args.in_pages = true; in fuse_fill_write_pages()
1155 ap->descs[0].offset = offset; in fuse_fill_write_pages()
1161 size_t bytes = min_t(size_t, PAGE_SIZE - offset, in fuse_fill_write_pages()
1164 bytes = min_t(size_t, bytes, fc->max_write - count); in fuse_fill_write_pages()
1167 err = -EFAULT; in fuse_fill_write_pages()
1171 err = -ENOMEM; in fuse_fill_write_pages()
1191 ap->pages[ap->num_pages] = page; in fuse_fill_write_pages()
1192 ap->descs[ap->num_pages].length = tmp; in fuse_fill_write_pages()
1193 ap->num_pages++; in fuse_fill_write_pages()
1208 ia->write.page_locked = true; in fuse_fill_write_pages()
1211 if (!fc->big_writes) in fuse_fill_write_pages()
1213 } while (iov_iter_count(ii) && count < fc->max_write && in fuse_fill_write_pages()
1214 ap->num_pages < max_pages && offset == 0); in fuse_fill_write_pages()
1223 ((pos + len - 1) >> PAGE_SHIFT) - in fuse_wr_pages()
1232 struct inode *inode = mapping->host; in fuse_perform_write()
1238 if (inode->i_size < pos + iov_iter_count(ii)) in fuse_perform_write()
1239 set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); in fuse_perform_write()
1246 fc->max_pages); in fuse_perform_write()
1248 ap->pages = fuse_pages_alloc(nr_pages, GFP_KERNEL, &ap->descs); in fuse_perform_write()
1249 if (!ap->pages) { in fuse_perform_write()
1250 err = -ENOMEM; in fuse_perform_write()
1268 err = -EIO; in fuse_perform_write()
1271 kfree(ap->pages); in fuse_perform_write()
1277 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); in fuse_perform_write()
1285 struct file *file = iocb->ki_filp; in fuse_cache_write_iter()
1286 struct address_space *mapping = file->f_mapping; in fuse_cache_write_iter()
1289 struct inode *inode = mapping->host; in fuse_cache_write_iter()
1293 if (get_fuse_conn(inode)->writeback_cache) { in fuse_cache_write_iter()
1295 err = fuse_update_attributes(mapping->host, file); in fuse_cache_write_iter()
1305 current->backing_dev_info = inode_to_bdi(inode); in fuse_cache_write_iter()
1319 if (iocb->ki_flags & IOCB_DIRECT) { in fuse_cache_write_iter()
1320 loff_t pos = iocb->ki_pos; in fuse_cache_write_iter()
1332 endbyte = pos + written_buffered - 1; in fuse_cache_write_iter()
1334 err = filemap_write_and_wait_range(file->f_mapping, pos, in fuse_cache_write_iter()
1339 invalidate_mapping_pages(file->f_mapping, in fuse_cache_write_iter()
1344 iocb->ki_pos = pos + written_buffered; in fuse_cache_write_iter()
1346 written = fuse_perform_write(iocb, mapping, from, iocb->ki_pos); in fuse_cache_write_iter()
1348 iocb->ki_pos += written; in fuse_cache_write_iter()
1351 current->backing_dev_info = NULL; in fuse_cache_write_iter()
1366 descs[i].length = PAGE_SIZE - descs[i].offset; in fuse_page_descs_length_init()
1371 return (unsigned long)ii->iov->iov_base + ii->iov_offset; in fuse_get_user_addr()
1393 ap->args.in_args[1].value = (void *) user_addr; in fuse_get_user_pages()
1395 ap->args.out_args[0].value = (void *) user_addr; in fuse_get_user_pages()
1402 while (nbytes < *nbytesp && ap->num_pages < max_pages) { in fuse_get_user_pages()
1405 ret = iov_iter_get_pages(ii, &ap->pages[ap->num_pages], in fuse_get_user_pages()
1406 *nbytesp - nbytes, in fuse_get_user_pages()
1407 max_pages - ap->num_pages, in fuse_get_user_pages()
1416 npages = (ret + PAGE_SIZE - 1) / PAGE_SIZE; in fuse_get_user_pages()
1418 ap->descs[ap->num_pages].offset = start; in fuse_get_user_pages()
1419 fuse_page_descs_length_init(ap->descs, ap->num_pages, npages); in fuse_get_user_pages()
1421 ap->num_pages += npages; in fuse_get_user_pages()
1422 ap->descs[ap->num_pages - 1].length -= in fuse_get_user_pages()
1423 (PAGE_SIZE - ret) & (PAGE_SIZE - 1); in fuse_get_user_pages()
1426 ap->args.user_pages = true; in fuse_get_user_pages()
1428 ap->args.in_pages = true; in fuse_get_user_pages()
1430 ap->args.out_pages = true; in fuse_get_user_pages()
1437 ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter, in fuse_direct_io() argument
1442 struct file *file = io->iocb->ki_filp; in fuse_direct_io()
1443 struct inode *inode = file->f_mapping->host; in fuse_direct_io()
1444 struct fuse_file *ff = file->private_data; in fuse_direct_io()
1445 struct fuse_conn *fc = ff->fm->fc; in fuse_direct_io()
1446 size_t nmax = write ? fc->max_write : fc->max_read; in fuse_direct_io()
1450 pgoff_t idx_to = (pos + count - 1) >> PAGE_SHIFT; in fuse_direct_io()
1456 max_pages = iov_iter_npages(iter, fc->max_pages); in fuse_direct_io()
1457 ia = fuse_io_alloc(io, max_pages); in fuse_direct_io()
1459 return -ENOMEM; in fuse_direct_io()
1461 ia->io = io; in fuse_direct_io()
1470 io->should_dirty = !write && iter_is_iovec(iter); in fuse_direct_io()
1473 fl_owner_t owner = current->files; in fuse_direct_io()
1476 err = fuse_get_user_pages(&ia->ap, iter, &nbytes, write, in fuse_direct_io()
1483 ia->write.in.write_flags |= FUSE_WRITE_KILL_PRIV; in fuse_direct_io()
1490 if (!io->async || nres < 0) { in fuse_direct_io()
1491 fuse_release_user_pages(&ia->ap, io->should_dirty); in fuse_direct_io()
1502 count -= nres; in fuse_direct_io()
1506 iov_iter_revert(iter, nbytes - nres); in fuse_direct_io()
1510 max_pages = iov_iter_npages(iter, fc->max_pages); in fuse_direct_io()
1511 ia = fuse_io_alloc(io, max_pages); in fuse_direct_io()
1525 static ssize_t __fuse_direct_read(struct fuse_io_priv *io, in __fuse_direct_read() argument
1530 struct inode *inode = file_inode(io->iocb->ki_filp); in __fuse_direct_read()
1532 res = fuse_direct_io(io, iter, ppos, 0); in __fuse_direct_read()
1545 if (!is_sync_kiocb(iocb) && iocb->ki_flags & IOCB_DIRECT) { in fuse_direct_read_iter()
1548 struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb); in fuse_direct_read_iter() local
1550 res = __fuse_direct_read(&io, to, &iocb->ki_pos); in fuse_direct_read_iter()
1558 struct inode *inode = file_inode(iocb->ki_filp); in fuse_direct_write_iter()
1559 struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb); in fuse_direct_write_iter() local
1566 if (!is_sync_kiocb(iocb) && iocb->ki_flags & IOCB_DIRECT) { in fuse_direct_write_iter()
1569 res = fuse_direct_io(&io, from, &iocb->ki_pos, in fuse_direct_write_iter()
1575 fuse_write_update_size(inode, iocb->ki_pos); in fuse_direct_write_iter()
1583 struct file *file = iocb->ki_filp; in fuse_file_read_iter()
1584 struct fuse_file *ff = file->private_data; in fuse_file_read_iter()
1588 return -EIO; in fuse_file_read_iter()
1593 if (!(ff->open_flags & FOPEN_DIRECT_IO)) in fuse_file_read_iter()
1601 struct file *file = iocb->ki_filp; in fuse_file_write_iter()
1602 struct fuse_file *ff = file->private_data; in fuse_file_write_iter()
1606 return -EIO; in fuse_file_write_iter()
1611 if (!(ff->open_flags & FOPEN_DIRECT_IO)) in fuse_file_write_iter()
1619 struct fuse_args_pages *ap = &wpa->ia.ap; in fuse_writepage_free()
1622 for (i = 0; i < ap->num_pages; i++) in fuse_writepage_free()
1623 __free_page(ap->pages[i]); in fuse_writepage_free()
1625 if (wpa->ia.ff) in fuse_writepage_free()
1626 fuse_file_put(wpa->ia.ff, false, false); in fuse_writepage_free()
1628 kfree(ap->pages); in fuse_writepage_free()
1635 struct fuse_args_pages *ap = &wpa->ia.ap; in fuse_writepage_finish()
1636 struct inode *inode = wpa->inode; in fuse_writepage_finish()
1641 for (i = 0; i < ap->num_pages; i++) { in fuse_writepage_finish()
1642 dec_wb_stat(&bdi->wb, WB_WRITEBACK); in fuse_writepage_finish()
1643 dec_node_page_state(ap->pages[i], NR_WRITEBACK_TEMP); in fuse_writepage_finish()
1644 wb_writeout_inc(&bdi->wb); in fuse_writepage_finish()
1646 wake_up(&fi->page_waitq); in fuse_writepage_finish()
1649 /* Called under fi->lock, may release and reacquire it */
1652 __releases(fi->lock) in fuse_send_writepage()
1653 __acquires(fi->lock) in fuse_send_writepage()
1656 struct fuse_inode *fi = get_fuse_inode(wpa->inode); in fuse_send_writepage()
1657 struct fuse_write_in *inarg = &wpa->ia.write.in; in fuse_send_writepage()
1658 struct fuse_args *args = &wpa->ia.ap.args; in fuse_send_writepage()
1659 __u64 data_size = wpa->ia.ap.num_pages * PAGE_SIZE; in fuse_send_writepage()
1662 fi->writectr++; in fuse_send_writepage()
1663 if (inarg->offset + data_size <= size) { in fuse_send_writepage()
1664 inarg->size = data_size; in fuse_send_writepage()
1665 } else if (inarg->offset < size) { in fuse_send_writepage()
1666 inarg->size = size - inarg->offset; in fuse_send_writepage()
1672 args->in_args[1].size = inarg->size; in fuse_send_writepage()
1673 args->force = true; in fuse_send_writepage()
1674 args->nocreds = true; in fuse_send_writepage()
1677 if (err == -ENOMEM) { in fuse_send_writepage()
1678 spin_unlock(&fi->lock); in fuse_send_writepage()
1680 spin_lock(&fi->lock); in fuse_send_writepage()
1690 fi->writectr--; in fuse_send_writepage()
1691 rb_erase(&wpa->writepages_entry, &fi->writepages); in fuse_send_writepage()
1693 spin_unlock(&fi->lock); in fuse_send_writepage()
1696 for (aux = wpa->next; aux; aux = next) { in fuse_send_writepage()
1697 next = aux->next; in fuse_send_writepage()
1698 aux->next = NULL; in fuse_send_writepage()
1703 spin_lock(&fi->lock); in fuse_send_writepage()
1707 * If fi->writectr is positive (no truncate or fsync going on) send
1710 * Called with fi->lock
1713 __releases(fi->lock) in fuse_flush_writepages()
1714 __acquires(fi->lock) in fuse_flush_writepages()
1721 while (fi->writectr >= 0 && !list_empty(&fi->queued_writes)) { in fuse_flush_writepages()
1722 wpa = list_entry(fi->queued_writes.next, in fuse_flush_writepages()
1724 list_del_init(&wpa->queue_entry); in fuse_flush_writepages()
1732 pgoff_t idx_from = wpa->ia.write.in.offset >> PAGE_SHIFT; in fuse_insert_writeback()
1733 pgoff_t idx_to = idx_from + wpa->ia.ap.num_pages - 1; in fuse_insert_writeback()
1734 struct rb_node **p = &root->rb_node; in fuse_insert_writeback()
1737 WARN_ON(!wpa->ia.ap.num_pages); in fuse_insert_writeback()
1745 WARN_ON(curr->inode != wpa->inode); in fuse_insert_writeback()
1746 curr_index = curr->ia.write.in.offset >> PAGE_SHIFT; in fuse_insert_writeback()
1748 if (idx_from >= curr_index + curr->ia.ap.num_pages) in fuse_insert_writeback()
1749 p = &(*p)->rb_right; in fuse_insert_writeback()
1751 p = &(*p)->rb_left; in fuse_insert_writeback()
1756 rb_link_node(&wpa->writepages_entry, parent, p); in fuse_insert_writeback()
1757 rb_insert_color(&wpa->writepages_entry, root); in fuse_insert_writeback()
1771 struct inode *inode = wpa->inode; in fuse_writepage_end()
1775 mapping_set_error(inode->i_mapping, error); in fuse_writepage_end()
1782 if (!fc->writeback_cache) in fuse_writepage_end()
1784 spin_lock(&fi->lock); in fuse_writepage_end()
1785 rb_erase(&wpa->writepages_entry, &fi->writepages); in fuse_writepage_end()
1786 while (wpa->next) { in fuse_writepage_end()
1788 struct fuse_write_in *inarg = &wpa->ia.write.in; in fuse_writepage_end()
1789 struct fuse_writepage_args *next = wpa->next; in fuse_writepage_end()
1791 wpa->next = next->next; in fuse_writepage_end()
1792 next->next = NULL; in fuse_writepage_end()
1793 next->ia.ff = fuse_file_get(wpa->ia.ff); in fuse_writepage_end()
1794 tree_insert(&fi->writepages, next); in fuse_writepage_end()
1806 * now for completion of all in-flight requests. This happens in fuse_writepage_end()
1812 * that fuse_set_nowrite returned implies that all in-flight in fuse_writepage_end()
1815 * writectr. Hence there cannot be any in-flight requests and in fuse_writepage_end()
1819 fuse_send_writepage(fm, next, inarg->offset + inarg->size); in fuse_writepage_end()
1821 fi->writectr--; in fuse_writepage_end()
1823 spin_unlock(&fi->lock); in fuse_writepage_end()
1832 spin_lock(&fi->lock); in __fuse_write_file_get()
1833 if (!list_empty(&fi->write_files)) { in __fuse_write_file_get()
1834 ff = list_entry(fi->write_files.next, struct fuse_file, in __fuse_write_file_get()
1838 spin_unlock(&fi->lock); in __fuse_write_file_get()
1867 WARN_ON(wbc->for_reclaim); in fuse_write_inode()
1884 ap = &wpa->ia.ap; in fuse_writepage_args_alloc()
1885 ap->num_pages = 0; in fuse_writepage_args_alloc()
1886 ap->pages = fuse_pages_alloc(1, GFP_NOFS, &ap->descs); in fuse_writepage_args_alloc()
1887 if (!ap->pages) { in fuse_writepage_args_alloc()
1898 struct address_space *mapping = page->mapping; in fuse_writepage_locked()
1899 struct inode *inode = mapping->host; in fuse_writepage_locked()
1905 int error = -ENOMEM; in fuse_writepage_locked()
1912 ap = &wpa->ia.ap; in fuse_writepage_locked()
1918 error = -EIO; in fuse_writepage_locked()
1919 wpa->ia.ff = fuse_write_file_get(fc, fi); in fuse_writepage_locked()
1920 if (!wpa->ia.ff) in fuse_writepage_locked()
1923 fuse_write_args_fill(&wpa->ia, wpa->ia.ff, page_offset(page), 0); in fuse_writepage_locked()
1926 wpa->ia.write.in.write_flags |= FUSE_WRITE_CACHE; in fuse_writepage_locked()
1927 wpa->next = NULL; in fuse_writepage_locked()
1928 ap->args.in_pages = true; in fuse_writepage_locked()
1929 ap->num_pages = 1; in fuse_writepage_locked()
1930 ap->pages[0] = tmp_page; in fuse_writepage_locked()
1931 ap->descs[0].offset = 0; in fuse_writepage_locked()
1932 ap->descs[0].length = PAGE_SIZE; in fuse_writepage_locked()
1933 ap->args.end = fuse_writepage_end; in fuse_writepage_locked()
1934 wpa->inode = inode; in fuse_writepage_locked()
1936 inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK); in fuse_writepage_locked()
1939 spin_lock(&fi->lock); in fuse_writepage_locked()
1940 tree_insert(&fi->writepages, wpa); in fuse_writepage_locked()
1941 list_add_tail(&wpa->queue_entry, &fi->queued_writes); in fuse_writepage_locked()
1943 spin_unlock(&fi->lock); in fuse_writepage_locked()
1954 mapping_set_error(page->mapping, error); in fuse_writepage_locked()
1963 if (fuse_page_is_writeback(page->mapping->host, page->index)) { in fuse_writepage()
1965 * ->writepages() should be called for sync() and friends. We in fuse_writepage()
1969 WARN_ON(wbc->sync_mode == WB_SYNC_ALL); in fuse_writepage()
1992 struct fuse_args_pages *ap = &data->wpa->ia.ap; in fuse_pages_realloc()
1993 struct fuse_conn *fc = get_fuse_conn(data->inode); in fuse_pages_realloc()
1997 max_t(unsigned int, data->max_pages * 2, in fuse_pages_realloc()
1999 fc->max_pages); in fuse_pages_realloc()
2000 WARN_ON(npages <= data->max_pages); in fuse_pages_realloc()
2006 memcpy(pages, ap->pages, sizeof(struct page *) * ap->num_pages); in fuse_pages_realloc()
2007 memcpy(descs, ap->descs, sizeof(struct fuse_page_desc) * ap->num_pages); in fuse_pages_realloc()
2008 kfree(ap->pages); in fuse_pages_realloc()
2009 ap->pages = pages; in fuse_pages_realloc()
2010 ap->descs = descs; in fuse_pages_realloc()
2011 data->max_pages = npages; in fuse_pages_realloc()
2018 struct fuse_writepage_args *wpa = data->wpa; in fuse_writepages_send()
2019 struct inode *inode = data->inode; in fuse_writepages_send()
2021 int num_pages = wpa->ia.ap.num_pages; in fuse_writepages_send()
2024 wpa->ia.ff = fuse_file_get(data->ff); in fuse_writepages_send()
2025 spin_lock(&fi->lock); in fuse_writepages_send()
2026 list_add_tail(&wpa->queue_entry, &fi->queued_writes); in fuse_writepages_send()
2028 spin_unlock(&fi->lock); in fuse_writepages_send()
2031 end_page_writeback(data->orig_pages[i]); in fuse_writepages_send()
2035 * Check under fi->lock if the page is under writeback, and insert it onto the
2044 struct fuse_inode *fi = get_fuse_inode(new_wpa->inode); in fuse_writepage_add()
2047 struct fuse_args_pages *new_ap = &new_wpa->ia.ap; in fuse_writepage_add()
2049 WARN_ON(new_ap->num_pages != 0); in fuse_writepage_add()
2050 new_ap->num_pages = 1; in fuse_writepage_add()
2052 spin_lock(&fi->lock); in fuse_writepage_add()
2053 old_wpa = fuse_insert_writeback(&fi->writepages, new_wpa); in fuse_writepage_add()
2055 spin_unlock(&fi->lock); in fuse_writepage_add()
2059 for (tmp = old_wpa->next; tmp; tmp = tmp->next) { in fuse_writepage_add()
2062 WARN_ON(tmp->inode != new_wpa->inode); in fuse_writepage_add()
2063 curr_index = tmp->ia.write.in.offset >> PAGE_SHIFT; in fuse_writepage_add()
2064 if (curr_index == page->index) { in fuse_writepage_add()
2065 WARN_ON(tmp->ia.ap.num_pages != 1); in fuse_writepage_add()
2066 swap(tmp->ia.ap.pages[0], new_ap->pages[0]); in fuse_writepage_add()
2072 new_wpa->next = old_wpa->next; in fuse_writepage_add()
2073 old_wpa->next = new_wpa; in fuse_writepage_add()
2076 spin_unlock(&fi->lock); in fuse_writepage_add()
2079 struct backing_dev_info *bdi = inode_to_bdi(new_wpa->inode); in fuse_writepage_add()
2081 dec_wb_stat(&bdi->wb, WB_WRITEBACK); in fuse_writepage_add()
2082 dec_node_page_state(new_ap->pages[0], NR_WRITEBACK_TEMP); in fuse_writepage_add()
2083 wb_writeout_inc(&bdi->wb); in fuse_writepage_add()
2094 WARN_ON(!ap->num_pages); in fuse_writepage_need_send()
2102 if (fuse_page_is_writeback(data->inode, page->index)) in fuse_writepage_need_send()
2106 if (ap->num_pages == fc->max_pages) in fuse_writepage_need_send()
2110 if ((ap->num_pages + 1) * PAGE_SIZE > fc->max_write) in fuse_writepage_need_send()
2114 if (data->orig_pages[ap->num_pages - 1]->index + 1 != page->index) in fuse_writepage_need_send()
2118 if (ap->num_pages == data->max_pages && !fuse_pages_realloc(data)) in fuse_writepage_need_send()
2128 struct fuse_writepage_args *wpa = data->wpa; in fuse_writepages_fill()
2129 struct fuse_args_pages *ap = &wpa->ia.ap; in fuse_writepages_fill()
2130 struct inode *inode = data->inode; in fuse_writepages_fill()
2136 if (!data->ff) { in fuse_writepages_fill()
2137 err = -EIO; in fuse_writepages_fill()
2138 data->ff = fuse_write_file_get(fc, fi); in fuse_writepages_fill()
2139 if (!data->ff) in fuse_writepages_fill()
2145 data->wpa = NULL; in fuse_writepages_fill()
2148 err = -ENOMEM; in fuse_writepages_fill()
2162 * request to the fi->writepages list and increment ap->num_pages. in fuse_writepages_fill()
2166 if (data->wpa == NULL) { in fuse_writepages_fill()
2167 err = -ENOMEM; in fuse_writepages_fill()
2173 data->max_pages = 1; in fuse_writepages_fill()
2175 ap = &wpa->ia.ap; in fuse_writepages_fill()
2176 fuse_write_args_fill(&wpa->ia, data->ff, page_offset(page), 0); in fuse_writepages_fill()
2177 wpa->ia.write.in.write_flags |= FUSE_WRITE_CACHE; in fuse_writepages_fill()
2178 wpa->next = NULL; in fuse_writepages_fill()
2179 ap->args.in_pages = true; in fuse_writepages_fill()
2180 ap->args.end = fuse_writepage_end; in fuse_writepages_fill()
2181 ap->num_pages = 0; in fuse_writepages_fill()
2182 wpa->inode = inode; in fuse_writepages_fill()
2187 ap->pages[ap->num_pages] = tmp_page; in fuse_writepages_fill()
2188 ap->descs[ap->num_pages].offset = 0; in fuse_writepages_fill()
2189 ap->descs[ap->num_pages].length = PAGE_SIZE; in fuse_writepages_fill()
2190 data->orig_pages[ap->num_pages] = page; in fuse_writepages_fill()
2192 inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK); in fuse_writepages_fill()
2196 if (data->wpa) { in fuse_writepages_fill()
2198 * Protected by fi->lock against concurrent access by in fuse_writepages_fill()
2201 spin_lock(&fi->lock); in fuse_writepages_fill()
2202 ap->num_pages++; in fuse_writepages_fill()
2203 spin_unlock(&fi->lock); in fuse_writepages_fill()
2205 data->wpa = wpa; in fuse_writepages_fill()
2218 struct inode *inode = mapping->host; in fuse_writepages()
2223 err = -EIO; in fuse_writepages()
2231 err = -ENOMEM; in fuse_writepages()
2232 data.orig_pages = kcalloc(fc->max_pages, in fuse_writepages()
2240 WARN_ON(!data.wpa->ia.ap.num_pages); in fuse_writepages()
2263 int err = -ENOMEM; in fuse_write_begin()
2265 WARN_ON(!fc->writeback_cache); in fuse_write_begin()
2271 fuse_wait_on_page_writeback(mapping->host, page->index); in fuse_write_begin()
2279 fsize = i_size_read(mapping->host); in fuse_write_begin()
2304 struct inode *inode = page->mapping->host; in fuse_write_end()
2332 struct inode *inode = page->mapping->host; in fuse_launder_page()
2335 fuse_wait_on_page_writeback(inode, page->index); in fuse_launder_page()
2346 filemap_write_and_wait(vma->vm_file->f_mapping); in fuse_vma_close()
2354 * Block here, instead of in ->writepage(), so that the userspace fs
2360 * - page migration
2361 * - sync(2)
2362 * - try_to_free_pages() with order > PAGE_ALLOC_COSTLY_ORDER
2366 struct page *page = vmf->page; in fuse_page_mkwrite()
2367 struct inode *inode = file_inode(vmf->vma->vm_file); in fuse_page_mkwrite()
2369 file_update_time(vmf->vma->vm_file); in fuse_page_mkwrite()
2371 if (page->mapping != inode->i_mapping) { in fuse_page_mkwrite()
2376 fuse_wait_on_page_writeback(inode, page->index); in fuse_page_mkwrite()
2389 struct fuse_file *ff = file->private_data; in fuse_file_mmap()
2395 if (ff->open_flags & FOPEN_DIRECT_IO) { in fuse_file_mmap()
2397 if (vma->vm_flags & VM_MAYSHARE) in fuse_file_mmap()
2398 return -ENODEV; in fuse_file_mmap()
2400 invalidate_inode_pages2(file->f_mapping); in fuse_file_mmap()
2405 if ((vma->vm_flags & VM_SHARED) && (vma->vm_flags & VM_MAYWRITE)) in fuse_file_mmap()
2409 vma->vm_ops = &fuse_file_vm_ops; in fuse_file_mmap()
2417 switch (ffl->type) { in convert_fuse_file_lock()
2423 if (ffl->start > OFFSET_MAX || ffl->end > OFFSET_MAX || in convert_fuse_file_lock()
2424 ffl->end < ffl->start) in convert_fuse_file_lock()
2425 return -EIO; in convert_fuse_file_lock()
2427 fl->fl_start = ffl->start; in convert_fuse_file_lock()
2428 fl->fl_end = ffl->end; in convert_fuse_file_lock()
2435 fl->fl_pid = pid_nr_ns(find_pid_ns(ffl->pid, fc->pid_ns), &init_pid_ns); in convert_fuse_file_lock()
2440 return -EIO; in convert_fuse_file_lock()
2442 fl->fl_type = ffl->type; in convert_fuse_file_lock()
2452 struct fuse_file *ff = file->private_data; in fuse_lk_fill()
2455 inarg->fh = ff->fh; in fuse_lk_fill()
2456 inarg->owner = fuse_lock_owner_id(fc, fl->fl_owner); in fuse_lk_fill()
2457 inarg->lk.start = fl->fl_start; in fuse_lk_fill()
2458 inarg->lk.end = fl->fl_end; in fuse_lk_fill()
2459 inarg->lk.type = fl->fl_type; in fuse_lk_fill()
2460 inarg->lk.pid = pid; in fuse_lk_fill()
2462 inarg->lk_flags |= FUSE_LK_FLOCK; in fuse_lk_fill()
2463 args->opcode = opcode; in fuse_lk_fill()
2464 args->nodeid = get_node_id(inode); in fuse_lk_fill()
2465 args->in_numargs = 1; in fuse_lk_fill()
2466 args->in_args[0].size = sizeof(*inarg); in fuse_lk_fill()
2467 args->in_args[0].value = inarg; in fuse_lk_fill()
2485 err = convert_fuse_file_lock(fm->fc, &outarg.lk, fl); in fuse_getlk()
2496 int opcode = (fl->fl_flags & FL_SLEEP) ? FUSE_SETLKW : FUSE_SETLK; in fuse_setlk()
2497 struct pid *pid = fl->fl_type != F_UNLCK ? task_tgid(current) : NULL; in fuse_setlk()
2498 pid_t pid_nr = pid_nr_ns(pid, fm->fc->pid_ns); in fuse_setlk()
2501 if (fl->fl_lmops && fl->fl_lmops->lm_grant) { in fuse_setlk()
2503 return -ENOLCK; in fuse_setlk()
2507 if ((fl->fl_flags & FL_CLOSE_POSIX) == FL_CLOSE_POSIX) in fuse_setlk()
2514 if (err == -EINTR) in fuse_setlk()
2515 err = -ERESTARTSYS; in fuse_setlk()
2529 if (fc->no_lock) { in fuse_file_lock()
2535 if (fc->no_lock) in fuse_file_lock()
2549 if (fc->no_flock) { in fuse_file_flock()
2552 struct fuse_file *ff = file->private_data; in fuse_file_flock()
2555 ff->flock = true; in fuse_file_flock()
2564 struct inode *inode = mapping->host; in fuse_bmap()
2571 if (!inode->i_sb->s_bdev || fm->fc->no_bmap) in fuse_bmap()
2576 inarg.blocksize = inode->i_sb->s_blocksize; in fuse_bmap()
2586 if (err == -ENOSYS) in fuse_bmap()
2587 fm->fc->no_bmap = 1; in fuse_bmap()
2594 struct inode *inode = file->f_mapping->host; in fuse_lseek()
2596 struct fuse_file *ff = file->private_data; in fuse_lseek()
2599 .fh = ff->fh, in fuse_lseek()
2606 if (fm->fc->no_lseek) in fuse_lseek()
2610 args.nodeid = ff->nodeid; in fuse_lseek()
2619 if (err == -ENOSYS) { in fuse_lseek()
2620 fm->fc->no_lseek = 1; in fuse_lseek()
2626 return vfs_setpos(file, outarg.offset, inode->i_sb->s_maxbytes); in fuse_lseek()
2661 retval = -EINVAL; in fuse_file_llseek()
2684 * non-compat (i.e. ones coming from 64bit apps) ioctl in fuse_copy_ioctl_iovec_old()
2688 return -EINVAL; in fuse_copy_ioctl_iovec_old()
2699 return -EIO; in fuse_copy_ioctl_iovec_old()
2710 u32 max = fc->max_pages << PAGE_SHIFT; in fuse_verify_ioctl_iov()
2713 if (iov->iov_len > (size_t) max) in fuse_verify_ioctl_iov()
2714 return -ENOMEM; in fuse_verify_ioctl_iov()
2715 max -= iov->iov_len; in fuse_verify_ioctl_iov()
2727 if (fc->minor < 16) { in fuse_copy_ioctl_iovec()
2733 return -EIO; in fuse_copy_ioctl_iovec()
2739 return -EIO; in fuse_copy_ioctl_iovec()
2748 return -EIO; in fuse_copy_ioctl_iovec()
2772 * On the first callout to FUSE server, inarg->in_size and
2773 * inarg->out_size will be NULL; then, the server completes the ioctl
2774 * with FUSE_IOCTL_RETRY set in out->flags, out->in_iovs set to 1 and
2782 * it sets FUSE_IOCTL_RETRY, out->in_iovs to 2 and iov array to
2799 * limits ioctl data transfers to well-formed ioctls and is the forced
2805 struct fuse_file *ff = file->private_data; in fuse_do_ioctl()
2806 struct fuse_mount *fm = ff->fm; in fuse_do_ioctl()
2808 .fh = ff->fh, in fuse_do_ioctl()
2838 err = -ENOMEM; in fuse_do_ioctl()
2839 ap.pages = fuse_pages_alloc(fm->fc->max_pages, GFP_KERNEL, &ap.descs); in fuse_do_ioctl()
2844 fuse_page_descs_length_init(ap.descs, 0, fm->fc->max_pages); in fuse_do_ioctl()
2847 * If restricted, initialize IO parameters as encoded in @cmd. in fuse_do_ioctl()
2853 iov->iov_base = (void __user *)arg; in fuse_do_ioctl()
2858 iov->iov_len = sizeof(int); in fuse_do_ioctl()
2861 iov->iov_len = _IOC_SIZE(cmd); in fuse_do_ioctl()
2888 err = -ENOMEM; in fuse_do_ioctl()
2889 if (max_pages > fm->fc->max_pages) in fuse_do_ioctl()
2901 ap.args.nodeid = ff->nodeid; in fuse_do_ioctl()
2910 err = -EFAULT; in fuse_do_ioctl()
2936 err = -EIO; in fuse_do_ioctl()
2947 err = -ENOMEM; in fuse_do_ioctl()
2954 err = fuse_copy_ioctl_iovec(fm->fc, iov_page, vaddr, in fuse_do_ioctl()
2964 err = fuse_verify_ioctl_iov(fm->fc, in_iov, in_iovs); in fuse_do_ioctl()
2968 err = fuse_verify_ioctl_iov(fm->fc, out_iov, out_iovs); in fuse_do_ioctl()
2975 err = -EIO; in fuse_do_ioctl()
2979 err = -EFAULT; in fuse_do_ioctl()
2990 __free_page(ap.pages[--ap.num_pages]); in fuse_do_ioctl()
3004 return -EACCES; in fuse_ioctl_common()
3007 return -EIO; in fuse_ioctl_common()
3026 * fuse_conn->polled_files which is indexed by kh. Walk the tree and
3032 struct rb_node **link = &fc->polled_files.rb_node; in fuse_find_polled_node()
3041 if (kh < ff->kh) in fuse_find_polled_node()
3042 link = &last->rb_left; in fuse_find_polled_node()
3043 else if (kh > ff->kh) in fuse_find_polled_node()
3044 link = &last->rb_right; in fuse_find_polled_node()
3063 spin_lock(&fc->lock); in fuse_register_polled_file()
3064 if (RB_EMPTY_NODE(&ff->polled_node)) { in fuse_register_polled_file()
3067 link = fuse_find_polled_node(fc, ff->kh, &parent); in fuse_register_polled_file()
3069 rb_link_node(&ff->polled_node, parent, link); in fuse_register_polled_file()
3070 rb_insert_color(&ff->polled_node, &fc->polled_files); in fuse_register_polled_file()
3072 spin_unlock(&fc->lock); in fuse_register_polled_file()
3077 struct fuse_file *ff = file->private_data; in fuse_file_poll()
3078 struct fuse_mount *fm = ff->fm; in fuse_file_poll()
3079 struct fuse_poll_in inarg = { .fh = ff->fh, .kh = ff->kh }; in fuse_file_poll()
3084 if (fm->fc->no_poll) in fuse_file_poll()
3087 poll_wait(file, &ff->poll_wait, wait); in fuse_file_poll()
3094 if (waitqueue_active(&ff->poll_wait)) { in fuse_file_poll()
3096 fuse_register_polled_file(fm->fc, ff); in fuse_file_poll()
3100 args.nodeid = ff->nodeid; in fuse_file_poll()
3111 if (err == -ENOSYS) { in fuse_file_poll()
3112 fm->fc->no_poll = 1; in fuse_file_poll()
3126 u64 kh = outarg->kh; in fuse_notify_poll_wakeup()
3129 spin_lock(&fc->lock); in fuse_notify_poll_wakeup()
3136 wake_up_interruptible_sync(&ff->poll_wait); in fuse_notify_poll_wakeup()
3139 spin_unlock(&fc->lock); in fuse_notify_poll_wakeup()
3145 struct inode *inode = file->f_mapping->host; in fuse_do_truncate()
3159 return round_up(off, fc->max_pages << PAGE_SHIFT); in fuse_round_up()
3167 struct file *file = iocb->ki_filp; in fuse_direct_IO()
3168 struct fuse_file *ff = file->private_data; in fuse_direct_IO()
3173 loff_t offset = iocb->ki_pos; in fuse_direct_IO()
3174 struct fuse_io_priv *io; in fuse_direct_IO() local
3177 inode = file->f_mapping->host; in fuse_direct_IO()
3183 io = kmalloc(sizeof(struct fuse_io_priv), GFP_KERNEL); in fuse_direct_IO()
3184 if (!io) in fuse_direct_IO()
3185 return -ENOMEM; in fuse_direct_IO()
3186 spin_lock_init(&io->lock); in fuse_direct_IO()
3187 kref_init(&io->refcnt); in fuse_direct_IO()
3188 io->reqs = 1; in fuse_direct_IO()
3189 io->bytes = -1; in fuse_direct_IO()
3190 io->size = 0; in fuse_direct_IO()
3191 io->offset = offset; in fuse_direct_IO()
3192 io->write = (iov_iter_rw(iter) == WRITE); in fuse_direct_IO()
3193 io->err = 0; in fuse_direct_IO()
3198 io->async = ff->fm->fc->async_dio; in fuse_direct_IO()
3199 io->iocb = iocb; in fuse_direct_IO()
3200 io->blocking = is_sync_kiocb(iocb); in fuse_direct_IO()
3203 if (io->async && !io->write && offset + count > i_size) { in fuse_direct_IO()
3204 iov_iter_truncate(iter, fuse_round_up(ff->fm->fc, i_size - offset)); in fuse_direct_IO()
3205 shortened = count - iov_iter_count(iter); in fuse_direct_IO()
3206 count -= shortened; in fuse_direct_IO()
3211 * In such case the aio will behave exactly like sync io. in fuse_direct_IO()
3213 if ((offset + count > i_size) && io->write) in fuse_direct_IO()
3214 io->blocking = true; in fuse_direct_IO()
3216 if (io->async && io->blocking) { in fuse_direct_IO()
3218 * Additional reference to keep io around after in fuse_direct_IO()
3221 kref_get(&io->refcnt); in fuse_direct_IO()
3222 io->done = &wait; in fuse_direct_IO()
3226 ret = fuse_direct_io(io, iter, &pos, FUSE_DIO_WRITE); in fuse_direct_IO()
3229 ret = __fuse_direct_read(io, iter, &pos); in fuse_direct_IO()
3233 if (io->async) { in fuse_direct_IO()
3234 bool blocking = io->blocking; in fuse_direct_IO() local
3236 fuse_aio_complete(io, ret < 0 ? ret : 0, -1); in fuse_direct_IO()
3238 /* we have a non-extending, async request, so return */ in fuse_direct_IO()
3239 if (!blocking) in fuse_direct_IO()
3240 return -EIOCBQUEUED; in fuse_direct_IO()
3243 ret = fuse_get_res_by_io(io); in fuse_direct_IO()
3246 kref_put(&io->refcnt, fuse_io_release); in fuse_direct_IO()
3260 int err = filemap_write_and_wait_range(inode->i_mapping, start, LLONG_MAX); in fuse_writeback_range()
3271 struct fuse_file *ff = file->private_data; in fuse_file_fallocate()
3274 struct fuse_mount *fm = ff->fm; in fuse_file_fallocate()
3277 .fh = ff->fh, in fuse_file_fallocate()
3288 return -EOPNOTSUPP; in fuse_file_fallocate()
3290 if (fm->fc->no_fallocate) in fuse_file_fallocate()
3291 return -EOPNOTSUPP; in fuse_file_fallocate()
3295 down_write(&fi->i_mmap_sem); in fuse_file_fallocate()
3302 loff_t endbyte = offset + length - 1; in fuse_file_fallocate()
3321 set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); in fuse_file_fallocate()
3324 args.nodeid = ff->nodeid; in fuse_file_fallocate()
3329 if (err == -ENOSYS) { in fuse_file_fallocate()
3330 fm->fc->no_fallocate = 1; in fuse_file_fallocate()
3331 err = -EOPNOTSUPP; in fuse_file_fallocate()
3340 if (changed && fm->fc->writeback_cache) in fuse_file_fallocate()
3345 truncate_pagecache_range(inode, offset, offset + length - 1); in fuse_file_fallocate()
3351 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); in fuse_file_fallocate()
3354 up_write(&fi->i_mmap_sem); in fuse_file_fallocate()
3367 struct fuse_file *ff_in = file_in->private_data; in __fuse_copy_file_range()
3368 struct fuse_file *ff_out = file_out->private_data; in __fuse_copy_file_range()
3372 struct fuse_mount *fm = ff_in->fm; in __fuse_copy_file_range()
3373 struct fuse_conn *fc = fm->fc; in __fuse_copy_file_range()
3376 .fh_in = ff_in->fh, in __fuse_copy_file_range()
3378 .nodeid_out = ff_out->nodeid, in __fuse_copy_file_range()
3379 .fh_out = ff_out->fh, in __fuse_copy_file_range()
3386 /* mark unstable when write-back is not used, and file_out gets in __fuse_copy_file_range()
3388 bool is_unstable = (!fc->writeback_cache) && in __fuse_copy_file_range()
3389 ((pos_out + len) > inode_out->i_size); in __fuse_copy_file_range()
3391 if (fc->no_copy_file_range) in __fuse_copy_file_range()
3392 return -EOPNOTSUPP; in __fuse_copy_file_range()
3394 if (file_inode(file_in)->i_sb != file_inode(file_out)->i_sb) in __fuse_copy_file_range()
3395 return -EXDEV; in __fuse_copy_file_range()
3398 err = fuse_writeback_range(inode_in, pos_in, pos_in + len - 1); in __fuse_copy_file_range()
3427 err = fuse_writeback_range(inode_out, pos_out, pos_out + len - 1); in __fuse_copy_file_range()
3432 set_bit(FUSE_I_SIZE_UNSTABLE, &fi_out->state); in __fuse_copy_file_range()
3435 args.nodeid = ff_in->nodeid; in __fuse_copy_file_range()
3443 if (err == -ENOSYS) { in __fuse_copy_file_range()
3444 fc->no_copy_file_range = 1; in __fuse_copy_file_range()
3445 err = -EOPNOTSUPP; in __fuse_copy_file_range()
3450 truncate_inode_pages_range(inode_out->i_mapping, in __fuse_copy_file_range()
3452 ALIGN(pos_out + outarg.size, PAGE_SIZE) - 1); in __fuse_copy_file_range()
3454 if (fc->writeback_cache) { in __fuse_copy_file_range()
3464 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi_out->state); in __fuse_copy_file_range()
3483 if (ret == -EOPNOTSUPP || ret == -EXDEV) in fuse_copy_file_range()
3527 inode->i_fop = &fuse_file_operations; in fuse_init_file_inode()
3528 inode->i_data.a_ops = &fuse_file_aops; in fuse_init_file_inode()
3530 INIT_LIST_HEAD(&fi->write_files); in fuse_init_file_inode()
3531 INIT_LIST_HEAD(&fi->queued_writes); in fuse_init_file_inode()
3532 fi->writectr = 0; in fuse_init_file_inode()
3533 init_waitqueue_head(&fi->page_waitq); in fuse_init_file_inode()
3534 fi->writepages = RB_ROOT; in fuse_init_file_inode()