This is a note to let you know that I've just added the patch titled

    Btrfs: send, don't leave without decrementing clone root's send_progress

to the 4.0-stable tree which can be found at:
    
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     
btrfs-send-don-t-leave-without-decrementing-clone-root-s-send_progress.patch
and it can be found in the queue-4.0 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <[email protected]> know about it.


>From 2f1f465ae6da244099af55c066e5355abd8ff620 Mon Sep 17 00:00:00 2001
From: Filipe Manana <[email protected]>
Date: Mon, 2 Mar 2015 20:53:53 +0000
Subject: Btrfs: send, don't leave without decrementing clone root's 
send_progress

From: Filipe Manana <[email protected]>

commit 2f1f465ae6da244099af55c066e5355abd8ff620 upstream.

If the clone root was not readonly or the dead flag was set on it, we were
leaving without decrementing the root's send_progress counter (and before
we just incremented it). If a concurrent snapshot deletion was in progress
and ended up being aborted, it would be impossible to later attempt to
delete again the snapshot, since the root's send_in_progress counter could
never go back to 0.

We were also setting clone_sources_to_rollback to i + 1 too early - if we
bailed out because the clone root we got is not readonly or flagged as dead
we ended up later derreferencing a null pointer because we didn't assign
the clone root to sctx->clone_roots[i].root:

                for (i = 0; sctx && i < clone_sources_to_rollback; i++)
                        btrfs_root_dec_send_in_progress(
                                        sctx->clone_roots[i].root);

So just don't increment the send_in_progress counter if the root is readonly
or flagged as dead.

Signed-off-by: Filipe Manana <[email protected]>
Reviewed-by: David Sterba <[email protected]>
Signed-off-by: Chris Mason <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>

---
 fs/btrfs/send.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--- a/fs/btrfs/send.c
+++ b/fs/btrfs/send.c
@@ -5852,9 +5852,7 @@ long btrfs_ioctl_send(struct file *mnt_f
                                ret = PTR_ERR(clone_root);
                                goto out;
                        }
-                       clone_sources_to_rollback = i + 1;
                        spin_lock(&clone_root->root_item_lock);
-                       clone_root->send_in_progress++;
                        if (!btrfs_root_readonly(clone_root) ||
                            btrfs_root_dead(clone_root)) {
                                spin_unlock(&clone_root->root_item_lock);
@@ -5862,10 +5860,12 @@ long btrfs_ioctl_send(struct file *mnt_f
                                ret = -EPERM;
                                goto out;
                        }
+                       clone_root->send_in_progress++;
                        spin_unlock(&clone_root->root_item_lock);
                        srcu_read_unlock(&fs_info->subvol_srcu, index);
 
                        sctx->clone_roots[i].root = clone_root;
+                       clone_sources_to_rollback = i + 1;
                }
                vfree(clone_sources_tmp);
                clone_sources_tmp = NULL;


Patches currently in stable-queue which might be from [email protected] are

queue-4.0/btrfs-send-add-missing-check-for-dead-clone-root.patch
queue-4.0/btrfs-send-don-t-leave-without-decrementing-clone-root-s-send_progress.patch
queue-4.0/btrfs-fix-range-cloning-when-same-inode-used-as-source-and-destination.patch
--
To unsubscribe from this list: send the line "unsubscribe stable" in

Reply via email to