On 06.05.20 12:37, Kevin Wolf wrote: > Am 18.02.2020 um 13:42 hat Max Reitz geschrieben: >> After the series this patch belongs to, we want to have a common >> BdrvChildClass that encompasses all of child_file, child_format, and >> child_backing. Such a single class needs a single .inherit_options() >> implementation, and this patch introduces it. >> >> The next patch will show how the existing implementations can fall back >> to it just by passing appropriate BdrvChildRole and parent_is_format >> values. >> >> Signed-off-by: Max Reitz >> Reviewed-by: Eric Blake >> --- >> block.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 84 insertions(+) >> >> diff --git a/block.c b/block.c >> index c33f0e9b42..9179b9b604 100644 >> --- a/block.c >> +++ b/block.c >> @@ -998,6 +998,90 @@ static void bdrv_temp_snapshot_options(int *child_flags, QDict *child_options, >> *child_flags &= ~BDRV_O_NATIVE_AIO; >> } >> >> +/* >> + * Returns the options and flags that a generic child of a BDS should >> + * get, based on the given options and flags for the parent BDS. >> + */ >> +static void __attribute__((unused)) >> + bdrv_inherited_options(BdrvChildRole role, bool parent_is_format, >> + int *child_flags, QDict *child_options, >> + int parent_flags, QDict *parent_options) >> +{ >> + int flags = parent_flags; >> + >> + /* >> + * First, decide whether to set, clear, or leave BDRV_O_PROTOCOL. >> + * Generally, the question to answer is: Should this child be >> + * format-probed by default? >> + */ >> + >> + /* >> + * Pure and non-filtered data children of non-format nodes should >> + * be probed by default (even when the node itself has BDRV_O_PROTOCOL >> + * set). This only affects a very limited set of drivers (namely >> + * quorum and blkverify when this comment was written). >> + * Force-clear BDRV_O_PROTOCOL then. >> + */ >> + if (!parent_is_format && >> + (role & (BDRV_CHILD_DATA | BDRV_CHILD_METADATA | >> + BDRV_CHILD_FILTERED)) == >> + BDRV_CHILD_DATA) > > You could avoid the odd indentation (I can't decide whether or not it > should be one space more to align correctly) and probably also make the > expression more readable if you split it into: > > (role & BDRV_CHILD_DATA) && > !(role & (BDRV_CHILD_METADATA | BDRV_CHILD_FILTERED)) Yes, looks good. >> + { >> + flags &= ~BDRV_O_PROTOCOL; >> + } >> + >> + /* >> + * All children of format nodes (except for COW children) and all >> + * metadata children in general should never be format-probed. >> + * Force-set BDRV_O_PROTOCOL then. >> + */ >> + if ((parent_is_format && !(role & BDRV_CHILD_COW)) || >> + (role & BDRV_CHILD_METADATA)) >> + { >> + flags |= BDRV_O_PROTOCOL; >> + } >> + >> + /* >> + * If the cache mode isn't explicitly set, inherit direct and no-flush from >> + * the parent. >> + */ >> + qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_DIRECT); >> + qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_NO_FLUSH); >> + qdict_copy_default(child_options, parent_options, BDRV_OPT_FORCE_SHARE); >> + >> + if (role & BDRV_CHILD_COW) { >> + /* backing files are always opened read-only */ > > Not "always", just by default. OK. I just copied the comment from bdrv_backing_options(). >> + qdict_set_default_str(child_options, BDRV_OPT_READ_ONLY, "on"); >> + qdict_set_default_str(child_options, BDRV_OPT_AUTO_READ_ONLY, "off"); >> + } else { >> + /* Inherit the read-only option from the parent if it's not set */ >> + qdict_copy_default(child_options, parent_options, BDRV_OPT_READ_ONLY); >> + qdict_copy_default(child_options, parent_options, >> + BDRV_OPT_AUTO_READ_ONLY); >> + } >> + >> + if (parent_is_format && !(role & BDRV_CHILD_COW)) { >> + /* >> + * Our format drivers take care to send flushes and respect >> + * unmap policy, so we can default to enable both on lower >> + * layers regardless of the corresponding parent options. >> + */ >> + qdict_set_default_str(child_options, BDRV_OPT_DISCARD, "unmap"); >> + } > > Why the restriction to format here? Don't we break "unmap" propagation > through filters with this? Right now (before this series), the behavior seems ambiguous, in that for filters that use bs->file, it is set, but for those that use bs->backing, it isn’t. But I suspect the main reason for what I did is the way I interpreted the comment (which before this series only mentions block drivers in general, not specifically format drivers): It sounded to me as if the block driver needed to respect the unmap policy, and I didn’t think filters did that. So it was my understanding that filter drivers would just propagate discards and thus we couldn’t default-enable unmap on their children. But I was wrong, the block driver doesn’t need to respect anything, because bdrv_co_pdiscard() already does. So I suppose it should indeed be enabled for all children, with the comment changed to express that it isn’t any block driver that respects unmap policy, but bdrv_co_pdiscard(), e.g.: bdrv_co_pdiscard() respects unmap policy for the parent, so we can default to enable it on lower layers regardless of the parent option. > It would probably also be a good question why we don't propagate it to > the backing file, but this is preexisting. I suppose we should, although it’s irrelevant, so. I suppose I’ll just drop the parent_is_format, adjust the comment and that should be fine for this series. Max