Message ID | 20190920152804.12875-10-mreitz@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | block: Fix check_to_replace_node() | expand |
20.09.2019 18:27, Max Reitz wrote: > We will need this to verify that Quorum can let one of its children be > replaced without breaking anything else. > > Signed-off-by: Max Reitz <mreitz@redhat.com> > --- > block/quorum.c | 23 +++++++++++++++++++++++ > 1 file changed, 23 insertions(+) > > diff --git a/block/quorum.c b/block/quorum.c > index cf2171cc74..207054a64e 100644 > --- a/block/quorum.c > +++ b/block/quorum.c > @@ -67,6 +67,13 @@ typedef struct QuorumVotes { > > typedef struct QuorumChild { > BdrvChild *child; > + > + /* > + * If set, check whether this node can be replaced without any > + * other parent noticing: Unshare CONSISTENT_READ, and take the > + * WRITE permission. > + */ > + bool to_be_replaced; > } QuorumChild; > > /* the following structure holds the state of one quorum instance */ > @@ -1128,6 +1135,16 @@ static void quorum_child_perm(BlockDriverState *bs, BdrvChild *c, > uint64_t perm, uint64_t shared, > uint64_t *nperm, uint64_t *nshared) > { > + BDRVQuorumState *s = bs->opaque; > + int i; > + > + for (i = 0; i < s->num_children; i++) { > + if (s->children[i].child == c) { > + break; > + } > + } > + assert(!c || i < s->num_children); seems, the loop is useless if c == NULL. > + > *nperm = perm & DEFAULT_PERM_PASSTHROUGH; > > /* > @@ -1137,6 +1154,12 @@ static void quorum_child_perm(BlockDriverState *bs, BdrvChild *c, > *nshared = (shared & (BLK_PERM_CONSISTENT_READ | > BLK_PERM_WRITE_UNCHANGED)) > | DEFAULT_PERM_UNCHANGED; > + > + if (c && s->children[i].to_be_replaced) { > + /* Prepare for sudden data changes */ > + *nperm |= BLK_PERM_WRITE; > + *nshared &= ~BLK_PERM_CONSISTENT_READ; > + } > } > > static const char *const quorum_strong_runtime_opts[] = { >
On 25.09.19 15:45, Vladimir Sementsov-Ogievskiy wrote: > 20.09.2019 18:27, Max Reitz wrote: >> We will need this to verify that Quorum can let one of its children be >> replaced without breaking anything else. >> >> Signed-off-by: Max Reitz <mreitz@redhat.com> >> --- >> block/quorum.c | 23 +++++++++++++++++++++++ >> 1 file changed, 23 insertions(+) >> >> diff --git a/block/quorum.c b/block/quorum.c >> index cf2171cc74..207054a64e 100644 >> --- a/block/quorum.c >> +++ b/block/quorum.c >> @@ -67,6 +67,13 @@ typedef struct QuorumVotes { >> >> typedef struct QuorumChild { >> BdrvChild *child; >> + >> + /* >> + * If set, check whether this node can be replaced without any >> + * other parent noticing: Unshare CONSISTENT_READ, and take the >> + * WRITE permission. >> + */ >> + bool to_be_replaced; >> } QuorumChild; >> >> /* the following structure holds the state of one quorum instance */ >> @@ -1128,6 +1135,16 @@ static void quorum_child_perm(BlockDriverState *bs, BdrvChild *c, >> uint64_t perm, uint64_t shared, >> uint64_t *nperm, uint64_t *nshared) >> { >> + BDRVQuorumState *s = bs->opaque; >> + int i; >> + >> + for (i = 0; i < s->num_children; i++) { >> + if (s->children[i].child == c) { >> + break; >> + } >> + } >> + assert(!c || i < s->num_children); > > seems, the loop is useless if c == NULL. Not wrong. I’ll put it all into an if (c) and initialize i to -1. Max
diff --git a/block/quorum.c b/block/quorum.c index cf2171cc74..207054a64e 100644 --- a/block/quorum.c +++ b/block/quorum.c @@ -67,6 +67,13 @@ typedef struct QuorumVotes { typedef struct QuorumChild { BdrvChild *child; + + /* + * If set, check whether this node can be replaced without any + * other parent noticing: Unshare CONSISTENT_READ, and take the + * WRITE permission. + */ + bool to_be_replaced; } QuorumChild; /* the following structure holds the state of one quorum instance */ @@ -1128,6 +1135,16 @@ static void quorum_child_perm(BlockDriverState *bs, BdrvChild *c, uint64_t perm, uint64_t shared, uint64_t *nperm, uint64_t *nshared) { + BDRVQuorumState *s = bs->opaque; + int i; + + for (i = 0; i < s->num_children; i++) { + if (s->children[i].child == c) { + break; + } + } + assert(!c || i < s->num_children); + *nperm = perm & DEFAULT_PERM_PASSTHROUGH; /* @@ -1137,6 +1154,12 @@ static void quorum_child_perm(BlockDriverState *bs, BdrvChild *c, *nshared = (shared & (BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHANGED)) | DEFAULT_PERM_UNCHANGED; + + if (c && s->children[i].to_be_replaced) { + /* Prepare for sudden data changes */ + *nperm |= BLK_PERM_WRITE; + *nshared &= ~BLK_PERM_CONSISTENT_READ; + } } static const char *const quorum_strong_runtime_opts[] = {
We will need this to verify that Quorum can let one of its children be replaced without breaking anything else. Signed-off-by: Max Reitz <mreitz@redhat.com> --- block/quorum.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)