On 16.06.21 16:43, Julien Grall wrote: > From: Julien Grall > > Currently, only Live-Update request can be delayed. In a follow-up, > we will want to delay more requests (e.g. transaction start). > Therefore we want to preserve delayed requests across Live-Update. > > Delayed requests are just complete "in" buffer. So the code is > refactored to allow sharing the code to dump "in" buffer. > > Signed-off-by: Julien Grall > --- > tools/xenstore/xenstored_core.c | 42 +++++++++++++++++++++++++-------- > 1 file changed, 32 insertions(+), 10 deletions(-) > > diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c > index 5b7ab7f74013..9eca58682b51 100644 > --- a/tools/xenstore/xenstored_core.c > +++ b/tools/xenstore/xenstored_core.c > @@ -2403,25 +2403,47 @@ const char *dump_state_global(FILE *fp) > return NULL; > } > > +static const char *dump_input_buffered_data(FILE *fp, > + const struct buffered_data *in, > + unsigned int *total_len) > +{ > + unsigned int hlen = in->inhdr ? in->used : sizeof(in->hdr); > + > + *total_len += hlen; > + if (fp && fwrite(&in->hdr, hlen, 1, fp) != 1) > + return "Dump read data error"; > + if (!in->inhdr && in->used) { > + *total_len += in->used; > + if (fp && fwrite(in->buffer, in->used, 1, fp) != 1) > + return "Dump read data error"; > + } > + > + return NULL; > +} > + > /* Called twice: first with fp == NULL to get length, then for writing data. */ > const char *dump_state_buffered_data(FILE *fp, const struct connection *c, > struct xs_state_connection *sc) > { > unsigned int len = 0, used; > - struct buffered_data *out, *in = c->in; > + struct buffered_data *out; > bool partial = true; > + struct delayed_request *req; > + const char *ret; > > - if (in) { > - len = in->inhdr ? in->used : sizeof(in->hdr); > - if (fp && fwrite(&in->hdr, len, 1, fp) != 1) > - return "Dump read data error"; > - if (!in->inhdr && in->used) { > - len += in->used; > - if (fp && fwrite(in->buffer, in->used, 1, fp) != 1) > - return "Dump read data error"; > - } > + /* Dump any command that was delayed */ > + list_for_each_entry(req, &c->delayed, list) { Please add a comment here that the following if() serves especially to avoid dumping the data for do_lu_start(). > + if (req->func != process_delayed_message) > + continue; > + > + assert(!req->in->inhdr); > + if ((ret = dump_input_buffered_data(fp, req->in, &len))) > + return ret; > } > > + if (c->in && (ret = dump_input_buffered_data(fp, c->in, &len))) > + return ret; > + > if (sc) { > sc->data_in_len = len; > sc->data_resp_len = 0; > Juergen