Hi,

you are adding a new smp_mb, can you please explain why it's needed and
document it?

thanks,
dave

On Fri, Mar 18, 2011 at 04:55:07PM +0100, Arne Jansen wrote:
> This adds several synchronizations:
>  - for a transaction commit, the scrub gets paused before the
>    tree roots are committed until the super are safely on disk
>  - during a log commit, scrubbing of supers is disabled
>  - on unmount, the scrub gets cancelled
>  - on device removal, the scrub for the particular device gets cancelled
> 
> Signed-off-by: Arne Jansen <sensi...@gmx.net>
> ---
>  fs/btrfs/disk-io.c     |    1 +
>  fs/btrfs/transaction.c |    3 +++
>  fs/btrfs/tree-log.c    |    2 ++
>  fs/btrfs/volumes.c     |    2 ++
>  4 files changed, 8 insertions(+), 0 deletions(-)
> 
> diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
> index 3e1ea3e..924a366 100644
> --- a/fs/btrfs/disk-io.c
> +++ b/fs/btrfs/disk-io.c
> @@ -2493,6 +2493,7 @@ int close_ctree(struct btrfs_root *root)
>       fs_info->closing = 1;
>       smp_mb();
>  
> +     btrfs_scrub_cancel(root);
>       btrfs_put_block_group_cache(fs_info);
>  
>       /*
> diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
> index 3d73c8d..5a43b20 100644
> --- a/fs/btrfs/transaction.c
> +++ b/fs/btrfs/transaction.c
> @@ -1310,6 +1310,7 @@ int btrfs_commit_transaction(struct btrfs_trans_handle 
> *trans,
>  
>       WARN_ON(cur_trans != trans->transaction);
>  
> +     btrfs_scrub_pause(root);
>       /* btrfs_commit_tree_roots is responsible for getting the
>        * various roots consistent with each other.  Every pointer
>        * in the tree of tree roots has to point to the most up to date
> @@ -1391,6 +1392,8 @@ int btrfs_commit_transaction(struct btrfs_trans_handle 
> *trans,
>  
>       mutex_unlock(&root->fs_info->trans_mutex);
>  
> +     btrfs_scrub_continue(root);
> +
>       if (current->journal_info == trans)
>               current->journal_info = NULL;
>  
> diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
> index 1f6788f..2be84fa 100644
> --- a/fs/btrfs/tree-log.c
> +++ b/fs/btrfs/tree-log.c
> @@ -2098,7 +2098,9 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
>        * the running transaction open, so a full commit can't hop
>        * in and cause problems either.
>        */
> +     btrfs_scrub_pause_super(root);
>       write_ctree_super(trans, root->fs_info->tree_root, 1);
> +     btrfs_scrub_continue_super(root);
>       ret = 0;
>  
>       mutex_lock(&root->log_mutex);
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index 7dc9fa5..ad3ea88 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -1330,6 +1330,8 @@ int btrfs_rm_device(struct btrfs_root *root, char 
> *device_path)
>               goto error_undo;
>  
>       device->in_fs_metadata = 0;
> +     smp_mb();
        ^^^^^^^^

> +     btrfs_scrub_cancel_dev(root, device);
>  
>       /*
>        * the device list mutex makes sure that we don't change
> -- 
> 1.7.3.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to