Merge tag 'xfs-4.13-merge-6' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux

Pull XFS fixes from Darrick Wong:
"Largely debugging and regression fixes.

- Add some locking assertions for the _ilock helpers.

- Revert the XFS_QMOPT_NOLOCK patch; after discussion with hch the
online fsck patch that would have needed it has been redesigned and
no longer needs it.

- Fix behavioral regression of SEEK_HOLE/DATA with negative offsets
to match 4.12-era XFS behavior"

* tag 'xfs-4.13-merge-6' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux:
vfs: in iomap seek_{hole,data}, return -ENXIO for negative offsets
Revert "xfs: grab dquots without taking the ilock"
xfs: assert locking precondition in xfs_readlink_bmap_ilocked
xfs: assert locking precondіtion in xfs_attr_list_int_ilocked
xfs: fixup xfs_attr_get_ilocked

+15 -17
+4 -4
fs/iomap.c
··· 610 610 loff_t length = size - offset; 611 611 loff_t ret; 612 612 613 - /* Nothing to be found beyond the end of the file. */ 614 - if (offset >= size) 613 + /* Nothing to be found before or beyond the end of the file. */ 614 + if (offset < 0 || offset >= size) 615 615 return -ENXIO; 616 616 617 617 while (length > 0) { ··· 656 656 loff_t length = size - offset; 657 657 loff_t ret; 658 658 659 - /* Nothing to be found beyond the end of the file. */ 660 - if (offset >= size) 659 + /* Nothing to be found before or beyond the end of the file. */ 660 + if (offset < 0 || offset >= size) 661 661 return -ENXIO; 662 662 663 663 while (length > 0) {
+3 -1
fs/xfs/libxfs/xfs_attr.c
··· 114 114 * Overall external interface routines. 115 115 *========================================================================*/ 116 116 117 - /* Retrieve an extended attribute and its value. Must have iolock. */ 117 + /* Retrieve an extended attribute and its value. Must have ilock. */ 118 118 int 119 119 xfs_attr_get_ilocked( 120 120 struct xfs_inode *ip, 121 121 struct xfs_da_args *args) 122 122 { 123 + ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); 124 + 123 125 if (!xfs_inode_hasattr(ip)) 124 126 return -ENOATTR; 125 127 else if (ip->i_d.di_aformat == XFS_DINODE_FMT_LOCAL)
-2
fs/xfs/libxfs/xfs_quota_defs.h
··· 136 136 */ 137 137 #define XFS_QMOPT_INHERIT 0x1000000 138 138 139 - #define XFS_QMOPT_NOLOCK 0x2000000 /* don't ilock during dqget */ 140 - 141 139 /* 142 140 * flags to xfs_trans_mod_dquot. 143 141 */
+2
fs/xfs/xfs_attr_list.c
··· 463 463 { 464 464 struct xfs_inode *dp = context->dp; 465 465 466 + ASSERT(xfs_isilocked(dp, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); 467 + 466 468 /* 467 469 * Decide on what work routines to call based on the inode size. 468 470 */
+4 -10
fs/xfs/xfs_dquot.c
··· 472 472 struct xfs_mount *mp = dqp->q_mount; 473 473 xfs_dqid_t id = be32_to_cpu(dqp->q_core.d_id); 474 474 struct xfs_trans *tp = (tpp ? *tpp : NULL); 475 - uint lock_mode = 0; 475 + uint lock_mode; 476 476 477 477 quotip = xfs_quota_inode(dqp->q_mount, dqp->dq_flags); 478 478 dqp->q_fileoffset = (xfs_fileoff_t)id / mp->m_quotainfo->qi_dqperchunk; 479 479 480 - ASSERT(!(flags & XFS_QMOPT_NOLOCK) || 481 - xfs_isilocked(quotip, XFS_ILOCK_SHARED) || 482 - xfs_isilocked(quotip, XFS_ILOCK_EXCL)); 483 - if (!(flags & XFS_QMOPT_NOLOCK)) 484 - lock_mode = xfs_ilock_data_map_shared(quotip); 480 + lock_mode = xfs_ilock_data_map_shared(quotip); 485 481 if (!xfs_this_quota_on(dqp->q_mount, dqp->dq_flags)) { 486 482 /* 487 483 * Return if this type of quotas is turned off while we 488 484 * didn't have the quota inode lock. 489 485 */ 490 - if (lock_mode) 491 - xfs_iunlock(quotip, lock_mode); 486 + xfs_iunlock(quotip, lock_mode); 492 487 return -ESRCH; 493 488 } 494 489 ··· 493 498 error = xfs_bmapi_read(quotip, dqp->q_fileoffset, 494 499 XFS_DQUOT_CLUSTER_SIZE_FSB, &map, &nmaps, 0); 495 500 496 - if (lock_mode) 497 - xfs_iunlock(quotip, lock_mode); 501 + xfs_iunlock(quotip, lock_mode); 498 502 if (error) 499 503 return error; 500 504
+2
fs/xfs/xfs_symlink.c
··· 61 61 int fsblocks = 0; 62 62 int offset; 63 63 64 + ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); 65 + 64 66 fsblocks = xfs_symlink_blocks(mp, pathlen); 65 67 error = xfs_bmapi_read(ip, 0, fsblocks, mval, &nmaps, 0); 66 68 if (error)