Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

fuse: simplify logic in fuse_notify_store() and fuse_retrieve()

Simplify the folio parsing logic in fuse_notify_store() and
fuse_retrieve().

In particular, calculate the index by tracking pos, which allows us to
remove calculating nr_pages, and use "pos" in place of outarg's offset
field.

Suggested-by: Jingbo Xu <jefflexu@linux.alibaba.com>
Signed-off-by: Joanne Koong <joannelkoong@gmail.com>
Reviewed-by: Jingbo Xu <jefflexu@linux.alibaba.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>

authored by

Joanne Koong and committed by
Miklos Szeredi
25307ca5 65161470

+16 -24
+16 -24
fs/fuse/dev.c
··· 1767 1767 struct address_space *mapping; 1768 1768 u64 nodeid; 1769 1769 int err; 1770 - pgoff_t index; 1771 - unsigned int offset; 1772 1770 unsigned int num; 1773 1771 loff_t file_size; 1772 + loff_t pos; 1774 1773 loff_t end; 1775 1774 1776 1775 if (size < sizeof(outarg)) ··· 1786 1787 return -EINVAL; 1787 1788 1788 1789 nodeid = outarg.nodeid; 1789 - num = min(outarg.size, MAX_LFS_FILESIZE - outarg.offset); 1790 + pos = outarg.offset; 1791 + num = min(outarg.size, MAX_LFS_FILESIZE - pos); 1790 1792 1791 1793 down_read(&fc->killsb); 1792 1794 ··· 1797 1797 goto out_up_killsb; 1798 1798 1799 1799 mapping = inode->i_mapping; 1800 - index = outarg.offset >> PAGE_SHIFT; 1801 - offset = outarg.offset & ~PAGE_MASK; 1802 1800 file_size = i_size_read(inode); 1803 - end = outarg.offset + num; 1801 + end = pos + num; 1804 1802 if (end > file_size) { 1805 1803 file_size = end; 1806 1804 fuse_write_update_attr(inode, file_size, num); ··· 1808 1810 struct folio *folio; 1809 1811 unsigned int folio_offset; 1810 1812 unsigned int nr_bytes; 1811 - unsigned int nr_pages; 1813 + pgoff_t index = pos >> PAGE_SHIFT; 1812 1814 1813 1815 folio = filemap_grab_folio(mapping, index); 1814 1816 err = PTR_ERR(folio); 1815 1817 if (IS_ERR(folio)) 1816 1818 goto out_iput; 1817 1819 1818 - folio_offset = ((index - folio->index) << PAGE_SHIFT) + offset; 1820 + folio_offset = offset_in_folio(folio, pos); 1819 1821 nr_bytes = min(num, folio_size(folio) - folio_offset); 1820 - nr_pages = (offset + nr_bytes + PAGE_SIZE - 1) >> PAGE_SHIFT; 1821 1822 1822 1823 err = fuse_copy_folio(cs, &folio, folio_offset, nr_bytes, 0); 1823 - if (!folio_test_uptodate(folio) && !err && offset == 0 && 1824 + if (!folio_test_uptodate(folio) && !err && folio_offset == 0 && 1824 1825 (nr_bytes == folio_size(folio) || file_size == end)) { 1825 1826 folio_zero_segment(folio, nr_bytes, folio_size(folio)); 1826 1827 folio_mark_uptodate(folio); ··· 1830 1833 if (err) 1831 1834 goto out_iput; 1832 1835 1836 + pos += nr_bytes; 1833 1837 num -= nr_bytes; 1834 - offset = 0; 1835 - index += nr_pages; 1836 1838 } 1837 1839 1838 1840 err = 0; ··· 1863 1867 { 1864 1868 int err; 1865 1869 struct address_space *mapping = inode->i_mapping; 1866 - pgoff_t index; 1867 1870 loff_t file_size; 1868 1871 unsigned int num; 1869 1872 unsigned int offset; ··· 1873 1878 size_t args_size = sizeof(*ra); 1874 1879 struct fuse_args_pages *ap; 1875 1880 struct fuse_args *args; 1881 + loff_t pos = outarg->offset; 1876 1882 1877 - offset = outarg->offset & ~PAGE_MASK; 1883 + offset = offset_in_page(pos); 1878 1884 file_size = i_size_read(inode); 1879 1885 1880 1886 num = min(outarg->size, fc->max_write); 1881 - if (outarg->offset > file_size) 1887 + if (pos > file_size) 1882 1888 num = 0; 1883 - else if (num > file_size - outarg->offset) 1884 - num = file_size - outarg->offset; 1889 + else if (num > file_size - pos) 1890 + num = file_size - pos; 1885 1891 1886 1892 num_pages = (num + offset + PAGE_SIZE - 1) >> PAGE_SHIFT; 1887 1893 num_pages = min(num_pages, fc->max_pages); ··· 1905 1909 args->in_pages = true; 1906 1910 args->end = fuse_retrieve_end; 1907 1911 1908 - index = outarg->offset >> PAGE_SHIFT; 1909 - 1910 1912 while (num && ap->num_folios < num_pages) { 1911 1913 struct folio *folio; 1912 1914 unsigned int folio_offset; 1913 1915 unsigned int nr_bytes; 1914 - unsigned int nr_pages; 1916 + pgoff_t index = pos >> PAGE_SHIFT; 1915 1917 1916 1918 folio = filemap_get_folio(mapping, index); 1917 1919 if (IS_ERR(folio)) 1918 1920 break; 1919 1921 1920 - folio_offset = ((index - folio->index) << PAGE_SHIFT) + offset; 1922 + folio_offset = offset_in_folio(folio, pos); 1921 1923 nr_bytes = min(folio_size(folio) - folio_offset, num); 1922 - nr_pages = (offset + nr_bytes + PAGE_SIZE - 1) >> PAGE_SHIFT; 1923 1924 1924 1925 ap->folios[ap->num_folios] = folio; 1925 1926 ap->descs[ap->num_folios].offset = folio_offset; 1926 1927 ap->descs[ap->num_folios].length = nr_bytes; 1927 1928 ap->num_folios++; 1928 1929 1929 - offset = 0; 1930 + pos += nr_bytes; 1930 1931 num -= nr_bytes; 1931 1932 total_len += nr_bytes; 1932 - index += nr_pages; 1933 1933 } 1934 1934 ra->inarg.offset = outarg->offset; 1935 1935 ra->inarg.size = total_len;