XFS_RANDOM_AG_RESV_CRITICAL,
        XFS_RANDOM_DROP_WRITES,
        XFS_RANDOM_LOG_BAD_CRC,
+       XFS_RANDOM_LOG_ITEM_PIN,
 };
 
 struct xfs_errortag_attr {
 XFS_ERRORTAG_ATTR_RW(ag_resv_critical, XFS_ERRTAG_AG_RESV_CRITICAL);
 XFS_ERRORTAG_ATTR_RW(drop_writes,      XFS_ERRTAG_DROP_WRITES);
 XFS_ERRORTAG_ATTR_RW(log_bad_crc,      XFS_ERRTAG_LOG_BAD_CRC);
+XFS_ERRORTAG_ATTR_RW(log_item_pin,     XFS_ERRTAG_LOG_ITEM_PIN);
 
 static struct attribute *xfs_errortag_attrs[] = {
        XFS_ERRORTAG_ATTR_LIST(noerror),
        XFS_ERRORTAG_ATTR_LIST(ag_resv_critical),
        XFS_ERRORTAG_ATTR_LIST(drop_writes),
        XFS_ERRORTAG_ATTR_LIST(log_bad_crc),
+       XFS_ERRORTAG_ATTR_LIST(log_item_pin),
        NULL,
 };
 
 
  */
 #define XFS_ERRTAG_DROP_WRITES                         28
 #define XFS_ERRTAG_LOG_BAD_CRC                         29
-#define XFS_ERRTAG_MAX                                 30
+#define XFS_ERRTAG_LOG_ITEM_PIN                                30
+#define XFS_ERRTAG_MAX                                 31
 
 /*
  * Random factors for above tags, 1 means always, 2 means 1/2 time, etc.
 #define XFS_RANDOM_AG_RESV_CRITICAL                    4
 #define XFS_RANDOM_DROP_WRITES                         1
 #define XFS_RANDOM_LOG_BAD_CRC                         1
+#define XFS_RANDOM_LOG_ITEM_PIN                                1
 
 #ifdef DEBUG
 extern int xfs_errortag_init(struct xfs_mount *mp);
 
        xfs_trans_ail_cursor_clear(ailp, lip);
 }
 
+static inline uint
+xfsaild_push_item(
+       struct xfs_ail          *ailp,
+       struct xfs_log_item     *lip)
+{
+       /*
+        * If log item pinning is enabled, skip the push and track the item as
+        * pinned. This can help induce head-behind-tail conditions.
+        */
+       if (XFS_TEST_ERROR(false, ailp->xa_mount, XFS_ERRTAG_LOG_ITEM_PIN))
+               return XFS_ITEM_PINNED;
+
+       return lip->li_ops->iop_push(lip, &ailp->xa_buf_list);
+}
+
 static long
 xfsaild_push(
        struct xfs_ail          *ailp)
                 * rely on the AIL cursor implementation to be able to deal with
                 * the dropped lock.
                 */
-               lock_result = lip->li_ops->iop_push(lip, &ailp->xa_buf_list);
+               lock_result = xfsaild_push_item(ailp, lip);
                switch (lock_result) {
                case XFS_ITEM_SUCCESS:
                        XFS_STATS_INC(mp, xs_push_ail_success);