• Home
  • Raw
  • Download

Lines Matching +full:blocking +full:- +full:io

3   Copyright (C) 2001-2008  Miklos Szeredi <miklos@szeredi.hu>
32 if (!fm->fc->atomic_o_trunc) in fuse_send_open()
35 if (fm->fc->handle_killpriv_v2 && in fuse_send_open()
66 ff->fm = fm; in fuse_file_alloc()
67 ff->release_args = kzalloc(sizeof(*ff->release_args), in fuse_file_alloc()
69 if (!ff->release_args) { in fuse_file_alloc()
74 INIT_LIST_HEAD(&ff->write_entry); in fuse_file_alloc()
75 mutex_init(&ff->readdir.lock); in fuse_file_alloc()
76 refcount_set(&ff->count, 1); in fuse_file_alloc()
77 RB_CLEAR_NODE(&ff->polled_node); in fuse_file_alloc()
78 init_waitqueue_head(&ff->poll_wait); in fuse_file_alloc()
80 ff->kh = atomic64_inc_return(&fm->fc->khctr); in fuse_file_alloc()
87 kfree(ff->release_args); in fuse_file_free()
88 mutex_destroy(&ff->readdir.lock); in fuse_file_free()
94 refcount_inc(&ff->count); in fuse_file_get()
103 iput(ra->inode); in fuse_release_end()
109 if (refcount_dec_and_test(&ff->count)) { in fuse_file_put()
110 struct fuse_args *args = &ff->release_args->args; in fuse_file_put()
112 if (isdir ? ff->fm->fc->no_opendir : ff->fm->fc->no_open) { in fuse_file_put()
114 fuse_release_end(ff->fm, args, 0); in fuse_file_put()
116 fuse_simple_request(ff->fm, args); in fuse_file_put()
117 fuse_release_end(ff->fm, args, 0); in fuse_file_put()
119 args->end = fuse_release_end; in fuse_file_put()
120 if (fuse_simple_background(ff->fm, args, in fuse_file_put()
122 fuse_release_end(ff->fm, args, -ENOTCONN); in fuse_file_put()
131 struct fuse_conn *fc = fm->fc; in fuse_file_open()
137 return ERR_PTR(-ENOMEM); in fuse_file_open()
139 ff->fh = 0; in fuse_file_open()
140 /* Default for no-open */ in fuse_file_open()
141 ff->open_flags = FOPEN_KEEP_CACHE | (isdir ? FOPEN_CACHE_DIR : 0); in fuse_file_open()
142 if (isdir ? !fc->no_opendir : !fc->no_open) { in fuse_file_open()
148 ff->fh = outarg.fh; in fuse_file_open()
149 ff->open_flags = outarg.open_flags; in fuse_file_open()
151 } else if (err != -ENOSYS) { in fuse_file_open()
156 fc->no_opendir = 1; in fuse_file_open()
158 fc->no_open = 1; in fuse_file_open()
163 ff->open_flags &= ~FOPEN_DIRECT_IO; in fuse_file_open()
165 ff->nodeid = nodeid; in fuse_file_open()
173 struct fuse_file *ff = fuse_file_open(fm, nodeid, file->f_flags, isdir); in fuse_do_open()
176 file->private_data = ff; in fuse_do_open()
186 struct fuse_file *ff = file->private_data; in fuse_link_write_file()
191 spin_lock(&fi->lock); in fuse_link_write_file()
192 if (list_empty(&ff->write_entry)) in fuse_link_write_file()
193 list_add(&ff->write_entry, &fi->write_files); in fuse_link_write_file()
194 spin_unlock(&fi->lock); in fuse_link_write_file()
199 struct fuse_file *ff = file->private_data; in fuse_finish_open()
202 if (ff->open_flags & FOPEN_STREAM) in fuse_finish_open()
204 else if (ff->open_flags & FOPEN_NONSEEKABLE) in fuse_finish_open()
207 if (fc->atomic_o_trunc && (file->f_flags & O_TRUNC)) { in fuse_finish_open()
210 spin_lock(&fi->lock); in fuse_finish_open()
211 fi->attr_version = atomic64_inc_return(&fc->attr_version); in fuse_finish_open()
213 spin_unlock(&fi->lock); 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()
243 filemap_invalidate_lock(inode->i_mapping); in fuse_open_common()
259 struct fuse_file *ff = file->private_data; in fuse_open_common()
261 if (fc->atomic_o_trunc && (file->f_flags & O_TRUNC)) in fuse_open_common()
263 else if (!(ff->open_flags & FOPEN_KEEP_CACHE)) in fuse_open_common()
264 invalidate_inode_pages2(inode->i_mapping); in fuse_open_common()
267 filemap_invalidate_unlock(inode->i_mapping); in fuse_open_common()
278 struct fuse_conn *fc = ff->fm->fc; in fuse_prepare_release()
279 struct fuse_release_args *ra = ff->release_args; in fuse_prepare_release()
283 spin_lock(&fi->lock); in fuse_prepare_release()
284 list_del(&ff->write_entry); in fuse_prepare_release()
285 spin_unlock(&fi->lock); in fuse_prepare_release()
287 spin_lock(&fc->lock); in fuse_prepare_release()
288 if (!RB_EMPTY_NODE(&ff->polled_node)) in fuse_prepare_release()
289 rb_erase(&ff->polled_node, &fc->polled_files); in fuse_prepare_release()
290 spin_unlock(&fc->lock); in fuse_prepare_release()
292 wake_up_interruptible_all(&ff->poll_wait); in fuse_prepare_release()
294 ra->inarg.fh = ff->fh; in fuse_prepare_release()
295 ra->inarg.flags = flags; in fuse_prepare_release()
296 ra->args.in_numargs = 1; in fuse_prepare_release()
297 ra->args.in_args[0].size = sizeof(struct fuse_release_in); in fuse_prepare_release()
298 ra->args.in_args[0].value = &ra->inarg; in fuse_prepare_release()
299 ra->args.opcode = opcode; in fuse_prepare_release()
300 ra->args.nodeid = ff->nodeid; in fuse_prepare_release()
301 ra->args.force = true; in fuse_prepare_release()
302 ra->args.nocreds = true; in fuse_prepare_release()
309 struct fuse_release_args *ra = ff->release_args; in fuse_file_release()
314 if (ff->flock) { in fuse_file_release()
315 ra->inarg.release_flags |= FUSE_RELEASE_FLOCK_UNLOCK; in fuse_file_release()
316 ra->inarg.lock_owner = fuse_lock_owner_id(ff->fm->fc, id); in fuse_file_release()
319 ra->inode = igrab(inode); in fuse_file_release()
330 fuse_file_put(ff, ff->fm->fc->destroy, isdir); in fuse_file_release()
335 fuse_file_release(file_inode(file), file->private_data, file->f_flags, in fuse_release_common()
352 if (fc->writeback_cache) in fuse_release()
364 WARN_ON(refcount_read(&ff->count) > 1); in fuse_sync_release()
367 * iput(NULL) is a no-op and since the refcount is 1 and everything's in fuse_sync_release()
380 u32 *k = fc->scramble_key; in fuse_lock_owner_id()
410 n = fi->writepages.rb_node; in fuse_find_writeback()
417 WARN_ON(get_fuse_inode(wpa->inode) != fi); in fuse_find_writeback()
418 curr_index = wpa->ia.write.in.offset >> PAGE_SHIFT; in fuse_find_writeback()
419 if (idx_from >= curr_index + wpa->ia.ap.num_pages) in fuse_find_writeback()
420 n = n->rb_right; in fuse_find_writeback()
422 n = n->rb_left; in fuse_find_writeback()
441 spin_lock(&fi->lock); in fuse_range_is_writeback()
443 spin_unlock(&fi->lock); in fuse_range_is_writeback()
463 wait_event(fi->page_waitq, !fuse_page_is_writeback(inode, index)); in fuse_wait_on_page_writeback()
469 * This is currently done by blocking further writes with FUSE_NOWRITE
485 struct fuse_file *ff = file->private_data; in fuse_flush()
491 return -EIO; in fuse_flush()
493 if (ff->open_flags & FOPEN_NOFLUSH && !fm->fc->writeback_cache) in fuse_flush()
504 err = filemap_check_errors(file->f_mapping); in fuse_flush()
509 if (fm->fc->no_flush) in fuse_flush()
513 inarg.fh = ff->fh; in fuse_flush()
514 inarg.lock_owner = fuse_lock_owner_id(fm->fc, id); in fuse_flush()
523 if (err == -ENOSYS) { in fuse_flush()
524 fm->fc->no_flush = 1; in fuse_flush()
533 if (!err && fm->fc->writeback_cache) in fuse_flush()
541 struct inode *inode = file->f_mapping->host; in fuse_fsync_common()
543 struct fuse_file *ff = file->private_data; in fuse_fsync_common()
548 inarg.fh = ff->fh; in fuse_fsync_common()
561 struct inode *inode = file->f_mapping->host; in fuse_fsync()
566 return -EIO; in fuse_fsync()
594 if (fc->no_fsync) in fuse_fsync()
598 if (err == -ENOSYS) { in fuse_fsync()
599 fc->no_fsync = 1; in fuse_fsync()
611 struct fuse_file *ff = file->private_data; in fuse_read_args_fill()
612 struct fuse_args *args = &ia->ap.args; in fuse_read_args_fill()
614 ia->read.in.fh = ff->fh; in fuse_read_args_fill()
615 ia->read.in.offset = pos; in fuse_read_args_fill()
616 ia->read.in.size = count; in fuse_read_args_fill()
617 ia->read.in.flags = file->f_flags; in fuse_read_args_fill()
618 args->opcode = opcode; in fuse_read_args_fill()
619 args->nodeid = ff->nodeid; in fuse_read_args_fill()
620 args->in_numargs = 1; in fuse_read_args_fill()
621 args->in_args[0].size = sizeof(ia->read.in); in fuse_read_args_fill()
622 args->in_args[0].value = &ia->read.in; in fuse_read_args_fill()
623 args->out_argvar = true; in fuse_read_args_fill()
624 args->out_numargs = 1; in fuse_read_args_fill()
625 args->out_args[0].size = count; in fuse_read_args_fill()
633 for (i = 0; i < ap->num_pages; i++) { in fuse_release_user_pages()
635 set_page_dirty_lock(ap->pages[i]); in fuse_release_user_pages()
636 put_page(ap->pages[i]); in fuse_release_user_pages()
645 static ssize_t fuse_get_res_by_io(struct fuse_io_priv *io) in fuse_get_res_by_io() argument
647 if (io->err) in fuse_get_res_by_io()
648 return io->err; in fuse_get_res_by_io()
650 if (io->bytes >= 0 && io->write) in fuse_get_res_by_io()
651 return -EIO; in fuse_get_res_by_io()
653 return io->bytes < 0 ? io->size : io->bytes; in fuse_get_res_by_io()
658 * actual end of fuse request in IO request. Otherwise, if bytes_requested
659 * == bytes_transferred or rw == WRITE, the caller sets 'pos' to -1.
664 * fully completed (req->out.args[0].size == 32K) resulting in pos == -1. The
668 * Thus, when all fuse requests are completed, the minimal non-negative 'pos'
670 * transferred data starting from the beginning of IO request.
672 static void fuse_aio_complete(struct fuse_io_priv *io, int err, ssize_t pos) in fuse_aio_complete() argument
676 spin_lock(&io->lock); in fuse_aio_complete()
678 io->err = io->err ? : err; in fuse_aio_complete()
679 else if (pos >= 0 && (io->bytes < 0 || pos < io->bytes)) in fuse_aio_complete()
680 io->bytes = pos; in fuse_aio_complete()
682 left = --io->reqs; in fuse_aio_complete()
683 if (!left && io->blocking) in fuse_aio_complete()
684 complete(io->done); in fuse_aio_complete()
685 spin_unlock(&io->lock); in fuse_aio_complete()
687 if (!left && !io->blocking) { in fuse_aio_complete()
688 ssize_t res = fuse_get_res_by_io(io); in fuse_aio_complete()
691 struct inode *inode = file_inode(io->iocb->ki_filp); in fuse_aio_complete()
695 spin_lock(&fi->lock); in fuse_aio_complete()
696 fi->attr_version = atomic64_inc_return(&fc->attr_version); in fuse_aio_complete()
697 spin_unlock(&fi->lock); in fuse_aio_complete()
700 io->iocb->ki_complete(io->iocb, res); in fuse_aio_complete()
703 kref_put(&io->refcnt, fuse_io_release); in fuse_aio_complete()
706 static struct fuse_io_args *fuse_io_alloc(struct fuse_io_priv *io, in fuse_io_alloc() argument
713 ia->io = io; in fuse_io_alloc()
714 ia->ap.pages = fuse_pages_alloc(npages, GFP_KERNEL, in fuse_io_alloc()
715 &ia->ap.descs); in fuse_io_alloc()
716 if (!ia->ap.pages) { in fuse_io_alloc()
726 kfree(ia->ap.pages); in fuse_io_free()
734 struct fuse_io_priv *io = ia->io; in fuse_aio_complete_req() local
735 ssize_t pos = -1; in fuse_aio_complete_req()
737 fuse_release_user_pages(&ia->ap, io->should_dirty); in fuse_aio_complete_req()
741 } else if (io->write) { in fuse_aio_complete_req()
742 if (ia->write.out.size > ia->write.in.size) { in fuse_aio_complete_req()
743 err = -EIO; in fuse_aio_complete_req()
744 } else if (ia->write.in.size != ia->write.out.size) { in fuse_aio_complete_req()
745 pos = ia->write.in.offset - io->offset + in fuse_aio_complete_req()
746 ia->write.out.size; in fuse_aio_complete_req()
749 u32 outsize = args->out_args[0].size; in fuse_aio_complete_req()
751 if (ia->read.in.size != outsize) in fuse_aio_complete_req()
752 pos = ia->read.in.offset - io->offset + outsize; in fuse_aio_complete_req()
755 fuse_aio_complete(io, err, pos); in fuse_aio_complete_req()
763 struct fuse_io_priv *io = ia->io; in fuse_async_req_send() local
765 spin_lock(&io->lock); in fuse_async_req_send()
766 kref_get(&io->refcnt); in fuse_async_req_send()
767 io->size += num_bytes; in fuse_async_req_send()
768 io->reqs++; in fuse_async_req_send()
769 spin_unlock(&io->lock); in fuse_async_req_send()
771 ia->ap.args.end = fuse_aio_complete_req; in fuse_async_req_send()
772 ia->ap.args.may_block = io->should_dirty; in fuse_async_req_send()
773 err = fuse_simple_background(fm, &ia->ap.args, GFP_KERNEL); in fuse_async_req_send()
775 fuse_aio_complete_req(fm, &ia->ap.args, err); in fuse_async_req_send()
783 struct file *file = ia->io->iocb->ki_filp; in fuse_send_read()
784 struct fuse_file *ff = file->private_data; in fuse_send_read()
785 struct fuse_mount *fm = ff->fm; in fuse_send_read()
789 ia->read.in.read_flags |= FUSE_READ_LOCKOWNER; in fuse_send_read()
790 ia->read.in.lock_owner = fuse_lock_owner_id(fm->fc, owner); in fuse_send_read()
793 if (ia->io->async) in fuse_send_read()
796 return fuse_simple_request(fm, &ia->ap.args); in fuse_send_read()
805 spin_lock(&fi->lock); in fuse_read_update_size()
806 if (attr_ver >= fi->attr_version && size < inode->i_size && in fuse_read_update_size()
807 !test_bit(FUSE_I_SIZE_UNSTABLE, &fi->state)) { in fuse_read_update_size()
808 fi->attr_version = atomic64_inc_return(&fc->attr_version); in fuse_read_update_size()
811 spin_unlock(&fi->lock); in fuse_read_update_size()
824 if (!fc->writeback_cache) { in fuse_short_read()
825 loff_t pos = page_offset(ap->pages[0]) + num_read; in fuse_short_read()
832 struct inode *inode = page->mapping->host; in fuse_do_readpage()
848 * page-cache page, so make sure we read a properly synced in fuse_do_readpage()
851 fuse_wait_on_page_writeback(inode, page->index); in fuse_do_readpage()
853 attr_ver = fuse_get_attr_version(fm->fc); in fuse_do_readpage()
856 if (pos + (desc.length - 1) == LLONG_MAX) in fuse_do_readpage()
857 desc.length--; in fuse_do_readpage()
876 struct page *page = &folio->page; in fuse_read_folio()
877 struct inode *inode = page->mapping->host; in fuse_read_folio()
880 err = -EIO; in fuse_read_folio()
896 struct fuse_args_pages *ap = &ia->ap; in fuse_readpages_end()
897 size_t count = ia->read.in.size; in fuse_readpages_end()
898 size_t num_read = args->out_args[0].size; in fuse_readpages_end()
901 for (i = 0; mapping == NULL && i < ap->num_pages; i++) in fuse_readpages_end()
902 mapping = ap->pages[i]->mapping; in fuse_readpages_end()
905 struct inode *inode = mapping->host; in fuse_readpages_end()
911 fuse_short_read(inode, ia->read.attr_ver, num_read, ap); in fuse_readpages_end()
916 for (i = 0; i < ap->num_pages; i++) { in fuse_readpages_end()
917 struct page *page = ap->pages[i]; in fuse_readpages_end()
926 if (ia->ff) in fuse_readpages_end()
927 fuse_file_put(ia->ff, false, false); in fuse_readpages_end()
934 struct fuse_file *ff = file->private_data; in fuse_send_readpages()
935 struct fuse_mount *fm = ff->fm; in fuse_send_readpages()
936 struct fuse_args_pages *ap = &ia->ap; in fuse_send_readpages()
937 loff_t pos = page_offset(ap->pages[0]); in fuse_send_readpages()
938 size_t count = ap->num_pages << PAGE_SHIFT; in fuse_send_readpages()
942 ap->args.out_pages = true; in fuse_send_readpages()
943 ap->args.page_zeroing = true; in fuse_send_readpages()
944 ap->args.page_replace = true; in fuse_send_readpages()
947 if (pos + (count - 1) == LLONG_MAX) { in fuse_send_readpages()
948 count--; in fuse_send_readpages()
949 ap->descs[ap->num_pages - 1].length--; in fuse_send_readpages()
954 ia->read.attr_ver = fuse_get_attr_version(fm->fc); in fuse_send_readpages()
955 if (fm->fc->async_read) { in fuse_send_readpages()
956 ia->ff = fuse_file_get(ff); in fuse_send_readpages()
957 ap->args.end = fuse_readpages_end; in fuse_send_readpages()
958 err = fuse_simple_background(fm, &ap->args, GFP_KERNEL); in fuse_send_readpages()
962 res = fuse_simple_request(fm, &ap->args); in fuse_send_readpages()
965 fuse_readpages_end(fm, &ap->args, err); in fuse_send_readpages()
970 struct inode *inode = rac->mapping->host; in fuse_readahead()
977 max_pages = min_t(unsigned int, fc->max_pages, in fuse_readahead()
978 fc->max_read / PAGE_SIZE); in fuse_readahead()
984 if (fc->num_background >= fc->congestion_threshold && in fuse_readahead()
985 rac->ra->async_size >= readahead_count(rac)) in fuse_readahead()
992 nr_pages = readahead_count(rac) - nr_pages; in fuse_readahead()
1000 ap = &ia->ap; in fuse_readahead()
1001 nr_pages = __readahead_batch(rac, ap->pages, nr_pages); in fuse_readahead()
1005 ap->descs[i].length = PAGE_SIZE; in fuse_readahead()
1007 ap->num_pages = nr_pages; in fuse_readahead()
1008 fuse_send_readpages(ia, rac->file); in fuse_readahead()
1014 struct inode *inode = iocb->ki_filp->f_mapping->host; in fuse_cache_read_iter()
1022 if (fc->auto_inval_data || in fuse_cache_read_iter()
1023 (iocb->ki_pos + iov_iter_count(to) > i_size_read(inode))) { in fuse_cache_read_iter()
1025 err = fuse_update_attributes(inode, iocb->ki_filp, STATX_SIZE); in fuse_cache_read_iter()
1036 struct fuse_args *args = &ia->ap.args; in fuse_write_args_fill()
1038 ia->write.in.fh = ff->fh; in fuse_write_args_fill()
1039 ia->write.in.offset = pos; in fuse_write_args_fill()
1040 ia->write.in.size = count; in fuse_write_args_fill()
1041 args->opcode = FUSE_WRITE; in fuse_write_args_fill()
1042 args->nodeid = ff->nodeid; in fuse_write_args_fill()
1043 args->in_numargs = 2; in fuse_write_args_fill()
1044 if (ff->fm->fc->minor < 9) in fuse_write_args_fill()
1045 args->in_args[0].size = FUSE_COMPAT_WRITE_IN_SIZE; in fuse_write_args_fill()
1047 args->in_args[0].size = sizeof(ia->write.in); in fuse_write_args_fill()
1048 args->in_args[0].value = &ia->write.in; in fuse_write_args_fill()
1049 args->in_args[1].size = count; in fuse_write_args_fill()
1050 args->out_numargs = 1; in fuse_write_args_fill()
1051 args->out_args[0].size = sizeof(ia->write.out); in fuse_write_args_fill()
1052 args->out_args[0].value = &ia->write.out; in fuse_write_args_fill()
1057 unsigned int flags = iocb->ki_filp->f_flags; in fuse_write_flags()
1061 if (iocb->ki_flags & IOCB_SYNC) in fuse_write_flags()
1070 struct kiocb *iocb = ia->io->iocb; in fuse_send_write()
1071 struct file *file = iocb->ki_filp; in fuse_send_write()
1072 struct fuse_file *ff = file->private_data; in fuse_send_write()
1073 struct fuse_mount *fm = ff->fm; in fuse_send_write()
1074 struct fuse_write_in *inarg = &ia->write.in; in fuse_send_write()
1078 inarg->flags = fuse_write_flags(iocb); in fuse_send_write()
1080 inarg->write_flags |= FUSE_WRITE_LOCKOWNER; in fuse_send_write()
1081 inarg->lock_owner = fuse_lock_owner_id(fm->fc, owner); in fuse_send_write()
1084 if (ia->io->async) in fuse_send_write()
1087 err = fuse_simple_request(fm, &ia->ap.args); in fuse_send_write()
1088 if (!err && ia->write.out.size > count) in fuse_send_write()
1089 err = -EIO; in fuse_send_write()
1091 return err ?: ia->write.out.size; in fuse_send_write()
1100 spin_lock(&fi->lock); in fuse_write_update_attr()
1101 fi->attr_version = atomic64_inc_return(&fc->attr_version); in fuse_write_update_attr()
1102 if (written > 0 && pos > inode->i_size) { in fuse_write_update_attr()
1106 spin_unlock(&fi->lock); in fuse_write_update_attr()
1117 struct fuse_args_pages *ap = &ia->ap; in fuse_send_write_pages()
1118 struct file *file = iocb->ki_filp; in fuse_send_write_pages()
1119 struct fuse_file *ff = file->private_data; in fuse_send_write_pages()
1120 struct fuse_mount *fm = ff->fm; in fuse_send_write_pages()
1125 for (i = 0; i < ap->num_pages; i++) in fuse_send_write_pages()
1126 fuse_wait_on_page_writeback(inode, ap->pages[i]->index); in fuse_send_write_pages()
1129 ia->write.in.flags = fuse_write_flags(iocb); in fuse_send_write_pages()
1130 if (fm->fc->handle_killpriv_v2 && !capable(CAP_FSETID)) in fuse_send_write_pages()
1131 ia->write.in.write_flags |= FUSE_WRITE_KILL_SUIDGID; in fuse_send_write_pages()
1133 err = fuse_simple_request(fm, &ap->args); in fuse_send_write_pages()
1134 if (!err && ia->write.out.size > count) in fuse_send_write_pages()
1135 err = -EIO; in fuse_send_write_pages()
1137 short_write = ia->write.out.size < count; in fuse_send_write_pages()
1138 offset = ap->descs[0].offset; in fuse_send_write_pages()
1139 count = ia->write.out.size; in fuse_send_write_pages()
1140 for (i = 0; i < ap->num_pages; i++) { in fuse_send_write_pages()
1141 struct page *page = ap->pages[i]; in fuse_send_write_pages()
1146 if (count >= PAGE_SIZE - offset) in fuse_send_write_pages()
1147 count -= PAGE_SIZE - offset; in fuse_send_write_pages()
1155 if (ia->write.page_locked && (i == ap->num_pages - 1)) in fuse_send_write_pages()
1168 struct fuse_args_pages *ap = &ia->ap; in fuse_fill_write_pages()
1169 struct fuse_conn *fc = get_fuse_conn(mapping->host); in fuse_fill_write_pages()
1170 unsigned offset = pos & (PAGE_SIZE - 1); in fuse_fill_write_pages()
1174 ap->args.in_pages = true; in fuse_fill_write_pages()
1175 ap->descs[0].offset = offset; in fuse_fill_write_pages()
1181 size_t bytes = min_t(size_t, PAGE_SIZE - offset, in fuse_fill_write_pages()
1184 bytes = min_t(size_t, bytes, fc->max_write - count); in fuse_fill_write_pages()
1187 err = -EFAULT; in fuse_fill_write_pages()
1191 err = -ENOMEM; in fuse_fill_write_pages()
1209 ap->pages[ap->num_pages] = page; in fuse_fill_write_pages()
1210 ap->descs[ap->num_pages].length = tmp; in fuse_fill_write_pages()
1211 ap->num_pages++; in fuse_fill_write_pages()
1226 ia->write.page_locked = true; in fuse_fill_write_pages()
1229 if (!fc->big_writes) in fuse_fill_write_pages()
1231 } while (iov_iter_count(ii) && count < fc->max_write && in fuse_fill_write_pages()
1232 ap->num_pages < max_pages && offset == 0); in fuse_fill_write_pages()
1241 ((pos + len - 1) >> PAGE_SHIFT) - in fuse_wr_pages()
1248 struct address_space *mapping = iocb->ki_filp->f_mapping; in fuse_perform_write()
1249 struct inode *inode = mapping->host; in fuse_perform_write()
1252 loff_t pos = iocb->ki_pos; in fuse_perform_write()
1256 if (inode->i_size < pos + iov_iter_count(ii)) in fuse_perform_write()
1257 set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); in fuse_perform_write()
1264 fc->max_pages); in fuse_perform_write()
1266 ap->pages = fuse_pages_alloc(nr_pages, GFP_KERNEL, &ap->descs); in fuse_perform_write()
1267 if (!ap->pages) { in fuse_perform_write()
1268 err = -ENOMEM; in fuse_perform_write()
1286 err = -EIO; in fuse_perform_write()
1289 kfree(ap->pages); in fuse_perform_write()
1293 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); in fuse_perform_write()
1297 iocb->ki_pos += res; in fuse_perform_write()
1303 struct file *file = iocb->ki_filp; in fuse_cache_write_iter()
1304 struct address_space *mapping = file->f_mapping; in fuse_cache_write_iter()
1306 struct inode *inode = mapping->host; in fuse_cache_write_iter()
1310 if (fc->writeback_cache) { in fuse_cache_write_iter()
1312 err = fuse_update_attributes(mapping->host, file, in fuse_cache_write_iter()
1317 if (fc->handle_killpriv_v2 && in fuse_cache_write_iter()
1341 if (iocb->ki_flags & IOCB_DIRECT) { in fuse_cache_write_iter()
1360 return (unsigned long)iter_iov(ii)->iov_base + ii->iov_offset; in fuse_get_user_addr()
1382 ap->args.in_args[1].value = (void *) user_addr; in fuse_get_user_pages()
1384 ap->args.out_args[0].value = (void *) user_addr; in fuse_get_user_pages()
1391 while (nbytes < *nbytesp && ap->num_pages < max_pages) { in fuse_get_user_pages()
1394 ret = iov_iter_get_pages2(ii, &ap->pages[ap->num_pages], in fuse_get_user_pages()
1395 *nbytesp - nbytes, in fuse_get_user_pages()
1396 max_pages - ap->num_pages, in fuse_get_user_pages()
1406 ap->descs[ap->num_pages].offset = start; in fuse_get_user_pages()
1407 fuse_page_descs_length_init(ap->descs, ap->num_pages, npages); in fuse_get_user_pages()
1409 ap->num_pages += npages; in fuse_get_user_pages()
1410 ap->descs[ap->num_pages - 1].length -= in fuse_get_user_pages()
1411 (PAGE_SIZE - ret) & (PAGE_SIZE - 1); in fuse_get_user_pages()
1414 ap->args.user_pages = true; in fuse_get_user_pages()
1416 ap->args.in_pages = true; in fuse_get_user_pages()
1418 ap->args.out_pages = true; in fuse_get_user_pages()
1425 ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter, in fuse_direct_io() argument
1430 struct file *file = io->iocb->ki_filp; in fuse_direct_io()
1431 struct address_space *mapping = file->f_mapping; in fuse_direct_io()
1432 struct inode *inode = mapping->host; in fuse_direct_io()
1433 struct fuse_file *ff = file->private_data; in fuse_direct_io()
1434 struct fuse_conn *fc = ff->fm->fc; in fuse_direct_io()
1435 size_t nmax = write ? fc->max_write : fc->max_read; in fuse_direct_io()
1439 pgoff_t idx_to = (pos + count - 1) >> PAGE_SHIFT; in fuse_direct_io()
1444 bool fopen_direct_io = ff->open_flags & FOPEN_DIRECT_IO; in fuse_direct_io()
1446 max_pages = iov_iter_npages(iter, fc->max_pages); in fuse_direct_io()
1447 ia = fuse_io_alloc(io, max_pages); in fuse_direct_io()
1449 return -ENOMEM; in fuse_direct_io()
1451 if (fopen_direct_io && fc->direct_io_allow_mmap) { in fuse_direct_io()
1452 res = filemap_write_and_wait_range(mapping, pos, pos + count - 1); in fuse_direct_io()
1474 io->should_dirty = !write && user_backed_iter(iter); in fuse_direct_io()
1477 fl_owner_t owner = current->files; in fuse_direct_io()
1480 err = fuse_get_user_pages(&ia->ap, iter, &nbytes, write, in fuse_direct_io()
1487 ia->write.in.write_flags |= FUSE_WRITE_KILL_SUIDGID; in fuse_direct_io()
1494 if (!io->async || nres < 0) { in fuse_direct_io()
1495 fuse_release_user_pages(&ia->ap, io->should_dirty); in fuse_direct_io()
1506 count -= nres; in fuse_direct_io()
1510 iov_iter_revert(iter, nbytes - nres); in fuse_direct_io()
1514 max_pages = iov_iter_npages(iter, fc->max_pages); in fuse_direct_io()
1515 ia = fuse_io_alloc(io, max_pages); in fuse_direct_io()
1529 static ssize_t __fuse_direct_read(struct fuse_io_priv *io, in __fuse_direct_read() argument
1534 struct inode *inode = file_inode(io->iocb->ki_filp); in __fuse_direct_read()
1536 res = fuse_direct_io(io, iter, ppos, 0); in __fuse_direct_read()
1549 if (!is_sync_kiocb(iocb) && iocb->ki_flags & IOCB_DIRECT) { in fuse_direct_read_iter()
1552 struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb); in fuse_direct_read_iter() local
1554 res = __fuse_direct_read(&io, to, &iocb->ki_pos); in fuse_direct_read_iter()
1563 struct inode *inode = file_inode(iocb->ki_filp); in fuse_direct_write_extending_i_size()
1565 return iocb->ki_pos + iov_iter_count(iter) > i_size_read(inode); in fuse_direct_write_extending_i_size()
1570 struct inode *inode = file_inode(iocb->ki_filp); in fuse_direct_write_iter()
1571 struct file *file = iocb->ki_filp; in fuse_direct_write_iter()
1572 struct fuse_file *ff = file->private_data; in fuse_direct_write_iter()
1573 struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb); in fuse_direct_write_iter() local
1576 !(ff->open_flags & FOPEN_PARALLEL_DIRECT_WRITES) || in fuse_direct_write_iter()
1577 get_fuse_conn(inode)->direct_io_allow_mmap || in fuse_direct_write_iter()
1578 iocb->ki_flags & IOCB_APPEND || in fuse_direct_write_iter()
1583 * - Parallel direct writes are disabled - a user space decision in fuse_direct_write_iter()
1584 * - Parallel direct writes are enabled and i_size is being extended. in fuse_direct_write_iter()
1585 * - Shared mmap on direct_io file is supported (FUSE_DIRECT_IO_ALLOW_MMAP). in fuse_direct_write_iter()
1605 if (!is_sync_kiocb(iocb) && iocb->ki_flags & IOCB_DIRECT) { in fuse_direct_write_iter()
1608 res = fuse_direct_io(&io, from, &iocb->ki_pos, in fuse_direct_write_iter()
1610 fuse_write_update_attr(inode, iocb->ki_pos, res); in fuse_direct_write_iter()
1623 struct file *file = iocb->ki_filp; in fuse_file_read_iter()
1624 struct fuse_file *ff = file->private_data; in fuse_file_read_iter()
1628 return -EIO; in fuse_file_read_iter()
1633 if (!(ff->open_flags & FOPEN_DIRECT_IO)) in fuse_file_read_iter()
1641 struct file *file = iocb->ki_filp; in fuse_file_write_iter()
1642 struct fuse_file *ff = file->private_data; in fuse_file_write_iter()
1646 return -EIO; in fuse_file_write_iter()
1651 if (!(ff->open_flags & FOPEN_DIRECT_IO)) in fuse_file_write_iter()
1659 struct fuse_args_pages *ap = &wpa->ia.ap; in fuse_writepage_free()
1662 if (wpa->bucket) in fuse_writepage_free()
1663 fuse_sync_bucket_dec(wpa->bucket); in fuse_writepage_free()
1665 for (i = 0; i < ap->num_pages; i++) in fuse_writepage_free()
1666 __free_page(ap->pages[i]); in fuse_writepage_free()
1668 if (wpa->ia.ff) in fuse_writepage_free()
1669 fuse_file_put(wpa->ia.ff, false, false); in fuse_writepage_free()
1671 kfree(ap->pages); in fuse_writepage_free()
1678 struct fuse_args_pages *ap = &wpa->ia.ap; in fuse_writepage_finish()
1679 struct inode *inode = wpa->inode; in fuse_writepage_finish()
1684 for (i = 0; i < ap->num_pages; i++) { in fuse_writepage_finish()
1685 dec_wb_stat(&bdi->wb, WB_WRITEBACK); in fuse_writepage_finish()
1686 dec_node_page_state(ap->pages[i], NR_WRITEBACK_TEMP); in fuse_writepage_finish()
1687 wb_writeout_inc(&bdi->wb); in fuse_writepage_finish()
1689 wake_up(&fi->page_waitq); in fuse_writepage_finish()
1692 /* Called under fi->lock, may release and reacquire it */
1695 __releases(fi->lock) in fuse_send_writepage()
1696 __acquires(fi->lock) in fuse_send_writepage()
1699 struct fuse_inode *fi = get_fuse_inode(wpa->inode); in fuse_send_writepage()
1700 struct fuse_write_in *inarg = &wpa->ia.write.in; in fuse_send_writepage()
1701 struct fuse_args *args = &wpa->ia.ap.args; in fuse_send_writepage()
1702 __u64 data_size = wpa->ia.ap.num_pages * PAGE_SIZE; in fuse_send_writepage()
1705 fi->writectr++; in fuse_send_writepage()
1706 if (inarg->offset + data_size <= size) { in fuse_send_writepage()
1707 inarg->size = data_size; in fuse_send_writepage()
1708 } else if (inarg->offset < size) { in fuse_send_writepage()
1709 inarg->size = size - inarg->offset; in fuse_send_writepage()
1715 args->in_args[1].size = inarg->size; in fuse_send_writepage()
1716 args->force = true; in fuse_send_writepage()
1717 args->nocreds = true; in fuse_send_writepage()
1720 if (err == -ENOMEM) { in fuse_send_writepage()
1721 spin_unlock(&fi->lock); in fuse_send_writepage()
1723 spin_lock(&fi->lock); in fuse_send_writepage()
1733 fi->writectr--; in fuse_send_writepage()
1734 rb_erase(&wpa->writepages_entry, &fi->writepages); in fuse_send_writepage()
1736 spin_unlock(&fi->lock); in fuse_send_writepage()
1739 for (aux = wpa->next; aux; aux = next) { in fuse_send_writepage()
1740 struct backing_dev_info *bdi = inode_to_bdi(aux->inode); in fuse_send_writepage()
1742 next = aux->next; in fuse_send_writepage()
1743 aux->next = NULL; in fuse_send_writepage()
1745 dec_wb_stat(&bdi->wb, WB_WRITEBACK); in fuse_send_writepage()
1746 dec_node_page_state(aux->ia.ap.pages[0], NR_WRITEBACK_TEMP); in fuse_send_writepage()
1747 wb_writeout_inc(&bdi->wb); in fuse_send_writepage()
1752 spin_lock(&fi->lock); in fuse_send_writepage()
1756 * If fi->writectr is positive (no truncate or fsync going on) send
1759 * Called with fi->lock
1762 __releases(fi->lock) in fuse_flush_writepages()
1763 __acquires(fi->lock) in fuse_flush_writepages()
1770 while (fi->writectr >= 0 && !list_empty(&fi->queued_writes)) { in fuse_flush_writepages()
1771 wpa = list_entry(fi->queued_writes.next, in fuse_flush_writepages()
1773 list_del_init(&wpa->queue_entry); in fuse_flush_writepages()
1781 pgoff_t idx_from = wpa->ia.write.in.offset >> PAGE_SHIFT; in fuse_insert_writeback()
1782 pgoff_t idx_to = idx_from + wpa->ia.ap.num_pages - 1; in fuse_insert_writeback()
1783 struct rb_node **p = &root->rb_node; in fuse_insert_writeback()
1786 WARN_ON(!wpa->ia.ap.num_pages); in fuse_insert_writeback()
1794 WARN_ON(curr->inode != wpa->inode); in fuse_insert_writeback()
1795 curr_index = curr->ia.write.in.offset >> PAGE_SHIFT; in fuse_insert_writeback()
1797 if (idx_from >= curr_index + curr->ia.ap.num_pages) in fuse_insert_writeback()
1798 p = &(*p)->rb_right; in fuse_insert_writeback()
1800 p = &(*p)->rb_left; in fuse_insert_writeback()
1805 rb_link_node(&wpa->writepages_entry, parent, p); in fuse_insert_writeback()
1806 rb_insert_color(&wpa->writepages_entry, root); in fuse_insert_writeback()
1820 struct inode *inode = wpa->inode; in fuse_writepage_end()
1824 mapping_set_error(inode->i_mapping, error); in fuse_writepage_end()
1831 if (!fc->writeback_cache) in fuse_writepage_end()
1833 spin_lock(&fi->lock); in fuse_writepage_end()
1834 rb_erase(&wpa->writepages_entry, &fi->writepages); in fuse_writepage_end()
1835 while (wpa->next) { in fuse_writepage_end()
1837 struct fuse_write_in *inarg = &wpa->ia.write.in; in fuse_writepage_end()
1838 struct fuse_writepage_args *next = wpa->next; in fuse_writepage_end()
1840 wpa->next = next->next; in fuse_writepage_end()
1841 next->next = NULL; in fuse_writepage_end()
1842 next->ia.ff = fuse_file_get(wpa->ia.ff); in fuse_writepage_end()
1843 tree_insert(&fi->writepages, next); in fuse_writepage_end()
1855 * now for completion of all in-flight requests. This happens in fuse_writepage_end()
1861 * that fuse_set_nowrite returned implies that all in-flight in fuse_writepage_end()
1864 * writectr. Hence there cannot be any in-flight requests and in fuse_writepage_end()
1868 fuse_send_writepage(fm, next, inarg->offset + inarg->size); in fuse_writepage_end()
1870 fi->writectr--; in fuse_writepage_end()
1872 spin_unlock(&fi->lock); in fuse_writepage_end()
1880 spin_lock(&fi->lock); in __fuse_write_file_get()
1881 ff = list_first_entry_or_null(&fi->write_files, struct fuse_file, in __fuse_write_file_get()
1885 spin_unlock(&fi->lock); in __fuse_write_file_get()
1912 WARN_ON(wbc->for_reclaim); in fuse_write_inode()
1929 ap = &wpa->ia.ap; in fuse_writepage_args_alloc()
1930 ap->num_pages = 0; in fuse_writepage_args_alloc()
1931 ap->pages = fuse_pages_alloc(1, GFP_NOFS, &ap->descs); in fuse_writepage_args_alloc()
1932 if (!ap->pages) { in fuse_writepage_args_alloc()
1944 if (!fc->sync_fs) in fuse_writepage_add_to_bucket()
1950 wpa->bucket = rcu_dereference(fc->curr_bucket); in fuse_writepage_add_to_bucket()
1951 } while (unlikely(!atomic_inc_not_zero(&wpa->bucket->count))); in fuse_writepage_add_to_bucket()
1957 struct address_space *mapping = page->mapping; in fuse_writepage_locked()
1958 struct inode *inode = mapping->host; in fuse_writepage_locked()
1964 int error = -ENOMEM; in fuse_writepage_locked()
1971 ap = &wpa->ia.ap; in fuse_writepage_locked()
1977 error = -EIO; in fuse_writepage_locked()
1978 wpa->ia.ff = fuse_write_file_get(fi); in fuse_writepage_locked()
1979 if (!wpa->ia.ff) in fuse_writepage_locked()
1983 fuse_write_args_fill(&wpa->ia, wpa->ia.ff, page_offset(page), 0); in fuse_writepage_locked()
1986 wpa->ia.write.in.write_flags |= FUSE_WRITE_CACHE; in fuse_writepage_locked()
1987 wpa->next = NULL; in fuse_writepage_locked()
1988 ap->args.in_pages = true; in fuse_writepage_locked()
1989 ap->num_pages = 1; in fuse_writepage_locked()
1990 ap->pages[0] = tmp_page; in fuse_writepage_locked()
1991 ap->descs[0].offset = 0; in fuse_writepage_locked()
1992 ap->descs[0].length = PAGE_SIZE; in fuse_writepage_locked()
1993 ap->args.end = fuse_writepage_end; in fuse_writepage_locked()
1994 wpa->inode = inode; in fuse_writepage_locked()
1996 inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK); in fuse_writepage_locked()
1999 spin_lock(&fi->lock); in fuse_writepage_locked()
2000 tree_insert(&fi->writepages, wpa); in fuse_writepage_locked()
2001 list_add_tail(&wpa->queue_entry, &fi->queued_writes); in fuse_writepage_locked()
2003 spin_unlock(&fi->lock); in fuse_writepage_locked()
2014 mapping_set_error(page->mapping, error); in fuse_writepage_locked()
2021 struct fuse_conn *fc = get_fuse_conn(page->mapping->host); in fuse_writepage()
2024 if (fuse_page_is_writeback(page->mapping->host, page->index)) { in fuse_writepage()
2026 * ->writepages() should be called for sync() and friends. We in fuse_writepage()
2030 WARN_ON(wbc->sync_mode == WB_SYNC_ALL); in fuse_writepage()
2037 if (wbc->sync_mode == WB_SYNC_NONE && in fuse_writepage()
2038 fc->num_background >= fc->congestion_threshold) in fuse_writepage()
2057 struct fuse_args_pages *ap = &data->wpa->ia.ap; in fuse_pages_realloc()
2058 struct fuse_conn *fc = get_fuse_conn(data->inode); in fuse_pages_realloc()
2062 max_t(unsigned int, data->max_pages * 2, in fuse_pages_realloc()
2064 fc->max_pages); in fuse_pages_realloc()
2065 WARN_ON(npages <= data->max_pages); in fuse_pages_realloc()
2071 memcpy(pages, ap->pages, sizeof(struct page *) * ap->num_pages); in fuse_pages_realloc()
2072 memcpy(descs, ap->descs, sizeof(struct fuse_page_desc) * ap->num_pages); in fuse_pages_realloc()
2073 kfree(ap->pages); in fuse_pages_realloc()
2074 ap->pages = pages; in fuse_pages_realloc()
2075 ap->descs = descs; in fuse_pages_realloc()
2076 data->max_pages = npages; in fuse_pages_realloc()
2083 struct fuse_writepage_args *wpa = data->wpa; in fuse_writepages_send()
2084 struct inode *inode = data->inode; in fuse_writepages_send()
2086 int num_pages = wpa->ia.ap.num_pages; in fuse_writepages_send()
2089 wpa->ia.ff = fuse_file_get(data->ff); in fuse_writepages_send()
2090 spin_lock(&fi->lock); in fuse_writepages_send()
2091 list_add_tail(&wpa->queue_entry, &fi->queued_writes); in fuse_writepages_send()
2093 spin_unlock(&fi->lock); in fuse_writepages_send()
2096 end_page_writeback(data->orig_pages[i]); in fuse_writepages_send()
2100 * Check under fi->lock if the page is under writeback, and insert it onto the
2109 struct fuse_inode *fi = get_fuse_inode(new_wpa->inode); in fuse_writepage_add()
2112 struct fuse_args_pages *new_ap = &new_wpa->ia.ap; in fuse_writepage_add()
2114 WARN_ON(new_ap->num_pages != 0); in fuse_writepage_add()
2115 new_ap->num_pages = 1; in fuse_writepage_add()
2117 spin_lock(&fi->lock); in fuse_writepage_add()
2118 old_wpa = fuse_insert_writeback(&fi->writepages, new_wpa); in fuse_writepage_add()
2120 spin_unlock(&fi->lock); in fuse_writepage_add()
2124 for (tmp = old_wpa->next; tmp; tmp = tmp->next) { in fuse_writepage_add()
2127 WARN_ON(tmp->inode != new_wpa->inode); in fuse_writepage_add()
2128 curr_index = tmp->ia.write.in.offset >> PAGE_SHIFT; in fuse_writepage_add()
2129 if (curr_index == page->index) { in fuse_writepage_add()
2130 WARN_ON(tmp->ia.ap.num_pages != 1); in fuse_writepage_add()
2131 swap(tmp->ia.ap.pages[0], new_ap->pages[0]); in fuse_writepage_add()
2137 new_wpa->next = old_wpa->next; in fuse_writepage_add()
2138 old_wpa->next = new_wpa; in fuse_writepage_add()
2141 spin_unlock(&fi->lock); in fuse_writepage_add()
2144 struct backing_dev_info *bdi = inode_to_bdi(new_wpa->inode); in fuse_writepage_add()
2146 dec_wb_stat(&bdi->wb, WB_WRITEBACK); in fuse_writepage_add()
2147 dec_node_page_state(new_ap->pages[0], NR_WRITEBACK_TEMP); in fuse_writepage_add()
2148 wb_writeout_inc(&bdi->wb); in fuse_writepage_add()
2159 WARN_ON(!ap->num_pages); in fuse_writepage_need_send()
2167 if (fuse_page_is_writeback(data->inode, page->index)) in fuse_writepage_need_send()
2171 if (ap->num_pages == fc->max_pages) in fuse_writepage_need_send()
2175 if ((ap->num_pages + 1) * PAGE_SIZE > fc->max_write) in fuse_writepage_need_send()
2179 if (data->orig_pages[ap->num_pages - 1]->index + 1 != page->index) in fuse_writepage_need_send()
2183 if (ap->num_pages == data->max_pages && !fuse_pages_realloc(data)) in fuse_writepage_need_send()
2193 struct fuse_writepage_args *wpa = data->wpa; in fuse_writepages_fill()
2194 struct fuse_args_pages *ap = &wpa->ia.ap; in fuse_writepages_fill()
2195 struct inode *inode = data->inode; in fuse_writepages_fill()
2201 if (!data->ff) { in fuse_writepages_fill()
2202 err = -EIO; in fuse_writepages_fill()
2203 data->ff = fuse_write_file_get(fi); in fuse_writepages_fill()
2204 if (!data->ff) in fuse_writepages_fill()
2208 if (wpa && fuse_writepage_need_send(fc, &folio->page, ap, data)) { in fuse_writepages_fill()
2210 data->wpa = NULL; in fuse_writepages_fill()
2213 err = -ENOMEM; in fuse_writepages_fill()
2227 * request to the fi->writepages list and increment ap->num_pages. in fuse_writepages_fill()
2231 if (data->wpa == NULL) { in fuse_writepages_fill()
2232 err = -ENOMEM; in fuse_writepages_fill()
2240 data->max_pages = 1; in fuse_writepages_fill()
2242 ap = &wpa->ia.ap; in fuse_writepages_fill()
2243 fuse_write_args_fill(&wpa->ia, data->ff, folio_pos(folio), 0); in fuse_writepages_fill()
2244 wpa->ia.write.in.write_flags |= FUSE_WRITE_CACHE; in fuse_writepages_fill()
2245 wpa->next = NULL; in fuse_writepages_fill()
2246 ap->args.in_pages = true; in fuse_writepages_fill()
2247 ap->args.end = fuse_writepage_end; in fuse_writepages_fill()
2248 ap->num_pages = 0; in fuse_writepages_fill()
2249 wpa->inode = inode; in fuse_writepages_fill()
2253 copy_highpage(tmp_page, &folio->page); in fuse_writepages_fill()
2254 ap->pages[ap->num_pages] = tmp_page; in fuse_writepages_fill()
2255 ap->descs[ap->num_pages].offset = 0; in fuse_writepages_fill()
2256 ap->descs[ap->num_pages].length = PAGE_SIZE; in fuse_writepages_fill()
2257 data->orig_pages[ap->num_pages] = &folio->page; in fuse_writepages_fill()
2259 inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK); in fuse_writepages_fill()
2263 if (data->wpa) { in fuse_writepages_fill()
2265 * Protected by fi->lock against concurrent access by in fuse_writepages_fill()
2268 spin_lock(&fi->lock); in fuse_writepages_fill()
2269 ap->num_pages++; in fuse_writepages_fill()
2270 spin_unlock(&fi->lock); in fuse_writepages_fill()
2271 } else if (fuse_writepage_add(wpa, &folio->page)) { in fuse_writepages_fill()
2272 data->wpa = wpa; in fuse_writepages_fill()
2285 struct inode *inode = mapping->host; in fuse_writepages()
2290 err = -EIO; in fuse_writepages()
2294 if (wbc->sync_mode == WB_SYNC_NONE && in fuse_writepages()
2295 fc->num_background >= fc->congestion_threshold) in fuse_writepages()
2302 err = -ENOMEM; in fuse_writepages()
2303 data.orig_pages = kcalloc(fc->max_pages, in fuse_writepages()
2311 WARN_ON(!data.wpa->ia.ap.num_pages); in fuse_writepages()
2333 int err = -ENOMEM; in fuse_write_begin()
2335 WARN_ON(!fc->writeback_cache); in fuse_write_begin()
2341 fuse_wait_on_page_writeback(mapping->host, page->index); in fuse_write_begin()
2349 fsize = i_size_read(mapping->host); in fuse_write_begin()
2374 struct inode *inode = page->mapping->host; in fuse_write_end()
2389 if (pos > inode->i_size) in fuse_write_end()
2405 struct inode *inode = folio->mapping->host; in fuse_launder_folio()
2408 fuse_wait_on_page_writeback(inode, folio->index); in fuse_launder_folio()
2409 err = fuse_writepage_locked(&folio->page); in fuse_launder_folio()
2411 fuse_wait_on_page_writeback(inode, folio->index); in fuse_launder_folio()
2424 err = write_inode_now(vma->vm_file->f_mapping->host, 1); in fuse_vma_close()
2425 mapping_set_error(vma->vm_file->f_mapping, err); in fuse_vma_close()
2433 * Block here, instead of in ->writepage(), so that the userspace fs
2439 * - page migration
2440 * - sync(2)
2441 * - try_to_free_pages() with order > PAGE_ALLOC_COSTLY_ORDER
2445 struct page *page = vmf->page; in fuse_page_mkwrite()
2446 struct inode *inode = file_inode(vmf->vma->vm_file); in fuse_page_mkwrite()
2448 file_update_time(vmf->vma->vm_file); in fuse_page_mkwrite()
2450 if (page->mapping != inode->i_mapping) { in fuse_page_mkwrite()
2455 fuse_wait_on_page_writeback(inode, page->index); in fuse_page_mkwrite()
2468 struct fuse_file *ff = file->private_data; in fuse_file_mmap()
2469 struct fuse_conn *fc = ff->fm->fc; in fuse_file_mmap()
2475 if (ff->open_flags & FOPEN_DIRECT_IO) { in fuse_file_mmap()
2480 if ((vma->vm_flags & VM_MAYSHARE) && !fc->direct_io_allow_mmap) in fuse_file_mmap()
2481 return -ENODEV; in fuse_file_mmap()
2483 invalidate_inode_pages2(file->f_mapping); in fuse_file_mmap()
2485 if (!(vma->vm_flags & VM_MAYSHARE)) { in fuse_file_mmap()
2491 if ((vma->vm_flags & VM_SHARED) && (vma->vm_flags & VM_MAYWRITE)) in fuse_file_mmap()
2495 vma->vm_ops = &fuse_file_vm_ops; in fuse_file_mmap()
2503 switch (ffl->type) { in convert_fuse_file_lock()
2509 if (ffl->start > OFFSET_MAX || ffl->end > OFFSET_MAX || in convert_fuse_file_lock()
2510 ffl->end < ffl->start) in convert_fuse_file_lock()
2511 return -EIO; in convert_fuse_file_lock()
2513 fl->fl_start = ffl->start; in convert_fuse_file_lock()
2514 fl->fl_end = ffl->end; in convert_fuse_file_lock()
2521 fl->fl_pid = pid_nr_ns(find_pid_ns(ffl->pid, fc->pid_ns), &init_pid_ns); in convert_fuse_file_lock()
2526 return -EIO; in convert_fuse_file_lock()
2528 fl->fl_type = ffl->type; in convert_fuse_file_lock()
2538 struct fuse_file *ff = file->private_data; in fuse_lk_fill()
2541 inarg->fh = ff->fh; in fuse_lk_fill()
2542 inarg->owner = fuse_lock_owner_id(fc, fl->fl_owner); in fuse_lk_fill()
2543 inarg->lk.start = fl->fl_start; in fuse_lk_fill()
2544 inarg->lk.end = fl->fl_end; in fuse_lk_fill()
2545 inarg->lk.type = fl->fl_type; in fuse_lk_fill()
2546 inarg->lk.pid = pid; in fuse_lk_fill()
2548 inarg->lk_flags |= FUSE_LK_FLOCK; in fuse_lk_fill()
2549 args->opcode = opcode; in fuse_lk_fill()
2550 args->nodeid = get_node_id(inode); in fuse_lk_fill()
2551 args->in_numargs = 1; in fuse_lk_fill()
2552 args->in_args[0].size = sizeof(*inarg); in fuse_lk_fill()
2553 args->in_args[0].value = inarg; in fuse_lk_fill()
2571 err = convert_fuse_file_lock(fm->fc, &outarg.lk, fl); in fuse_getlk()
2582 int opcode = (fl->fl_flags & FL_SLEEP) ? FUSE_SETLKW : FUSE_SETLK; in fuse_setlk()
2583 struct pid *pid = fl->fl_type != F_UNLCK ? task_tgid(current) : NULL; in fuse_setlk()
2584 pid_t pid_nr = pid_nr_ns(pid, fm->fc->pid_ns); in fuse_setlk()
2587 if (fl->fl_lmops && fl->fl_lmops->lm_grant) { in fuse_setlk()
2589 return -ENOLCK; in fuse_setlk()
2593 if ((fl->fl_flags & FL_CLOSE_POSIX) == FL_CLOSE_POSIX) in fuse_setlk()
2600 if (err == -EINTR) in fuse_setlk()
2601 err = -ERESTARTSYS; in fuse_setlk()
2615 if (fc->no_lock) { in fuse_file_lock()
2621 if (fc->no_lock) in fuse_file_lock()
2635 if (fc->no_flock) { in fuse_file_flock()
2638 struct fuse_file *ff = file->private_data; in fuse_file_flock()
2641 ff->flock = true; in fuse_file_flock()
2650 struct inode *inode = mapping->host; in fuse_bmap()
2657 if (!inode->i_sb->s_bdev || fm->fc->no_bmap) in fuse_bmap()
2662 inarg.blocksize = inode->i_sb->s_blocksize; in fuse_bmap()
2672 if (err == -ENOSYS) in fuse_bmap()
2673 fm->fc->no_bmap = 1; in fuse_bmap()
2680 struct inode *inode = file->f_mapping->host; in fuse_lseek()
2682 struct fuse_file *ff = file->private_data; in fuse_lseek()
2685 .fh = ff->fh, in fuse_lseek()
2692 if (fm->fc->no_lseek) in fuse_lseek()
2696 args.nodeid = ff->nodeid; in fuse_lseek()
2705 if (err == -ENOSYS) { in fuse_lseek()
2706 fm->fc->no_lseek = 1; in fuse_lseek()
2712 return vfs_setpos(file, outarg.offset, inode->i_sb->s_maxbytes); in fuse_lseek()
2747 retval = -EINVAL; in fuse_file_llseek()
2755 * fuse_conn->polled_files which is indexed by kh. Walk the tree and
2761 struct rb_node **link = &fc->polled_files.rb_node; in fuse_find_polled_node()
2770 if (kh < ff->kh) in fuse_find_polled_node()
2771 link = &last->rb_left; in fuse_find_polled_node()
2772 else if (kh > ff->kh) in fuse_find_polled_node()
2773 link = &last->rb_right; in fuse_find_polled_node()
2792 spin_lock(&fc->lock); in fuse_register_polled_file()
2793 if (RB_EMPTY_NODE(&ff->polled_node)) { in fuse_register_polled_file()
2796 link = fuse_find_polled_node(fc, ff->kh, &parent); in fuse_register_polled_file()
2798 rb_link_node(&ff->polled_node, parent, link); in fuse_register_polled_file()
2799 rb_insert_color(&ff->polled_node, &fc->polled_files); in fuse_register_polled_file()
2801 spin_unlock(&fc->lock); in fuse_register_polled_file()
2806 struct fuse_file *ff = file->private_data; in fuse_file_poll()
2807 struct fuse_mount *fm = ff->fm; in fuse_file_poll()
2808 struct fuse_poll_in inarg = { .fh = ff->fh, .kh = ff->kh }; in fuse_file_poll()
2813 if (fm->fc->no_poll) in fuse_file_poll()
2816 poll_wait(file, &ff->poll_wait, wait); in fuse_file_poll()
2823 if (waitqueue_active(&ff->poll_wait)) { in fuse_file_poll()
2825 fuse_register_polled_file(fm->fc, ff); in fuse_file_poll()
2829 args.nodeid = ff->nodeid; in fuse_file_poll()
2840 if (err == -ENOSYS) { in fuse_file_poll()
2841 fm->fc->no_poll = 1; in fuse_file_poll()
2855 u64 kh = outarg->kh; in fuse_notify_poll_wakeup()
2858 spin_lock(&fc->lock); in fuse_notify_poll_wakeup()
2865 wake_up_interruptible_sync(&ff->poll_wait); in fuse_notify_poll_wakeup()
2868 spin_unlock(&fc->lock); in fuse_notify_poll_wakeup()
2874 struct inode *inode = file->f_mapping->host; in fuse_do_truncate()
2888 return round_up(off, fc->max_pages << PAGE_SHIFT); in fuse_round_up()
2896 struct file *file = iocb->ki_filp; in fuse_direct_IO()
2897 struct fuse_file *ff = file->private_data; in fuse_direct_IO()
2902 loff_t offset = iocb->ki_pos; in fuse_direct_IO()
2903 struct fuse_io_priv *io; in fuse_direct_IO() local
2906 inode = file->f_mapping->host; in fuse_direct_IO()
2912 io = kmalloc(sizeof(struct fuse_io_priv), GFP_KERNEL); in fuse_direct_IO()
2913 if (!io) in fuse_direct_IO()
2914 return -ENOMEM; in fuse_direct_IO()
2915 spin_lock_init(&io->lock); in fuse_direct_IO()
2916 kref_init(&io->refcnt); in fuse_direct_IO()
2917 io->reqs = 1; in fuse_direct_IO()
2918 io->bytes = -1; in fuse_direct_IO()
2919 io->size = 0; in fuse_direct_IO()
2920 io->offset = offset; in fuse_direct_IO()
2921 io->write = (iov_iter_rw(iter) == WRITE); in fuse_direct_IO()
2922 io->err = 0; in fuse_direct_IO()
2927 io->async = ff->fm->fc->async_dio; in fuse_direct_IO()
2928 io->iocb = iocb; in fuse_direct_IO()
2929 io->blocking = is_sync_kiocb(iocb); in fuse_direct_IO()
2932 if (io->async && !io->write && offset + count > i_size) { in fuse_direct_IO()
2933 iov_iter_truncate(iter, fuse_round_up(ff->fm->fc, i_size - offset)); in fuse_direct_IO()
2934 shortened = count - iov_iter_count(iter); in fuse_direct_IO()
2935 count -= shortened; in fuse_direct_IO()
2940 * In such case the aio will behave exactly like sync io. in fuse_direct_IO()
2942 if ((offset + count > i_size) && io->write) in fuse_direct_IO()
2943 io->blocking = true; in fuse_direct_IO()
2945 if (io->async && io->blocking) { in fuse_direct_IO()
2947 * Additional reference to keep io around after in fuse_direct_IO()
2950 kref_get(&io->refcnt); in fuse_direct_IO()
2951 io->done = &wait; in fuse_direct_IO()
2955 ret = fuse_direct_io(io, iter, &pos, FUSE_DIO_WRITE); in fuse_direct_IO()
2958 ret = __fuse_direct_read(io, iter, &pos); in fuse_direct_IO()
2962 if (io->async) { in fuse_direct_IO()
2963 bool blocking = io->blocking; in fuse_direct_IO() local
2965 fuse_aio_complete(io, ret < 0 ? ret : 0, -1); in fuse_direct_IO()
2967 /* we have a non-extending, async request, so return */ in fuse_direct_IO()
2968 if (!blocking) in fuse_direct_IO()
2969 return -EIOCBQUEUED; in fuse_direct_IO()
2972 ret = fuse_get_res_by_io(io); in fuse_direct_IO()
2975 kref_put(&io->refcnt, fuse_io_release); in fuse_direct_IO()
2989 int err = filemap_write_and_wait_range(inode->i_mapping, start, LLONG_MAX); in fuse_writeback_range()
3000 struct fuse_file *ff = file->private_data; in fuse_file_fallocate()
3003 struct fuse_mount *fm = ff->fm; in fuse_file_fallocate()
3006 .fh = ff->fh, in fuse_file_fallocate()
3018 return -EOPNOTSUPP; in fuse_file_fallocate()
3020 if (fm->fc->no_fallocate) in fuse_file_fallocate()
3021 return -EOPNOTSUPP; in fuse_file_fallocate()
3025 filemap_invalidate_lock(inode->i_mapping); in fuse_file_fallocate()
3032 loff_t endbyte = offset + length - 1; in fuse_file_fallocate()
3051 set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); in fuse_file_fallocate()
3054 args.nodeid = ff->nodeid; in fuse_file_fallocate()
3059 if (err == -ENOSYS) { in fuse_file_fallocate()
3060 fm->fc->no_fallocate = 1; in fuse_file_fallocate()
3061 err = -EOPNOTSUPP; in fuse_file_fallocate()
3073 truncate_pagecache_range(inode, offset, offset + length - 1); in fuse_file_fallocate()
3079 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); in fuse_file_fallocate()
3082 filemap_invalidate_unlock(inode->i_mapping); in fuse_file_fallocate()
3095 struct fuse_file *ff_in = file_in->private_data; in __fuse_copy_file_range()
3096 struct fuse_file *ff_out = file_out->private_data; in __fuse_copy_file_range()
3100 struct fuse_mount *fm = ff_in->fm; in __fuse_copy_file_range()
3101 struct fuse_conn *fc = fm->fc; in __fuse_copy_file_range()
3104 .fh_in = ff_in->fh, in __fuse_copy_file_range()
3106 .nodeid_out = ff_out->nodeid, in __fuse_copy_file_range()
3107 .fh_out = ff_out->fh, in __fuse_copy_file_range()
3114 /* mark unstable when write-back is not used, and file_out gets in __fuse_copy_file_range()
3116 bool is_unstable = (!fc->writeback_cache) && in __fuse_copy_file_range()
3117 ((pos_out + len) > inode_out->i_size); in __fuse_copy_file_range()
3119 if (fc->no_copy_file_range) in __fuse_copy_file_range()
3120 return -EOPNOTSUPP; in __fuse_copy_file_range()
3122 if (file_inode(file_in)->i_sb != file_inode(file_out)->i_sb) in __fuse_copy_file_range()
3123 return -EXDEV; in __fuse_copy_file_range()
3126 err = fuse_writeback_range(inode_in, pos_in, pos_in + len - 1); in __fuse_copy_file_range()
3152 * To fix this a mapping->invalidate_lock could be used to prevent new in __fuse_copy_file_range()
3155 err = fuse_writeback_range(inode_out, pos_out, pos_out + len - 1); in __fuse_copy_file_range()
3160 set_bit(FUSE_I_SIZE_UNSTABLE, &fi_out->state); in __fuse_copy_file_range()
3163 args.nodeid = ff_in->nodeid; in __fuse_copy_file_range()
3171 if (err == -ENOSYS) { in __fuse_copy_file_range()
3172 fc->no_copy_file_range = 1; in __fuse_copy_file_range()
3173 err = -EOPNOTSUPP; in __fuse_copy_file_range()
3178 truncate_inode_pages_range(inode_out->i_mapping, in __fuse_copy_file_range()
3180 ALIGN(pos_out + outarg.size, PAGE_SIZE) - 1); in __fuse_copy_file_range()
3188 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi_out->state); in __fuse_copy_file_range()
3207 if (ret == -EOPNOTSUPP || ret == -EXDEV) in fuse_copy_file_range()
3251 inode->i_fop = &fuse_file_operations; in fuse_init_file_inode()
3252 inode->i_data.a_ops = &fuse_file_aops; in fuse_init_file_inode()
3254 INIT_LIST_HEAD(&fi->write_files); in fuse_init_file_inode()
3255 INIT_LIST_HEAD(&fi->queued_writes); in fuse_init_file_inode()
3256 fi->writectr = 0; in fuse_init_file_inode()
3257 init_waitqueue_head(&fi->page_waitq); in fuse_init_file_inode()
3258 fi->writepages = RB_ROOT; in fuse_init_file_inode()