> +#define BMBT_STARTOFF_MASK ((1ULL << BMBT_STARTOFF_BITLEN) - 1) Please move this next to BMBT_STARTOFF_BITLEN. For brownie points also use this new defined instead of XFS_IEXT_STARTOFF_MASK in the extent tree code. > +/* Make sure we won't be right-shifting an extent past the maximum bound. */ > +int > +xfs_bmap_can_insert_extents( > + struct xfs_inode *ip, > + xfs_fileoff_t off, > + xfs_fileoff_t shift) > +{ > + struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); > + struct xfs_bmbt_irec got; > + struct xfs_iext_cursor icur; > + xfs_fileoff_t new_off; > + int error = 0; > + > + if (XFS_FORCED_SHUTDOWN(ip->i_mount)) > + return -EIO; > + > + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + > + if (!(ifp->if_flags & XFS_IFEXTENTS)) { > + error = xfs_iread_extents(NULL, ip, XFS_DATA_FORK); > + if (error) > + goto out; > + } > + > + xfs_iext_last(ifp, &icur); > + if (!xfs_iext_get_extent(ifp, &icur, &got) || off > got.br_startoff) > + goto out; This largely duplicates xfs_bmap_last_extent. The function body could probably be written as: { struct xfs_bmbt_irec got; int error = 0; ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); if (XFS_FORCED_SHUTDOWN(ip->i_mount)) return -EIO; xfs_ilock(ip, XFS_ILOCK_EXCL); error = xfs_bmap_last_extent(NULL, ip, XFS_DATA_FORK, &got, &is_empty) if (!error && !is_empty && got.br_startoff >= off && got.br_startoff + shift) & BMBT_STARTOFF_MASK < got.br_startoff) error = -EINVAL; xfs_iunlock(ip, XFS_ILOCK_EXCL); return error; -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html