• Leah Rumancik's avatar
    xfs: up(ic_sema) if flushing data device fails · 471de203
    Leah Rumancik authored
    We flush the data device cache before we issue external log IO. If
    the flush fails, we shut down the log immediately and return. However,
    the iclog->ic_sema is left in a decremented state so let's add an up().
    Prior to this patch, xfs/438 would fail consistently when running with
    an external log device:
    
    sync
      -> xfs_log_force
      -> xlog_write_iclog
          -> down(&iclog->ic_sema)
          -> blkdev_issue_flush (fail causes us to intiate shutdown)
              -> xlog_force_shutdown
              -> return
    
    unmount
      -> xfs_log_umount
          -> xlog_wait_iclog_completion
              -> down(&iclog->ic_sema) --------> HANG
    
    There is a second early return / shutdown. Make sure the up() happens
    for it as well. Also make sure we cleanup the iclog state,
    xlog_state_done_syncing, before dropping the iclog lock.
    
    Fixes: b5d721ea ("xfs: external logs need to flush data device")
    Fixes: 842a42d1 ("xfs: shutdown on failure to add page to log bio")
    Fixes: 7d839e32 ("xfs: check return codes when flushing block devices")
    Signed-off-by: default avatarLeah Rumancik <leah.rumancik@gmail.com>
    Reviewed-by: default avatar"Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: default avatarChandan Babu R <chandanbabu@kernel.org>
    471de203
xfs_log.c 110 KB