diff options
author | Dave Chinner <dchinner@redhat.com> | 2012-10-08 06:56:08 -0400 |
---|---|---|
committer | Ben Myers <bpm@sgi.com> | 2012-10-17 14:39:14 -0400 |
commit | c75921a72a7c4bb73a5e09a697a672722e5543f1 (patch) | |
tree | ed46f37241cdc860ffc691f6d71159333c434a83 /fs/xfs/xfs_log.c | |
parent | c7eea6f7adca4501d2c2db7f0f7c9dc88efac95e (diff) |
xfs: xfs_quiesce_attr() should quiesce the log like unmount
xfs_quiesce_attr() is supposed to leave the log empty with an
unmount record written. Right now it does not wait for the AIL to be
emptied before writing the unmount record, not does it wait for
metadata IO completion, either. Fix it to use the same method and
code as xfs_log_unmount().
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Mark Tinguely <tinguely@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_log.c')
-rw-r--r-- | fs/xfs/xfs_log.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index b6ce4d4b6def..d2d59692739f 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c | |||
@@ -855,20 +855,17 @@ xfs_log_unmount_write(xfs_mount_t *mp) | |||
855 | } /* xfs_log_unmount_write */ | 855 | } /* xfs_log_unmount_write */ |
856 | 856 | ||
857 | /* | 857 | /* |
858 | * Shut down and release the AIL and Log. | 858 | * Empty the log for unmount/freeze. |
859 | * | ||
860 | * During unmount, we need to ensure we flush all the dirty metadata objects | ||
861 | * from the AIL so that the log is empty before we write the unmount record to | ||
862 | * the log. | ||
863 | * | 859 | * |
864 | * To do this, we first need to shut down the background log work so it is not | 860 | * To do this, we first need to shut down the background log work so it is not |
865 | * trying to cover the log as we clean up. We then need to unpin all objects in | 861 | * trying to cover the log as we clean up. We then need to unpin all objects in |
866 | * the log so we can then flush them out. Once they have completed their IO and | 862 | * the log so we can then flush them out. Once they have completed their IO and |
867 | * run the callbacks removing themselves from the AIL, we can write the unmount | 863 | * run the callbacks removing themselves from the AIL, we can write the unmount |
868 | * record, tear down the AIL and finally free the log. | 864 | * record. |
869 | */ | 865 | */ |
870 | void | 866 | void |
871 | xfs_log_unmount(xfs_mount_t *mp) | 867 | xfs_log_quiesce( |
868 | struct xfs_mount *mp) | ||
872 | { | 869 | { |
873 | cancel_delayed_work_sync(&mp->m_log->l_work); | 870 | cancel_delayed_work_sync(&mp->m_log->l_work); |
874 | xfs_log_force(mp, XFS_LOG_SYNC); | 871 | xfs_log_force(mp, XFS_LOG_SYNC); |
@@ -886,6 +883,20 @@ xfs_log_unmount(xfs_mount_t *mp) | |||
886 | xfs_buf_unlock(mp->m_sb_bp); | 883 | xfs_buf_unlock(mp->m_sb_bp); |
887 | 884 | ||
888 | xfs_log_unmount_write(mp); | 885 | xfs_log_unmount_write(mp); |
886 | } | ||
887 | |||
888 | /* | ||
889 | * Shut down and release the AIL and Log. | ||
890 | * | ||
891 | * During unmount, we need to ensure we flush all the dirty metadata objects | ||
892 | * from the AIL so that the log is empty before we write the unmount record to | ||
893 | * the log. Once this is done, we can tear down the AIL and the log. | ||
894 | */ | ||
895 | void | ||
896 | xfs_log_unmount( | ||
897 | struct xfs_mount *mp) | ||
898 | { | ||
899 | xfs_log_quiesce(mp); | ||
889 | 900 | ||
890 | xfs_trans_ail_destroy(mp); | 901 | xfs_trans_ail_destroy(mp); |
891 | xlog_dealloc_log(mp->m_log); | 902 | xlog_dealloc_log(mp->m_log); |