Commit 7f7bebef authored by Dave Chinner's avatar Dave Chinner Committed by Ben Myers

xfs: don't run the sync work if the filesystem is read-only

If the filesystem is mounted or remounted read-only, stop the sync
worker that tries to flush or cover the log if the filesystem is
dirty. It's read-only, so it isn't dirty. Restart it on a remount,rw
as necessary. This avoids the need for RO checks in the work.

Similarly, stop the sync work when the filesystem is frozen, and
start it again when the filesysetm is thawed. This avoids the need
for special freeze checks in the work.
Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarMark Tinguely <tinguely@sgi.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarBen Myers <bpm@sgi.com>
parent 7e18530b
...@@ -1200,6 +1200,7 @@ xfs_fs_remount( ...@@ -1200,6 +1200,7 @@ xfs_fs_remount(
* value if it is non-zero, otherwise go with the default. * value if it is non-zero, otherwise go with the default.
*/ */
xfs_restore_resvblks(mp); xfs_restore_resvblks(mp);
xfs_syncd_queue_sync(mp);
} }
/* rw -> ro */ /* rw -> ro */
...@@ -1245,6 +1246,7 @@ xfs_fs_unfreeze( ...@@ -1245,6 +1246,7 @@ xfs_fs_unfreeze(
struct xfs_mount *mp = XFS_M(sb); struct xfs_mount *mp = XFS_M(sb);
xfs_restore_resvblks(mp); xfs_restore_resvblks(mp);
xfs_syncd_queue_sync(mp);
return 0; return 0;
} }
......
...@@ -323,6 +323,9 @@ xfs_quiesce_data( ...@@ -323,6 +323,9 @@ xfs_quiesce_data(
* Second stage of a quiesce. The data is already synced, now we have to take * Second stage of a quiesce. The data is already synced, now we have to take
* care of the metadata. New transactions are already blocked, so we need to * care of the metadata. New transactions are already blocked, so we need to
* wait for any remaining transactions to drain out before proceeding. * wait for any remaining transactions to drain out before proceeding.
*
* Note: this stops background sync work - the callers must ensure it is started
* again when appropriate.
*/ */
void void
xfs_quiesce_attr( xfs_quiesce_attr(
...@@ -341,6 +344,9 @@ xfs_quiesce_attr( ...@@ -341,6 +344,9 @@ xfs_quiesce_attr(
/* flush all pending changes from the AIL */ /* flush all pending changes from the AIL */
xfs_ail_push_all_sync(mp->m_ail); xfs_ail_push_all_sync(mp->m_ail);
/* stop background sync work */
cancel_delayed_work_sync(&mp->m_sync_work);
/* /*
* Just warn here till VFS can correctly support * Just warn here till VFS can correctly support
* read-only remount without racing. * read-only remount without racing.
...@@ -379,9 +385,8 @@ xfs_syncd_queue_sync( ...@@ -379,9 +385,8 @@ xfs_syncd_queue_sync(
} }
/* /*
* Every sync period we need to unpin all items in the AIL and push them to * Every sync period we need to push dirty metadata and try to cover the log
* disk. If there is nothing dirty, then we might need to cover the log to * to indicate the filesystem is idle and not frozen.
* indicate that the filesystem is idle and not frozen.
*/ */
void void
xfs_sync_worker( xfs_sync_worker(
...@@ -391,17 +396,15 @@ xfs_sync_worker( ...@@ -391,17 +396,15 @@ xfs_sync_worker(
struct xfs_mount, m_sync_work); struct xfs_mount, m_sync_work);
int error; int error;
if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { /* dgc: errors ignored here */
/* dgc: errors ignored here */ if (mp->m_super->s_writers.frozen == SB_UNFROZEN &&
if (mp->m_super->s_writers.frozen == SB_UNFROZEN && xfs_log_need_covered(mp))
xfs_log_need_covered(mp)) error = xfs_fs_log_dummy(mp);
error = xfs_fs_log_dummy(mp); else
else xfs_log_force(mp, 0);
xfs_log_force(mp, 0);
/* start pushing all the metadata that is currently dirty */ /* start pushing all the metadata that is currently dirty */
xfs_ail_push_all(mp->m_ail); xfs_ail_push_all(mp->m_ail);
}
/* queue us up again */ /* queue us up again */
xfs_syncd_queue_sync(mp); xfs_syncd_queue_sync(mp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment