linux_dsm_epyc7002/fs/xfs
Chandra Seetharaman 297aa63769 xfs: Fix a deadlock in xfs_log_commit_cil() code path
While testing and rearranging pquota/gquota code, I stumbled
on a xfs_shutdown() during a mount. But the mount just hung.

Debugged and found that there is a deadlock involving
&log->l_cilp->xc_ctx_lock.

It is in a code path where &log->l_cilp->xc_ctx_lock is first
acquired in read mode and some levels down the same semaphore
is being acquired in write mode causing a deadlock.

This is the stack:
xfs_log_commit_cil -> acquires &log->l_cilp->xc_ctx_lock in read mode
  xlog_print_tic_res
    xfs_force_shutdown
      xfs_log_force_umount
        xlog_cil_force
          xlog_cil_force_lsn
            xlog_cil_push_foreground
              xlog_cil_push - tries to acquire same semaphore in write mode

This patch fixes the deadlock by changing the reason code for
xfs_force_shutdown in xlog_print_tic_res() to SHUTDOWN_LOG_IO_ERROR.

SHUTDOWN_LOG_IO_ERROR is the right reason code to be set since
we are in the log path.

Thanks to Dave for suggesting this solution.

Signed-off-by: Chandra Seetharaman <sekharan@us.ibm.com>
Reviewed-by: Ben Myers <bpm@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
2013-07-22 13:58:10 -05:00
..
Kconfig xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
kmem.c xfs: switch to proper __bitwise type for KM_... flags 2012-05-29 23:28:32 -04:00
kmem.h xfs: switch to proper __bitwise type for KM_... flags 2012-05-29 23:28:32 -04:00
Makefile xfs: Inode create log items 2013-06-27 13:34:12 -05:00
mrlock.h xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
time.h xfs: remove subdirectories 2011-08-12 16:21:35 -05:00
uuid.c xfs: remove subdirectories 2011-08-12 16:21:35 -05:00
uuid.h xfs: add CRC infrastructure 2012-11-19 20:11:24 -06:00
xfs_acl.c xfs: increase number of ACL entries for V5 superblocks 2013-06-06 10:52:15 -05:00
xfs_acl.h xfs: increase number of ACL entries for V5 superblocks 2013-06-06 10:52:15 -05:00
xfs_ag.h xfs: add CRC checks to the AGI 2013-04-21 14:57:43 -05:00
xfs_alloc_btree.c xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
xfs_alloc_btree.h xfs: add support for large btree blocks 2013-04-21 14:53:46 -05:00
xfs_alloc.c xfs: Avoid pathological backwards allocation 2013-05-20 13:09:11 -05:00
xfs_alloc.h xfs: convert buffer verifiers to an ops structure. 2012-11-15 21:35:12 -06:00
xfs_aops.c xfs: fix assertion failure in xfs_vm_write_failed() 2013-07-22 13:12:19 -05:00
xfs_aops.h Prefix IO_XX flags with XFS_IO_XX to avoid namespace colision. 2012-07-22 11:00:55 -05:00
xfs_attr_leaf.c xfs: remove local fork format handling from xfs_bmapi_write() 2013-07-09 16:40:22 -05:00
xfs_attr_leaf.h xfs: fix implicit padding in directory and attr CRC formats 2013-06-14 15:59:16 -05:00
xfs_attr_remote.c xfs: rework remote attr CRCs 2013-05-30 17:26:31 -05:00
xfs_attr_remote.h xfs: rework remote attr CRCs 2013-05-30 17:26:31 -05:00
xfs_attr_sf.h xfs: convert attr to use unsigned names 2010-01-20 10:47:48 +11:00
xfs_attr.c xfs: split remote attribute code out 2013-04-27 12:49:32 -05:00
xfs_attr.h xfs: split remote attribute code out 2013-04-27 12:49:32 -05:00
xfs_bit.c
xfs_bit.h
xfs_bmap_btree.c xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
xfs_bmap_btree.h xfs: check on-disk (not incore) btree root size in dfrag.c 2013-06-20 13:26:09 -05:00
xfs_bmap.c xfs: remove local fork format handling from xfs_bmapi_write() 2013-07-09 16:40:22 -05:00
xfs_bmap.h xfs: remove local fork format handling from xfs_bmapi_write() 2013-07-09 16:40:22 -05:00
xfs_btree.c xfs: ensure btree root split sets blkno correctly 2013-06-14 15:59:31 -05:00
xfs_btree.h xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
xfs_buf_item.c xfs: Use inode create transaction 2013-06-27 14:27:18 -05:00
xfs_buf_item.h xfs: Introduce an ordered buffer item 2013-06-27 13:33:11 -05:00
xfs_buf.c xfs: rework remote attr CRCs 2013-05-30 17:26:31 -05:00
xfs_buf.h xfs: use b_maps[] for discontiguous buffers 2013-01-16 16:07:11 -06:00
xfs_cksum.h xfs: add CRC infrastructure 2012-11-19 20:11:24 -06:00
xfs_da_btree.c xfs: xfs_da3_node_read_verify() doesn't handle XFS_ATTR3_LEAF_MAGIC 2013-05-24 16:29:37 -05:00
xfs_da_btree.h xfs: add buffer types to directory and attribute buffers 2013-04-27 13:01:06 -05:00
xfs_dfrag.c xfs: check on-disk (not incore) btree root size in dfrag.c 2013-06-20 13:26:09 -05:00
xfs_dfrag.h xfs: clean up inconsistent variable naming in xfs_swap_extent 2010-01-15 15:31:23 -06:00
xfs_dinode.h xfs: use XFS_BMAP_BMDR_SPACE vs. XFS_BROOT_SIZE_ADJ 2013-07-09 13:21:15 -05:00
xfs_dir2_block.c xfs: update (#2) for 3.11-rc1 2013-07-13 11:40:24 -07:00
xfs_dir2_data.c xfs: buffer type overruns blf_flags field 2013-04-27 13:01:58 -05:00
xfs_dir2_format.h xfs: fix implicit padding in directory and attr CRC formats 2013-06-14 15:59:16 -05:00
xfs_dir2_leaf.c xfs: update for 3.11-rc1 2013-07-09 12:29:12 -07:00
xfs_dir2_node.c xfs: fix dir3 freespace block corruption 2013-05-30 17:22:54 -05:00
xfs_dir2_priv.h [readdir] convert xfs 2013-06-29 12:57:00 +04:00
xfs_dir2_sf.c [readdir] convert xfs 2013-06-29 12:57:00 +04:00
xfs_dir2.c [readdir] convert xfs 2013-06-29 12:57:00 +04:00
xfs_dir2.h xfs: reshuffle dir2 headers 2011-07-13 13:43:48 +02:00
xfs_discard.c xfs: check for possible overflow in xfs_ioc_trim 2012-08-23 14:48:44 -05:00
xfs_discard.h xfs: remove subdirectories 2011-08-12 16:21:35 -05:00
xfs_dquot_item.c xfs: clean up xfs_bit.h includes 2012-05-14 16:21:00 -05:00
xfs_dquot_item.h xfs: remove subdirectories 2011-08-12 16:21:35 -05:00
xfs_dquot.c xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_dquot.h xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_error.c xfs: increase hexdump output in xfs_corruption_error 2013-04-21 14:48:41 -05:00
xfs_error.h xfs: kill support/debug.[ch] 2011-03-07 10:09:35 +11:00
xfs_export.c fs: encode_fh: return FILEID_INVALID if invalid fid_type 2013-02-26 02:46:10 -05:00
xfs_export.h xfs: remove subdirectories 2011-08-12 16:21:35 -05:00
xfs_extent_busy.c xfs: make xfs_extent_busy_trim not static 2012-05-14 16:21:04 -05:00
xfs_extent_busy.h xfs: make xfs_extent_busy_trim not static 2012-05-14 16:21:04 -05:00
xfs_extfree_item.c xfs: Don't reference the EFI after it is freed 2013-05-24 16:27:57 -05:00
xfs_extfree_item.h xfs: don't free EFIs before the EFDs are committed 2013-04-05 13:25:35 -05:00
xfs_file.c vfs: export lseek_execute() to modules 2013-07-03 16:23:27 +04:00
xfs_filestream.c xfs: rename allocation range fields in struct xfs_bmalloca 2011-10-11 21:15:06 -05:00
xfs_filestream.h xfs: clean up filestreams helpers 2010-07-26 13:16:51 -05:00
xfs_fs.h xfs: add fsgeom flag for v5 superblock support. 2013-05-30 17:19:45 -05:00
xfs_fsops.c xfs: Remove redundant error variable from xfs_growfs_data_private() 2013-06-17 17:43:04 -05:00
xfs_fsops.h xfs: ensure log covering transactions are synchronous 2011-01-11 20:28:17 -06:00
xfs_globals.c xfs: add background scanning to clear eofblocks inodes 2012-11-08 15:34:59 -06:00
xfs_ialloc_btree.c xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
xfs_ialloc_btree.h xfs: add support for large btree blocks 2013-04-21 14:53:46 -05:00
xfs_ialloc.c xfs: Use inode create transaction 2013-06-27 14:27:18 -05:00
xfs_ialloc.h xfs: Inode create item recovery 2013-06-27 14:26:21 -05:00
xfs_icache.c xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_icache.h xfs: Remove dead function prototype xfs_sync_inode_grab() 2013-06-26 12:29:27 -05:00
xfs_icreate_item.c xfs: Inode create log items 2013-06-27 13:34:12 -05:00
xfs_icreate_item.h xfs: Inode create log items 2013-06-27 13:34:12 -05:00
xfs_inode_item.c xfs: add version 3 inode format with CRCs 2013-04-21 15:03:33 -05:00
xfs_inode_item.h xfs remove the XFS_TRANS_DEBUG routines 2012-12-17 16:29:00 -06:00
xfs_inode.c xfs: use XFS_BMAP_BMDR_SPACE vs. XFS_BROOT_SIZE_ADJ 2013-07-09 13:21:15 -05:00
xfs_inode.h xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_inum.h xfs: move xfsagino_t to xfs_types.h 2012-05-14 16:20:54 -05:00
xfs_ioctl32.c xfs: fallback to vmalloc for large buffers in xfs_compat_attrlist_by_handle 2013-05-07 19:00:10 -05:00
xfs_ioctl32.h xfs: remove subdirectories 2011-08-12 16:21:35 -05:00
xfs_ioctl.c xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_ioctl.h xfs: remove subdirectories 2011-08-12 16:21:35 -05:00
xfs_iomap.c xfs: don't use speculative prealloc for small files 2013-06-27 13:27:37 -05:00
xfs_iomap.h xfs: kill xfs_iomap 2010-12-16 16:05:51 -06:00
xfs_iops.c xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_iops.h xfs: remove subdirectories 2011-08-12 16:21:35 -05:00
xfs_itable.c xfs: clean up unused codes at xfs_bulkstat() 2013-07-09 15:36:21 -05:00
xfs_itable.h xfs: remove block number from inode lookup code 2010-06-24 11:35:17 +10:00
xfs_linux.h xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
xfs_log_cil.c xfs: Introduce ordered log vector support 2013-06-27 13:32:08 -05:00
xfs_log_priv.h xfs: Remove the obsolete XLOG_CIL_HARD_SPACE_LIMIT() macros 2013-04-16 13:18:33 -05:00
xfs_log_recover.c xfs: Inode create item recovery 2013-06-27 14:26:21 -05:00
xfs_log_recover.h xfs: Clean up XFS_BLI_* flag namespace 2010-05-24 10:33:39 -05:00
xfs_log.c xfs: Fix a deadlock in xfs_log_commit_cil() code path 2013-07-22 13:58:10 -05:00
xfs_log.h xfs: Inode create log items 2013-06-27 13:34:12 -05:00
xfs_message.c xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
xfs_message.h xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
xfs_mount.c xfs: Remove incore use of XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD 2013-06-28 17:39:22 -05:00
xfs_mount.h xfs: Remove XFS_MOUNT_RETERR 2013-06-19 14:54:17 -05:00
xfs_mru_cache.c xfs: convert to alloc_workqueue() 2011-02-01 11:42:43 +01:00
xfs_mru_cache.h xfs: Kill filestreams cache flush 2010-01-15 15:34:22 -06:00
xfs_qm_bhv.c xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_qm_syscalls.c xfs: Fix the logic check for all quotas being turned off 2013-07-11 16:49:10 -05:00
xfs_qm.c xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_qm.h xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_quota_priv.h xfs: use per-filesystem radix trees for dquot lookup 2012-03-14 11:09:06 -05:00
xfs_quota.h xfs: Fix the logic check for all quotas being turned off 2013-07-11 16:49:10 -05:00
xfs_quotaops.c xfs: Remove incore use of XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD 2013-06-28 17:39:22 -05:00
xfs_rename.c xfs: move xfsagino_t to xfs_types.h 2012-05-14 16:20:54 -05:00
xfs_rtalloc.c xfs: uncached buffer reads need to return an error 2012-11-15 21:34:05 -06:00
xfs_rtalloc.h xfs: Remove the macro XFS_BUF_PTR 2011-07-25 15:03:13 -05:00
xfs_sb.h xfs: Define a new function xfs_is_quota_inode() 2013-06-28 13:03:49 -05:00
xfs_stats.c xfs: use common code for quota statistics 2012-03-14 11:09:06 -05:00
xfs_stats.h xfs: use common code for quota statistics 2012-03-14 11:09:06 -05:00
xfs_super.c xfs: Remove incore use of XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD 2013-06-28 17:39:22 -05:00
xfs_super.h xfs: xfs_sync_data is redundant. 2012-10-17 12:01:25 -05:00
xfs_symlink.c xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_symlink.h xfs: fix the symbolic link assert in xfs_ifree 2013-06-19 14:14:43 -05:00
xfs_sysctl.c xfs: Convert use of typedef ctl_table to struct ctl_table 2013-06-17 17:42:25 -05:00
xfs_sysctl.h xfs: add background scanning to clear eofblocks inodes 2012-11-08 15:34:59 -06:00
xfs_trace.c xfs: add CRCs to dir2/da node blocks 2013-04-27 12:33:38 -05:00
xfs_trace.h xfs: update for 3.11-rc1 2013-07-09 12:29:12 -07:00
xfs_trans_ail.c xfs remove the XFS_TRANS_DEBUG routines 2012-12-17 16:29:00 -06:00
xfs_trans_buf.c xfs: Introduce an ordered buffer item 2013-06-27 13:33:11 -05:00
xfs_trans_dquot.c xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_trans_extfree.c xfs: move xfsagino_t to xfs_types.h 2012-05-14 16:20:54 -05:00
xfs_trans_inode.c xfs: implement inode change count 2013-06-28 13:00:05 -05:00
xfs_trans_priv.h xfs: re-enable xfsaild idle mode and fix associated races 2012-07-29 16:27:57 -05:00
xfs_trans_space.h
xfs_trans.c xfs: Inode create transaction reservations 2013-06-27 13:36:37 -05:00
xfs_trans.h xfs: Inode create log items 2013-06-27 13:34:12 -05:00
xfs_types.h xfs: Remove boolean_t typedef completely. 2013-01-17 17:32:57 -06:00
xfs_utils.c xfs: remove the alloc_done argument to xfs_dialloc 2012-07-29 16:00:31 -05:00
xfs_utils.h xfs: propagate umode_t 2012-01-03 22:55:00 -05:00
xfs_vnode.h xfs: remove remaining scraps of struct xfs_iomap 2012-03-15 13:40:16 -05:00
xfs_vnodeops.c xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_vnodeops.h [readdir] convert xfs 2013-06-29 12:57:00 +04:00
xfs_xattr.c xfs: remove subdirectories 2011-08-12 16:21:35 -05:00
xfs.h xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00