summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@redhat.com>2019-09-10 09:04:10 -0400
committerMiklos Szeredi <mszeredi@redhat.com>2019-09-10 10:29:49 -0400
commit33826ebbbe4b45ccecf2f5a08b3457f5d59c6282 (patch)
tree806a7a70bef00091ea21d3bda3f375a88b6dbe3c
parent43f5098eb82b1dbf3988cab0a26e729e88a004fc (diff)
fuse: convert writepages to simple api
Derive fuse_writepage_args from fuse_io_args. Sending the request is tricky since it was done with fi->lock held, hence we must either use atomic allocation or release the lock. Both are possible so try atomic first and if it fails, release the lock and do the regular allocation with GFP_NOFS and __GFP_NOFAIL. Both flags are necessary for correct operation. Move the page realloc function from dev.c to file.c and convert to using fuse_writepage_args. The last caller of fuse_write_fill() is gone, so get rid of it. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
-rw-r--r--fs/fuse/dev.c27
-rw-r--r--fs/fuse/file.c361
-rw-r--r--fs/fuse/fuse_i.h3
3 files changed, 206 insertions, 185 deletions
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index a52a7380baa4..d87accc9df9d 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -96,33 +96,6 @@ static void fuse_req_pages_free(struct fuse_req *req)
96 kfree(req->pages); 96 kfree(req->pages);
97} 97}
98 98
99bool fuse_req_realloc_pages(struct fuse_conn *fc, struct fuse_req *req,
100 gfp_t flags)
101{
102 struct page **pages;
103 struct fuse_page_desc *page_descs;
104 unsigned int npages = min_t(unsigned int,
105 max_t(unsigned int, req->max_pages * 2,
106 FUSE_DEFAULT_MAX_PAGES_PER_REQ),
107 fc->max_pages);
108 WARN_ON(npages <= req->max_pages);
109
110 pages = fuse_pages_alloc(npages, flags, &page_descs);
111 if (!pages)
112 return false;
113
114 memcpy(pages, req->pages, sizeof(struct page *) * req->max_pages);
115 memcpy(page_descs, req->page_descs,
116 sizeof(struct fuse_page_desc) * req->max_pages);
117 fuse_req_pages_free(req);
118 __set_bit(FR_ALLOC_PAGES, &req->flags);
119 req->pages = pages;
120 req->page_descs = page_descs;
121 req->max_pages = npages;
122
123 return true;
124}
125
126void fuse_request_free(struct fuse_req *req) 99void fuse_request_free(struct fuse_req *req)
127{ 100{
128 fuse_req_pages_free(req); 101 fuse_req_pages_free(req);
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 3cb98ff267cf..399b89b29bb4 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -347,19 +347,27 @@ u64 fuse_lock_owner_id(struct fuse_conn *fc, fl_owner_t id)
347 return (u64) v0 + ((u64) v1 << 32); 347 return (u64) v0 + ((u64) v1 << 32);
348} 348}
349 349
350static struct fuse_req *fuse_find_writeback(struct fuse_inode *fi, 350struct fuse_writepage_args {
351 struct fuse_io_args ia;
352 struct list_head writepages_entry;
353 struct list_head queue_entry;
354 struct fuse_writepage_args *next;
355 struct inode *inode;
356};
357
358static struct fuse_writepage_args *fuse_find_writeback(struct fuse_inode *fi,
351 pgoff_t idx_from, pgoff_t idx_to) 359 pgoff_t idx_from, pgoff_t idx_to)
352{ 360{
353 struct fuse_req *req; 361 struct fuse_writepage_args *wpa;
354 362
355 list_for_each_entry(req, &fi->writepages, writepages_entry) { 363 list_for_each_entry(wpa, &fi->writepages, writepages_entry) {
356 pgoff_t curr_index; 364 pgoff_t curr_index;
357 365
358 WARN_ON(get_fuse_inode(req->inode) != fi); 366 WARN_ON(get_fuse_inode(wpa->inode) != fi);
359 curr_index = req->misc.write.in.offset >> PAGE_SHIFT; 367 curr_index = wpa->ia.write.in.offset >> PAGE_SHIFT;
360 if (idx_from < curr_index + req->num_pages && 368 if (idx_from < curr_index + wpa->ia.ap.num_pages &&
361 curr_index <= idx_to) { 369 curr_index <= idx_to) {
362 return req; 370 return wpa;
363 } 371 }
364 } 372 }
365 return NULL; 373 return NULL;
@@ -984,29 +992,6 @@ static ssize_t fuse_cache_read_iter(struct kiocb *iocb, struct iov_iter *to)
984 return generic_file_read_iter(iocb, to); 992 return generic_file_read_iter(iocb, to);
985} 993}
986 994
987static void fuse_write_fill(struct fuse_req *req, struct fuse_file *ff,
988 loff_t pos, size_t count)
989{
990 struct fuse_write_in *inarg = &req->misc.write.in;
991 struct fuse_write_out *outarg = &req->misc.write.out;
992
993 inarg->fh = ff->fh;
994 inarg->offset = pos;
995 inarg->size = count;
996 req->in.h.opcode = FUSE_WRITE;
997 req->in.h.nodeid = ff->nodeid;
998 req->in.numargs = 2;
999 if (ff->fc->minor < 9)
1000 req->in.args[0].size = FUSE_COMPAT_WRITE_IN_SIZE;
1001 else
1002 req->in.args[0].size = sizeof(struct fuse_write_in);
1003 req->in.args[0].value = inarg;
1004 req->in.args[1].size = count;
1005 req->out.numargs = 1;
1006 req->out.args[0].size = sizeof(struct fuse_write_out);
1007 req->out.args[0].value = outarg;
1008}
1009
1010static void fuse_write_args_fill(struct fuse_io_args *ia, struct fuse_file *ff, 995static void fuse_write_args_fill(struct fuse_io_args *ia, struct fuse_file *ff,
1011 loff_t pos, size_t count) 996 loff_t pos, size_t count)
1012{ 997{
@@ -1576,45 +1561,53 @@ static ssize_t fuse_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
1576 return fuse_direct_write_iter(iocb, from); 1561 return fuse_direct_write_iter(iocb, from);
1577} 1562}
1578 1563
1579static void fuse_writepage_free(struct fuse_conn *fc, struct fuse_req *req) 1564static void fuse_writepage_free(struct fuse_writepage_args *wpa)
1580{ 1565{
1566 struct fuse_args_pages *ap = &wpa->ia.ap;
1581 int i; 1567 int i;
1582 1568
1583 for (i = 0; i < req->num_pages; i++) 1569 for (i = 0; i < ap->num_pages; i++)
1584 __free_page(req->pages[i]); 1570 __free_page(ap->pages[i]);
1571
1572 if (wpa->ia.ff)
1573 fuse_file_put(wpa->ia.ff, false, false);
1585 1574
1586 if (req->ff) 1575 kfree(ap->pages);
1587 fuse_file_put(req->ff, false, false); 1576 kfree(wpa);
1588} 1577}
1589 1578
1590static void fuse_writepage_finish(struct fuse_conn *fc, struct fuse_req *req) 1579static void fuse_writepage_finish(struct fuse_conn *fc,
1580 struct fuse_writepage_args *wpa)
1591{ 1581{
1592 struct inode *inode = req->inode; 1582 struct fuse_args_pages *ap = &wpa->ia.ap;
1583 struct inode *inode = wpa->inode;
1593 struct fuse_inode *fi = get_fuse_inode(inode); 1584 struct fuse_inode *fi = get_fuse_inode(inode);
1594 struct backing_dev_info *bdi = inode_to_bdi(inode); 1585 struct backing_dev_info *bdi = inode_to_bdi(inode);
1595 int i; 1586 int i;
1596 1587
1597 list_del(&req->writepages_entry); 1588 list_del(&wpa->writepages_entry);
1598 for (i = 0; i < req->num_pages; i++) { 1589 for (i = 0; i < ap->num_pages; i++) {
1599 dec_wb_stat(&bdi->wb, WB_WRITEBACK); 1590 dec_wb_stat(&bdi->wb, WB_WRITEBACK);
1600 dec_node_page_state(req->pages[i], NR_WRITEBACK_TEMP); 1591 dec_node_page_state(ap->pages[i], NR_WRITEBACK_TEMP);
1601 wb_writeout_inc(&bdi->wb); 1592 wb_writeout_inc(&bdi->wb);
1602 } 1593 }
1603 wake_up(&fi->page_waitq); 1594 wake_up(&fi->page_waitq);
1604} 1595}
1605 1596
1606/* Called under fi->lock, may release and reacquire it */ 1597/* Called under fi->lock, may release and reacquire it */
1607static void fuse_send_writepage(struct fuse_conn *fc, struct fuse_req *req, 1598static void fuse_send_writepage(struct fuse_conn *fc,
1608 loff_t size) 1599 struct fuse_writepage_args *wpa, loff_t size)
1609__releases(fi->lock) 1600__releases(fi->lock)
1610__acquires(fi->lock) 1601__acquires(fi->lock)
1611{ 1602{
1612 struct fuse_req *aux, *next; 1603 struct fuse_writepage_args *aux, *next;
1613 struct fuse_inode *fi = get_fuse_inode(req->inode); 1604 struct fuse_inode *fi = get_fuse_inode(wpa->inode);
1614 struct fuse_write_in *inarg = &req->misc.write.in; 1605 struct fuse_write_in *inarg = &wpa->ia.write.in;
1615 __u64 data_size = req->num_pages * PAGE_SIZE; 1606 struct fuse_args *args = &wpa->ia.ap.args;
1616 bool queued; 1607 __u64 data_size = wpa->ia.ap.num_pages * PAGE_SIZE;
1608 int err;
1617 1609
1610 fi->writectr++;
1618 if (inarg->offset + data_size <= size) { 1611 if (inarg->offset + data_size <= size) {
1619 inarg->size = data_size; 1612 inarg->size = data_size;
1620 } else if (inarg->offset < size) { 1613 } else if (inarg->offset < size) {
@@ -1624,29 +1617,36 @@ __acquires(fi->lock)
1624 goto out_free; 1617 goto out_free;
1625 } 1618 }
1626 1619
1627 req->in.args[1].size = inarg->size; 1620 args->in_args[1].size = inarg->size;
1628 queued = fuse_request_queue_background(fc, req); 1621 args->force = true;
1622 args->nocreds = true;
1623
1624 err = fuse_simple_background(fc, args, GFP_ATOMIC);
1625 if (err == -ENOMEM) {
1626 spin_unlock(&fi->lock);
1627 err = fuse_simple_background(fc, args, GFP_NOFS | __GFP_NOFAIL);
1628 spin_lock(&fi->lock);
1629 }
1630
1629 /* Fails on broken connection only */ 1631 /* Fails on broken connection only */
1630 if (unlikely(!queued)) 1632 if (unlikely(err))
1631 goto out_free; 1633 goto out_free;
1632 1634
1633 fi->writectr++;
1634 return; 1635 return;
1635 1636
1636 out_free: 1637 out_free:
1637 fuse_writepage_finish(fc, req); 1638 fi->writectr--;
1639 fuse_writepage_finish(fc, wpa);
1638 spin_unlock(&fi->lock); 1640 spin_unlock(&fi->lock);
1639 1641
1640 /* After fuse_writepage_finish() aux request list is private */ 1642 /* After fuse_writepage_finish() aux request list is private */
1641 for (aux = req->misc.write.next; aux; aux = next) { 1643 for (aux = wpa->next; aux; aux = next) {
1642 next = aux->misc.write.next; 1644 next = aux->next;
1643 aux->misc.write.next = NULL; 1645 aux->next = NULL;
1644 fuse_writepage_free(fc, aux); 1646 fuse_writepage_free(aux);
1645 fuse_put_request(fc, aux);
1646 } 1647 }
1647 1648
1648 fuse_writepage_free(fc, req); 1649 fuse_writepage_free(wpa);
1649 fuse_put_request(fc, req);
1650 spin_lock(&fi->lock); 1650 spin_lock(&fi->lock);
1651} 1651}
1652 1652
@@ -1663,29 +1663,34 @@ __acquires(fi->lock)
1663 struct fuse_conn *fc = get_fuse_conn(inode); 1663 struct fuse_conn *fc = get_fuse_conn(inode);
1664 struct fuse_inode *fi = get_fuse_inode(inode); 1664 struct fuse_inode *fi = get_fuse_inode(inode);
1665 loff_t crop = i_size_read(inode); 1665 loff_t crop = i_size_read(inode);
1666 struct fuse_req *req; 1666 struct fuse_writepage_args *wpa;
1667 1667
1668 while (fi->writectr >= 0 && !list_empty(&fi->queued_writes)) { 1668 while (fi->writectr >= 0 && !list_empty(&fi->queued_writes)) {
1669 req = list_entry(fi->queued_writes.next, struct fuse_req, list); 1669 wpa = list_entry(fi->queued_writes.next,
1670 list_del_init(&req->list); 1670 struct fuse_writepage_args, queue_entry);
1671 fuse_send_writepage(fc, req, crop); 1671 list_del_init(&wpa->queue_entry);
1672 fuse_send_writepage(fc, wpa, crop);
1672 } 1673 }
1673} 1674}
1674 1675
1675static void fuse_writepage_end(struct fuse_conn *fc, struct fuse_req *req) 1676static void fuse_writepage_end(struct fuse_conn *fc, struct fuse_args *args,
1677 int error)
1676{ 1678{
1677 struct inode *inode = req->inode; 1679 struct fuse_writepage_args *wpa =
1680 container_of(args, typeof(*wpa), ia.ap.args);
1681 struct inode *inode = wpa->inode;
1678 struct fuse_inode *fi = get_fuse_inode(inode); 1682 struct fuse_inode *fi = get_fuse_inode(inode);
1679 1683
1680 mapping_set_error(inode->i_mapping, req->out.h.error); 1684 mapping_set_error(inode->i_mapping, error);
1681 spin_lock(&fi->lock); 1685 spin_lock(&fi->lock);
1682 while (req->misc.write.next) { 1686 while (wpa->next) {
1683 struct fuse_conn *fc = get_fuse_conn(inode); 1687 struct fuse_conn *fc = get_fuse_conn(inode);
1684 struct fuse_write_in *inarg = &req->misc.write.in; 1688 struct fuse_write_in *inarg = &wpa->ia.write.in;
1685 struct fuse_req *next = req->misc.write.next; 1689 struct fuse_writepage_args *next = wpa->next;
1686 req->misc.write.next = next->misc.write.next; 1690
1687 next->misc.write.next = NULL; 1691 wpa->next = next->next;
1688 next->ff = fuse_file_get(req->ff); 1692 next->next = NULL;
1693 next->ia.ff = fuse_file_get(wpa->ia.ff);
1689 list_add(&next->writepages_entry, &fi->writepages); 1694 list_add(&next->writepages_entry, &fi->writepages);
1690 1695
1691 /* 1696 /*
@@ -1714,9 +1719,9 @@ static void fuse_writepage_end(struct fuse_conn *fc, struct fuse_req *req)
1714 fuse_send_writepage(fc, next, inarg->offset + inarg->size); 1719 fuse_send_writepage(fc, next, inarg->offset + inarg->size);
1715 } 1720 }
1716 fi->writectr--; 1721 fi->writectr--;
1717 fuse_writepage_finish(fc, req); 1722 fuse_writepage_finish(fc, wpa);
1718 spin_unlock(&fi->lock); 1723 spin_unlock(&fi->lock);
1719 fuse_writepage_free(fc, req); 1724 fuse_writepage_free(wpa);
1720} 1725}
1721 1726
1722static struct fuse_file *__fuse_write_file_get(struct fuse_conn *fc, 1727static struct fuse_file *__fuse_write_file_get(struct fuse_conn *fc,
@@ -1758,52 +1763,71 @@ int fuse_write_inode(struct inode *inode, struct writeback_control *wbc)
1758 return err; 1763 return err;
1759} 1764}
1760 1765
1766static struct fuse_writepage_args *fuse_writepage_args_alloc(void)
1767{
1768 struct fuse_writepage_args *wpa;
1769 struct fuse_args_pages *ap;
1770
1771 wpa = kzalloc(sizeof(*wpa), GFP_NOFS);
1772 if (wpa) {
1773 ap = &wpa->ia.ap;
1774 ap->num_pages = 0;
1775 ap->pages = fuse_pages_alloc(1, GFP_NOFS, &ap->descs);
1776 if (!ap->pages) {
1777 kfree(wpa);
1778 wpa = NULL;
1779 }
1780 }
1781 return wpa;
1782
1783}
1784
1761static int fuse_writepage_locked(struct page *page) 1785static int fuse_writepage_locked(struct page *page)
1762{ 1786{
1763 struct address_space *mapping = page->mapping; 1787 struct address_space *mapping = page->mapping;
1764 struct inode *inode = mapping->host; 1788 struct inode *inode = mapping->host;
1765 struct fuse_conn *fc = get_fuse_conn(inode); 1789 struct fuse_conn *fc = get_fuse_conn(inode);
1766 struct fuse_inode *fi = get_fuse_inode(inode); 1790 struct fuse_inode *fi = get_fuse_inode(inode);
1767 struct fuse_req *req; 1791 struct fuse_writepage_args *wpa;
1792 struct fuse_args_pages *ap;
1768 struct page *tmp_page; 1793 struct page *tmp_page;
1769 int error = -ENOMEM; 1794 int error = -ENOMEM;
1770 1795
1771 set_page_writeback(page); 1796 set_page_writeback(page);
1772 1797
1773 req = fuse_request_alloc_nofs(1); 1798 wpa = fuse_writepage_args_alloc();
1774 if (!req) 1799 if (!wpa)
1775 goto err; 1800 goto err;
1801 ap = &wpa->ia.ap;
1776 1802
1777 /* writeback always goes to bg_queue */
1778 __set_bit(FR_BACKGROUND, &req->flags);
1779 tmp_page = alloc_page(GFP_NOFS | __GFP_HIGHMEM); 1803 tmp_page = alloc_page(GFP_NOFS | __GFP_HIGHMEM);
1780 if (!tmp_page) 1804 if (!tmp_page)
1781 goto err_free; 1805 goto err_free;
1782 1806
1783 error = -EIO; 1807 error = -EIO;
1784 req->ff = fuse_write_file_get(fc, fi); 1808 wpa->ia.ff = fuse_write_file_get(fc, fi);
1785 if (!req->ff) 1809 if (!wpa->ia.ff)
1786 goto err_nofile; 1810 goto err_nofile;
1787 1811
1788 fuse_write_fill(req, req->ff, page_offset(page), 0); 1812 fuse_write_args_fill(&wpa->ia, wpa->ia.ff, page_offset(page), 0);
1789 1813
1790 copy_highpage(tmp_page, page); 1814 copy_highpage(tmp_page, page);
1791 req->misc.write.in.write_flags |= FUSE_WRITE_CACHE; 1815 wpa->ia.write.in.write_flags |= FUSE_WRITE_CACHE;
1792 req->misc.write.next = NULL; 1816 wpa->next = NULL;
1793 req->in.argpages = 1; 1817 ap->args.in_pages = true;
1794 req->num_pages = 1; 1818 ap->num_pages = 1;
1795 req->pages[0] = tmp_page; 1819 ap->pages[0] = tmp_page;
1796 req->page_descs[0].offset = 0; 1820 ap->descs[0].offset = 0;
1797 req->page_descs[0].length = PAGE_SIZE; 1821 ap->descs[0].length = PAGE_SIZE;
1798 req->end = fuse_writepage_end; 1822 ap->args.end = fuse_writepage_end;
1799 req->inode = inode; 1823 wpa->inode = inode;
1800 1824
1801 inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK); 1825 inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK);
1802 inc_node_page_state(tmp_page, NR_WRITEBACK_TEMP); 1826 inc_node_page_state(tmp_page, NR_WRITEBACK_TEMP);
1803 1827
1804 spin_lock(&fi->lock); 1828 spin_lock(&fi->lock);
1805 list_add(&req->writepages_entry, &fi->writepages); 1829 list_add(&wpa->writepages_entry, &fi->writepages);
1806 list_add_tail(&req->list, &fi->queued_writes); 1830 list_add_tail(&wpa->queue_entry, &fi->queued_writes);
1807 fuse_flush_writepages(inode); 1831 fuse_flush_writepages(inode);
1808 spin_unlock(&fi->lock); 1832 spin_unlock(&fi->lock);
1809 1833
@@ -1814,7 +1838,7 @@ static int fuse_writepage_locked(struct page *page)
1814err_nofile: 1838err_nofile:
1815 __free_page(tmp_page); 1839 __free_page(tmp_page);
1816err_free: 1840err_free:
1817 fuse_request_free(req); 1841 kfree(wpa);
1818err: 1842err:
1819 mapping_set_error(page->mapping, error); 1843 mapping_set_error(page->mapping, error);
1820 end_page_writeback(page); 1844 end_page_writeback(page);
@@ -1844,23 +1868,50 @@ static int fuse_writepage(struct page *page, struct writeback_control *wbc)
1844} 1868}
1845 1869
1846struct fuse_fill_wb_data { 1870struct fuse_fill_wb_data {
1847 struct fuse_req *req; 1871 struct fuse_writepage_args *wpa;
1848 struct fuse_file *ff; 1872 struct fuse_file *ff;
1849 struct inode *inode; 1873 struct inode *inode;
1850 struct page **orig_pages; 1874 struct page **orig_pages;
1875 unsigned int max_pages;
1851}; 1876};
1852 1877
1878static bool fuse_pages_realloc(struct fuse_fill_wb_data *data)
1879{
1880 struct fuse_args_pages *ap = &data->wpa->ia.ap;
1881 struct fuse_conn *fc = get_fuse_conn(data->inode);
1882 struct page **pages;
1883 struct fuse_page_desc *descs;
1884 unsigned int npages = min_t(unsigned int,
1885 max_t(unsigned int, data->max_pages * 2,
1886 FUSE_DEFAULT_MAX_PAGES_PER_REQ),
1887 fc->max_pages);
1888 WARN_ON(npages <= data->max_pages);
1889
1890 pages = fuse_pages_alloc(npages, GFP_NOFS, &descs);
1891 if (!pages)
1892 return false;
1893
1894 memcpy(pages, ap->pages, sizeof(struct page *) * ap->num_pages);
1895 memcpy(descs, ap->descs, sizeof(struct fuse_page_desc) * ap->num_pages);
1896 kfree(ap->pages);
1897 ap->pages = pages;
1898 ap->descs = descs;
1899 data->max_pages = npages;
1900
1901 return true;
1902}
1903
1853static void fuse_writepages_send(struct fuse_fill_wb_data *data) 1904static void fuse_writepages_send(struct fuse_fill_wb_data *data)
1854{ 1905{
1855 struct fuse_req *req = data->req; 1906 struct fuse_writepage_args *wpa = data->wpa;
1856 struct inode *inode = data->inode; 1907 struct inode *inode = data->inode;
1857 struct fuse_inode *fi = get_fuse_inode(inode); 1908 struct fuse_inode *fi = get_fuse_inode(inode);
1858 int num_pages = req->num_pages; 1909 int num_pages = wpa->ia.ap.num_pages;
1859 int i; 1910 int i;
1860 1911
1861 req->ff = fuse_file_get(data->ff); 1912 wpa->ia.ff = fuse_file_get(data->ff);
1862 spin_lock(&fi->lock); 1913 spin_lock(&fi->lock);
1863 list_add_tail(&req->list, &fi->queued_writes); 1914 list_add_tail(&wpa->queue_entry, &fi->queued_writes);
1864 fuse_flush_writepages(inode); 1915 fuse_flush_writepages(inode);
1865 spin_unlock(&fi->lock); 1916 spin_unlock(&fi->lock);
1866 1917
@@ -1875,54 +1926,52 @@ static void fuse_writepages_send(struct fuse_fill_wb_data *data)
1875 * this new request onto the auxiliary list, otherwise reuse the existing one by 1926 * this new request onto the auxiliary list, otherwise reuse the existing one by
1876 * copying the new page contents over to the old temporary page. 1927 * copying the new page contents over to the old temporary page.
1877 */ 1928 */
1878static bool fuse_writepage_in_flight(struct fuse_req *new_req, 1929static bool fuse_writepage_in_flight(struct fuse_writepage_args *new_wpa,
1879 struct page *page) 1930 struct page *page)
1880{ 1931{
1881 struct fuse_conn *fc = get_fuse_conn(new_req->inode); 1932 struct fuse_inode *fi = get_fuse_inode(new_wpa->inode);
1882 struct fuse_inode *fi = get_fuse_inode(new_req->inode); 1933 struct fuse_writepage_args *tmp;
1883 struct fuse_req *tmp; 1934 struct fuse_writepage_args *old_wpa;
1884 struct fuse_req *old_req; 1935 struct fuse_args_pages *new_ap = &new_wpa->ia.ap;
1885 1936
1886 WARN_ON(new_req->num_pages != 0); 1937 WARN_ON(new_ap->num_pages != 0);
1887 1938
1888 spin_lock(&fi->lock); 1939 spin_lock(&fi->lock);
1889 list_del(&new_req->writepages_entry); 1940 list_del(&new_wpa->writepages_entry);
1890 old_req = fuse_find_writeback(fi, page->index, page->index); 1941 old_wpa = fuse_find_writeback(fi, page->index, page->index);
1891 if (!old_req) { 1942 if (!old_wpa) {
1892 list_add(&new_req->writepages_entry, &fi->writepages); 1943 list_add(&new_wpa->writepages_entry, &fi->writepages);
1893 spin_unlock(&fi->lock); 1944 spin_unlock(&fi->lock);
1894 return false; 1945 return false;
1895 } 1946 }
1896 1947
1897 new_req->num_pages = 1; 1948 new_ap->num_pages = 1;
1898 for (tmp = old_req->misc.write.next; tmp; tmp = tmp->misc.write.next) { 1949 for (tmp = old_wpa->next; tmp; tmp = tmp->next) {
1899 pgoff_t curr_index; 1950 pgoff_t curr_index;
1900 1951
1901 WARN_ON(tmp->inode != new_req->inode); 1952 WARN_ON(tmp->inode != new_wpa->inode);
1902 curr_index = tmp->misc.write.in.offset >> PAGE_SHIFT; 1953 curr_index = tmp->ia.write.in.offset >> PAGE_SHIFT;
1903 if (curr_index == page->index) { 1954 if (curr_index == page->index) {
1904 WARN_ON(tmp->num_pages != 1); 1955 WARN_ON(tmp->ia.ap.num_pages != 1);
1905 WARN_ON(!test_bit(FR_PENDING, &tmp->flags)); 1956 swap(tmp->ia.ap.pages[0], new_ap->pages[0]);
1906 swap(tmp->pages[0], new_req->pages[0]);
1907 break; 1957 break;
1908 } 1958 }
1909 } 1959 }
1910 1960
1911 if (!tmp) { 1961 if (!tmp) {
1912 new_req->misc.write.next = old_req->misc.write.next; 1962 new_wpa->next = old_wpa->next;
1913 old_req->misc.write.next = new_req; 1963 old_wpa->next = new_wpa;
1914 } 1964 }
1915 1965
1916 spin_unlock(&fi->lock); 1966 spin_unlock(&fi->lock);
1917 1967
1918 if (tmp) { 1968 if (tmp) {
1919 struct backing_dev_info *bdi = inode_to_bdi(new_req->inode); 1969 struct backing_dev_info *bdi = inode_to_bdi(new_wpa->inode);
1920 1970
1921 dec_wb_stat(&bdi->wb, WB_WRITEBACK); 1971 dec_wb_stat(&bdi->wb, WB_WRITEBACK);
1922 dec_node_page_state(new_req->pages[0], NR_WRITEBACK_TEMP); 1972 dec_node_page_state(new_ap->pages[0], NR_WRITEBACK_TEMP);
1923 wb_writeout_inc(&bdi->wb); 1973 wb_writeout_inc(&bdi->wb);
1924 fuse_writepage_free(fc, new_req); 1974 fuse_writepage_free(new_wpa);
1925 fuse_request_free(new_req);
1926 } 1975 }
1927 1976
1928 return true; 1977 return true;
@@ -1932,7 +1981,8 @@ static int fuse_writepages_fill(struct page *page,
1932 struct writeback_control *wbc, void *_data) 1981 struct writeback_control *wbc, void *_data)
1933{ 1982{
1934 struct fuse_fill_wb_data *data = _data; 1983 struct fuse_fill_wb_data *data = _data;
1935 struct fuse_req *req = data->req; 1984 struct fuse_writepage_args *wpa = data->wpa;
1985 struct fuse_args_pages *ap = &wpa->ia.ap;
1936 struct inode *inode = data->inode; 1986 struct inode *inode = data->inode;
1937 struct fuse_inode *fi = get_fuse_inode(inode); 1987 struct fuse_inode *fi = get_fuse_inode(inode);
1938 struct fuse_conn *fc = get_fuse_conn(inode); 1988 struct fuse_conn *fc = get_fuse_conn(inode);
@@ -1955,16 +2005,16 @@ static int fuse_writepages_fill(struct page *page,
1955 */ 2005 */
1956 is_writeback = fuse_page_is_writeback(inode, page->index); 2006 is_writeback = fuse_page_is_writeback(inode, page->index);
1957 2007
1958 if (req && req->num_pages && 2008 if (wpa && ap->num_pages &&
1959 (is_writeback || req->num_pages == fc->max_pages || 2009 (is_writeback || ap->num_pages == fc->max_pages ||
1960 (req->num_pages + 1) * PAGE_SIZE > fc->max_write || 2010 (ap->num_pages + 1) * PAGE_SIZE > fc->max_write ||
1961 data->orig_pages[req->num_pages - 1]->index + 1 != page->index)) { 2011 data->orig_pages[ap->num_pages - 1]->index + 1 != page->index)) {
1962 fuse_writepages_send(data); 2012 fuse_writepages_send(data);
1963 data->req = NULL; 2013 data->wpa = NULL;
1964 } else if (req && req->num_pages == req->max_pages) { 2014 } else if (wpa && ap->num_pages == data->max_pages) {
1965 if (!fuse_req_realloc_pages(fc, req, GFP_NOFS)) { 2015 if (!fuse_pages_realloc(data)) {
1966 fuse_writepages_send(data); 2016 fuse_writepages_send(data);
1967 req = data->req = NULL; 2017 data->wpa = NULL;
1968 } 2018 }
1969 } 2019 }
1970 2020
@@ -1982,59 +2032,60 @@ static int fuse_writepages_fill(struct page *page,
1982 * This is ensured by holding the page lock in page_mkwrite() while 2032 * This is ensured by holding the page lock in page_mkwrite() while
1983 * checking fuse_page_is_writeback(). We already hold the page lock 2033 * checking fuse_page_is_writeback(). We already hold the page lock
1984 * since clear_page_dirty_for_io() and keep it held until we add the 2034 * since clear_page_dirty_for_io() and keep it held until we add the
1985 * request to the fi->writepages list and increment req->num_pages. 2035 * request to the fi->writepages list and increment ap->num_pages.
1986 * After this fuse_page_is_writeback() will indicate that the page is 2036 * After this fuse_page_is_writeback() will indicate that the page is
1987 * under writeback, so we can release the page lock. 2037 * under writeback, so we can release the page lock.
1988 */ 2038 */
1989 if (data->req == NULL) { 2039 if (data->wpa == NULL) {
1990 struct fuse_inode *fi = get_fuse_inode(inode); 2040 struct fuse_inode *fi = get_fuse_inode(inode);
1991 2041
1992 err = -ENOMEM; 2042 err = -ENOMEM;
1993 req = fuse_request_alloc_nofs(FUSE_REQ_INLINE_PAGES); 2043 wpa = fuse_writepage_args_alloc();
1994 if (!req) { 2044 if (!wpa) {
1995 __free_page(tmp_page); 2045 __free_page(tmp_page);
1996 goto out_unlock; 2046 goto out_unlock;
1997 } 2047 }
2048 data->max_pages = 1;
1998 2049
1999 fuse_write_fill(req, data->ff, page_offset(page), 0); 2050 ap = &wpa->ia.ap;
2000 req->misc.write.in.write_flags |= FUSE_WRITE_CACHE; 2051 fuse_write_args_fill(&wpa->ia, data->ff, page_offset(page), 0);
2001 req->misc.write.next = NULL; 2052 wpa->ia.write.in.write_flags |= FUSE_WRITE_CACHE;
2002 req->in.argpages = 1; 2053 wpa->next = NULL;
2003 __set_bit(FR_BACKGROUND, &req->flags); 2054 ap->args.in_pages = true;
2004 req->num_pages = 0; 2055 ap->args.end = fuse_writepage_end;
2005 req->end = fuse_writepage_end; 2056 ap->num_pages = 0;
2006 req->inode = inode; 2057 wpa->inode = inode;
2007 2058
2008 spin_lock(&fi->lock); 2059 spin_lock(&fi->lock);
2009 list_add(&req->writepages_entry, &fi->writepages); 2060 list_add(&wpa->writepages_entry, &fi->writepages);
2010 spin_unlock(&fi->lock); 2061 spin_unlock(&fi->lock);
2011 2062
2012 data->req = req; 2063 data->wpa = wpa;
2013 } 2064 }
2014 set_page_writeback(page); 2065 set_page_writeback(page);
2015 2066
2016 copy_highpage(tmp_page, page); 2067 copy_highpage(tmp_page, page);
2017 req->pages[req->num_pages] = tmp_page; 2068 ap->pages[ap->num_pages] = tmp_page;
2018 req->page_descs[req->num_pages].offset = 0; 2069 ap->descs[ap->num_pages].offset = 0;
2019 req->page_descs[req->num_pages].length = PAGE_SIZE; 2070 ap->descs[ap->num_pages].length = PAGE_SIZE;
2020 2071
2021 inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK); 2072 inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK);
2022 inc_node_page_state(tmp_page, NR_WRITEBACK_TEMP); 2073 inc_node_page_state(tmp_page, NR_WRITEBACK_TEMP);
2023 2074
2024 err = 0; 2075 err = 0;
2025 if (is_writeback && fuse_writepage_in_flight(req, page)) { 2076 if (is_writeback && fuse_writepage_in_flight(wpa, page)) {
2026 end_page_writeback(page); 2077 end_page_writeback(page);
2027 data->req = NULL; 2078 data->wpa = NULL;
2028 goto out_unlock; 2079 goto out_unlock;
2029 } 2080 }
2030 data->orig_pages[req->num_pages] = page; 2081 data->orig_pages[ap->num_pages] = page;
2031 2082
2032 /* 2083 /*
2033 * Protected by fi->lock against concurrent access by 2084 * Protected by fi->lock against concurrent access by
2034 * fuse_page_is_writeback(). 2085 * fuse_page_is_writeback().
2035 */ 2086 */
2036 spin_lock(&fi->lock); 2087 spin_lock(&fi->lock);
2037 req->num_pages++; 2088 ap->num_pages++;
2038 spin_unlock(&fi->lock); 2089 spin_unlock(&fi->lock);
2039 2090
2040out_unlock: 2091out_unlock:
@@ -2056,7 +2107,7 @@ static int fuse_writepages(struct address_space *mapping,
2056 goto out; 2107 goto out;
2057 2108
2058 data.inode = inode; 2109 data.inode = inode;
2059 data.req = NULL; 2110 data.wpa = NULL;
2060 data.ff = NULL; 2111 data.ff = NULL;
2061 2112
2062 err = -ENOMEM; 2113 err = -ENOMEM;
@@ -2067,9 +2118,9 @@ static int fuse_writepages(struct address_space *mapping,
2067 goto out; 2118 goto out;
2068 2119
2069 err = write_cache_pages(mapping, wbc, fuse_writepages_fill, &data); 2120 err = write_cache_pages(mapping, wbc, fuse_writepages_fill, &data);
2070 if (data.req) { 2121 if (data.wpa) {
2071 /* Ignore errors if we can write at least one page */ 2122 /* Ignore errors if we can write at least one page */
2072 BUG_ON(!data.req->num_pages); 2123 WARN_ON(!data.wpa->ia.ap.num_pages);
2073 fuse_writepages_send(&data); 2124 fuse_writepages_send(&data);
2074 err = 0; 2125 err = 0;
2075 } 2126 }
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
index 4d7cd20967c2..a9d707bf2e69 100644
--- a/fs/fuse/fuse_i.h
+++ b/fs/fuse/fuse_i.h
@@ -932,9 +932,6 @@ struct fuse_req *fuse_request_alloc_nofs(unsigned npages);
932 932
933struct page **fuse_pages_alloc(unsigned int npages, gfp_t flags, 933struct page **fuse_pages_alloc(unsigned int npages, gfp_t flags,
934 struct fuse_page_desc **desc); 934 struct fuse_page_desc **desc);
935bool fuse_req_realloc_pages(struct fuse_conn *fc, struct fuse_req *req,
936 gfp_t flags);
937
938 935
939/** 936/**
940 * Free a request 937 * Free a request