From mboxrd@z Thu Jan 1 00:00:00 1970 From: majianpeng Subject: Re: Re: [PATCH 1/2] ceph: Implement readv/preadv for sync operation. Date: Thu, 5 Sep 2013 08:28:24 +0800 Message-ID: <201309050828216701631@gmail.com> References: <201309031652087109940@gmail.com>, <52272E1D.9090908@intel.com> Reply-To: majianpeng Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: base64 Cc: sage , ceph-devel , linux-fsdevel To: =?iso-8859-1?B?WWFuLCBaaGVuZw==?= Return-path: Sender: ceph-devel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org Pk9uIDA5LzAzLzIwMTMgMDQ6NTIgUE0sIG1hamlhbnBlbmcgd3JvdGU6DQo+PiBGb3IgcmVhZHYv cHJlYWR2IHN5bmMtb3BlcmF0b2luLCBjZXBoIG9ubHkgZG8gdGhlIGZpcnN0IGlvdi4NCj4+IEl0 IGRvbid0IHRoaW5rIG90aGVyIGlvdnMuTm93IGltcGxlbWVudCB0aGlzLg0KPj4gDQo+PiBTaWdu ZWQtb2ZmLWJ5OiBKaWFucGVuZyBNYSA8bWFqaWFucGVuZ0BnbWFpbC5jb20+DQo+PiAtLS0NCj4+ ICBmcy9jZXBoL2ZpbGUuYyB8IDE3NSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrLS0tLS0tLS0tLS0tLS0tLS0NCj4+ICAxIGZpbGUgY2hhbmdlZCwgMTIzIGluc2VydGlv bnMoKyksIDUyIGRlbGV0aW9ucygtKQ0KPj4gDQo+PiBkaWZmIC0tZ2l0IGEvZnMvY2VwaC9maWxl LmMgYi9mcy9jZXBoL2ZpbGUuYw0KPj4gaW5kZXggM2RlODk4Mi4uN2Q2YTNlZSAxMDA2NDQNCj4+ IC0tLSBhL2ZzL2NlcGgvZmlsZS5jDQo+PiArKysgYi9mcy9jZXBoL2ZpbGUuYw0KPj4gQEAgLTQw OCw1MSArNDA4LDk1IEBAIG1vcmU6DQo+PiAgICoNCj4+ICAgKiBJZiB0aGUgcmVhZCBzcGFucyBv YmplY3QgYm91bmRhcnksIGp1c3QgZG8gbXVsdGlwbGUgcmVhZHMuDQo+PiAgICovDQo+PiAtc3Rh dGljIHNzaXplX3QgY2VwaF9zeW5jX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2Vy ICpkYXRhLA0KPj4gLQkJCSAgICAgIHVuc2lnbmVkIGxlbiwgbG9mZl90ICpwb2ZmLCBpbnQgKmNo ZWNrZW9mKQ0KPj4gK3N0YXRpYyBzc2l6ZV90IGNlcGhfc3luY19yZWFkKHN0cnVjdCBraW9jYiAq aW9jYiwgc3RydWN0IGlvdmVjICppb3YsDQo+PiArCQkJICAgICAgdW5zaWduZWQgbG9uZyBucl9z ZWdzLCBpbnQgKmNoZWNrZW9mKQ0KPj4gIHsNCj4+ICsJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2Ni LT5raV9maWxwOw0KPj4gIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTsN Cj4+ICAJc3RydWN0IHBhZ2UgKipwYWdlczsNCj4+IC0JdTY0IG9mZiA9ICpwb2ZmOw0KPj4gLQlp bnQgbnVtX3BhZ2VzLCByZXQ7DQo+PiArCXU2NCBvZmYgPSBpb2NiLT5raV9wb3M7DQo+PiArCWlu dCBudW1fcGFnZXMsIHJldCwgaTsNCj4+ICANCj4+IC0JZG91dCgic3luY19yZWFkIG9uIGZpbGUg JXAgJWxsdX4ldSAlc1xuIiwgZmlsZSwgb2ZmLCBsZW4sDQo+PiArCWRvdXQoInN5bmNfcmVhZCBv biBmaWxlICVwICVsbHV+JXUgJXNcbiIsIGZpbGUsIG9mZiwNCj4+ICsJICAgICAodW5zaWduZWQp aW9jYi0+a2lfbGVmdCwNCj4+ICAJICAgICAoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSA/ICJP X0RJUkVDVCIgOiAiIik7DQo+PiAtDQo+PiAtCWlmIChmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1Qp IHsNCj4+IC0JCW51bV9wYWdlcyA9IGNhbGNfcGFnZXNfZm9yKCh1bnNpZ25lZCBsb25nKWRhdGEs IGxlbik7DQo+PiAtCQlwYWdlcyA9IGNlcGhfZ2V0X2RpcmVjdF9wYWdlX3ZlY3RvcihkYXRhLCBu dW1fcGFnZXMsIHRydWUpOw0KPj4gLQl9IGVsc2Ugew0KPj4gLQkJbnVtX3BhZ2VzID0gY2FsY19w YWdlc19mb3Iob2ZmLCBsZW4pOw0KPj4gLQkJcGFnZXMgPSBjZXBoX2FsbG9jX3BhZ2VfdmVjdG9y KG51bV9wYWdlcywgR0ZQX05PRlMpOw0KPj4gLQl9DQo+PiAtCWlmIChJU19FUlIocGFnZXMpKQ0K Pj4gLQkJcmV0dXJuIFBUUl9FUlIocGFnZXMpOw0KPj4gLQ0KPj4gIAkvKg0KPj4gIAkgKiBmbHVz aCBhbnkgcGFnZSBjYWNoZSBwYWdlcyBpbiB0aGlzIHJhbmdlLiAgdGhpcw0KPj4gIAkgKiB3aWxs IG1ha2UgY29uY3VycmVudCBub3JtYWwgYW5kIHN5bmMgaW8gc2xvdywNCj4+ICAJICogYnV0IGl0 IHdpbGwgYXQgbGVhc3QgYmVoYXZlIHNlbnNpYmx5IHdoZW4gdGhleSBhcmUNCj4+ICAJICogaW4g c2VxdWVuY2UuDQo+PiAgCSAqLw0KPj4gLQlyZXQgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0KGlu b2RlLT5pX21hcHBpbmcpOw0KPj4gKwlyZXQgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3Jhbmdl KGlub2RlLT5pX21hcHBpbmcsIG9mZiwNCj4+ICsJCQkJCQlvZmYgKyBpb2NiLT5raV9sZWZ0KTsN Cj4+ICAJaWYgKHJldCA8IDApDQo+PiAtCQlnb3RvIGRvbmU7DQo+PiAtDQo+PiAtCXJldCA9IHN0 cmlwZWRfcmVhZChpbm9kZSwgb2ZmLCBsZW4sIHBhZ2VzLCBudW1fcGFnZXMsIGNoZWNrZW9mLA0K Pj4gLQkJCSAgIGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCwNCj4+IC0JCQkgICAodW5zaWduZWQg bG9uZylkYXRhICYgflBBR0VfTUFTSyk7DQo+PiArCQlyZXR1cm4gcmV0Ow0KPj4gIA0KPj4gLQlp ZiAocmV0ID49IDAgJiYgKGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkgPT0gMCkNCj4+IC0JCXJl dCA9IGNlcGhfY29weV9wYWdlX3ZlY3Rvcl90b191c2VyKHBhZ2VzLCBkYXRhLCBvZmYsIHJldCk7 DQo+PiAtCWlmIChyZXQgPj0gMCkNCj4+IC0JCSpwb2ZmID0gb2ZmICsgcmV0Ow0KPj4gKwlpZiAo ZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSB7DQo+PiArCQlmb3IgKGkgPSAwOyBpIDwgbnJfc2Vn czsgaSsrKSB7DQo+PiArCQkJdm9pZCBfX3VzZXIgKmRhdGEgPSBpb3ZbaV0uaW92X2Jhc2U7DQo+ PiArCQkJc2l6ZV90IGxlbiA9IGlvdltpXS5pb3ZfbGVuOw0KPj4gKw0KPj4gKwkJCW51bV9wYWdl cyA9IGNhbGNfcGFnZXNfZm9yKCh1bnNpZ25lZCBsb25nKWRhdGEsIGxlbik7DQo+PiArCQkJcGFn ZXMgPSBjZXBoX2dldF9kaXJlY3RfcGFnZV92ZWN0b3IoZGF0YSwNCj4+ICsJCQkJCQkJICAgIG51 bV9wYWdlcywgdHJ1ZSk7DQo+PiArCQkJaWYgKElTX0VSUihwYWdlcykpDQo+PiArCQkJCXJldHVy biBQVFJfRVJSKHBhZ2VzKTsNCj4+ICsNCj4+ICsJCQlyZXQgPSBzdHJpcGVkX3JlYWQoaW5vZGUs IG9mZiwgbGVuLA0KPj4gKwkJCQkJICAgcGFnZXMsIG51bV9wYWdlcywgY2hlY2tlb2YsDQo+PiAr CQkJCQkgICAxLCAodW5zaWduZWQgbG9uZylkYXRhICYgflBBR0VfTUFTSyk7DQo+PiArCQkJY2Vw aF9wdXRfcGFnZV92ZWN0b3IocGFnZXMsIG51bV9wYWdlcywgdHJ1ZSk7DQo+PiArDQo+PiArCQkJ aWYgKHJldCA8PSAwKQ0KPj4gKwkJCQlicmVhazsNCj4+ICsJCQlvZmYgKz0gcmV0Ow0KPj4gKwkJ CWlmIChyZXQgPCBsZW4pDQo+PiArCQkJCWJyZWFrOw0KPj4gKwkJfQ0KPj4gKwkJaWYgKG9mZiA+ IGlvY2ItPmtpX3Bvcykgew0KPj4gKwkJCXJldCA9IG9mZiAtIGlvY2ItPmtpX3BvczsNCj4+ICsJ CQlpb2NiLT5raV9wb3MgPSBvZmY7DQo+PiArCQkJaW9jYi0+a2lfbGVmdCAtPSByZXQ7DQo+PiAr CQl9DQo+PiArCX0gZWxzZSB7DQo+PiArCQlzaXplX3QgbGVuID0gaW9jYi0+a2lfbGVmdDsNCj4+ ICANCj4+IC1kb25lOg0KPj4gLQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKQ0KPj4gLQkJ Y2VwaF9wdXRfcGFnZV92ZWN0b3IocGFnZXMsIG51bV9wYWdlcywgdHJ1ZSk7DQo+PiAtCWVsc2UN Cj4+ICsJCW51bV9wYWdlcyA9IGNhbGNfcGFnZXNfZm9yKG9mZiwgbGVuKTsNCj4+ICsJCXBhZ2Vz ID0gY2VwaF9hbGxvY19wYWdlX3ZlY3RvcihudW1fcGFnZXMsIEdGUF9OT0ZTKTsNCj4+ICsJCWlm IChJU19FUlIocGFnZXMpKQ0KPj4gKwkJCXJldHVybiBQVFJfRVJSKHBhZ2VzKTsNCj4+ICsJCXJl dCA9IHN0cmlwZWRfcmVhZChpbm9kZSwgb2ZmLCBsZW4sIHBhZ2VzLA0KPj4gKwkJCQkJbnVtX3Bh Z2VzLCBjaGVja2VvZiwgMCwgMCk7DQo+PiArCQlsZW4gPSByZXQ7DQo+PiArCQlpZiAobGVuKSB7 DQo+PiArCQkJaW50IGksIGwsIGsgPSAwOw0KPj4gKwkJCXNpemVfdCBsZWZ0ID0gbGVuOw0KPj4g Kw0KPj4gKwkJCWZvciAoaSA9IDA7IGkgPCBucl9zZWdzICYmIGxlZnQ7IGkrKykgew0KPj4gKwkJ CQl2b2lkIF9fdXNlciAqZGF0YSA9IGlvdltpXS5pb3ZfYmFzZTsNCj4+ICsJCQkJbCA9IG1pbihs ZWZ0LCBpb3ZbaV0uaW92X2xlbik7DQo+PiArCQkJCXJldCA9IGNlcGhfY29weV9wYWdlX3ZlY3Rv cl90b191c2VyKCZwYWdlc1trXSwNCj4+ICsJCQkJCQkJCSAgICBkYXRhLCBvZmYsDQo+PiArCQkJ CQkJCQkgICAgbCk7DQo+PiArCQkJCWlmIChyZXQgPiAwKSB7DQo+PiArCQkJCQlsZWZ0IC09IHJl dDsNCj4+ICsJCQkJCW9mZiArPSByZXQ7DQo+PiArCQkJCQlrID0gY2FsY19wYWdlc19mb3IoaW9j Yi0+a2lfcG9zLA0KPj4gKwkJCQkJCQkgICBsZW4gLSBsZWZ0ICsgMSkgLSAxOw0KPj4gKwkJCQkJ QlVHX09OKGsgPj0gbnVtX3BhZ2VzICYmIGxlZnQpOw0KPj4gKwkJCQl9IGVsc2UNCj4+ICsJCQkJ CWJyZWFrOw0KPj4gKwkJCX0NCj4+ICsNCj4+ICsJCQlpZiAobGVmdCA9PSAwKSB7DQo+PiArCQkJ CWlvY2ItPmtpX3BvcyArPSBsZW47DQo+PiArCQkJCWlvY2ItPmtpX2xlZnQgLT0gbGVuOw0KPj4g KwkJCQlyZXQgPSBsZW47DQo+PiArCQkJfQ0KPg0KPklmIHVzZXIgcHJvZ3JhbSBwcm92aWRlcyBp bnZhbGlkIGJ1ZmZlciB0byByZWFkdiBzeXNjYWxsLiAnbGVmdCcgY2FuIGJlIGxhcmdlciB0aGFu IDAuDQo+Rm9yIHRoaXMgY2FzZSwgd2Ugc2hvdWxkIHJldHVybiBzaXplIG9mIGRhdGEgdGhhdCB3 ZXJlIHN1Y2Nlc3NmdWxseSBjb3BpZWQNCk9rLCB3ZSBzaG91bGQgYWRkIHRoaXMgY29kZSwgYmVm b3JlICJpZiAobGVmdCA9PSAwKSINCmxlZnQgPSBsZW4gLSBsZWZ0Ow0KDQo+DQo+PiArCQl9DQo+ PiAgCQljZXBoX3JlbGVhc2VfcGFnZV92ZWN0b3IocGFnZXMsIG51bV9wYWdlcyk7DQo+PiArCX0N Cj4+ICsNCj4+ICAJZG91dCgic3luY19yZWFkIHJlc3VsdCAlZFxuIiwgcmV0KTsNCj4+ICAJcmV0 dXJuIHJldDsNCj4+ICB9DQo+PiBAQCAtNjQ3LDU1ICs2OTEsODIgQEAgc3RhdGljIHNzaXplX3Qg Y2VwaF9haW9fcmVhZChzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92 LA0KPj4gIHsNCj4+ICAJc3RydWN0IGZpbGUgKmZpbHAgPSBpb2NiLT5raV9maWxwOw0KPj4gIAlz dHJ1Y3QgY2VwaF9maWxlX2luZm8gKmZpID0gZmlscC0+cHJpdmF0ZV9kYXRhOw0KPj4gLQlsb2Zm X3QgKnBwb3MgPSAmaW9jYi0+a2lfcG9zOw0KPj4gLQlzaXplX3QgbGVuID0gaW92LT5pb3ZfbGVu Ow0KPj4gKwlzaXplX3QgbGVuID0gaW9jYi0+a2lfbGVmdDsNCj4+ICAJc3RydWN0IGlub2RlICpp bm9kZSA9IGZpbGVfaW5vZGUoZmlscCk7DQo+PiAgCXN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNp ID0gY2VwaF9pbm9kZShpbm9kZSk7DQo+PiAtCXZvaWQgX191c2VyICpiYXNlID0gaW92LT5pb3Zf YmFzZTsNCj4+ICAJc3NpemVfdCByZXQ7DQo+PiAgCWludCB3YW50LCBnb3QgPSAwOw0KPj4gIAlp bnQgY2hlY2tlb2YgPSAwLCByZWFkID0gMDsNCj4+ICANCj4+ICsNCj4+ICAJZG91dCgiYWlvX3Jl YWQgJXAgJWxseC4lbGx4ICVsbHV+JXUgdHJ5aW5nIHRvIGdldCBjYXBzIG9uICVwXG4iLA0KPj4g IAkgICAgIGlub2RlLCBjZXBoX3Zpbm9wKGlub2RlKSwgcG9zLCAodW5zaWduZWQpbGVuLCBpbm9k ZSk7DQo+PiAtYWdhaW46DQo+PiArDQo+PiAgCWlmIChmaS0+Zm1vZGUgJiBDRVBIX0ZJTEVfTU9E RV9MQVpZKQ0KPj4gIAkJd2FudCA9IENFUEhfQ0FQX0ZJTEVfQ0FDSEUgfCBDRVBIX0NBUF9GSUxF X0xBWllJTzsNCj4+ICAJZWxzZQ0KPj4gIAkJd2FudCA9IENFUEhfQ0FQX0ZJTEVfQ0FDSEU7DQo+ PiAgCXJldCA9IGNlcGhfZ2V0X2NhcHMoY2ksIENFUEhfQ0FQX0ZJTEVfUkQsIHdhbnQsICZnb3Qs IC0xKTsNCj4+ICAJaWYgKHJldCA8IDApDQo+PiAtCQlnb3RvIG91dDsNCj4+ICsJCXJldHVybiBy ZXQ7DQo+PiArDQo+PiAgCWRvdXQoImFpb19yZWFkICVwICVsbHguJWxseCAlbGx1fiV1IGdvdCBj YXAgcmVmcyBvbiAlc1xuIiwNCj4+ICAJICAgICBpbm9kZSwgY2VwaF92aW5vcChpbm9kZSksIHBv cywgKHVuc2lnbmVkKWxlbiwNCj4+ICAJICAgICBjZXBoX2NhcF9zdHJpbmcoZ290KSk7DQo+PiAg DQo+PiAgCWlmICgoZ290ICYgKENFUEhfQ0FQX0ZJTEVfQ0FDSEV8Q0VQSF9DQVBfRklMRV9MQVpZ SU8pKSA9PSAwIHx8DQo+PiAgCSAgICAoaW9jYi0+a2lfZmlscC0+Zl9mbGFncyAmIE9fRElSRUNU KSB8fA0KPj4gLQkgICAgKGZpLT5mbGFncyAmIENFUEhfRl9TWU5DKSkNCj4+ICsJICAgIChmaS0+ ZmxhZ3MgJiBDRVBIX0ZfU1lOQykpIHsNCj4+ICsJCXVuc2lnbmVkIGxvbmcgY3Vycl9zZWcgPSAw Ow0KPj4gKwkJc3RydWN0IGlvdmVjICppb3ZfY2xvbmU7DQo+PiArDQo+PiArCQlpb3ZfY2xvbmUg PSBrbWFsbG9jKG5yX3NlZ3MgKiBzaXplb2Yoc3RydWN0IGlvdmVjKSwgR0ZQX0tFUk5FTCk7DQo+ PiArCQlpZiAoaW92X2Nsb25lID09IE5VTEwpIHsNCj4+ICsJCQlyZXQgPSAtRU5PTUVNOw0KPj4g KwkJCWdvdG8gb3V0Ow0KPj4gKwkJfQ0KPj4gKwkJbWVtY3B5KGlvdl9jbG9uZSwgaW92LCBucl9z ZWdzICogc2l6ZW9mKHN0cnVjdCBpb3ZlYykpOw0KPg0KPndoeSBkbyB3ZSBuZWVkIHRvIGNsb25l IHRoZSBpb3YgPw0KPg0KSSBub3RpY2VkIGluIHBhdGNoMix5b3UgYXNrZWQgdGhlIHNhbWUgcXVl c3Rpb24uDQpUaGUgcmVhc29uIGlzIGkgbmVlZCBtb2RpZnkgaW92LGJ1dCB0aGUgaW92IGlzIGNv bnN0LlNvIGkgb25seSBjbG9uZSBpdC4NCk9yIHNob3VsZCB5b3UgaGF2ZSBiZXR0ZXIgbWV0aG9k Pw0KDQo+UmVnYXJkcw0KPllhbiwgWmhlbmcNCj4NCj4+ICthZ2FpbjoNCj4+ICAJCS8qIGhtbSwg dGhpcyBpc24ndCByZWFsbHkgYXN5bmMuLi4gKi8NCj4+IC0JCXJldCA9IGNlcGhfc3luY19yZWFk KGZpbHAsIGJhc2UsIGxlbiwgcHBvcywgJmNoZWNrZW9mKTsNCj4+IC0JZWxzZQ0KPj4gLQkJcmV0 ID0gZ2VuZXJpY19maWxlX2Fpb19yZWFkKGlvY2IsIGlvdiwgbnJfc2VncywgcG9zKTsNCj4+ICsJ CXJldCA9IGNlcGhfc3luY19yZWFkKGlvY2IsICZpb3ZfY2xvbmVbY3Vycl9zZWddLA0KPj4gKwkJ CQkJbnJfc2VncyAtIGN1cnJfc2VnLCAmY2hlY2tlb2YpOw0KPj4gKw0KPj4gKwkJaWYgKGNoZWNr ZW9mICYmIHJldCA+PSAwKSB7DQo+PiArCQkJaW50IHN0YXRyZXQgPSBjZXBoX2RvX2dldGF0dHIo aW5vZGUsDQo+PiArCQkJCQkJICAgICAgQ0VQSF9TVEFUX0NBUF9TSVpFKTsNCj4+ICsNCj4+ICsJ CQkvKiBoaXQgRU9GIG9yIGhvbGU/ICovDQo+PiArCQkJaWYgKHN0YXRyZXQgPT0gMCAmJiBpb2Ni LT5raV9wb3MgPCBpbm9kZS0+aV9zaXplICYmDQo+PiArCQkJCWlvY2ItPmtpX2xlZnQpIHsNCj4+ ICsJCQkJc2l6ZV90IHRtcCA9IDA7DQo+PiArCQkJCWRvdXQoIiVzIHN5bmNfcmVhZCBoaXQgaG9s ZSwgcHBvcyAlbGxkIDwgc2l6ZSAlbGxkIg0KPj4gKwkJCQkgICAgICIsIHJlYWRpbmcgbW9yZVxu IiwgX19mdW5jX18sIGlvY2ItPmtpX3BvcywNCj4+ICsJCQkJICAgICBpbm9kZS0+aV9zaXplKTsN Cj4+ICsNCj4+ICsJCQkJcmVhZCArPSByZXQ7DQo+PiArCQkJCWZvciAoOyBjdXJyX3NlZyA8IG5y X3NlZ3M7IGN1cnJfc2VnKyspIHsNCj4+ICsJCQkJCWlmICgodG1wICsgaW92X2Nsb25lW2N1cnJf c2VnXS5pb3ZfbGVuKQ0KPj4gKwkJCQkJCT4gcmV0KQ0KPj4gKwkJCQkJCWJyZWFrOw0KPj4gKwkJ CQkJdG1wICs9IGlvdl9jbG9uZVtjdXJyX3NlZ10uaW92X2xlbjsNCj4+ICsJCQkJfQ0KPj4gKw0K Pj4gKwkJCQlCVUdfT04oY3Vycl9zZWcgPT0gbnJfc2Vncyk7DQo+PiArCQkJCWlvdl9jbG9uZVtj dXJyX3NlZ10uaW92X2Jhc2UgKz0gcmV0IC0gdG1wOw0KPj4gKwkJCQlpb3ZfY2xvbmVbY3Vycl9z ZWddLmlvdl9sZW4gLT0gcmV0IC0gdG1wOw0KPj4gKwkJCQljaGVja2VvZiA9IDA7DQo+PiArCQkJ CWdvdG8gYWdhaW47DQo+PiArCQkJfQ0KPj4gKwkJfQ0KPj4gKwkJa2ZyZWUoaW92X2Nsb25lKTsN Cj4+ICANCj4+ICsJfSBlbHNlDQo+PiArCQlyZXQgPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQoaW9j YiwgaW92LCBucl9zZWdzLCBwb3MpOw0KPj4gIG91dDoNCj4+ICAJZG91dCgiYWlvX3JlYWQgJXAg JWxseC4lbGx4IGRyb3BwaW5nIGNhcCByZWZzIG9uICVzID0gJWRcbiIsDQo+PiAgCSAgICAgaW5v ZGUsIGNlcGhfdmlub3AoaW5vZGUpLCBjZXBoX2NhcF9zdHJpbmcoZ290KSwgKGludClyZXQpOw0K Pj4gIAljZXBoX3B1dF9jYXBfcmVmcyhjaSwgZ290KTsNCj4+ICANCj4+IC0JaWYgKGNoZWNrZW9m ICYmIHJldCA+PSAwKSB7DQo+PiAtCQlpbnQgc3RhdHJldCA9IGNlcGhfZG9fZ2V0YXR0cihpbm9k ZSwgQ0VQSF9TVEFUX0NBUF9TSVpFKTsNCj4+IC0NCj4+IC0JCS8qIGhpdCBFT0Ygb3IgaG9sZT8g Ki8NCj4+IC0JCWlmIChzdGF0cmV0ID09IDAgJiYgKnBwb3MgPCBpbm9kZS0+aV9zaXplKSB7DQo+ PiAtCQkJZG91dCgiYWlvX3JlYWQgc3luY19yZWFkIGhpdCBob2xlLCBwcG9zICVsbGQgPCBzaXpl ICVsbGQsIHJlYWRpbmcgbW9yZVxuIiwgKnBwb3MsIGlub2RlLT5pX3NpemUpOw0KPj4gLQkJCXJl YWQgKz0gcmV0Ow0KPj4gLQkJCWJhc2UgKz0gcmV0Ow0KPj4gLQkJCWxlbiAtPSByZXQ7DQo+PiAt CQkJY2hlY2tlb2YgPSAwOw0KPj4gLQkJCWdvdG8gYWdhaW47DQo+PiAtCQl9DQo+PiAtCX0NCj4+ ICAJaWYgKHJldCA+PSAwKQ0KPj4gIAkJcmV0ICs9IHJlYWQ7DQo+PiAgDQo+PiANCj4=