On 19.03.2019 19:44, Andrey Shinkevich wrote: > > > On 18/03/2019 17:42, Alberto Garcia wrote: >> On Tue 26 Feb 2019 05:39:41 PM CET, Andrey Shinkevich wrote: >>> On 26/02/2019 16:33, Alberto Garcia wrote: >>>> On Mon 25 Feb 2019 05:39:14 PM CET, Vladimir Sementsov-Ogievskiy wrote: >>>>>> --- a/block/stream.c >>>>>> +++ b/block/stream.c >>>>>> @@ -259,6 +259,15 @@ void stream_start(const char *job_id, >>>>>> BlockDriverState *bs, >>>>>> &error_abort); >>>>>> } >>>>>> >>>>>> + if (base) { >>>>>> + /* >>>>>> + * The base node should not disappear during the job. >>>>>> + */ >>>>>> + block_job_add_bdrv(&s->common, "base", base, 0, >>>>>> + BLK_PERM_ALL & ~BLK_PERM_GRAPH_MOD, >>>>>> + &error_abort); >>>>>> + } >>>>>> + >>>>>> s->base = base; >>>>>> s->backing_file_str = g_strdup(backing_file_str); >>>>>> s->bs_read_only = bs_read_only; >>>>>> >>>>> >>>>> >>>>> Hmm, intersting, is BLK_PERM_GRAPH_MOD a good way to lock relations in >>>>> node graph? >>>>> >>>>> bdrv_replace_node don't check this permission. So, I don't understand, >>>>> how this permission works.. Graph modification operation in difference >>>>> with read or write are not done through BdrvChild at all. >>>>> >>>>> Are there any ideas or work started for some another mechanism of >>>>> "freezing" a subgraph during an operation? >>>> >>>> See this discussion: >>>> >>>> https://lists.gnu.org/archive/html/qemu-block/2018-11/msg00387.html >>>> >>>> And these patches (currently under review): >>>> >>>> https://lists.gnu.org/archive/html/qemu-block/2019-01/msg00622.html >>> >>> The bdrv_freeze_backing_chain() excludes the base BlockDriverState. >>> And we would like to protect the base as well when running the >>> block-stream. >> >> I was just looking into this again. The bdrv_freeze_backing_chain() (now >> in master) freezes all links between bs and base, both included, so base >> cannot go away anymore. >> >> Is block_job_add_bdrv() still necessary in this scenario? >> >> Unless I'm wrong I think that what we can do now is to start getting rid >> of the op blockers, shouldn't it be possible to get the same >> functionality with the permission system plus the BdrvChild.frozen >> attribute ? >> >> Berto >> I have got rid of using the block_job_add_bdrv() for the 'base'. > But, as for the "intermediate nodes", I will want to add the > BLK_PERM_WRITE shared flag to them for the 'discard block' feature > in future. So, I have to check if we can get 'write' permission for > the block discard operation without invoking block_job_add_bdrv() > for them... > > Andrey >
I think Alberto mean only block_job_add_bdrv for base, and I agree that we don't need it after we have frozen attribute. -- Best regards, Vladimir