diff options
author | Brian Foster <bfoster@redhat.com> | 2015-08-19 09:58:36 +1000 |
---|---|---|
committer | Dave Chinner <david@fromorbit.com> | 2015-08-19 09:58:36 +1000 |
commit | f0b2efad16e78623b5a156f6e4e9166907b83155 (patch) | |
tree | 82ebc3e9a7524046d748dd0bebae3caeb9bc91fd /fs/xfs/xfs_log.h | |
parent | e32a1d1fbf6eb2bdc24aa0502e827ff4d2234604 (diff) | |
download | linux-f0b2efad16e78623b5a156f6e4e9166907b83155.tar.gz linux-f0b2efad16e78623b5a156f6e4e9166907b83155.tar.bz2 linux-f0b2efad16e78623b5a156f6e4e9166907b83155.zip |
xfs: don't leave EFIs on AIL on mount failure
Log recovery occurs in two phases at mount time. In the first phase,
EFIs and EFDs are processed and potentially cancelled out. EFIs without
EFD objects are inserted into the AIL for processing and recovery in the
second phase. xfs_mountfs() runs various other operations between the
phases and is thus subject to failure. If failure occurs after the first
phase but before the second, pending EFIs sit on the AIL, pin it and
cause the mount to hang.
Update the mount sequence to ensure that pending EFIs are cancelled in
the event of failure. Add a recovery cancellation mechanism to iterate
the AIL and cancel all EFI items when requested. Plumb cancellation
support through the log mount finish helper and update xfs_mountfs() to
invoke cancellation in the event of failure after recovery has started.
Signed-off-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
Diffstat (limited to 'fs/xfs/xfs_log.h')
-rw-r--r-- | fs/xfs/xfs_log.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index fa27aaec72cb..09d91d3166cd 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -147,6 +147,7 @@ int xfs_log_mount(struct xfs_mount *mp, xfs_daddr_t start_block, int num_bblocks); int xfs_log_mount_finish(struct xfs_mount *mp); +int xfs_log_mount_cancel(struct xfs_mount *); xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp); xfs_lsn_t xlog_assign_tail_lsn_locked(struct xfs_mount *mp); void xfs_log_space_wake(struct xfs_mount *mp); |