On Tue, Dec 19, 2017 at 7:44 AM, Qu Wenruo <w...@suse.com> wrote: > When multiple pending snapshots referring the same source subvolume are > executed, enabled quota will cause root item corruption, where root > items are using old bytenr (no backref in extent tree). > > This can be triggered by fstests btrfs/152. > > The cause is when source subvolume is still dirty, extra commit > (simplied transaction commit) of qgroup_account_snapshot() can skip > dirty roots not recorded in current transaction, making root item of > source subvolume not updated. > > Fix it by forcing recording source subvolume in current transaction > before qgroup sub-transaction commit. > > Reported-by: Justin Maggard <jmagg...@netgear.com> > Signed-off-by: Qu Wenruo <w...@suse.com> Reviewed-by: Filipe Manana <fdman...@suse.com>
Looks good. > --- > fs/btrfs/transaction.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c > index ddae813c01dd..f645e5de5fa5 100644 > --- a/fs/btrfs/transaction.c > +++ b/fs/btrfs/transaction.c > @@ -319,7 +319,7 @@ static int record_root_in_trans(struct btrfs_trans_handle > *trans, > if ((test_bit(BTRFS_ROOT_REF_COWS, &root->state) && > root->last_trans < trans->transid) || force) { > WARN_ON(root == fs_info->extent_root); > - WARN_ON(root->commit_root != root->node); > + WARN_ON(!force && root->commit_root != root->node); > > /* > * see below for IN_TRANS_SETUP usage rules > @@ -1366,6 +1366,14 @@ static int qgroup_account_snapshot(struct > btrfs_trans_handle *trans, > if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) > return 0; > > + /* > + * Ensure dirty @src will be commited. > + * Or after comming commit_fs_roots() and switch_commit_roots(), > + * any dirty but not recorded root will never be updated again. > + * Causing outdated root item. > + */ > + record_root_in_trans(trans, src, 1); > + > /* > * We are going to commit transaction, see btrfs_commit_transaction() > * comment for reason locking tree_log_mutex > -- > 2.15.1 > > -- > 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 -- Filipe David Manana, “Whether you think you can, or you think you can't — you're right.” -- 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