Lines Matching refs:ia
385 struct fuse_io_args ia;
405 curr_index = wpa->ia.write.in.offset >> PAGE_SHIFT;
406 if (idx_from >= curr_index + wpa->ia.ap.num_pages)
592 void fuse_read_args_fill(struct fuse_io_args *ia, struct file *file, loff_t pos,
596 struct fuse_args *args = &ia->ap.args;
598 ia->read.in.fh = ff->fh;
599 ia->read.in.offset = pos;
600 ia->read.in.size = count;
601 ia->read.in.flags = file->f_flags;
605 args->in_args[0].size = sizeof(ia->read.in);
606 args->in_args[0].value = &ia->read.in;
693 struct fuse_io_args *ia;
695 ia = kzalloc(sizeof(*ia), GFP_KERNEL);
696 if (ia) {
697 ia->io = io;
698 ia->ap.pages = fuse_pages_alloc(npages, GFP_KERNEL,
699 &ia->ap.descs);
700 if (!ia->ap.pages) {
701 kfree(ia);
702 ia = NULL;
705 return ia;
708 static void fuse_io_free(struct fuse_io_args *ia)
710 kfree(ia->ap.pages);
711 kfree(ia);
717 struct fuse_io_args *ia = container_of(args, typeof(*ia), ap.args);
718 struct fuse_io_priv *io = ia->io;
721 fuse_release_user_pages(&ia->ap, io->should_dirty);
726 if (ia->write.out.size > ia->write.in.size) {
728 } else if (ia->write.in.size != ia->write.out.size) {
729 pos = ia->write.in.offset - io->offset +
730 ia->write.out.size;
735 if (ia->read.in.size != outsize)
736 pos = ia->read.in.offset - io->offset + outsize;
740 fuse_io_free(ia);
744 struct fuse_io_args *ia, size_t num_bytes)
747 struct fuse_io_priv *io = ia->io;
755 ia->ap.args.end = fuse_aio_complete_req;
756 ia->ap.args.may_block = io->should_dirty;
757 err = fuse_simple_background(fm, &ia->ap.args, GFP_KERNEL);
759 fuse_aio_complete_req(fm, &ia->ap.args, err);
764 static ssize_t fuse_send_read(struct fuse_io_args *ia, loff_t pos, size_t count,
767 struct file *file = ia->io->iocb->ki_filp;
771 fuse_read_args_fill(ia, file, pos, count, FUSE_READ);
773 ia->read.in.read_flags |= FUSE_READ_LOCKOWNER;
774 ia->read.in.lock_owner = fuse_lock_owner_id(fm->fc, owner);
777 if (ia->io->async)
778 return fuse_async_req_send(fm, ia, count);
780 return fuse_simple_request(fm, &ia->ap.args);
829 struct fuse_io_args ia = {
852 fuse_read_args_fill(&ia, file, pos, desc.length, FUSE_READ);
853 res = fuse_simple_request(fm, &ia.ap.args);
860 fuse_short_read(inode, attr_ver, res, &ia.ap);
887 struct fuse_io_args *ia = container_of(args, typeof(*ia), ap.args);
888 struct fuse_args_pages *ap = &ia->ap;
889 size_t count = ia->read.in.size;
903 fuse_short_read(inode, ia->read.attr_ver, num_read, ap);
918 if (ia->ff)
919 fuse_file_put(ia->ff, false, false);
921 fuse_io_free(ia);
924 static void fuse_send_readpages(struct fuse_io_args *ia, struct file *file)
928 struct fuse_args_pages *ap = &ia->ap;
945 fuse_read_args_fill(ia, file, pos, count, FUSE_READ);
946 ia->read.attr_ver = fuse_get_attr_version(fm->fc);
948 ia->ff = fuse_file_get(ff);
973 struct fuse_io_args *ia;
981 ia = fuse_io_alloc(NULL, nr_pages);
982 if (!ia)
984 ap = &ia->ap;
992 fuse_send_readpages(ia, rac->file);
1017 static void fuse_write_args_fill(struct fuse_io_args *ia, struct fuse_file *ff,
1020 struct fuse_args *args = &ia->ap.args;
1022 ia->write.in.fh = ff->fh;
1023 ia->write.in.offset = pos;
1024 ia->write.in.size = count;
1031 args->in_args[0].size = sizeof(ia->write.in);
1032 args->in_args[0].value = &ia->write.in;
1035 args->out_args[0].size = sizeof(ia->write.out);
1036 args->out_args[0].value = &ia->write.out;
1051 static ssize_t fuse_send_write(struct fuse_io_args *ia, loff_t pos,
1054 struct kiocb *iocb = ia->io->iocb;
1058 struct fuse_write_in *inarg = &ia->write.in;
1061 fuse_write_args_fill(ia, ff, pos, count);
1068 if (ia->io->async)
1069 return fuse_async_req_send(fm, ia, count);
1071 err = fuse_simple_request(fm, &ia->ap.args);
1072 if (!err && ia->write.out.size > count)
1075 return err ?: ia->write.out.size;
1095 static ssize_t fuse_send_write_pages(struct fuse_io_args *ia,
1099 struct fuse_args_pages *ap = &ia->ap;
1110 fuse_write_args_fill(ia, ff, pos, count);
1111 ia->write.in.flags = fuse_write_flags(iocb);
1114 if (!err && ia->write.out.size > count)
1117 short_write = ia->write.out.size < count;
1119 count = ia->write.out.size;
1135 if (ia->write.page_locked && (i == ap->num_pages - 1))
1143 static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia,
1148 struct fuse_args_pages *ap = &ia->ap;
1208 ia->write.page_locked = true;
1243 struct fuse_io_args ia = {};
1244 struct fuse_args_pages *ap = &ia.ap;
1254 count = fuse_fill_write_pages(&ia, mapping, ii, pos, nr_pages);
1258 err = fuse_send_write_pages(&ia, iocb, inode,
1261 size_t num_written = ia.write.out.size;
1453 struct fuse_io_args *ia;
1457 ia = fuse_io_alloc(io, max_pages);
1458 if (!ia)
1461 ia->io = io;
1476 err = fuse_get_user_pages(&ia->ap, iter, &nbytes, write,
1483 ia->write.in.write_flags |= FUSE_WRITE_KILL_PRIV;
1485 nres = fuse_send_write(ia, pos, nbytes, owner);
1487 nres = fuse_send_read(ia, pos, nbytes, owner);
1491 fuse_release_user_pages(&ia->ap, io->should_dirty);
1492 fuse_io_free(ia);
1494 ia = NULL;
1511 ia = fuse_io_alloc(io, max_pages);
1512 if (!ia)
1516 if (ia)
1517 fuse_io_free(ia);
1619 struct fuse_args_pages *ap = &wpa->ia.ap;
1625 if (wpa->ia.ff)
1626 fuse_file_put(wpa->ia.ff, false, false);
1635 struct fuse_args_pages *ap = &wpa->ia.ap;
1657 struct fuse_write_in *inarg = &wpa->ia.write.in;
1658 struct fuse_args *args = &wpa->ia.ap.args;
1659 __u64 data_size = wpa->ia.ap.num_pages * PAGE_SIZE;
1732 pgoff_t idx_from = wpa->ia.write.in.offset >> PAGE_SHIFT;
1733 pgoff_t idx_to = idx_from + wpa->ia.ap.num_pages - 1;
1737 WARN_ON(!wpa->ia.ap.num_pages);
1746 curr_index = curr->ia.write.in.offset >> PAGE_SHIFT;
1748 if (idx_from >= curr_index + curr->ia.ap.num_pages)
1770 container_of(args, typeof(*wpa), ia.ap.args);
1788 struct fuse_write_in *inarg = &wpa->ia.write.in;
1793 next->ia.ff = fuse_file_get(wpa->ia.ff);
1884 ap = &wpa->ia.ap;
1912 ap = &wpa->ia.ap;
1919 wpa->ia.ff = fuse_write_file_get(fc, fi);
1920 if (!wpa->ia.ff)
1923 fuse_write_args_fill(&wpa->ia, wpa->ia.ff, page_offset(page), 0);
1926 wpa->ia.write.in.write_flags |= FUSE_WRITE_CACHE;
1992 struct fuse_args_pages *ap = &data->wpa->ia.ap;
2021 int num_pages = wpa->ia.ap.num_pages;
2024 wpa->ia.ff = fuse_file_get(data->ff);
2047 struct fuse_args_pages *new_ap = &new_wpa->ia.ap;
2063 curr_index = tmp->ia.write.in.offset >> PAGE_SHIFT;
2065 WARN_ON(tmp->ia.ap.num_pages != 1);
2066 swap(tmp->ia.ap.pages[0], new_ap->pages[0]);
2129 struct fuse_args_pages *ap = &wpa->ia.ap;
2175 ap = &wpa->ia.ap;
2176 fuse_write_args_fill(&wpa->ia, data->ff, page_offset(page), 0);
2177 wpa->ia.write.in.write_flags |= FUSE_WRITE_CACHE;
2240 WARN_ON(!data.wpa->ia.ap.num_pages);