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.

Merge tag 'xfs-4.20-fixes-3' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux

Pull xfs fixes from Darrick Wong:
"Here are hopefully the last set of fixes for 4.20.

There's a fix for a longstanding statfs reporting problem with project
quotas, a correction for page cache invalidation behaviors when
fallocating near EOF, and a fix for a broken metadata verifier return
code.

Finally, the most important fix is to the pipe splicing code (aka the
generic copy_file_range fallback) to avoid pointless short directio
reads by only asking the filesystem for as much data as there are
available pages in the pipe buffer. Our previous fix (simulated short
directio reads because the number of pages didn't match the length of
the read requested) caused subtle problems on overlayfs, so that part
is reverted.

Anyhow, this series passes fstests -g all on xfs and overlay+xfs, and
has passed 17 billion fsx operations problem-free since I started
testing

Summary:

- Fix broken project quota inode counts

- Fix incorrect PAGE_MASK/PAGE_SIZE usage

- Fix incorrect return value in btree verifier

- Fix WARN_ON remap flags false positive

- Fix splice read overflows"

* tag 'xfs-4.20-fixes-3' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux:
iomap: partially revert 4721a601099 (simulated directio short read on EFAULT)
splice: don't read more than available pipe space
vfs: allow some remap flags to be passed to vfs_clone_file_range
xfs: fix inverted return from xfs_btree_sblock_verify_crc
xfs: fix PAGE_MASK usage in xfs_free_file_space
fs/xfs: fix f_ffree value for statfs when project quota is set

+11 -15
-9
fs/iomap.c
··· 1877 1877 dio->wait_for_completion = true; 1878 1878 ret = 0; 1879 1879 } 1880 - 1881 - /* 1882 - * Splicing to pipes can fail on a full pipe. We have to 1883 - * swallow this to make it look like a short IO 1884 - * otherwise the higher splice layers will completely 1885 - * mishandle the error and stop moving data. 1886 - */ 1887 - if (ret == -EFAULT) 1888 - ret = 0; 1889 1880 break; 1890 1881 } 1891 1882 pos += ret;
+1 -1
fs/read_write.c
··· 1956 1956 struct inode *inode_out = file_inode(file_out); 1957 1957 loff_t ret; 1958 1958 1959 - WARN_ON_ONCE(remap_flags); 1959 + WARN_ON_ONCE(remap_flags & REMAP_FILE_DEDUP); 1960 1960 1961 1961 if (S_ISDIR(inode_in->i_mode) || S_ISDIR(inode_out->i_mode)) 1962 1962 return -EISDIR;
+6 -1
fs/splice.c
··· 945 945 sd->flags &= ~SPLICE_F_NONBLOCK; 946 946 more = sd->flags & SPLICE_F_MORE; 947 947 948 + WARN_ON_ONCE(pipe->nrbufs != 0); 949 + 948 950 while (len) { 949 951 size_t read_len; 950 952 loff_t pos = sd->pos, prev_pos = pos; 951 953 952 - ret = do_splice_to(in, &pos, pipe, len, flags); 954 + /* Don't try to read more the pipe has space for. */ 955 + read_len = min_t(size_t, len, 956 + (pipe->buffers - pipe->nrbufs) << PAGE_SHIFT); 957 + ret = do_splice_to(in, &pos, pipe, read_len, flags); 953 958 if (unlikely(ret <= 0)) 954 959 goto out_release; 955 960
+1 -1
fs/xfs/libxfs/xfs_btree.c
··· 330 330 331 331 if (xfs_sb_version_hascrc(&mp->m_sb)) { 332 332 if (!xfs_log_check_lsn(mp, be64_to_cpu(block->bb_u.s.bb_lsn))) 333 - return __this_address; 333 + return false; 334 334 return xfs_buf_verify_cksum(bp, XFS_BTREE_SBLOCK_CRC_OFF); 335 335 } 336 336
+2 -2
fs/xfs/xfs_bmap_util.c
··· 1126 1126 * page could be mmap'd and iomap_zero_range doesn't do that for us. 1127 1127 * Writeback of the eof page will do this, albeit clumsily. 1128 1128 */ 1129 - if (offset + len >= XFS_ISIZE(ip) && ((offset + len) & PAGE_MASK)) { 1129 + if (offset + len >= XFS_ISIZE(ip) && offset_in_page(offset + len) > 0) { 1130 1130 error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, 1131 - (offset + len) & ~PAGE_MASK, LLONG_MAX); 1131 + round_down(offset + len, PAGE_SIZE), LLONG_MAX); 1132 1132 } 1133 1133 1134 1134 return error;
+1 -1
fs/xfs/xfs_qm_bhv.c
··· 40 40 statp->f_files = limit; 41 41 statp->f_ffree = 42 42 (statp->f_files > dqp->q_res_icount) ? 43 - (statp->f_ffree - dqp->q_res_icount) : 0; 43 + (statp->f_files - dqp->q_res_icount) : 0; 44 44 } 45 45 } 46 46