Looks good to me. Thanks. Reviewed-by: Naohiro Aota <naohiro.a...@wdc.com>
On Thu, Mar 11, 2021 at 03:13:30PM +0000, fdman...@kernel.org wrote: > From: Filipe Manana <fdman...@suse.com> > > When using a zoned filesystem, while syncing the log, if we fail to > allocate the root node for the log root tree, we are not removing the > log context we allocated on stack from the list of log contextes of the > log root tree. This means after the return from btrfs_sync_log() we get > a corrupted linked list. > > Fix this by allocating the node before adding our stack allocated context > to the list of log contextes of the log root tree. > > Fixes: 3ddebf27fcd3a9 ("btrfs: zoned: reorder log node allocation on zoned > filesystem") > Signed-off-by: Filipe Manana <fdman...@suse.com> > --- > fs/btrfs/tree-log.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c > index 2f1acc9aea9e..92a368627791 100644 > --- a/fs/btrfs/tree-log.c > +++ b/fs/btrfs/tree-log.c > @@ -3169,10 +3169,6 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans, > > mutex_lock(&log_root_tree->log_mutex); > > - index2 = log_root_tree->log_transid % 2; > - list_add_tail(&root_log_ctx.list, &log_root_tree->log_ctxs[index2]); > - root_log_ctx.log_transid = log_root_tree->log_transid; > - > if (btrfs_is_zoned(fs_info)) { > if (!log_root_tree->node) { > ret = btrfs_alloc_log_tree_node(trans, log_root_tree); > @@ -3183,6 +3179,10 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans, > } > } > > + index2 = log_root_tree->log_transid % 2; > + list_add_tail(&root_log_ctx.list, &log_root_tree->log_ctxs[index2]); > + root_log_ctx.log_transid = log_root_tree->log_transid; > + > /* > * Now we are safe to update the log_root_tree because we're under the > * log_mutex, and we're a current writer so we're holding the commit > -- > 2.28.0 >