Message ID | 20211104103849.46855-1-hreitz@redhat.com |
---|---|
Headers | show |
Series | block: Attempt on fixing 030-reported errors | expand |
Am 04.11.2021 um 11:38 hat Hanna Reitz geschrieben: > (2A) bdrv_replace_child_noperm() should immediately set bs->file or > bs->backing to NULL when it sets bs->{file,backing}->bs to NULL. > It should also immediately remove any BdrvChild with .bs == NULL > from the parent’s BDS.children list. > Implemented in patches 2 through 6. > > (2B) Alternatively, we could always keep the whole subgraph drained > while we manipulate it. Then, the bdrv_parent_drained_end_single() > in bdrv_replace_child_noperm() wouldn’t do anything. > To fix 030, we would need to add a drained section to > stream_prepare(): Namely we’d need to drain the subgraph below the > COR filter node. > This would be a much simpler solution, but I don’t feel like it’s > the right one. > As you can see, I’m not sure which of 2A or 2B is the right solution. I > decided to investigate both: 2A was much more complicated, but seemed > like the right thing to do; 2B is much simpler, but doesn’t feel as > right. Therefore, I decided to go with 2A in this first version of this > series. I haven't looked at the patches yet, but if I understand correctly the choice you're presenting here is between protecting code from accessing invalid state and not creating the invalid state in the first place. I agree that the latter is preferable as long as it doesn't make things so complicated that we would be willing to accept the higher risk of breakage in the former. If it's doable in five patches, it's probably not complicated enough to make such compromises. Kevin
On 04.11.21 12:58, Kevin Wolf wrote: > Am 04.11.2021 um 11:38 hat Hanna Reitz geschrieben: >> (2A) bdrv_replace_child_noperm() should immediately set bs->file or >> bs->backing to NULL when it sets bs->{file,backing}->bs to NULL. >> It should also immediately remove any BdrvChild with .bs == NULL >> from the parent’s BDS.children list. >> Implemented in patches 2 through 6. >> >> (2B) Alternatively, we could always keep the whole subgraph drained >> while we manipulate it. Then, the bdrv_parent_drained_end_single() >> in bdrv_replace_child_noperm() wouldn’t do anything. >> To fix 030, we would need to add a drained section to >> stream_prepare(): Namely we’d need to drain the subgraph below the >> COR filter node. >> This would be a much simpler solution, but I don’t feel like it’s >> the right one. >> As you can see, I’m not sure which of 2A or 2B is the right solution. I >> decided to investigate both: 2A was much more complicated, but seemed >> like the right thing to do; 2B is much simpler, but doesn’t feel as >> right. Therefore, I decided to go with 2A in this first version of this >> series. > I haven't looked at the patches yet, but if I understand correctly the > choice you're presenting here is between protecting code from accessing > invalid state and not creating the invalid state in the first place. Yes, that’s right. > I agree that the latter is preferable as long as it doesn't make things > so complicated that we would be willing to accept the higher risk of > breakage in the former. No, I don’t think it’s too complicated. Just not as sample as a drained_begin + drained_end. > If it's doable in five patches, it's probably > not complicated enough to make such compromises. Without the clean-up patches that are patches 3 and 4, it would be doable in even fewer patches. :) Hanna
Am 04.11.2021 um 11:38 hat Hanna Reitz geschrieben: > Hanna Reitz (7): > stream: Traverse graph after modification > block: Manipulate children list in .attach/.detach > block: Unite remove_empty_child and child_free > block: Drop detached child from ignore list > block: Pass BdrvChild ** to replace_child_noperm > block: Let replace_child_noperm free children > iotests/030: Unthrottle parallel jobs in reverse Now I know that I don't aspire to a new career as a full time borrow checker. :-) Patches 1-4: Reviewed-by: Kevin Wolf <kwolf@redhat.com>