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)