#define        ATTR_DMI        0x08    /* invocation from a DMI function */
 #define        ATTR_LAZY       0x80    /* set/get attributes lazily */
 #define        ATTR_NONBLOCK   0x100   /* return EAGAIN if operation would block */
+#define ATTR_NOLOCK    0x200   /* Don't grab any conflicting locks */
 
 /*
  * Flags to VOP_FSYNC and VOP_RECLAIM.
 
        int                     mandlock_before, mandlock_after;
        struct xfs_dquot        *udqp, *gdqp, *olddquot1, *olddquot2;
        int                     file_owner;
-       int                     need_iolock = (flags & ATTR_DMI) == 0;
+       int                     need_iolock = 1;
 
        vp = BHV_TO_VNODE(bdp);
        vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address);
         */
        tp = NULL;
        lock_flags = XFS_ILOCK_EXCL;
+       ASSERT(flags & ATTR_NOLOCK ? flags & ATTR_DMI : 1);
+       if (flags & ATTR_NOLOCK)
+               need_iolock = 0;
        if (!(mask & XFS_AT_SIZE)) {
                if ((mask != (XFS_AT_CTIME|XFS_AT_ATIME|XFS_AT_MTIME)) ||
                    (mp->m_flags & XFS_MOUNT_WSYNC)) {
        int                     rt;
        xfs_fileoff_t           startoffset_fsb;
        xfs_trans_t             *tp;
-       int                     need_iolock = (attr_flags & ATTR_DMI) == 0;
+       int                     need_iolock = 1;
 
        vn_trace_entry(XFS_ITOV(ip), __FUNCTION__, (inst_t *)__return_address);
        mp = ip->i_mount;
                        return(error);
        }
 
+       ASSERT(attr_flags & ATTR_NOLOCK ? attr_flags & ATTR_DMI : 1);
+       if (attr_flags & ATTR_NOLOCK)
+               need_iolock = 0;
        if (need_iolock)
                xfs_ilock(ip, XFS_IOLOCK_EXCL);
+
        rounding = MAX((__uint8_t)(1 << mp->m_sb.sb_blocklog),
                        (__uint8_t)NBPP);
        ilen = len + (offset & (rounding - 1));