xfs_attr_get_ilocked(
        struct xfs_da_args      *args)
 {
-       ASSERT(xfs_isilocked(args->dp, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(args->dp, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL);
 
        if (!xfs_inode_hasattr(args->dp))
                return -ENOATTR;
 
        struct xfs_buf          *bp;
        int                     error;
 
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
 
        if (XFS_IS_CORRUPT(mp, map->br_startblock == DELAYSTARTBLOCK) ||
            XFS_IS_CORRUPT(mp, map->br_startblock == HOLESTARTBLOCK))
 
        if (!xfs_need_iread_extents(ifp))
                return 0;
 
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
 
        ir.loaded = 0;
        xfs_iext_first(ifp, &ir.icur);
 
        ASSERT(*nmap >= 1);
        ASSERT(!(flags & ~(XFS_BMAPI_ATTRFORK | XFS_BMAPI_ENTIRE)));
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED|XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL);
 
        if (WARN_ON_ONCE(!ifp))
                return -EFSCORRUPTED;
        ASSERT(tp != NULL);
        ASSERT(len > 0);
        ASSERT(ifp->if_format != XFS_DINODE_FMT_LOCAL);
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
        ASSERT(!(flags & XFS_BMAPI_REMAP));
 
        /* zeroing is for currently only for data extents, not metadata */
        ifp = xfs_ifork_ptr(ip, whichfork);
        ASSERT(len > 0);
        ASSERT(len <= (xfs_filblks_t)XFS_MAX_BMBT_EXTLEN);
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
        ASSERT(!(flags & ~(XFS_BMAPI_ATTRFORK | XFS_BMAPI_PREALLOC |
                           XFS_BMAPI_NORMAP)));
        ASSERT((flags & (XFS_BMAPI_ATTRFORK | XFS_BMAPI_PREALLOC)) !=
        if (xfs_is_shutdown(mp))
                return -EIO;
 
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
        ASSERT(len > 0);
        ASSERT(nexts >= 0);
 
 
        blockcount = left->br_blockcount + got->br_blockcount;
 
-       ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL));
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
        ASSERT(xfs_bmse_can_merge(left, got, shift));
 
        new = *left;
        if (xfs_is_shutdown(mp))
                return -EIO;
 
-       ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
 
        error = xfs_iread_extents(tp, ip, whichfork);
        if (error)
        int                     is_empty;
        int                     error = 0;
 
-       ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_IOLOCK_EXCL);
 
        if (xfs_is_shutdown(ip->i_mount))
                return -EIO;
        if (xfs_is_shutdown(mp))
                return -EIO;
 
