From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59386) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c9pRs-0007Ll-WD for qemu-devel@nongnu.org; Thu, 24 Nov 2016 03:32:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c9pRo-0007lV-G8 for qemu-devel@nongnu.org; Thu, 24 Nov 2016 03:32:05 -0500 Received: from 8.mo3.mail-out.ovh.net ([87.98.172.249]:46247) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1c9pRo-0007kA-7H for qemu-devel@nongnu.org; Thu, 24 Nov 2016 03:32:00 -0500 Received: from player730.ha.ovh.net (b7.ovh.net [213.186.33.57]) by mo3.mail-out.ovh.net (Postfix) with ESMTP id C6B7461A96 for ; Thu, 24 Nov 2016 09:31:58 +0100 (CET) Date: Thu, 24 Nov 2016 09:31:52 +0100 From: Greg Kurz Message-ID: <20161124093152.5afff15c@bahia> In-Reply-To: <1479764372-29470-2-git-send-email-sstabellini@kernel.org> References: <1479764372-29470-1-git-send-email-sstabellini@kernel.org> <1479764372-29470-2-git-send-email-sstabellini@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 2/4] 9pfs: introduce transport specific callbacks List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Stefano Stabellini Cc: aneesh.kumar@linux.vnet.ibm.com, qemu-devel@nongnu.org, xen-devel@lists.xensource.com, anthony.perard@citrix.com, wei.liu2@citrix.com On Mon, 21 Nov 2016 13:39:30 -0800 Stefano Stabellini wrote: > Don't call virtio functions from 9pfs generic code, use generic function > callbacks instead. > > Signed-off-by: Stefano Stabellini > --- Just a couple of indentation and line over 80 characters nits. I'll fix them before pushing to 9p-next. Reviewed-by: Greg Kurz > hw/9pfs/9p.c | 8 ++++---- > hw/9pfs/9p.h | 18 ++++++++++++++++++ > hw/9pfs/virtio-9p-device.c | 18 ++++++++++++++---- > hw/9pfs/virtio-9p.h | 9 --------- > 4 files changed, 36 insertions(+), 17 deletions(-) > > diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c > index 05e950f..5a20a13 100644 > --- a/hw/9pfs/9p.c > +++ b/hw/9pfs/9p.c > @@ -47,7 +47,7 @@ ssize_t pdu_marshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...) > va_list ap; > > va_start(ap, fmt); > - ret = virtio_pdu_vmarshal(pdu, offset, fmt, ap); > + ret = pdu->s->transport->pdu_vmarshal(pdu, offset, fmt, ap); > va_end(ap); > > return ret; > @@ -59,7 +59,7 @@ ssize_t pdu_unmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...) > va_list ap; > > va_start(ap, fmt); > - ret = virtio_pdu_vunmarshal(pdu, offset, fmt, ap); > + ret = pdu->s->transport->pdu_vunmarshal(pdu, offset, fmt, ap); > va_end(ap); > > return ret; > @@ -67,7 +67,7 @@ ssize_t pdu_unmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...) > > static void pdu_push_and_notify(V9fsPDU *pdu) > { > - virtio_9p_push_and_notify(pdu); > + pdu->s->transport->push_and_notify(pdu); > } > > static int omode_to_uflags(int8_t mode) > @@ -1751,7 +1751,7 @@ static void v9fs_init_qiov_from_pdu(QEMUIOVector *qiov, V9fsPDU *pdu, > struct iovec *iov; > unsigned int niov; > > - virtio_init_iov_from_pdu(pdu, &iov, &niov, is_write); > + pdu->s->transport->init_iov_from_pdu(pdu, &iov, &niov, is_write); > > qemu_iovec_init_external(&elem, iov, niov); > qemu_iovec_init(qiov, niov); > diff --git a/hw/9pfs/9p.h b/hw/9pfs/9p.h > index 07cee01..ab398d0 100644 > --- a/hw/9pfs/9p.h > +++ b/hw/9pfs/9p.h > @@ -230,6 +230,7 @@ typedef struct V9fsState > enum p9_proto_version proto_version; > int32_t msize; > V9fsPDU pdus[MAX_REQ]; > + struct V9fsTransport *transport; > /* > * lock ensuring atomic path update > * on rename. > @@ -343,4 +344,21 @@ void pdu_free(V9fsPDU *pdu); > void pdu_submit(V9fsPDU *pdu); > void v9fs_reset(V9fsState *s); > > +struct V9fsTransport { > + ssize_t (*pdu_vmarshal)(V9fsPDU *pdu, size_t offset, const char *fmt, va_list ap); over 80 characters > + ssize_t (*pdu_vunmarshal)(V9fsPDU *pdu, size_t offset, const char *fmt, va_list ap); ditto > + void (*init_iov_from_pdu)(V9fsPDU *pdu, struct iovec **piov, > + unsigned int *pniov, bool is_write); indent > + void (*push_and_notify)(V9fsPDU *pdu); > +}; > + > +static inline int v9fs_register_transport(V9fsState *s, struct V9fsTransport *t) > +{ > + if (s->transport) { > + return -EINVAL; > + } > + s->transport = t; > + return 0; > +} > + > #endif > diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c > index 1782e4a..e1a37a4 100644 > --- a/hw/9pfs/virtio-9p-device.c > +++ b/hw/9pfs/virtio-9p-device.c > @@ -20,7 +20,9 @@ > #include "hw/virtio/virtio-access.h" > #include "qemu/iov.h" > > -void virtio_9p_push_and_notify(V9fsPDU *pdu) > +static struct V9fsTransport virtio_9p_transport; > + > +static void virtio_9p_push_and_notify(V9fsPDU *pdu) > { > V9fsState *s = pdu->s; > V9fsVirtioState *v = container_of(s, V9fsVirtioState, state); > @@ -126,6 +128,7 @@ static void virtio_9p_device_realize(DeviceState *dev, Error **errp) > v->config_size = sizeof(struct virtio_9p_config) + strlen(s->fsconf.tag); > virtio_init(vdev, "virtio-9p", VIRTIO_ID_9P, v->config_size); > v->vq = virtio_add_queue(vdev, MAX_REQ, handle_9p_output); > + v9fs_register_transport(s, &virtio_9p_transport); > > out: > return; > @@ -148,7 +151,7 @@ static void virtio_9p_reset(VirtIODevice *vdev) > v9fs_reset(&v->state); > } > > -ssize_t virtio_pdu_vmarshal(V9fsPDU *pdu, size_t offset, > +static ssize_t virtio_pdu_vmarshal(V9fsPDU *pdu, size_t offset, > const char *fmt, va_list ap) indent > { > V9fsState *s = pdu->s; > @@ -158,7 +161,7 @@ ssize_t virtio_pdu_vmarshal(V9fsPDU *pdu, size_t offset, > return v9fs_iov_vmarshal(elem->in_sg, elem->in_num, offset, 1, fmt, ap); > } > > -ssize_t virtio_pdu_vunmarshal(V9fsPDU *pdu, size_t offset, > +static ssize_t virtio_pdu_vunmarshal(V9fsPDU *pdu, size_t offset, > const char *fmt, va_list ap) indent > { > V9fsState *s = pdu->s; > @@ -168,7 +171,7 @@ ssize_t virtio_pdu_vunmarshal(V9fsPDU *pdu, size_t offset, > return v9fs_iov_vunmarshal(elem->out_sg, elem->out_num, offset, 1, fmt, ap); > } > > -void virtio_init_iov_from_pdu(V9fsPDU *pdu, struct iovec **piov, > +static void virtio_init_iov_from_pdu(V9fsPDU *pdu, struct iovec **piov, > unsigned int *pniov, bool is_write) indent > { > V9fsState *s = pdu->s; > @@ -184,6 +187,13 @@ void virtio_init_iov_from_pdu(V9fsPDU *pdu, struct iovec **piov, > } > } > > +static struct V9fsTransport virtio_9p_transport = { > + .pdu_vmarshal = virtio_pdu_vmarshal, > + .pdu_vunmarshal = virtio_pdu_vunmarshal, > + .init_iov_from_pdu = virtio_init_iov_from_pdu, > + .push_and_notify = virtio_9p_push_and_notify, > +}; > + > /* virtio-9p device */ > > static const VMStateDescription vmstate_virtio_9p = { > diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h > index 52c4b9d..e763da2c 100644 > --- a/hw/9pfs/virtio-9p.h > +++ b/hw/9pfs/virtio-9p.h > @@ -14,15 +14,6 @@ typedef struct V9fsVirtioState > V9fsState state; > } V9fsVirtioState; > > -void virtio_9p_push_and_notify(V9fsPDU *pdu); > - > -ssize_t virtio_pdu_vmarshal(V9fsPDU *pdu, size_t offset, > - const char *fmt, va_list ap); > -ssize_t virtio_pdu_vunmarshal(V9fsPDU *pdu, size_t offset, > - const char *fmt, va_list ap); > -void virtio_init_iov_from_pdu(V9fsPDU *pdu, struct iovec **piov, > - unsigned int *pniov, bool is_write); > - > #define TYPE_VIRTIO_9P "virtio-9p-device" > #define VIRTIO_9P(obj) \ > OBJECT_CHECK(V9fsVirtioState, (obj), TYPE_VIRTIO_9P) From mboxrd@z Thu Jan 1 00:00:00 1970 From: Greg Kurz Subject: Re: [PATCH 2/4] 9pfs: introduce transport specific callbacks Date: Thu, 24 Nov 2016 09:31:52 +0100 Message-ID: <20161124093152.5afff15c@bahia> References: <1479764372-29470-1-git-send-email-sstabellini@kernel.org> <1479764372-29470-2-git-send-email-sstabellini@kernel.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1479764372-29470-2-git-send-email-sstabellini@kernel.org> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Stefano Stabellini Cc: anthony.perard@citrix.com, xen-devel@lists.xensource.com, wei.liu2@citrix.com, aneesh.kumar@linux.vnet.ibm.com, qemu-devel@nongnu.org List-Id: xen-devel@lists.xenproject.org T24gTW9uLCAyMSBOb3YgMjAxNiAxMzozOTozMCAtMDgwMApTdGVmYW5vIFN0YWJlbGxpbmkgPHNz dGFiZWxsaW5pQGtlcm5lbC5vcmc+IHdyb3RlOgoKPiBEb24ndCBjYWxsIHZpcnRpbyBmdW5jdGlv bnMgZnJvbSA5cGZzIGdlbmVyaWMgY29kZSwgdXNlIGdlbmVyaWMgZnVuY3Rpb24KPiBjYWxsYmFj a3MgaW5zdGVhZC4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBTdGVmYW5vIFN0YWJlbGxpbmkgPHNzdGFi ZWxsaW5pQGtlcm5lbC5vcmc+Cj4gLS0tCgpKdXN0IGEgY291cGxlIG9mIGluZGVudGF0aW9uIGFu ZCBsaW5lIG92ZXIgODAgY2hhcmFjdGVycyBuaXRzLiBJJ2xsIGZpeCB0aGVtCmJlZm9yZSBwdXNo aW5nIHRvIDlwLW5leHQuCgpSZXZpZXdlZC1ieTogR3JlZyBLdXJ6IDxncm91Z0BrYW9kLm9yZz4K Cj4gIGh3LzlwZnMvOXAuYyAgICAgICAgICAgICAgIHwgIDggKysrKy0tLS0KPiAgaHcvOXBmcy85 cC5oICAgICAgICAgICAgICAgfCAxOCArKysrKysrKysrKysrKysrKysKPiAgaHcvOXBmcy92aXJ0 aW8tOXAtZGV2aWNlLmMgfCAxOCArKysrKysrKysrKysrKy0tLS0KPiAgaHcvOXBmcy92aXJ0aW8t OXAuaCAgICAgICAgfCAgOSAtLS0tLS0tLS0KPiAgNCBmaWxlcyBjaGFuZ2VkLCAzNiBpbnNlcnRp b25zKCspLCAxNyBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEvaHcvOXBmcy85cC5jIGIv aHcvOXBmcy85cC5jCj4gaW5kZXggMDVlOTUwZi4uNWEyMGExMyAxMDA2NDQKPiAtLS0gYS9ody85 cGZzLzlwLmMKPiArKysgYi9ody85cGZzLzlwLmMKPiBAQCAtNDcsNyArNDcsNyBAQCBzc2l6ZV90 IHBkdV9tYXJzaGFsKFY5ZnNQRFUgKnBkdSwgc2l6ZV90IG9mZnNldCwgY29uc3QgY2hhciAqZm10 LCAuLi4pCj4gICAgICB2YV9saXN0IGFwOwo+ICAKPiAgICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwo+ IC0gICAgcmV0ID0gdmlydGlvX3BkdV92bWFyc2hhbChwZHUsIG9mZnNldCwgZm10LCBhcCk7Cj4g KyAgICByZXQgPSBwZHUtPnMtPnRyYW5zcG9ydC0+cGR1X3ZtYXJzaGFsKHBkdSwgb2Zmc2V0LCBm bXQsIGFwKTsKPiAgICAgIHZhX2VuZChhcCk7Cj4gIAo+ICAgICAgcmV0dXJuIHJldDsKPiBAQCAt NTksNyArNTksNyBAQCBzc2l6ZV90IHBkdV91bm1hcnNoYWwoVjlmc1BEVSAqcGR1LCBzaXplX3Qg b2Zmc2V0LCBjb25zdCBjaGFyICpmbXQsIC4uLikKPiAgICAgIHZhX2xpc3QgYXA7Cj4gIAo+ICAg ICAgdmFfc3RhcnQoYXAsIGZtdCk7Cj4gLSAgICByZXQgPSB2aXJ0aW9fcGR1X3Z1bm1hcnNoYWwo cGR1LCBvZmZzZXQsIGZtdCwgYXApOwo+ICsgICAgcmV0ID0gcGR1LT5zLT50cmFuc3BvcnQtPnBk dV92dW5tYXJzaGFsKHBkdSwgb2Zmc2V0LCBmbXQsIGFwKTsKPiAgICAgIHZhX2VuZChhcCk7Cj4g IAo+ICAgICAgcmV0dXJuIHJldDsKPiBAQCAtNjcsNyArNjcsNyBAQCBzc2l6ZV90IHBkdV91bm1h cnNoYWwoVjlmc1BEVSAqcGR1LCBzaXplX3Qgb2Zmc2V0LCBjb25zdCBjaGFyICpmbXQsIC4uLikK PiAgCj4gIHN0YXRpYyB2b2lkIHBkdV9wdXNoX2FuZF9ub3RpZnkoVjlmc1BEVSAqcGR1KQo+ICB7 Cj4gLSAgICB2aXJ0aW9fOXBfcHVzaF9hbmRfbm90aWZ5KHBkdSk7Cj4gKyAgICBwZHUtPnMtPnRy YW5zcG9ydC0+cHVzaF9hbmRfbm90aWZ5KHBkdSk7Cj4gIH0KPiAgCj4gIHN0YXRpYyBpbnQgb21v ZGVfdG9fdWZsYWdzKGludDhfdCBtb2RlKQo+IEBAIC0xNzUxLDcgKzE3NTEsNyBAQCBzdGF0aWMg dm9pZCB2OWZzX2luaXRfcWlvdl9mcm9tX3BkdShRRU1VSU9WZWN0b3IgKnFpb3YsIFY5ZnNQRFUg KnBkdSwKPiAgICAgIHN0cnVjdCBpb3ZlYyAqaW92Owo+ICAgICAgdW5zaWduZWQgaW50IG5pb3Y7 Cj4gIAo+IC0gICAgdmlydGlvX2luaXRfaW92X2Zyb21fcGR1KHBkdSwgJmlvdiwgJm5pb3YsIGlz X3dyaXRlKTsKPiArICAgIHBkdS0+cy0+dHJhbnNwb3J0LT5pbml0X2lvdl9mcm9tX3BkdShwZHUs ICZpb3YsICZuaW92LCBpc193cml0ZSk7Cj4gIAo+ICAgICAgcWVtdV9pb3ZlY19pbml0X2V4dGVy bmFsKCZlbGVtLCBpb3YsIG5pb3YpOwo+ICAgICAgcWVtdV9pb3ZlY19pbml0KHFpb3YsIG5pb3Yp Owo+IGRpZmYgLS1naXQgYS9ody85cGZzLzlwLmggYi9ody85cGZzLzlwLmgKPiBpbmRleCAwN2Nl ZTAxLi5hYjM5OGQwIDEwMDY0NAo+IC0tLSBhL2h3LzlwZnMvOXAuaAo+ICsrKyBiL2h3LzlwZnMv OXAuaAo+IEBAIC0yMzAsNiArMjMwLDcgQEAgdHlwZWRlZiBzdHJ1Y3QgVjlmc1N0YXRlCj4gICAg ICBlbnVtIHA5X3Byb3RvX3ZlcnNpb24gcHJvdG9fdmVyc2lvbjsKPiAgICAgIGludDMyX3QgbXNp emU7Cj4gICAgICBWOWZzUERVIHBkdXNbTUFYX1JFUV07Cj4gKyAgICBzdHJ1Y3QgVjlmc1RyYW5z cG9ydCAqdHJhbnNwb3J0Owo+ICAgICAgLyoKPiAgICAgICAqIGxvY2sgZW5zdXJpbmcgYXRvbWlj IHBhdGggdXBkYXRlCj4gICAgICAgKiBvbiByZW5hbWUuCj4gQEAgLTM0Myw0ICszNDQsMjEgQEAg dm9pZCBwZHVfZnJlZShWOWZzUERVICpwZHUpOwo+ICB2b2lkIHBkdV9zdWJtaXQoVjlmc1BEVSAq cGR1KTsKPiAgdm9pZCB2OWZzX3Jlc2V0KFY5ZnNTdGF0ZSAqcyk7Cj4gIAo+ICtzdHJ1Y3QgVjlm c1RyYW5zcG9ydCB7Cj4gKyAgICBzc2l6ZV90ICAgICAoKnBkdV92bWFyc2hhbCkoVjlmc1BEVSAq cGR1LCBzaXplX3Qgb2Zmc2V0LCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApOwoKb3ZlciA4 MCBjaGFyYWN0ZXJzCgo+ICsgICAgc3NpemVfdCAgICAgKCpwZHVfdnVubWFyc2hhbCkoVjlmc1BE VSAqcGR1LCBzaXplX3Qgb2Zmc2V0LCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApOwoKZGl0 dG8KCj4gKyAgICB2b2lkICAgICAgICAoKmluaXRfaW92X2Zyb21fcGR1KShWOWZzUERVICpwZHUs IHN0cnVjdCBpb3ZlYyAqKnBpb3YsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVu c2lnbmVkIGludCAqcG5pb3YsIGJvb2wgaXNfd3JpdGUpOwoKaW5kZW50Cgo+ICsgICAgdm9pZCAg ICAgICAgKCpwdXNoX2FuZF9ub3RpZnkpKFY5ZnNQRFUgKnBkdSk7Cj4gK307Cj4gKwo+ICtzdGF0 aWMgaW5saW5lIGludCB2OWZzX3JlZ2lzdGVyX3RyYW5zcG9ydChWOWZzU3RhdGUgKnMsIHN0cnVj dCBWOWZzVHJhbnNwb3J0ICp0KQo+ICt7Cj4gKyAgICBpZiAocy0+dHJhbnNwb3J0KSB7Cj4gKyAg ICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gKyAgICB9Cj4gKyAgICBzLT50cmFuc3BvcnQgPSB0Owo+ ICsgICAgcmV0dXJuIDA7Cj4gK30KPiArCj4gICNlbmRpZgo+IGRpZmYgLS1naXQgYS9ody85cGZz L3ZpcnRpby05cC1kZXZpY2UuYyBiL2h3LzlwZnMvdmlydGlvLTlwLWRldmljZS5jCj4gaW5kZXgg MTc4MmU0YS4uZTFhMzdhNCAxMDA2NDQKPiAtLS0gYS9ody85cGZzL3ZpcnRpby05cC1kZXZpY2Uu Ywo+ICsrKyBiL2h3LzlwZnMvdmlydGlvLTlwLWRldmljZS5jCj4gQEAgLTIwLDcgKzIwLDkgQEAK PiAgI2luY2x1ZGUgImh3L3ZpcnRpby92aXJ0aW8tYWNjZXNzLmgiCj4gICNpbmNsdWRlICJxZW11 L2lvdi5oIgo+ICAKPiAtdm9pZCB2aXJ0aW9fOXBfcHVzaF9hbmRfbm90aWZ5KFY5ZnNQRFUgKnBk dSkKPiArc3RhdGljIHN0cnVjdCBWOWZzVHJhbnNwb3J0IHZpcnRpb185cF90cmFuc3BvcnQ7Cj4g Kwo+ICtzdGF0aWMgdm9pZCB2aXJ0aW9fOXBfcHVzaF9hbmRfbm90aWZ5KFY5ZnNQRFUgKnBkdSkK PiAgewo+ICAgICAgVjlmc1N0YXRlICpzID0gcGR1LT5zOwo+ICAgICAgVjlmc1ZpcnRpb1N0YXRl ICp2ID0gY29udGFpbmVyX29mKHMsIFY5ZnNWaXJ0aW9TdGF0ZSwgc3RhdGUpOwo+IEBAIC0xMjYs NiArMTI4LDcgQEAgc3RhdGljIHZvaWQgdmlydGlvXzlwX2RldmljZV9yZWFsaXplKERldmljZVN0 YXRlICpkZXYsIEVycm9yICoqZXJycCkKPiAgICAgIHYtPmNvbmZpZ19zaXplID0gc2l6ZW9mKHN0 cnVjdCB2aXJ0aW9fOXBfY29uZmlnKSArIHN0cmxlbihzLT5mc2NvbmYudGFnKTsKPiAgICAgIHZp cnRpb19pbml0KHZkZXYsICJ2aXJ0aW8tOXAiLCBWSVJUSU9fSURfOVAsIHYtPmNvbmZpZ19zaXpl KTsKPiAgICAgIHYtPnZxID0gdmlydGlvX2FkZF9xdWV1ZSh2ZGV2LCBNQVhfUkVRLCBoYW5kbGVf OXBfb3V0cHV0KTsKPiArICAgIHY5ZnNfcmVnaXN0ZXJfdHJhbnNwb3J0KHMsICZ2aXJ0aW9fOXBf dHJhbnNwb3J0KTsKPiAgCj4gIG91dDoKPiAgICAgIHJldHVybjsKPiBAQCAtMTQ4LDcgKzE1MSw3 IEBAIHN0YXRpYyB2b2lkIHZpcnRpb185cF9yZXNldChWaXJ0SU9EZXZpY2UgKnZkZXYpCj4gICAg ICB2OWZzX3Jlc2V0KCZ2LT5zdGF0ZSk7Cj4gIH0KPiAgCj4gLXNzaXplX3QgdmlydGlvX3BkdV92 bWFyc2hhbChWOWZzUERVICpwZHUsIHNpemVfdCBvZmZzZXQsCj4gK3N0YXRpYyBzc2l6ZV90IHZp cnRpb19wZHVfdm1hcnNoYWwoVjlmc1BEVSAqcGR1LCBzaXplX3Qgb2Zmc2V0LAo+ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoKaW5kZW50 Cgo+ICB7Cj4gICAgICBWOWZzU3RhdGUgKnMgPSBwZHUtPnM7Cj4gQEAgLTE1OCw3ICsxNjEsNyBA QCBzc2l6ZV90IHZpcnRpb19wZHVfdm1hcnNoYWwoVjlmc1BEVSAqcGR1LCBzaXplX3Qgb2Zmc2V0 LAo+ICAgICAgcmV0dXJuIHY5ZnNfaW92X3ZtYXJzaGFsKGVsZW0tPmluX3NnLCBlbGVtLT5pbl9u dW0sIG9mZnNldCwgMSwgZm10LCBhcCk7Cj4gIH0KPiAgCj4gLXNzaXplX3QgdmlydGlvX3BkdV92 dW5tYXJzaGFsKFY5ZnNQRFUgKnBkdSwgc2l6ZV90IG9mZnNldCwKPiArc3RhdGljIHNzaXplX3Qg dmlydGlvX3BkdV92dW5tYXJzaGFsKFY5ZnNQRFUgKnBkdSwgc2l6ZV90IG9mZnNldCwKPiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoK aW5kZW50Cgo+ICB7Cj4gICAgICBWOWZzU3RhdGUgKnMgPSBwZHUtPnM7Cj4gQEAgLTE2OCw3ICsx NzEsNyBAQCBzc2l6ZV90IHZpcnRpb19wZHVfdnVubWFyc2hhbChWOWZzUERVICpwZHUsIHNpemVf dCBvZmZzZXQsCj4gICAgICByZXR1cm4gdjlmc19pb3ZfdnVubWFyc2hhbChlbGVtLT5vdXRfc2cs IGVsZW0tPm91dF9udW0sIG9mZnNldCwgMSwgZm10LCBhcCk7Cj4gIH0KPiAgCj4gLXZvaWQgdmly dGlvX2luaXRfaW92X2Zyb21fcGR1KFY5ZnNQRFUgKnBkdSwgc3RydWN0IGlvdmVjICoqcGlvdiwK PiArc3RhdGljIHZvaWQgdmlydGlvX2luaXRfaW92X2Zyb21fcGR1KFY5ZnNQRFUgKnBkdSwgc3Ry dWN0IGlvdmVjICoqcGlvdiwKPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWdu ZWQgaW50ICpwbmlvdiwgYm9vbCBpc193cml0ZSkKCmluZGVudAoKPiAgewo+ICAgICAgVjlmc1N0 YXRlICpzID0gcGR1LT5zOwo+IEBAIC0xODQsNiArMTg3LDEzIEBAIHZvaWQgdmlydGlvX2luaXRf aW92X2Zyb21fcGR1KFY5ZnNQRFUgKnBkdSwgc3RydWN0IGlvdmVjICoqcGlvdiwKPiAgICAgIH0K PiAgfQo+ICAKPiArc3RhdGljIHN0cnVjdCBWOWZzVHJhbnNwb3J0IHZpcnRpb185cF90cmFuc3Bv cnQgPSB7Cj4gKyAgICAucGR1X3ZtYXJzaGFsID0gdmlydGlvX3BkdV92bWFyc2hhbCwKPiArICAg IC5wZHVfdnVubWFyc2hhbCA9IHZpcnRpb19wZHVfdnVubWFyc2hhbCwKPiArICAgIC5pbml0X2lv dl9mcm9tX3BkdSA9IHZpcnRpb19pbml0X2lvdl9mcm9tX3BkdSwKPiArICAgIC5wdXNoX2FuZF9u b3RpZnkgPSB2aXJ0aW9fOXBfcHVzaF9hbmRfbm90aWZ5LAo+ICt9Owo+ICsKPiAgLyogdmlydGlv LTlwIGRldmljZSAqLwo+ICAKPiAgc3RhdGljIGNvbnN0IFZNU3RhdGVEZXNjcmlwdGlvbiB2bXN0 YXRlX3ZpcnRpb185cCA9IHsKPiBkaWZmIC0tZ2l0IGEvaHcvOXBmcy92aXJ0aW8tOXAuaCBiL2h3 LzlwZnMvdmlydGlvLTlwLmgKPiBpbmRleCA1MmM0YjlkLi5lNzYzZGEyYyAxMDA2NDQKPiAtLS0g YS9ody85cGZzL3ZpcnRpby05cC5oCj4gKysrIGIvaHcvOXBmcy92aXJ0aW8tOXAuaAo+IEBAIC0x NCwxNSArMTQsNiBAQCB0eXBlZGVmIHN0cnVjdCBWOWZzVmlydGlvU3RhdGUKPiAgICAgIFY5ZnNT dGF0ZSBzdGF0ZTsKPiAgfSBWOWZzVmlydGlvU3RhdGU7Cj4gIAo+IC12b2lkIHZpcnRpb185cF9w dXNoX2FuZF9ub3RpZnkoVjlmc1BEVSAqcGR1KTsKPiAtCj4gLXNzaXplX3QgdmlydGlvX3BkdV92 bWFyc2hhbChWOWZzUERVICpwZHUsIHNpemVfdCBvZmZzZXQsCj4gLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApOwo+IC1zc2l6ZV90IHZpcnRp b19wZHVfdnVubWFyc2hhbChWOWZzUERVICpwZHUsIHNpemVfdCBvZmZzZXQsCj4gLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCk7Cj4gLXZv aWQgdmlydGlvX2luaXRfaW92X2Zyb21fcGR1KFY5ZnNQRFUgKnBkdSwgc3RydWN0IGlvdmVjICoq cGlvdiwKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpwbmlv diwgYm9vbCBpc193cml0ZSk7Cj4gLQo+ICAjZGVmaW5lIFRZUEVfVklSVElPXzlQICJ2aXJ0aW8t OXAtZGV2aWNlIgo+ICAjZGVmaW5lIFZJUlRJT185UChvYmopIFwKPiAgICAgICAgICBPQkpFQ1Rf Q0hFQ0soVjlmc1ZpcnRpb1N0YXRlLCAob2JqKSwgVFlQRV9WSVJUSU9fOVApCgoKX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcg bGlzdApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5vcmcveGVuLWRl dmVsCg==