On Mon, Feb 11, 2019 at 10:35:00AM +0200, Nikolay Borisov wrote:
> From: Jeff Mahoney <je...@suse.com>
> 
> We currently overload the pending_chunks list to handle updating
> btrfs_device->commit_bytes used.  We don't actually care about
> the extent mapping or even the device mapping for the chunk - we
> just need the device, and we can end up processing it multiple
> times.  The fs_devices->resized_list does more or less the same
> thing, but with the disk size.  They are called consecutively
> during commit and have more or less the same purpose.
> 
> We can combine the two lists into a single list that attaches
> to the transaction and contains a list of devices that need
> updating.  Since we always add the device to a list when we
> change bytes_used or disk_total_size, there's no harm in
> copying both values at once.

Agreed, overall sounds good.

> Signed-off-by: Jeff Mahoney <je...@suse.com>
> Signed-off-by: Nikolay Borisov <nbori...@suse.com>
> ---
> --- a/fs/btrfs/transaction.c
> +++ b/fs/btrfs/transaction.c
> @@ -75,6 +75,7 @@ void btrfs_put_transaction(struct btrfs_transaction 
> *transaction)
>                       btrfs_put_block_group_trimming(cache);
>                       btrfs_put_block_group(cache);
>               }
> +             BUG_ON(!list_empty(&transaction->dev_update_list));

Why BUG_ON? Would ASSERT or WARN_ON enough?

>               kfree(transaction);
>       }
>  }
> @@ -334,6 +333,7 @@ static struct btrfs_fs_devices *alloc_fs_devices(const u8 
> *fsid,
>  
>  void btrfs_free_device(struct btrfs_device *device)
>  {
> +     BUG_ON(!list_empty(&device->post_commit_list));

Same here

>       rcu_string_free(device->name);
>       bio_put(device->flush_bio);
>       kfree(device);
> +     /*
> +      * We don't need the device_list_mutex here.  This list is owned
> +      * by the transaction and the transaction must complete before
> +      * the device is released.
> +      */
> +     mutex_lock(&trans->fs_info->chunk_mutex);
> +     list_for_each_entry_safe(curr, next, &trans->dev_update_list,
> +                              post_commit_list) {
> +             list_del_init(&curr->post_commit_list);
> +             curr->commit_total_bytes = curr->disk_total_bytes;
> +             curr->commit_bytes_used = curr->bytes_used;

Agreed, the chunk_mutex should be enough from what I've seen.

>       }
> -     mutex_unlock(&fs_info->chunk_mutex);
> +     mutex_unlock(&trans->fs_info->chunk_mutex);
>  }
>  
>  void btrfs_set_fs_info_ptr(struct btrfs_fs_info *fs_info)

Reply via email to