Skip to content

Commit

Permalink
xfs: don't run the sync work if the filesystem is read-only
Browse files Browse the repository at this point in the history
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: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Mark Tinguely <tinguely@sgi.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Ben Myers <bpm@sgi.com>
  • Loading branch information
Dave Chinner authored and Ben Myers committed Oct 17, 2012
1 parent 7e18530 commit 7f7bebe
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 13 deletions.
2 changes: 2 additions & 0 deletions fs/xfs/xfs_super.c
Original file line number Diff line number Diff line change
Expand Up @@ -1200,6 +1200,7 @@ xfs_fs_remount(
* value if it is non-zero, otherwise go with the default.
*/
xfs_restore_resvblks(mp);
xfs_syncd_queue_sync(mp);
}

/* rw -> ro */
Expand Down Expand Up @@ -1245,6 +1246,7 @@ xfs_fs_unfreeze(
struct xfs_mount *mp = XFS_M(sb);

xfs_restore_resvblks(mp);
xfs_syncd_queue_sync(mp);
return 0;
}

Expand Down
29 changes: 16 additions & 13 deletions fs/xfs/xfs_sync.c
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,9 @@ xfs_quiesce_data(
* 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
* 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
xfs_quiesce_attr(
Expand All @@ -341,6 +344,9 @@ xfs_quiesce_attr(
/* flush all pending changes from the 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
* read-only remount without racing.
Expand Down Expand Up @@ -379,9 +385,8 @@ xfs_syncd_queue_sync(
}

/*
* Every sync period we need to unpin all items in the AIL and push them to
* disk. If there is nothing dirty, then we might need to cover the log to
* indicate that the filesystem is idle and not frozen.
* Every sync period we need to push dirty metadata and try to cover the log
* to indicate the filesystem is idle and not frozen.
*/
void
xfs_sync_worker(
Expand All @@ -391,17 +396,15 @@ xfs_sync_worker(
struct xfs_mount, m_sync_work);
int error;

if (!(mp->m_flags & XFS_MOUNT_RDONLY)) {
/* dgc: errors ignored here */
if (mp->m_super->s_writers.frozen == SB_UNFROZEN &&
xfs_log_need_covered(mp))
error = xfs_fs_log_dummy(mp);
else
xfs_log_force(mp, 0);
/* dgc: errors ignored here */
if (mp->m_super->s_writers.frozen == SB_UNFROZEN &&
xfs_log_need_covered(mp))
error = xfs_fs_log_dummy(mp);
else
xfs_log_force(mp, 0);

/* start pushing all the metadata that is currently dirty */
xfs_ail_push_all(mp->m_ail);
}
/* start pushing all the metadata that is currently dirty */
xfs_ail_push_all(mp->m_ail);

/* queue us up again */
xfs_syncd_queue_sync(mp);
Expand Down

0 comments on commit 7f7bebe

Please sign in to comment.