-       ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
 
        error = xfs_iread_extents(tp, ip, whichfork);
        if (error)
        xfs_filblks_t           unmap_len = endoff - startoff + 1;
        int                     error = 0;
 
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
 
        while (unmap_len > 0) {
                ASSERT((*tpp)->t_highest_agno == NULLAGNUMBER);
 
         * transaction.
         */
        for (i = 0; i < dfc->dfc_held.dr_inos; i++) {
-               ASSERT(xfs_isilocked(dfc->dfc_held.dr_ip[i], XFS_ILOCK_EXCL));
+               xfs_assert_ilocked(dfc->dfc_held.dr_ip[i], XFS_ILOCK_EXCL);
                ihold(VFS_I(dfc->dfc_held.dr_ip[i]));
        }
 
 
        struct xfs_bmbt_irec    rec;
        int64_t                 copied = 0;
 
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL | XFS_ILOCK_SHARED));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL | XFS_ILOCK_SHARED);
        ASSERT(ifp->if_bytes > 0);
 
        for_each_xfs_iext(ifp, &icur, &rec) {
 
        struct timespec64       atime;
 
        ASSERT(mp->m_rbmip->i_itemp != NULL);
-       ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(mp->m_rbmip, XFS_ILOCK_EXCL);
 
        error = xfs_rtcheck_alloc_range(&args, start, len);
        if (error)
 
 {
        struct xfs_inode_log_item *iip;
 
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
        if (ip->i_itemp == NULL)
                xfs_inode_item_init(ip, ip->i_mount);
        iip = ip->i_itemp;
        struct timespec64       tv;
 
        ASSERT(tp);
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
 
        tv = current_time(inode);
 
        struct inode            *inode = VFS_I(ip);
 
        ASSERT(iip);
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
        ASSERT(!xfs_iflags_test(ip, XFS_ISTALE));
 
        tp->t_flags |= XFS_TRANS_DIRTY;
 
                return -EIO;
 
        ASSERT(S_ISDIR(VFS_I(dp)->i_mode));
-       ASSERT(xfs_isilocked(dp, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(dp, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL);
 
        if (dp->i_df.if_format == XFS_DINODE_FMT_LOCAL)
                return xchk_dir_walk_sf(sc, dp, dirent_fn, priv);
                return -EIO;
 
        ASSERT(S_ISDIR(VFS_I(dp)->i_mode));
-       ASSERT(xfs_isilocked(dp, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(dp, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL);
 
        if (dp->i_df.if_format == XFS_DINODE_FMT_LOCAL) {
                error = xfs_dir2_sf_lookup(&args);
 
 {
        struct xfs_inode                *dp = context->dp;
 
-       ASSERT(xfs_isilocked(dp, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(dp, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL);
 
        /*
         * Decide on what work routines to call based on the inode size.
 
         * Caller must either hold the exclusive io lock; or be inactivating
         * the inode, which guarantees there are no other users of the inode.
         */
-       ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL) ||
-              (VFS_I(ip)->i_state & I_FREEING));
+       if (!(VFS_I(ip)->i_state & I_FREEING))
+               xfs_assert_ilocked(ip, XFS_IOLOCK_EXCL);
 
        /* prealloc/delalloc exists only on regular files */
        if (!S_ISREG(VFS_I(ip)->i_mode))
        xfs_fileoff_t           shift_fsb = XFS_B_TO_FSB(mp, len);
        bool                    done = false;
 
-       ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL));
-       ASSERT(xfs_isilocked(ip, XFS_MMAPLOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL);
 
        trace_xfs_collapse_file_space(ip);
 
        xfs_fileoff_t           shift_fsb = XFS_B_TO_FSB(mp, len);
        bool                    done = false;
 
-       ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL));
-       ASSERT(xfs_isilocked(ip, XFS_MMAPLOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL);
 
        trace_xfs_insert_file_space(ip);
 
 
                return -EIO;
 
        ASSERT(S_ISDIR(VFS_I(dp)->i_mode));
-       ASSERT(xfs_isilocked(dp, XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL));
+       xfs_assert_ilocked(dp, XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL);
        XFS_STATS_INC(dp->i_mount, xs_dir_getdents);
 
        args.dp = dp;
 
        if (error)
                return error;
 
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
        ASSERT(xfs_inode_dquot(ip, type) == NULL);
 
        id = xfs_qm_id_for_quotatype(ip, type);
        }
 
 dqret:
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
        trace_xfs_dqget_miss(dqp);
        *O_dqpp = dqp;
        return 0;
 
 {
        struct page             *page;
 
-       ASSERT(xfs_isilocked(XFS_I(inode), XFS_MMAPLOCK_EXCL));
+       xfs_assert_ilocked(XFS_I(inode), XFS_MMAPLOCK_EXCL);
 
        page = dax_layout_busy_page(inode->i_mapping);
        if (!page)
        bool                    retry;
        int                     error;
 
-       ASSERT(xfs_isilocked(XFS_I(inode), XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL));
+       xfs_assert_ilocked(XFS_I(inode), XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL);
 
        do {
                retry = false;
 
        trace_xfs_ilock_demote(ip, lock_flags, _RET_IP_);
 }
 
-#if defined(DEBUG) || defined(XFS_WARN)
-static inline bool
-__xfs_rwsem_islocked(
-       struct rw_semaphore     *rwsem,
-       bool                    shared)
-{
-       if (!debug_locks)
-               return rwsem_is_locked(rwsem);
-
-       if (!shared)
-               return lockdep_is_held_type(rwsem, 0);
-
-       /*
-        * We are checking that the lock is held at least in shared
-        * mode but don't care that it might be held exclusively
-        * (i.e. shared | excl). Hence we check if the lock is held
-        * in any mode rather than an explicit shared mode.
-        */
-       return lockdep_is_held_type(rwsem, -1);
-}
-
-bool
-xfs_isilocked(
+void
+xfs_assert_ilocked(
        struct xfs_inode        *ip,
        uint                    lock_flags)
 {
-       if (lock_flags & (XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)) {
-               if (!(lock_flags & XFS_ILOCK_SHARED))
-                       return !!ip->i_lock.mr_writer;
-               return rwsem_is_locked(&ip->i_lock.mr_lock);
-       }
+       if (lock_flags & XFS_ILOCK_SHARED)
+               rwsem_assert_held(&ip->i_lock.mr_lock);
+       else if (lock_flags & XFS_ILOCK_EXCL)
+               ASSERT(ip->i_lock.mr_writer);
 
-       if (lock_flags & (XFS_MMAPLOCK_EXCL|XFS_MMAPLOCK_SHARED)) {
-               return __xfs_rwsem_islocked(&VFS_I(ip)->i_mapping->invalidate_lock,
-                               (lock_flags & XFS_MMAPLOCK_SHARED));
-       }
+       if (lock_flags & XFS_MMAPLOCK_SHARED)
+               rwsem_assert_held(&VFS_I(ip)->i_mapping->invalidate_lock);
+       else if (lock_flags & XFS_MMAPLOCK_EXCL)
+               rwsem_assert_held_write(&VFS_I(ip)->i_mapping->invalidate_lock);
 
-       if (lock_flags & (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED)) {
-               return __xfs_rwsem_islocked(&VFS_I(ip)->i_rwsem,
-                               (lock_flags & XFS_IOLOCK_SHARED));
-       }
-
-       ASSERT(0);
-       return false;
+       if (lock_flags & XFS_IOLOCK_SHARED)
+               rwsem_assert_held(&VFS_I(ip)->i_rwsem);
+       else if (lock_flags & XFS_IOLOCK_EXCL)
+               rwsem_assert_held_write(&VFS_I(ip)->i_rwsem);
 }
-#endif
 
 /*
  * xfs_lockdep_subclass_ok() is only used in an ASSERT, so is only called when
        xfs_fileoff_t           first_unmap_block;
        int                     error = 0;
 
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
-       ASSERT(!atomic_read(&VFS_I(ip)->i_count) ||
-              xfs_isilocked(ip, XFS_IOLOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
+       if (atomic_read(&VFS_I(ip)->i_count))
+               xfs_assert_ilocked(ip, XFS_IOLOCK_EXCL);
        ASSERT(new_size <= XFS_ISIZE(ip));
        ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES);
        ASSERT(ip->i_itemp != NULL);
        xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
 
        error = xfs_ifree(tp, ip);
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
        if (error) {
                /*
                 * If we fail to free the inode, shut down.  The cancel
        struct xfs_inode_log_item *iip = ip->i_itemp;
        int                     error;
 
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
        ASSERT(VFS_I(ip)->i_nlink == 0);
        ASSERT(ip->i_df.if_nextents == 0);
        ASSERT(ip->i_disk_size == 0 || !S_ISREG(VFS_I(ip)->i_mode));
 xfs_iunpin(
        struct xfs_inode        *ip)
 {
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL | XFS_ILOCK_SHARED);
 
        trace_xfs_inode_unpin_nowait(ip, _RET_IP_);
 
        struct xfs_mount        *mp = ip->i_mount;
        int                     error;
 
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL | XFS_ILOCK_SHARED);
        ASSERT(xfs_iflags_test(ip, XFS_IFLUSHING));
        ASSERT(ip->i_df.if_format != XFS_DINODE_FMT_BTREE ||
               ip->i_df.if_nextents > XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK));
 
 int            xfs_ilock_nowait(xfs_inode_t *, uint);
 void           xfs_iunlock(xfs_inode_t *, uint);
 void           xfs_ilock_demote(xfs_inode_t *, uint);
-bool           xfs_isilocked(struct xfs_inode *, uint);
+void           xfs_assert_ilocked(struct xfs_inode *, uint);
 uint           xfs_ilock_data_map_shared(struct xfs_inode *);
 uint           xfs_ilock_attr_map_shared(struct xfs_inode *);
 
 
 {
        struct xfs_inode        *ip = INODE_ITEM(lip)->ili_inode;
 
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
        ASSERT(lip->li_buf);
 
        trace_xfs_inode_pin(ip, _RET_IP_);
        unsigned short          lock_flags;
 
        ASSERT(ip->i_itemp != NULL);
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
 
        lock_flags = iip->ili_lock_flags;
        iip->ili_lock_flags = 0;
 
        uint                    lock_flags = 0;
        bool                    did_zeroing = false;
 
-       ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL));
-       ASSERT(xfs_isilocked(ip, XFS_MMAPLOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL);
        ASSERT(S_ISREG(inode->i_mode));
        ASSERT((iattr->ia_valid & (ATTR_UID|ATTR_GID|ATTR_ATIME|ATTR_ATIME_SET|
                ATTR_MTIME_SET|ATTR_TIMES_SET)) == 0);
 
        struct xfs_dquot        *dqp;
        int                     error;
 
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
        error = 0;
 
        /*
        if (!xfs_qm_need_dqattach(ip))
                return 0;
 
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
 
        if (XFS_IS_UQUOTA_ON(mp) && !ip->i_udquot) {
                error = xfs_qm_dqattach_one(ip, XFS_DQTYPE_USER,
         * Don't worry about the dquots that we may have attached before any
         * error - they'll get detached later if it has not already been done.
         */
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
        return error;
 }
 
                                 XFS_TRANS_DQ_RTBCOUNT : XFS_TRANS_DQ_BCOUNT;
 
 
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
        ASSERT(XFS_IS_QUOTA_ON(ip->i_mount));
 
        /* old dquot */
        if (!XFS_IS_QUOTA_ON(mp))
                return;
 
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
 
        if (udqp && XFS_IS_UQUOTA_ON(mp)) {
                ASSERT(ip->i_udquot == NULL);
 
        int                     error;
        bool                    found;
 
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
        if (!ip->i_cowfp) {
                ASSERT(!xfs_is_reflink_inode(ip));
                xfs_ifork_init_cow(ip);
 
        uint64_t                seq;            /* sequence number of file creation */
        struct timespec64       ts;             /* timespec in inode */
 
-       ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(mp->m_rbmip, XFS_ILOCK_EXCL);
 
        ts = inode_get_atime(VFS_I(mp->m_rbmip));
        if (!(mp->m_rbmip->i_diflags & XFS_DIFLAG_NEWRTBM)) {
 
        int                     fsblocks = 0;
        int                     offset;
 
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL);
 
        fsblocks = xfs_symlink_blocks(mp, pathlen);
        error = xfs_bmapi_read(ip, 0, fsblocks, mval, &nmaps, 0);
 
        unsigned int            rtx = xfs_extlen_to_rtxlen(mp, rblocks);
        int                     error;
 
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
 
        error = xfs_trans_reserve(tp, &resv, dblocks, rtx);
        if (error)
 
                return 0;
 
        ASSERT(!xfs_is_quota_inode(&mp->m_sb, ip->i_ino));
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
+       xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
 
        if (force)
                qflags |= XFS_QMOPT_FORCE_RES;