On Mon, May 13, 2019 at 5:06 PM David Sterba <dste...@suse.cz> wrote: > > On Mon, May 13, 2019 at 05:56:07PM +0200, David Sterba wrote: > > On Mon, Apr 22, 2019 at 04:43:42PM +0100, fdman...@kernel.org wrote: > > > + btrfs_warn_rl(root_dst->fs_info, > > > +"Can not deduplicate to root %llu while send operations are using it (%d > > > in progress)", > > > + root_dst->root_key.objectid, > > > + root_dst->send_in_progress); > > > > The test btrfs/187 stresses this code and the logs are flooded by the > > messages, even ratelimited. > > > > I wonder if the test is rather artificail (and that's fine for the testing > > purposes) or if the number of messages would repeat under normal conditions. > > > > We don't need to print the message each time the dedup tries to acces a > > snapshot under send, so keeping track if the message has been sent already > > would be less intrusive and still provide the information. > > Untested: > > --- a/fs/btrfs/ctree.h > +++ b/fs/btrfs/ctree.h > @@ -1205,6 +1205,8 @@ enum { > BTRFS_ROOT_DEAD_RELOC_TREE, > /* Mark dead root stored on device whose cleanup needs to be resumed > */ > BTRFS_ROOT_DEAD_TREE, > + /* Track if dedupe was attempted under a current send */ > + BTRFS_ROOT_NOTIFIED_DEDUPE_DURING_SEND, > }; > > /* > diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c > index 6dafa857bbb9..23677cf12afc 100644 > --- a/fs/btrfs/ioctl.c > +++ b/fs/btrfs/ioctl.c > @@ -3263,7 +3263,9 @@ static int btrfs_extent_same(struct inode *src, u64 > loff, u64 olen, > > spin_lock(&root_dst->root_item_lock); > if (root_dst->send_in_progress) { > - btrfs_warn_rl(root_dst->fs_info, > + if (!test_and_set_bit(BTRFS_ROOT_NOTIFIED_DEDUPE_DURING_SEND, > + &root_dst->state)) > + btrfs_warn(root_dst->fs_info, > "cannot deduplicate to root %llu while send operations are using it (%d in > progress)", > root_dst->root_key.objectid, > root_dst->send_in_progress); > diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c > index dd38dfe174df..cc85ae903368 100644 > --- a/fs/btrfs/send.c > +++ b/fs/btrfs/send.c > @@ -6637,6 +6637,8 @@ static void btrfs_root_dec_send_in_progress(struct > btrfs_root* root) > btrfs_err(root->fs_info, > "send_in_progress unbalanced %d root %llu", > root->send_in_progress, root->root_key.objectid); > + if (root->send_in_progress == 0) > + clear_bit(BTRFS_ROOT_NOTIFIED_DEDUPE_DURING_SEND, > &root->state); > spin_unlock(&root->root_item_lock);
I would leave it as it is unless users start to complain. Yes, the test does this on purpose. Adding such code/state seems weird to me, instead I would change the rate limit state so that the messages would repeat much less frequently. > } >