Re: [PATCH v3 07/12] btrfs: replace pending/pinned chunks lists with io tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Mar 25, 2019 at 06:43:49PM +0200, Nikolay Borisov wrote:
> >> -static int __must_check
> >> +int __must_check
> >>  __set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
> >>  		 unsigned bits, unsigned exclusive_bits,
> >>  		 u64 *failed_start, struct extent_state **cached_state,
> > 
> > Does this really need to be exported again? There are helpers that can
> > wrap specific combinations of parameters.
> 
> This is exported so that __set_extent_bit could be called with
> GFP_NOWAIT parameter otherwise I was getting lockdep splats since
> extent_map_device_set_bits (called from add_extent_mapping) is called
> under a write_lock hence we can't sleep.

So then we should add a helper for that, like

  int set_exentent_bit_nowait(...)

similar to set_record_extent_bits.

> >> @@ -335,6 +335,8 @@ void btrfs_free_device(struct btrfs_device *device)
> >>  {
> >>  	WARN_ON(!list_empty(&device->post_commit_list));
> >>  	rcu_string_free(device->name);
> >> +	if (!in_softirq())
> >> +		extent_io_tree_release(&device->alloc_state);
> 
> This is used to distinguish between btrfs_free_device being called from
> btrfs_close_devices in close_ctree i.e non rcu (hence no softirq )
> context or any of the error handlers and from free_device_rcu. In the
> latter case the extent tree is already freed in btrfs_close_one_device,
> hence there is no need to do it in the RCU callback.

Ok, I can cook a comment from that, thanks.

> Furthermore, there is also a comment that the extent io tree cannot be
> destroyed in RCU context because extent_io_tree_release calls
> cond_resched_lock which in turn could sleep, but this is forbidden in
> RCU context.

Yeah, comment in the right place.



[Index of Archives]     [Linux Filesystem Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux