I/O completion ports for Linux

Robey Pointer (robey@lag.net)
Fri, 27 Mar 1998 17:52:38 -0800 (PST)


This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.
Send mail to mime@docserver.cac.washington.edu for more info.

---1647234734-886522687-891049958=:8185
Content-Type: TEXT/PLAIN; charset=US-ASCII

The following is a patch against Linux 2.1.84 to implement "I/O
completion ports" similar to VMS/NT. It will probably patch against
more recent kernels, with slight changes. (I used 84 because it was
the last one I could boot from when I started the patch -- the next
version of the patch will be against one of the 2.1.9x probably.)

An I/O completion port is a special fd that receives notification of
completed I/O (hence the name...) from other fd's. You can start an
I/O operation from one thread, and any other thread can pick up the
result later, when the I/O is finished.

The general concept is: You open an IOCP, and associate file
descriptors with it via ioctl(). Read/write operations on that
fd will now always return EINPROGRESS, indicating that the I/O
request has been queued. A read() on the IOCP will eventually
pull out a data structure containing all the information from
the original read/write call, plus the results.

Normal unix asynchronous I/O uses signals to notify a process/thread
that some I/O operation won't block, but no information is given to
the process beyond that signal. Solaris' aio_read/write (when they
are implemented) will queue the request but will still use signals
to notify the process of completion. Linux IOCP avoids signals
altogether.

I've included a small test program, "iocp-test.c", to show how
IOCP's work.

This patch is intended as a "proof of concept" only -- it works (for
me), but isn't ready for prime time yet. Issues that need to be
solved:

* In this patch, each IOCP can only have 15 pending I/O operations
on it. In reality, applications would probably want to queue a
lot more, and the queue should be allocated dynamically. Which
also means that there will need to be a mechanism to keep users
from abusing it by creating a bunch of IOCP's and sucking up lots
of memory that way.

* read() on an IOCP is implemented, but not poll() yet. (Should
be easy, I just haven't bothered yet.)

* The method of opening an IOCP is a total hack (creating a bogus
flag in the open() syscall). A better way would probably be to
create a device like "/dev/iocp" which hands out IOCPs, but I'm
not familiar enough with Linux's device code to try this yet.
(And I'm not entirely sure it can be done without assigning a
different minor# to each IOCP, which would suck.)

* Only read() and write() syscalls are supported in this patch,
and only for sockets. Like I said, it's just a proof of concept.

Please send comments and suggestions! This is my first attempt at a
kernel patch. :)

Robey

-- 
Robey Pointer              |  "So that's what an invisible barrier
robey@lag.net              |   looks like."   -Time Bandits
http://www.lag.net/~robey  |  (join the 90's retro bandwagon early!)

---1647234734-886522687-891049958=:8185 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="iocp.patch.2" Content-Transfer-Encoding: BASE64 Content-ID: <Pine.LNX.3.95.980327175238.8185B@kitten> Content-Description:

ZGlmZiAtcnVOIGxpbnV4L2ZzL01ha2VmaWxlIGxpbnV4LWlvY3AvZnMvTWFr ZWZpbGUNCi0tLSBsaW51eC9mcy9NYWtlZmlsZQlXZWQgTWFyIDI1IDE5OjM0 OjU4IDE5OTgNCisrKyBsaW51eC1pb2NwL2ZzL01ha2VmaWxlCVdlZCBNYXIg MjUgMTk6NDA6NDYgMTk5OA0KQEAgLTEzLDcgKzEzLDcgQEANCiBPX09CSlMg ICAgPSBvcGVuLm8gcmVhZF93cml0ZS5vIGRldmljZXMubyBmaWxlX3RhYmxl Lm8gYnVmZmVyLm8gXA0KIAkJc3VwZXIubyAgYmxvY2tfZGV2Lm8gc3RhdC5v IGV4ZWMubyBwaXBlLm8gbmFtZWkubyBmY250bC5vIFwNCiAJCWlvY3RsLm8g cmVhZGRpci5vIHNlbGVjdC5vIGZpZm8ubyBsb2Nrcy5vIGZpbGVzeXN0ZW1z Lm8gXA0KLQkJaW5vZGUubyBkY2FjaGUubyBhdHRyLm8gYmFkX2lub2RlLm8g JChCSU5GTVRTKSANCisJCWlub2RlLm8gZGNhY2hlLm8gYXR0ci5vIGJhZF9p bm9kZS5vIGlvY3AubyAkKEJJTkZNVFMpIA0KIA0KIE1PRF9MSVNUX05BTUUg Oj0gRlNfTU9EVUxFUw0KIEFMTF9TVUJfRElSUyA9IGNvZGEgbWluaXggZXh0 MiBmYXQgbXNkb3MgdmZhdCBwcm9jIGlzb2ZzIG5mcyB1bXNkb3MgbnRmcyBc DQpkaWZmIC1ydU4gbGludXgvZnMvaW9jcC5jIGxpbnV4LWlvY3AvZnMvaW9j cC5jDQotLS0gbGludXgvZnMvaW9jcC5jCVdlZCBEZWMgMzEgMTY6MDA6MDAg MTk2OQ0KKysrIGxpbnV4LWlvY3AvZnMvaW9jcC5jCVRodSBNYXIgMjYgMTc6 NTc6MDggMTk5OA0KQEAgLTAsMCArMSwzOTIgQEANCisvKg0KKyAqICBsaW51 eC9mcy9pb2NwLmMNCisgKg0KKyAqICBDb3B5cmlnaHQgKEMpIDE5OTggIFJv YmV5IFBvaW50ZXINCisgKi8NCisNCisjaW5jbHVkZSA8bGludXgvdmZzLmg+ DQorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+DQorI2luY2x1ZGUgPGxpbnV4L2Zj bnRsLmg+DQorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+DQorI2luY2x1ZGUg PGxpbnV4L2tlcm5lbC5oPg0KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+DQor I2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4NCisjaW5jbHVkZSA8bGludXgvc21w Lmg+DQorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+DQorI2luY2x1ZGUg PGxpbnV4L2lvY3AuaD4NCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4NCisN CisNCisvKiBmcmVlIHVwIHRoZSBjb21wbGV0aW9uIHF1ZXVlICovDQorc3Rh dGljIGludCBpb2NwX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3Ry dWN0IGZpbGUgKmZpbHApDQorew0KKwlzdHJ1Y3QgaW9jcF9wcml2YXRlICpw ciA9IChzdHJ1Y3QgaW9jcF9wcml2YXRlICopZmlscC0+cHJpdmF0ZV9kYXRh Ow0KKwlzdHJ1Y3QgZmlsZSAqZjsNCisNCisJLyogZGlzYXNzb2NpYXRlIGZy b20gYW55IGZkJ3MgdGhhdCBhcmUgc3RpbGwgaW4gbXkgbGlzdCAqLw0KKwlm b3IgKGYgPSBwci0+bmV4dDsgZjsgZiA9IGYtPmZfbm90aWZ5X25leHQpDQor CQlmLT5mX25vdGlmeSA9IE5VTEw7DQorCS8qIGdldCByaWQgb2YgdGhlIHBl c2t5IGlub2RlIHRoYXQgInBpcGUiIG1hZGUgZm9yIG1lICovDQorCWZyZWVf cGFnZSgodW5zaWduZWQgbG9uZykgUElQRV9CQVNFKCppbm9kZSkpOw0KKwlQ SVBFX0JBU0UoKmlub2RlKSA9IE5VTEw7DQorCWtmcmVlKHByKTsNCisJZmls cC0+cHJpdmF0ZV9kYXRhID0gTlVMTDsNCisJcmV0dXJuIDA7DQorfQ0KKw0K Ky8qIGlzIGEgZ2l2ZW4gZmQgYmVpbmcgd2F0Y2hlZCBieSB0aGlzIGlvY3A/ ICovDQorc3RhdGljIGludCBpb2NwX2dldHdhdGNoKHN0cnVjdCBmaWxlICpm aWxwLCB1bnNpZ25lZCBsb25nIGFyZykNCit7DQorCXN0cnVjdCBpb2NwX3dh dGNoIGl3Ow0KKwlzdHJ1Y3QgZmlsZSAqZjsNCisJaW50IGVycm9yOw0KKw0K KwllcnJvciA9IGNvcHlfZnJvbV91c2VyKCh2b2lkICopJml3LCAodm9pZCAq KWFyZywNCisJCXNpemVvZihzdHJ1Y3QgaW9jcF93YXRjaCkpOw0KKwlpZiAo ZXJyb3IpDQorCQlyZXR1cm4gZXJyb3I7DQorCWYgPSBmZ2V0KGl3LmZkKTsN CisJaWYgKCFmKQ0KKwkJcmV0dXJuIC1FQkFERjsNCisJaXcud2F0Y2ggPSAo Zi0+Zl9ub3RpZnkgPT0gZmlscCk7DQorCWVycm9yID0gY29weV90b191c2Vy KCh2b2lkICopYXJnLCAodm9pZCAqKSZpdywNCisJCXNpemVvZihzdHJ1Y3Qg aW9jcF93YXRjaCkpOw0KKwlmcHV0KGYpOw0KKwlyZXR1cm4gZXJyb3I7DQor fQ0KKw0KKy8qIG1ha2UgYSBnaXZlbiBmZCBiZSB3YXRjaGVkL25vdCB3YXRj aGVkIGJ5IHRoaXMgaW9jcCAqLw0KK3N0YXRpYyBpbnQgaW9jcF9zZXR3YXRj aChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgbG9uZyBhcmcpDQorew0K KwlzdHJ1Y3QgaW9jcF93YXRjaCBpdzsNCisJc3RydWN0IGZpbGUgKmY7DQor CWludCBlcnJvcjsNCisNCisJZXJyb3IgPSBjb3B5X2Zyb21fdXNlcigodm9p ZCAqKSZpdywgKHZvaWQgKilhcmcsDQorCQlzaXplb2Yoc3RydWN0IGlvY3Bf d2F0Y2gpKTsNCisJaWYgKGVycm9yKQ0KKwkJcmV0dXJuIGVycm9yOw0KKwlm ID0gZmdldChpdy5mZCk7DQorCWlmICghZikNCisJCXJldHVybiAtRUJBREY7 DQorCWlmIChmLT5mX2ZsYWdzICYgT19TUEVDSUFMKQ0KKwkJcmV0dXJuIC1F SU5WQUw7CQkvKiBjYW4ndCB3YXRjaCBhbm90aGVyIGlvY3AhICovDQorCWxv Y2tfa2VybmVsKCk7DQorCS8qIG5vIG1hdHRlciB3aGF0LCByZW1vdmUgdGhl IG9sZCBjaGFpbiAqLw0KKwlpZiAoZi0+Zl9ub3RpZnkpIHsNCisJCXN0cnVj dCBpb2NwX3ByaXZhdGUgKnByID0gKHN0cnVjdCBpb2NwX3ByaXZhdGUgKikN CisJCQlmLT5mX25vdGlmeS0+cHJpdmF0ZV9kYXRhOw0KKw0KKwkJaWYgKGYt PmZfbm90aWZ5X3ByZXYpDQorCQkJZi0+Zl9ub3RpZnlfcHJldi0+Zl9ub3Rp ZnlfbmV4dCA9IGYtPmZfbm90aWZ5X25leHQ7IA0KKwkJaWYgKGYtPmZfbm90 aWZ5X25leHQpDQorCQkJZi0+Zl9ub3RpZnlfbmV4dC0+Zl9ub3RpZnlfcHJl diA9IGYtPmZfbm90aWZ5X3ByZXY7DQorCQlpZiAocHItPm5leHQgPT0gZikN CisJCQlwci0+bmV4dCA9IGYtPmZfbm90aWZ5X25leHQ7DQorCQlmLT5mX25v dGlmeSA9IE5VTEw7DQorCX0NCisJaWYgKGl3LndhdGNoKSB7DQorCQlzdHJ1 Y3QgaW9jcF9wcml2YXRlICpwciA9IChzdHJ1Y3QgaW9jcF9wcml2YXRlICop DQorCQkJZmlscC0+cHJpdmF0ZV9kYXRhOw0KKw0KKwkJZi0+Zl9ub3RpZnkg PSBmaWxwOw0KKwkJZi0+Zl9ub3RpZnlfbmV4dCA9IHByLT5uZXh0Ow0KKwkJ Zi0+Zl9ub3RpZnlfcHJldiA9IE5VTEw7DQorCQlwci0+bmV4dCA9IGY7DQor CQlpZiAoZi0+Zl9ub3RpZnlfbmV4dCkNCisJCQlmLT5mX25vdGlmeV9uZXh0 LT5mX25vdGlmeV9wcmV2ID0gZjsNCisJfQ0KKwl1bmxvY2tfa2VybmVsKCk7 DQorCWZwdXQoZik7DQorCXJldHVybiAwOw0KK30NCisNCitzdGF0aWMgaW50 IGlvY3BfaW9jdGwoc3RydWN0IGlub2RlICp1bnVzZWQsIHN0cnVjdCBmaWxl ICpmaWxwLA0KKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFy ZykNCit7DQorCXN3aXRjaChjbWQpIHsNCisJCWNhc2UgSU9DUEdXQVRDSDoN CisJCQlyZXR1cm4gaW9jcF9nZXR3YXRjaChmaWxwLCBhcmcpOw0KKwkJY2Fz ZSBJT0NQU1dBVENIOg0KKwkJCXJldHVybiBpb2NwX3NldHdhdGNoKGZpbHAs IGFyZyk7DQorCQlkZWZhdWx0Og0KKwkJCXJldHVybiAtRUlOVkFMOw0KKwl9 DQorfQ0KKw0KK3N0YXRpYyBzc2l6ZV90IGlvY3BfcmVhZChzdHJ1Y3QgZmls ZSAqZmlscCwgY2hhciAqYnVmLCBzaXplX3QgY291bnQsDQorCSBsb2ZmX3Qg KnBwb3MpDQorew0KKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9k ZW50cnktPmRfaW5vZGU7DQorCXN0cnVjdCBpb2NwX3ByaXZhdGUgKnByID0g KHN0cnVjdCBpb2NwX3ByaXZhdGUgKilmaWxwLT5wcml2YXRlX2RhdGE7DQor CXN0cnVjdCBpb2NwX2lvX3VzZXIgaW91Ow0KKwlzdHJ1Y3QgaW9jcF9pbyBp bzsNCisJc3NpemVfdCByZXQgPSAtRUJBREY7DQorCXVuc2lnbmVkIHNob3J0 IHNhdmVkX2ZsYWdzOw0KKwlsb25nIGk7DQorCWludCB3aGljaCwgZXJyb3I7 DQorDQorCWlmIChwcG9zICE9ICZmaWxwLT5mX3BvcykNCisJCXJldHVybiAt RVNQSVBFOw0KKwlpZiAoY291bnQgPCBzaXplb2Yoc3RydWN0IGlvY3BfaW9f dXNlcikpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJZG8gew0KKwkJLyog ZW1wdHkgcXVldWU/ICovDQorCQlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9O QkxPQ0spIHsNCisJCQlpZiAoUElQRV9MT0NLKCppbm9kZSkpDQorCQkJCXJl dHVybiAtRUFHQUlOOw0KKwkJCWlmICghKHdoaWNoID0gaW9jcF9pb19yZWFk eShwcikpKQ0KKwkJCQlyZXR1cm4gLUVBR0FJTjsNCisJCX0NCisJCWVsc2Ug d2hpbGUgKCEod2hpY2ggPSBpb2NwX2lvX3JlYWR5KHByKSkgfHwNCisJCQlQ SVBFX0xPQ0soKmlub2RlKSkgew0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhj dXJyZW50KSkNCisJCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsNCisJCQlpbnRl cnJ1cHRpYmxlX3NsZWVwX29uKCZQSVBFX1dBSVQoKmlub2RlKSk7DQorCQl9 DQorCQl3aGljaC0tOw0KKwkJUElQRV9MT0NLKCppbm9kZSkrKzsNCisJCWlv Y3BfcG9wKHByLCB3aGljaCwgJmlvKTsNCisNCisJCS8qIHNldCB0aGUgZmls ZSBub24tYmxvY2tpbmcgZm9yIG5vdyAqLw0KKwkJc2F2ZWRfZmxhZ3MgPSBp by5mLT5mX2ZsYWdzOw0KKwkJaW8uZi0+Zl9mbGFncyB8PSBPX05PTkJMT0NL Ow0KKwkJLyogcGVyZm9ybSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbiAqLw0K KwkJaWYgKGlvLmZsYWdzICYgSU9DUFFfUkVBRCkNCisJCQlyZXQgPSBrc3lz X3ByZWFkKGlvLmYsIGlvLmJ1ZmZlciwgaW8ubmJ5dGVzLA0KKwkJCQlpby5v ZmZzZXQpOw0KKwkJZWxzZSBpZiAoaW8uZmxhZ3MgJiBJT0NQUV9XUklURSkN CisJCQlyZXQgPSBrc3lzX3B3cml0ZShpby5mLCBpby5idWZmZXIsIGlvLm5i eXRlcywNCisJCQkJaW8ub2Zmc2V0KTsNCisJCWlvLmYtPmZfZmxhZ3MgPSBz YXZlZF9mbGFnczsNCisJCVBJUEVfTE9DSygqaW5vZGUpLS07DQorCQ0KKwkJ aWYgKHJldCA9PSAtRUFHQUlOKSB7DQorCQkJLyogd2Ugd2VyZSBmb29sZWQu ICB0aGlzIGlzbid0IHJlYWR5LiAqLw0KKwkJCWlvLmZsYWdzICY9IH5JT0NQ UV9SRUFEWTsNCisJCQlpb2NwX3B1c2gocHIsICZpbyk7DQorCQl9DQorCX0g d2hpbGUgKHJldCA9PSAtRUFHQUlOKTsNCisNCisJLyogb3BlcmF0aW9uIGNv bXBsZXRlIC0tIGNvcHkgaW5mbyBpbnRvIHRoZSB1c2VyIHN0cnVjdCAqLw0K Kwlpb3UuYnVmZmVyID0gaW8uYnVmZmVyOw0KKwlpb3UubmJ5dGVzID0gaW8u bmJ5dGVzOw0KKwlpb3UubnJlc3VsdCA9IChyZXQgPCAwKSA/IDAgOiByZXQ7 DQorCWlvdS5vZmZzZXQgPSAqKGlvLm9mZnNldCk7DQorCWlvdS5mbGFncyA9 IGlvLmZsYWdzICYgSU9DUFFfUldNQVNLOw0KKwlpb3UuZXJyb3IgPSAocmV0 IDwgMCkgPyAtcmV0IDogMDsNCisNCisJLyogaSB3aXNoIHRoZXJlIHdhcyBh IGJldHRlciB3YXkgdG8gZG8gdGhpczogKi8NCisJZm9yIChpID0gMDsgKGN1 cnJlbnQtPmZpbGVzLT5mZFtpXSAhPSBpby5mKSAmJiAoaSA8IE5SX09QRU4p OyBpKyspOw0KKwkvKiBub3Qgc3VyZSB3aGF0IGVsc2UgaSBjYW4gZG8gaGVy ZTogKi8NCisJaWYgKGkgPj0gTlJfT1BFTikNCisJCWkgPSAtMTsNCisJaW91 LmZkID0gaTsNCisJZXJyb3IgPSBjb3B5X3RvX3VzZXIoYnVmLCAmaW91LCBz aXplb2Yoc3RydWN0IGlvY3BfaW9fdXNlcikpOw0KKwlpZiAoZXJyb3IpDQor CQlyZXR1cm4gZXJyb3I7DQorCXJldHVybiBzaXplb2Yoc3RydWN0IGlvY3Bf aW9fdXNlcik7DQorfQ0KKw0KK3N0YXRpYyBzc2l6ZV90IGlvY3Bfd3JpdGUo c3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNv dW50LA0KKwlsb2ZmX3QgKnBwb3MpDQorew0KKwlyZXR1cm4gLUVCQURGOw0K K30NCisNCitzdGF0aWMgbG9uZyBsb25nIGlvY3BfbHNlZWsoc3RydWN0IGZp bGUgKmZpbHAsIGxvbmcgbG9uZyBvZmZzZXQsIGludCBvcmlnKQ0KK3sNCisJ cmV0dXJuIC1FU1BJUEU7DQorfQ0KKw0KKy8qIGZpbGUgb3BlcmF0aW9ucyBv biBhbiBJL08gY29tcGxldGlvbiBwb3J0ICovDQorc3RydWN0IGZpbGVfb3Bl cmF0aW9ucyBpb2NwX2ZpbGVfb3BzID0gew0KKwlpb2NwX2xzZWVrLA0KKwlp b2NwX3JlYWQsDQorCWlvY3Bfd3JpdGUsDQorCU5VTEwsCQkvKiByZWFkZGly ICovDQorCU5VTEwsCQkvKiBwb2xsICovDQorCWlvY3BfaW9jdGwsDQorCU5V TEwsCQkvKiBtbWFwICovDQorCU5VTEwsCQkvKiBvcGVuICovDQorCWlvY3Bf cmVsZWFzZSwNCisJTlVMTCwJCS8qIGZzeW5jICovDQorCU5VTEwsCQkvKiBm YXN5bmMgKi8NCisJTlVMTCwJCS8qIGNoZWNrX21lZGlhX2NoYW5nZSAod2hh dGV2ZXIpICovDQorCU5VTEwsCQkvKiByZXZhbGlkYXRlICovDQorCU5VTEwJ CS8qIGxvY2sgKi8NCit9Ow0KKw0KKy8qKioqKiBmdW5jdGlvbnMgY2FsbGVk IGJ5IHRoZSBrZXJuZWwgaW50ZXJuYWxseSAqKioqKi8NCisNCisvKiBjcmVh dGUgYSBuZXcgaW9jcCAqLw0KK2ludCBpb2NwX25ldyh1bnNpZ25lZCBsb25n IGZkKQ0KK3sNCisJc3RydWN0IGZpbGUgKmY7DQorCXN0cnVjdCBpb2NwX3By aXZhdGUgKnA7DQorCXN0cnVjdCBpbm9kZSAqaW5vZGU7DQorCWludCBlcnJv cjsNCisNCisJZXJyb3IgPSAtRU5GSUxFOw0KKwlmID0gZ2V0X2VtcHR5X2Zp bHAoKTsNCisJaWYgKCFmKQ0KKwkJZ290byBub19maWxlczsNCisJLyogY3Jh enkgaW5vZGUvZGVudHJ5IHN0dWZmIHdlIGRvbid0IHJlYWxseSBuZWVkICov DQorCS8qIHVzZSBwaXBlJ3MgaW5vZGUgc3RydWN0dXJlIHNpbmNlIGl0IG1h dGNoZXMgcHJldHR5IGNsb3NlbHkgKi8NCisJaW5vZGUgPSBnZXRfcGlwZV9p bm9kZSgpOw0KKwlpZiAoIWlub2RlKQ0KKwkJZ290byBjbGVhbnVwX2ZpbGU7 DQorCS8qIGZpeCBvbmUgc21hbGwgdGhpbmcgdGhhdCBnZXRfcGlwZV9pbm9k ZSgpIGRvZXMgKi8NCisJaW5vZGUtPmlfb3AtPmRlZmF1bHRfZmlsZV9vcHMg PSAmaW9jcF9maWxlX29wczsNCisJZXJyb3IgPSAtRU5PTUVNOw0KKwlmLT5m X2RlbnRyeSA9IGRnZXQoZF9hbGxvY19yb290KGlub2RlLCBOVUxMKSk7DQor CWlmICghZi0+Zl9kZW50cnkpDQorCQlnb3RvIGNsZWFudXBfaW5vZGU7DQor CWYtPmZfZmxhZ3MgPSBPX1NQRUNJQUwgfCBPU1BfSU9DUDsNCisJZi0+Zl9t b2RlID0gRk1PREVfUkVBRDsNCisJZi0+Zl9wb3MgPSAwOw0KKwlmLT5mX29w ID0gJmlvY3BfZmlsZV9vcHM7DQorCXAgPSAoc3RydWN0IGlvY3BfcHJpdmF0 ZSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb2NwX3ByaXZhdGUpLA0KKwkJ R0ZQX0tFUk5FTCk7DQorCWlmICghcCkNCisJCWdvdG8gY2xlYW51cF9maWxl Ow0KKwlzcGluX2xvY2tfaW5pdChwLT5sb2NrKTsNCisJcC0+aW5xX3RhaWwg PSAwOw0KKwlwLT5uZXh0ID0gTlVMTDsNCisJZi0+cHJpdmF0ZV9kYXRhID0g cDsNCisJY3VycmVudC0+ZmlsZXMtPmZkW2ZkXSA9IGY7CS8qIGZkX2luc3Rh bGwoZmQsIGYpOyAqLw0KKwlyZXR1cm4gMDsNCisNCitjbGVhbnVwX2lub2Rl Og0KKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIFBJUEVfQkFTRSgqaW5v ZGUpKTsNCisJaXB1dChpbm9kZSk7DQorY2xlYW51cF9maWxlOg0KKwlwdXRf ZmlscChmKTsNCitub19maWxlczoNCisJcmV0dXJuIGVycm9yOw0KK30NCisN CisvKiBxdWV1ZSBhbiBpL28gcmVxdWVzdCB0byB0aGUgYXNzb2NpYXRlZCBp b2NwIG9mIGEgZmlsZS4NCisgKiBOT1RFOiBhIGRpZmZlcmVudCBpbnRlcmZh Y2Ugd2lsbCBiZSBuZWVkZWQgb25jZSBwcmVhZC9wd3JpdGUgYXJlIHN1cHBv cnRlZCwNCisgKiAgICAgICBzaW5jZSB0aG9zZSBwYXNzIGFuIGxvZmZfdCwg bm90IGFuIGxvZmZfdCouDQorICovDQoraW50IGlvY3BfYWRkcShzdHJ1Y3Qg ZmlsZSAqZmlscCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbmJ5dGVz LA0KKwlsb2ZmX3QgKm9mZnNldCwgdW5zaWduZWQgaW50IGZsYWdzKQ0KK3sN CisJc3RydWN0IGlvY3BfcHJpdmF0ZSAqcHIgPSAoc3RydWN0IGlvY3BfcHJp dmF0ZSAqKQ0KKwkJZmlscC0+Zl9ub3RpZnktPnByaXZhdGVfZGF0YTsNCisJ c3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfbm90aWZ5LT5mX2RlbnRy eS0+ZF9pbm9kZTsNCisNCisJc3Bpbl9sb2NrKHByLT5sb2NrKTsNCisJaWYg KHByLT5pbnFfdGFpbCA+PSBJT0NQX01BWFEpIHsNCisJCXNwaW5fdW5sb2Nr KHByLT5sb2NrKTsNCisJCXJldHVybiAtRU5PTUVNOwkJLyogaXMgdGhlcmUg YSBiZXR0ZXIgZXJyb3I/ICovDQorCX0NCisJcHItPmlucVtwci0+aW5xX3Rh aWxdLmYgPSBmaWxwOw0KKwlwci0+aW5xW3ByLT5pbnFfdGFpbF0uYnVmZmVy ID0gKHZvaWQgKilidWZmZXI7DQorCXByLT5pbnFbcHItPmlucV90YWlsXS5u Ynl0ZXMgPSBuYnl0ZXM7DQorCXByLT5pbnFbcHItPmlucV90YWlsXS5vZmZz ZXQgPSBvZmZzZXQ7DQorCXByLT5pbnFbcHItPmlucV90YWlsXS50YXNrID0g Y3VycmVudDsNCisJLyogaXQgbWlnaHQgYmUgcmVhZHkgcmlnaHQgbm93ISAg Y2FuJ3QgaHVydCB0byBjaGVjay4uLiAqLw0KKwlwci0+aW5xW3ByLT5pbnFf dGFpbF0uZmxhZ3MgPSBmbGFncyB8IElPQ1BRX1JFQURZOw0KKwlwci0+aW5x X3RhaWwrKzsNCisJc3Bpbl91bmxvY2socHItPmxvY2spOw0KKwl3YWtlX3Vw X2ludGVycnVwdGlibGUoJlBJUEVfV0FJVCgqaW5vZGUpKTsNCisJcmV0dXJu IC1FSU5QUk9HUkVTUzsNCit9DQorDQorLyogZGlzY29ubmVjdCB0aGlzIGZp bGUgZnJvbSBpdHMgaW9jcCAqLw0KK3ZvaWQgaW9jcF9wdXQoc3RydWN0IGZp bGUgKmZpbHApDQorew0KKwlzdHJ1Y3QgaW9jcF9wcml2YXRlICpwciA9IChz dHJ1Y3QgaW9jcF9wcml2YXRlICopDQorCQlmaWxwLT5mX25vdGlmeS0+cHJp dmF0ZV9kYXRhOw0KKwlpbnQgaTsNCisNCisJLyogc2NhbiB0aGUgaW9jcCBx dWV1ZSBmb3IgcGVuZGluZyBvcGVyYXRpb25zIG9uIHRoaXMgZmlsZSwNCisJ ICogYW5kIHNxdWFzaCB0aGVtLg0KKwkgKi8NCisJc3Bpbl9sb2NrKHByLT5s b2NrKTsNCisJZm9yIChpID0gMDsgaSA8IHByLT5pbnFfdGFpbDsgaSsrKSB7 DQorCQlpZiAocHItPmlucVtpXS5mID09IGZpbHApIHsNCisJCQlpZiAocHIt PmlucV90YWlsID4gaSsxKSANCisJCQkJbWVtY3B5KCYocHItPmlucVtpXSks DQorCQkJCQkmKHByLT5pbnFbcHItPmlucV90YWlsLTFdKSwNCisJCQkJCXNp emVvZihzdHJ1Y3QgaW9jcF9pbykpOw0KKwkJCXByLT5pbnFfdGFpbC0tOw0K KwkJCWktLTsNCisJCX0NCisJfQ0KKwkvKiByZW1vdmUgdGhpcyBmaWxlIGZy b20gdGhlIHdhdGNoIGxpc3QgKi8NCisJaWYgKGZpbHAtPmZfbm90aWZ5X3By ZXYpDQorCQlmaWxwLT5mX25vdGlmeV9wcmV2LT5mX25vdGlmeV9uZXh0ID0g ZmlscC0+Zl9ub3RpZnlfbmV4dDsNCisJaWYgKGZpbHAtPmZfbm90aWZ5X25l eHQpDQorCQlmaWxwLT5mX25vdGlmeV9uZXh0LT5mX25vdGlmeV9wcmV2ID0g ZmlscC0+Zl9ub3RpZnlfcHJldjsNCisJaWYgKHByLT5uZXh0ID09IGZpbHAp DQorCQlwci0+bmV4dCA9IGZpbHAtPmZfbm90aWZ5X25leHQ7DQorCXNwaW5f dW5sb2NrKHByLT5sb2NrKTsNCit9DQorDQorLyogbm90aWZ5IHRoZSBpb2Nw IGVuZ2luZSB0aGF0IGEgcmVhZC93cml0ZSBvcGVyYXRpb24gd2lsbCBwcm9i YWJseQ0KKyAqIHN1Y2NlZWQgZm9yIHRoaXMgZmlsZQ0KKyAqLw0KK3ZvaWQg aW9jcF9ub3RpZnkoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBm bGFncykNCit7DQorCXN0cnVjdCBpb2NwX3ByaXZhdGUgKnByID0gKHN0cnVj dCBpb2NwX3ByaXZhdGUgKikNCisJCWZpbHAtPmZfbm90aWZ5LT5wcml2YXRl X2RhdGE7DQorCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX25vdGlm eS0+Zl9kZW50cnktPmRfaW5vZGU7DQorCWludCBhd2FrZW4gPSAwLCBpOw0K Kw0KKwkvKiBhbGwgdGhlIHF1ZXVlZCBvcGVyYXRpb25zIGZvciBvbmUgZmls ZSBDT1VMRCBiZSBmb3Igc21hbGwNCisJICogYW1vdW50cywgc28gd2UganVz dCBtYXJrIHRoZW0gYWxsIGFzIHJlYWR5LiAgaWYgd2UncmUgd3JvbmcsDQor CSAqIHRoZSBpb2NwX3JlYWQoKSBoYW5kbGVyIHdpbGwgZmluZCBvdXQuDQor CSAqLw0KKwlzcGluX2xvY2socHItPmxvY2spOw0KKwlmb3IgKGkgPSAwOyBp IDwgcHItPmlucV90YWlsOyBpKyspIHsNCisJCWlmICgocHItPmlucVtpXS5m ID09IGZpbHApICYmDQorCQkJKChwci0+aW5xW2ldLmZsYWdzICYgSU9DUFFf UldNQVNLKSA9PSBmbGFncykpIHsNCisJCQlhd2FrZW4gPSAxOw0KKwkJCXBy LT5pbnFbaV0uZmxhZ3MgfD0gSU9DUFFfUkVBRFk7DQorCQl9DQorCX0NCisJ c3Bpbl91bmxvY2socHItPmxvY2spOw0KKwlpZiAoYXdha2VuKQ0KKwkJd2Fr ZV91cF9pbnRlcnJ1cHRpYmxlKCZQSVBFX1dBSVQoKmlub2RlKSk7DQorfQ0K Kw0KKy8qIGFueSBmaWxlcyByZWFkeT8gKi8NCitpbnQgaW9jcF9pb19yZWFk eShzdHJ1Y3QgaW9jcF9wcml2YXRlICpwcikNCit7DQorCWludCBpOw0KKw0K Kwlmb3IgKGkgPSAwOyBpIDwgcHItPmlucV90YWlsOyBpKyspDQorCQlpZiAo cHItPmlucVtpXS5mbGFncyAmIElPQ1BRX1JFQURZKQ0KKwkJCXJldHVybiBp KzE7DQorCXJldHVybiAwOw0KK30NCisNCit2b2lkIGlvY3BfcG9wKHN0cnVj dCBpb2NwX3ByaXZhdGUgKnByLCBpbnQgd2hpY2gsIHN0cnVjdCBpb2NwX2lv ICppbykNCit7DQorCXNwaW5fbG9jayhwci0+bG9jayk7DQorCW1lbWNweShp bywgJihwci0+aW5xW3doaWNoXSksIHNpemVvZihzdHJ1Y3QgaW9jcF9pbykp Ow0KKwlpZiAod2hpY2grMSA8IHByLT5pbnFfdGFpbCkNCisJCW1lbWNweSgm KHByLT5pbnFbd2hpY2hdKSwgJihwci0+aW5xW3ByLT5pbnFfdGFpbC0xXSks DQorCQkJc2l6ZW9mKHN0cnVjdCBpb2NwX2lvKSk7DQorCXByLT5pbnFfdGFp bC0tOw0KKwlzcGluX3VubG9jayhwci0+bG9jayk7DQorfQ0KKw0KKy8qIG9u bHkgY2FsbGVkIHdoZW4gcHJlY2VkZWQgYnkgYW4gaW9jcF9wb3AsIHNvIHRo ZXJlJ3MgYWx3YXlzIHNwYWNlICovDQordm9pZCBpb2NwX3B1c2goc3RydWN0 IGlvY3BfcHJpdmF0ZSAqcHIsIHN0cnVjdCBpb2NwX2lvICppbykNCit7DQor CXNwaW5fbG9jayhwci0+bG9jayk7DQorCWlmIChwci0+aW5xX3RhaWwgPj0g SU9DUF9NQVhRKSB7DQorCQkvKiBob3cnZCB0aGF0IGhhcHBlbj8gKi8NCisJ CXNwaW5fdW5sb2NrKHByLT5sb2NrKTsNCisJCXJldHVybjsNCisJfQ0KKwlt ZW1jcHkoJihwci0+aW5xW3ByLT5pbnFfdGFpbF0pLCBpbywgc2l6ZW9mKHN0 cnVjdCBpb2NwX2lvKSk7DQorCXByLT5pbnFfdGFpbCsrOw0KKwlzcGluX3Vu bG9jayhwci0+bG9jayk7DQorfQ0KKw0KZGlmZiAtcnVOIGxpbnV4L2ZzL29w ZW4uYyBsaW51eC1pb2NwL2ZzL29wZW4uYw0KLS0tIGxpbnV4L2ZzL29wZW4u YwlXZWQgTWFyIDI1IDE5OjM0OjU4IDE5OTgNCisrKyBsaW51eC1pb2NwL2Zz L29wZW4uYwlUaHUgTWFyIDI2IDEzOjU0OjE4IDE5OTgNCkBAIC0yMCw2ICsy MCw4IEBADQogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4NCiAjaW5jbHVkZSA8 bGludXgvc21wLmg+DQogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+DQor I2luY2x1ZGUgPGxpbnV4L2lvY3AuaD4NCisjaW5jbHVkZSA8bGludXgvc2xh Yi5oPg0KIA0KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPg0KICNpbmNsdWRl IDxhc20vYml0b3BzLmg+DQpAQCAtNjkyLDggKzY5NCwyMSBAQA0KIAllcnJv ciA9IGdldF91bnVzZWRfZmQoKTsNCiAJaWYgKGVycm9yIDwgMCkNCiAJCWdv dG8gb3V0Ow0KLQ0KIAlmZCA9IGVycm9yOw0KKw0KKwkvKiBjaGVjayBmb3Ig cmVxdWVzdCBmb3IgaW9jcCAqLw0KKwlpZiAoZmxhZ3MgJiBPX1NQRUNJQUwp IHsNCisJCWlmICgoZmxhZ3MgJiAyNTUpICE9IE9TUF9JT0NQKSB7DQorCQkJ ZXJyb3IgPSAtRU5PRU5UOw0KKwkJCWdvdG8gb3V0X2ZhaWw7DQorCQl9DQor CQllcnJvciA9IGlvY3BfbmV3KGZkKTsNCisJCWlmIChlcnJvcikNCisJCQln b3RvIG91dF9mYWlsOw0KKwkJZXJyb3IgPSBmZDsNCisJCWdvdG8gb3V0Ow0K Kwl9DQorDQogCXRtcCA9IGdldG5hbWUoZmlsZW5hbWUpOw0KIAllcnJvciA9 IFBUUl9FUlIodG1wKTsNCiAJaWYgKCFJU19FUlIodG1wKSkgew0KQEAgLTcw NCw2ICs3MTksNyBAQA0KIAkJCWdvdG8gb3V0Ow0KIAkJfQ0KIAl9DQorb3V0 X2ZhaWw6DQogCXB1dF91bnVzZWRfZmQoZmQpOw0KIG91dDoNCiAJdW5sb2Nr X2tlcm5lbCgpOw0KQEAgLTczNiw2ICs3NTIsOCBAQA0KIA0KIAlpZiAoZmls cC0+Zl9vcCAmJiBmaWxwLT5mX29wLT5yZWxlYXNlKQ0KIAkJZXJyb3IgPSBm aWxwLT5mX29wLT5yZWxlYXNlKGlub2RlLCBmaWxwKTsNCisJaWYgKGZpbHAt PmZfbm90aWZ5KQ0KKwkJaW9jcF9wdXQoZmlscCk7DQogCWZpbHAtPmZfZGVu dHJ5ID0gTlVMTDsNCiAJaWYgKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRF KQ0KIAkJcHV0X3dyaXRlX2FjY2Vzcyhpbm9kZSk7DQpkaWZmIC1ydU4gbGlu dXgvZnMvcGlwZS5jIGxpbnV4LWlvY3AvZnMvcGlwZS5jDQotLS0gbGludXgv ZnMvcGlwZS5jCVdlZCBNYXIgMjUgMTk6MzQ6NTggMTk5OA0KKysrIGxpbnV4 LWlvY3AvZnMvcGlwZS5jCVdlZCBNYXIgMjUgMTk6NDA6NDYgMTk5OA0KQEAg LTM4NSw3ICszODUsNyBAQA0KIAlOVUxMDQogfTsNCiANCi1zdGF0aWMgc3Ry dWN0IGlub2RlICogZ2V0X3BpcGVfaW5vZGUodm9pZCkNCitzdHJ1Y3QgaW5v ZGUgKiBnZXRfcGlwZV9pbm9kZSh2b2lkKQ0KIHsNCiAJZXh0ZXJuIHN0cnVj dCBpbm9kZV9vcGVyYXRpb25zIHBpcGVfaW5vZGVfb3BlcmF0aW9uczsNCiAJ c3RydWN0IGlub2RlICppbm9kZSA9IGdldF9lbXB0eV9pbm9kZSgpOw0KZGlm ZiAtcnVOIGxpbnV4L2ZzL3JlYWRfd3JpdGUuYyBsaW51eC1pb2NwL2ZzL3Jl YWRfd3JpdGUuYw0KLS0tIGxpbnV4L2ZzL3JlYWRfd3JpdGUuYwlXZWQgTWFy IDI1IDE5OjM0OjU4IDE5OTgNCisrKyBsaW51eC1pb2NwL2ZzL3JlYWRfd3Jp dGUuYwlUaHUgTWFyIDI2IDEzOjU0OjE4IDE5OTgNCkBAIC0xNyw2ICsxNyw3 IEBADQogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPg0KICNpbmNsdWRlIDxsaW51 eC9zbXBfbG9jay5oPg0KICNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4NCisj aW5jbHVkZSA8bGludXgvaW9jcC5oPg0KIA0KICNpbmNsdWRlIDxhc20vdWFj Y2Vzcy5oPg0KIA0KQEAgLTEzNCw3ICsxMzUsMTAgQEANCiAJcmV0ID0gLUVJ TlZBTDsNCiAJaWYgKCFmaWxlLT5mX29wIHx8ICEocmVhZCA9IGZpbGUtPmZf b3AtPnJlYWQpKQ0KIAkJZ290byBvdXQ7DQotCXJldCA9IHJlYWQoZmlsZSwg YnVmLCBjb3VudCwgJmZpbGUtPmZfcG9zKTsNCisJaWYgKGZpbGUtPmZfbm90 aWZ5KQ0KKwkJcmV0ID0gaW9jcF9hZGRxKGZpbGUsIGJ1ZiwgY291bnQsICYo ZmlsZS0+Zl9wb3MpLCBJT0NQUV9SRUFEKTsNCisJZWxzZQ0KKwkJcmV0ID0g cmVhZChmaWxlLCBidWYsIGNvdW50LCAmZmlsZS0+Zl9wb3MpOw0KIG91dDoN CiAJZnB1dChmaWxlKTsNCiBiYWRfZmlsZToNCkBAIC0xNjcsNyArMTcxLDEw IEBADQogCQlnb3RvIG91dDsNCiANCiAJZG93bigmaW5vZGUtPmlfc2VtKTsN Ci0JcmV0ID0gd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgJmZpbGUtPmZfcG9z KTsNCisJaWYgKGZpbGUtPmZfbm90aWZ5KQ0KKwkJcmV0ID0gaW9jcF9hZGRx KGZpbGUsIGJ1ZiwgY291bnQsICYoZmlsZS0+Zl9wb3MpLCBJT0NQUV9XUklU RSk7DQorCWVsc2UNCisJCXJldCA9IHdyaXRlKGZpbGUsIGJ1ZiwgY291bnQs ICZmaWxlLT5mX3Bvcyk7DQogCXVwKCZpbm9kZS0+aV9zZW0pOw0KIG91dDoN CiAJZnB1dChmaWxlKTsNCkBAIC0zMjAsNTUgKzMyNyw2MyBAQA0KICAgIGxz ZWVrIGJhY2sgdG8gb3JpZ2luYWwgbG9jYXRpb24uICBUaGV5IGZhaWwganVz dCBsaWtlIGxzZWVrIGRvZXMgb24NCiAgICBub24tc2Vla2FibGUgZmlsZXMu ICAqLw0KIA0KLWFzbWxpbmthZ2Ugc3NpemVfdCBzeXNfcHJlYWQodW5zaWdu ZWQgaW50IGZkLCBjaGFyICogYnVmLA0KLQkJCSAgICAgc2l6ZV90IGNvdW50 LCBsb2ZmX3QgcG9zKQ0KK3NzaXplX3Qga3N5c19wcmVhZChzdHJ1Y3QgZmls ZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9z KQ0KIHsNCiAJc3NpemVfdCByZXQ7DQotCXN0cnVjdCBmaWxlICogZmlsZTsN CiAJc3NpemVfdCAoKnJlYWQpKHN0cnVjdCBmaWxlICosIGNoYXIgKiwgc2l6 ZV90LCBsb2ZmX3QgKik7DQogDQogCWxvY2tfa2VybmVsKCk7DQogDQogCXJl dCA9IC1FQkFERjsNCi0JZmlsZSA9IGZnZXQoZmQpOw0KLQlpZiAoIWZpbGUp DQotCQlnb3RvIGJhZF9maWxlOw0KIAlpZiAoIShmaWxlLT5mX21vZGUgJiBG TU9ERV9SRUFEKSkNCiAJCWdvdG8gb3V0Ow0KIAlyZXQgPSBsb2Nrc192ZXJp ZnlfYXJlYShGTE9DS19WRVJJRllfUkVBRCwgZmlsZS0+Zl9kZW50cnktPmRf aW5vZGUsDQotCQkJCWZpbGUsIHBvcywgY291bnQpOw0KKwkJCQlmaWxlLCAq cG9zLCBjb3VudCk7DQogCWlmIChyZXQpDQogCQlnb3RvIG91dDsNCiAJcmV0 ID0gLUVJTlZBTDsNCiAJaWYgKCFmaWxlLT5mX29wIHx8ICEocmVhZCA9IGZp bGUtPmZfb3AtPnJlYWQpKQ0KIAkJZ290byBvdXQ7DQotCWlmIChwb3MgPCAw KQ0KKwlpZiAoKnBvcyA8IDApDQogCQlnb3RvIG91dDsNCi0JcmV0ID0gcmVh ZChmaWxlLCBidWYsIGNvdW50LCAmcG9zKTsNCisJcmV0ID0gcmVhZChmaWxl LCBidWYsIGNvdW50LCBwb3MpOw0KIG91dDoNCisJdW5sb2NrX2tlcm5lbCgp Ow0KKwlyZXR1cm4gcmV0Ow0KK30NCisNCithc21saW5rYWdlIHNzaXplX3Qg c3lzX3ByZWFkKHVuc2lnbmVkIGludCBmZCwgY2hhciAqYnVmLCBzaXplX3Qg Y291bnQsDQorCWxvZmZfdCBwb3MpDQorew0KKwlzdHJ1Y3QgZmlsZSAqZmls ZTsNCisJc3NpemVfdCByZXQ7DQorDQorCWxvY2tfa2VybmVsKCk7DQorCXJl dCA9IC1FQkFERjsNCisJZmlsZSA9IGZnZXQoZmQpOw0KKwlpZiAoIWZpbGUp DQorCQlnb3RvIGJhZF9maWxlOw0KKwlyZXQgPSBrc3lzX3ByZWFkKGZpbGUs IGJ1ZiwgY291bnQsICZwb3MpOw0KIAlmcHV0KGZpbGUpOw0KKw0KIGJhZF9m aWxlOg0KIAl1bmxvY2tfa2VybmVsKCk7DQogCXJldHVybiByZXQ7DQogfQ0K IA0KLWFzbWxpbmthZ2Ugc3NpemVfdCBzeXNfcHdyaXRlKHVuc2lnbmVkIGlu dCBmZCwgY29uc3QgY2hhciAqIGJ1ZiwNCi0JCQkgICAgICBzaXplX3QgY291 bnQsIGxvZmZfdCBwb3MpDQorc3NpemVfdCBrc3lzX3B3cml0ZShzdHJ1Y3Qg ZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsDQor CWxvZmZfdCAqcG9zKQ0KIHsNCiAJc3NpemVfdCByZXQ7DQotCXN0cnVjdCBm aWxlICogZmlsZTsNCiAJc3NpemVfdCAoKndyaXRlKShzdHJ1Y3QgZmlsZSAq LCBjb25zdCBjaGFyICosIHNpemVfdCwgbG9mZl90ICopOw0KIA0KIAlsb2Nr X2tlcm5lbCgpOw0KIA0KIAlyZXQgPSAtRUJBREY7DQotCWZpbGUgPSBmZ2V0 KGZkKTsNCi0JaWYgKCFmaWxlKQ0KLQkJZ290byBiYWRfZmlsZTsNCiAJaWYg KCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQ0KIAkJZ290byBvdXQ7 DQogCXJldCA9IGxvY2tzX3ZlcmlmeV9hcmVhKEZMT0NLX1ZFUklGWV9XUklU RSwgZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsDQotCQkJCWZpbGUsIHBvcywg Y291bnQpOw0KKwkJCQlmaWxlLCAqcG9zLCBjb3VudCk7DQogCWlmIChyZXQp DQogCQlnb3RvIG91dDsNCiAJcmV0ID0gLUVJTlZBTDsNCkBAIC0zNzgsMTIg KzM5MywzMCBAQA0KIAkJZ290byBvdXQ7DQogDQogCWRvd24oJmZpbGUtPmZf ZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7DQotCXJldCA9IHdyaXRlKGZpbGUs IGJ1ZiwgY291bnQsICZwb3MpOw0KKwlyZXQgPSB3cml0ZShmaWxlLCBidWYs IGNvdW50LCBwb3MpOw0KIAl1cCgmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUt Pmlfc2VtKTsNCiANCiBvdXQ6DQorCXVubG9ja19rZXJuZWwoKTsNCisJcmV0 dXJuIHJldDsNCit9DQorDQorYXNtbGlua2FnZSBzc2l6ZV90IHN5c19wd3Jp dGUodW5zaWduZWQgaW50IGZkLCBjb25zdCBjaGFyICpidWYsDQorCXNpemVf dCBjb3VudCwgbG9mZl90IHBvcykNCit7DQorCXNzaXplX3QgcmV0Ow0KKwlz dHJ1Y3QgZmlsZSAqZmlsZTsNCisNCisJbG9ja19rZXJuZWwoKTsNCisJcmV0 ID0gLUVCQURGOw0KKwlmaWxlID0gZmdldChmZCk7DQorCWlmICghZmlsZSkN CisJCWdvdG8gYmFkX2ZpbGU7DQorCXJldCA9IGtzeXNfcHdyaXRlKGZpbGUs IGJ1ZiwgY291bnQsICZwb3MpOw0KIAlmcHV0KGZpbGUpOw0KKw0KIGJhZF9m aWxlOg0KIAl1bmxvY2tfa2VybmVsKCk7DQogCXJldHVybiByZXQ7DQogfQ0K Kw0KZGlmZiAtcnVOIGxpbnV4L2luY2x1ZGUvYXNtL2ZjbnRsLmggbGludXgt aW9jcC9pbmNsdWRlL2FzbS9mY250bC5oDQotLS0gbGludXgvaW5jbHVkZS9h c20vZmNudGwuaAlXZWQgTWFyIDI1IDE5OjM1OjExIDE5OTgNCisrKyBsaW51 eC1pb2NwL2luY2x1ZGUvYXNtL2ZjbnRsLmgJV2VkIE1hciAyNSAyMDoxMDo0 NyAxOTk4DQpAQCAtMTYsNiArMTYsMTAgQEANCiAjZGVmaW5lIE9fTkRFTEFZ CU9fTk9OQkxPQ0sNCiAjZGVmaW5lIE9fU1lOQwkJMDEwMDAwDQogI2RlZmlu ZSBGQVNZTkMJCTAyMDAwMAkvKiBmY250bCwgZm9yIEJTRCBjb21wYXRpYmls aXR5ICovDQorI2RlZmluZSBPX1NQRUNJQUwJMDQwMDAwCS8qIHNlZSBiZWxv dyAqLw0KKw0KKy8qIG1hc2sgb2ZmIGxvd2VyIDggYml0cyBmb3IgT19TUEVD SUFMIHRvIGRldGVybWluZSB0eXBlOiAqLw0KKyNkZWZpbmUgT1NQX0lPQ1AJ MQkvKiBJL08gY29tcGxldGlvbiBub3RpZmljYXRpb24gKi8NCiANCiAjZGVm aW5lIEZfRFVQRkQJCTAJLyogZHVwICovDQogI2RlZmluZSBGX0dFVEZECQkx CS8qIGdldCBmX2ZsYWdzICovDQpkaWZmIC1ydU4gbGludXgvaW5jbHVkZS9h c20taTM4Ni9mY250bC5oIGxpbnV4LWlvY3AvaW5jbHVkZS9hc20taTM4Ni9m Y250bC5oDQotLS0gbGludXgvaW5jbHVkZS9hc20taTM4Ni9mY250bC5oCVdl ZCBNYXIgMjUgMTk6MzU6MTEgMTk5OA0KKysrIGxpbnV4LWlvY3AvaW5jbHVk ZS9hc20taTM4Ni9mY250bC5oCVdlZCBNYXIgMjUgMjA6MTA6NDcgMTk5OA0K QEAgLTE2LDYgKzE2LDEwIEBADQogI2RlZmluZSBPX05ERUxBWQlPX05PTkJM T0NLDQogI2RlZmluZSBPX1NZTkMJCTAxMDAwMA0KICNkZWZpbmUgRkFTWU5D CQkwMjAwMDAJLyogZmNudGwsIGZvciBCU0QgY29tcGF0aWJpbGl0eSAqLw0K KyNkZWZpbmUgT19TUEVDSUFMCTA0MDAwMAkvKiBzZWUgYmVsb3cgKi8NCisN CisvKiBtYXNrIG9mZiBsb3dlciA4IGJpdHMgZm9yIE9fU1BFQ0lBTCB0byBk ZXRlcm1pbmUgdHlwZTogKi8NCisjZGVmaW5lIE9TUF9JT0NQCTEJLyogSS9P IGNvbXBsZXRpb24gbm90aWZpY2F0aW9uICovDQogDQogI2RlZmluZSBGX0RV UEZECQkwCS8qIGR1cCAqLw0KICNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQg Zl9mbGFncyAqLw0KZGlmZiAtcnVOIGxpbnV4L2luY2x1ZGUvbGludXgvZnMu aCBsaW51eC1pb2NwL2luY2x1ZGUvbGludXgvZnMuaA0KLS0tIGxpbnV4L2lu Y2x1ZGUvbGludXgvZnMuaAlXZWQgTWFyIDI1IDE5OjM1OjA4IDE5OTgNCisr KyBsaW51eC1pb2NwL2luY2x1ZGUvbGludXgvZnMuaAlUaHUgTWFyIDI2IDEz OjI3OjQ4IDE5OTgNCkBAIC00MDUsNiArNDA1LDggQEANCiAJc3RydWN0IGZv d25fc3RydWN0CWZfb3duZXI7DQogDQogCXVuc2lnbmVkIGxvbmcJCWZfdmVy c2lvbjsNCisJc3RydWN0IGZpbGUJCSpmX25vdGlmeTsJLyogZm9yIGkvbyBj b21wbGV0aW9uIHBvcnRzICovDQorCXN0cnVjdCBmaWxlCQkqZl9ub3RpZnlf bmV4dCwgKmZfbm90aWZ5X3ByZXY7DQogDQogCS8qIG5lZWRlZCBmb3IgdHR5 IGRyaXZlciwgYW5kIG1heWJlIG90aGVycyAqLw0KIAl2b2lkCQkJKnByaXZh dGVfZGF0YTsNCkBAIC03MjcsOCArNzI5LDEzIEBADQogZXh0ZXJuIHZvaWQg cHV0X3dyaXRlX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsNCiBleHRl cm4gc3RydWN0IGRlbnRyeSAqIG9wZW5fbmFtZWkoY29uc3QgY2hhciAqIHBh dGhuYW1lLCBpbnQgZmxhZywgaW50IG1vZGUpOw0KIGV4dGVybiBzdHJ1Y3Qg ZGVudHJ5ICogZG9fbWtub2QoY29uc3QgY2hhciAqIGZpbGVuYW1lLCBpbnQg bW9kZSwgZGV2X3QgZGV2KTsNCitleHRlcm4gc3RydWN0IGlub2RlICpnZXRf cGlwZV9pbm9kZSh2b2lkKTsNCiBleHRlcm4gaW50IGRvX3BpcGUoaW50ICop Ow0KIGV4dGVybiBpbm9fdCBmaW5kX2lub2RlX251bWJlcihzdHJ1Y3QgZGVu dHJ5ICosIHN0cnVjdCBxc3RyICopOw0KK2V4dGVybiBzc2l6ZV90IGtzeXNf cHJlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNv dW50LA0KKwlsb2ZmX3QgKnBvcyk7DQorZXh0ZXJuIHNzaXplX3Qga3N5c19w d3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6 ZV90IGNvdW50LA0KKwlsb2ZmX3QgKnBvcyk7DQogDQogLyoNCiAgKiBLZXJu ZWwgcG9pbnRlcnMgaGF2ZSByZWR1bmRhbnQgaW5mb3JtYXRpb24sIHNvIHdl IGNhbiB1c2UgYQ0KZGlmZiAtcnVOIGxpbnV4L2luY2x1ZGUvbGludXgvaW9j cC5oIGxpbnV4LWlvY3AvaW5jbHVkZS9saW51eC9pb2NwLmgNCi0tLSBsaW51 eC9pbmNsdWRlL2xpbnV4L2lvY3AuaAlXZWQgRGVjIDMxIDE2OjAwOjAwIDE5 NjkNCisrKyBsaW51eC1pb2NwL2luY2x1ZGUvbGludXgvaW9jcC5oCVRodSBN YXIgMjYgMTM6Mjk6NDcgMTk5OA0KQEAgLTAsMCArMSw2OCBAQA0KKy8qDQor ICogSS9PIGNvbXBsZXRpb24gcG9ydHMgZm9yIExpbnV4Lg0KKyAqDQorICog Um9iZXkgUG9pbnRlciA8cm9iZXlAbGFnLm5ldD4sIDkgbWFyY2ggMTk5OA0K KyAqLw0KKw0KKyNpZm5kZWYgX0xJTlVYX0lPQ1BfSA0KKyNkZWZpbmUgX0xJ TlVYX0lPQ1BfSA0KKw0KKyNkZWZpbmUgSU9DUF9NQVhRCTE1DQorDQorLyog cXVldWUgZW50cmllcyBmb3IgcGVuZGluZyBpL28gKGtlcm5lbCkgKi8NCitz dHJ1Y3QgaW9jcF9pbyB7DQorCXN0cnVjdCBmaWxlCQkqZjsNCisJdm9pZAkJ CSpidWZmZXI7DQorCXNpemVfdCAJCQluYnl0ZXM7CQkvKiBieXRlcyB0cmFu c2ZlcnJlZCAqLw0KKwlsb2ZmX3QJCQkqb2Zmc2V0OwkvKiBvbmx5IGZvciBw cmVhZC9wd3JpdGUgKi8NCisJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOwkJ Lyogd2hpY2ggcHJvY2VzcyBpbml0aWF0ZWQgKi8NCisJdW5zaWduZWQgaW50 CQlmbGFnczsJCS8qIHNlZSBiZWxvdyAqLw0KK307DQorI2RlZmluZSBJT0NQ UV9SRUFECTB4MDAwMQkvKiByZWFkIHJlcXVlc3QgKi8NCisjZGVmaW5lIElP Q1BRX1dSSVRFCTB4MDAwMgkvKiB3cml0ZSByZXF1ZXN0ICovDQorI2RlZmlu ZSBJT0NQUV9SV01BU0sJMHgwMDAzDQorLyogaW50ZXJuYWwtdXNlIGZsYWdz IGZvciBob3VzZWtlZXBpbmc6ICovDQorI2RlZmluZSBJT0NQUV9SRUFEWQkw eDAxMDAJLyogaS9vIHdpbGwgcHJvYmFibHkgbm90IGJsb2NrICovDQorDQor LyogY29tcGxldGVkIGkvbyBzdHJ1Y3QgdGhhdCB3aWxsIGJlIHJldHVybmVk IHRvIHVzZXJzICovDQorc3RydWN0IGlvY3BfaW9fdXNlciB7DQorCWxvbmcJ CWZkOw0KKwl2b2lkCQkqYnVmZmVyOw0KKwlzaXplX3QJCW5ieXRlczsJCS8q IGJ5dGVzIHJlcXVlc3RlZCAqLw0KKwlzaXplX3QJCW5yZXN1bHQ7CS8qIGJ5 dGVzIGFjdHVhbGx5IGNvcGllZCAqLw0KKwlsb2ZmX3QgCQlvZmZzZXQ7DQor CXVuc2lnbmVkIGludAlmbGFnczsNCisJdW5zaWduZWQgaW50CWVycm9yOw0K K307DQorDQorLyogcHJpdmF0ZV9kYXRhIHBhcnQgb2YgYW4gSU9DUCAiZmls ZSIgKi8NCisvKiBzaG91bGQgdGhlIHNpemUgb2YgdGhlIHF1ZXVlIGJlIHVz ZXItc2V0dGFibGU/ICBwb3NzaWJsZSBhYnVzZS4uLiAqLw0KK3N0cnVjdCBp b2NwX3ByaXZhdGUgew0KKwlzcGlubG9ja190CWxvY2s7DQorCWludAkJaW5x X3RhaWw7DQorCXN0cnVjdCBpb2NwX2lvCWlucVtJT0NQX01BWFFdOwkJLyog cGVuZGluZyBpL28gKi8NCisJc3RydWN0IGZpbGUJKm5leHQ7CQkvKiBsaW5r ZWQgbGlzdCBvZiB3YXRjaGVkIGZpbGVzICovDQorfTsNCisNCisvKiBpb2N0 bCBzdHVmZiAqLw0KK3N0cnVjdCBpb2NwX3dhdGNoIHsNCisJdW5zaWduZWQg bG9uZwlmZDsJLyogZmQgdG8gd2F0Y2ggKi8NCisJaW50CQl3YXRjaDsJLyog b24vb2ZmICovDQorfTsNCisNCisjZGVmaW5lIElPQ1BTV0FUQ0gJX0lPVygn cCcsIDB4YTAsIHN0cnVjdCBpb2NwX3dhdGNoKQ0KKyNkZWZpbmUgSU9DUEdX QVRDSAlfSU9XUigncCcsIDB4YTEsIHN0cnVjdCBpb2NwX3dhdGNoKQ0KKw0K K2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlvY3BfZmlsZV9vcHM7 DQorDQoraW50IGlvY3BfbmV3KHVuc2lnbmVkIGxvbmcgZmQpOw0KK2ludCBp b2NwX2FkZHEoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IHZvaWQgKmJ1ZmZl ciwgc2l6ZV90IG5ieXRlcywNCisJbG9mZl90ICpvZmZzZXQsIHVuc2lnbmVk IGludCBmbGFncyk7DQordm9pZCBpb2NwX3B1dChzdHJ1Y3QgZmlsZSAqZmls cCk7DQordm9pZCBpb2NwX25vdGlmeShzdHJ1Y3QgZmlsZSAqZmlscCwgdW5z aWduZWQgaW50IGZsYWdzKTsNCitpbnQgaW9jcF9pb19yZWFkeShzdHJ1Y3Qg aW9jcF9wcml2YXRlICpwcik7DQordm9pZCBpb2NwX3BvcChzdHJ1Y3QgaW9j cF9wcml2YXRlICpwciwgaW50IHdoaWNoLCBzdHJ1Y3QgaW9jcF9pbyAqaW8p Ow0KK3ZvaWQgaW9jcF9wdXNoKHN0cnVjdCBpb2NwX3ByaXZhdGUgKnByLCBz dHJ1Y3QgaW9jcF9pbyAqaW8pOw0KKw0KKyNlbmRpZg0KKw0KZGlmZiAtcnVO IGxpbnV4L25ldC9zb2NrZXQuYyBsaW51eC1pb2NwL25ldC9zb2NrZXQuYw0K LS0tIGxpbnV4L25ldC9zb2NrZXQuYwlXZWQgTWFyIDI1IDE5OjM1OjE5IDE5 OTgNCisrKyBsaW51eC1pb2NwL25ldC9zb2NrZXQuYwlGcmkgTWFyIDI3IDE2 OjA3OjQ5IDE5OTgNCkBAIC03NSw2ICs3NSw3IEBADQogI2luY2x1ZGUgPGxp bnV4L3dhbnJvdXRlci5oPg0KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+DQog I2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4NCisjaW5jbHVkZSA8bGludXgvaW9j cC5oPg0KIA0KICNpZiBkZWZpbmVkKENPTkZJR19LRVJORUxEKSAmJiBkZWZp bmVkKENPTkZJR19ORVQpDQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbGQuaD4N CkBAIC01NDMsNyArNTQ0LDEwIEBADQogDQogaW50IHNvY2tfd2FrZV9hc3lu YyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgaG93KQ0KIHsNCi0JaWYgKCFz b2NrIHx8ICFzb2NrLT5mYXN5bmNfbGlzdCkNCisJaWYgKCFzb2NrKQ0KKwkJ cmV0dXJuIC0xOw0KKwlpZiAoKCFzb2NrLT5mYXN5bmNfbGlzdCkgJiYNCisJ CSgoIXNvY2stPmZpbGUpIHx8ICghc29jay0+ZmlsZS0+Zl9ub3RpZnkpKSkN CiAJCXJldHVybiAtMTsNCiAJc3dpdGNoIChob3cpDQogCXsNCkBAIC01NTMs NiArNTU3LDggQEANCiAJCWNhc2UgMToNCiAJCQlpZiAoIShzb2NrLT5mbGFn cyAmIFNPX1dBSVREQVRBKSkNCiAJCQkJa2lsbF9mYXN5bmMoc29jay0+ZmFz eW5jX2xpc3QsIFNJR0lPKTsNCisJCQlpZiAoc29jay0+ZmlsZS0+Zl9ub3Rp ZnkpDQorCQkJCWlvY3Bfbm90aWZ5KHNvY2stPmZpbGUsIElPQ1BRX1JFQUQp Ow0KIAkJCWJyZWFrOw0KIAkJY2FzZSAyOg0KIAkJCWlmIChzb2NrLT5mbGFn cyAmIFNPX05PU1BBQ0UpDQpAQCAtNTYwLDYgKzU2Niw4IEBADQogCQkJCWtp bGxfZmFzeW5jKHNvY2stPmZhc3luY19saXN0LCBTSUdJTyk7DQogCQkJCXNv Y2stPmZsYWdzICY9IH5TT19OT1NQQUNFOw0KIAkJCX0NCisJCQlpZiAoc29j ay0+ZmlsZS0+Zl9ub3RpZnkpDQorCQkJCWlvY3Bfbm90aWZ5KHNvY2stPmZp bGUsIElPQ1BRX1dSSVRFKTsNCiAJCQlicmVhazsNCiAJfQ0KIAlyZXR1cm4g MDsNCg== ---1647234734-886522687-891049958=:8185 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="iocp-test.c" Content-Transfer-Encoding: BASE64 Content-ID: <Pine.LNX.3.95.980327175238.8185C@kitten> Content-Description:

LyogdGVzdCBvZiBhbiBpb2NwLWVuaGFuY2VkIGtlcm5lbCAqLw0KDQojaW5j bHVkZSA8c3RkaW8uaD4NCiNpbmNsdWRlIDxzdGRsaWIuaD4NCiNpbmNsdWRl IDxmY250bC5oPg0KI2luY2x1ZGUgPGVycm5vLmg+DQojaW5jbHVkZSA8c3lz L3R5cGVzLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUg PG5ldGluZXQvaW4uaD4NCiNpbmNsdWRlIDxhcnBhL2luZXQuaD4NCg0KLyog c2l6ZW9mID0gOCAqLw0Kc3RydWN0IGlvY3Bfd2F0Y2ggew0KCXVuc2lnbmVk IGxvbmcgZmQ7DQoJaW50IHdhdGNoOw0KfTsNCg0KI2RlZmluZSBPX0lPQ1AJ MDQwMDAxDQojZGVmaW5lIElPQ1BTV0FUQ0gJMHg0MDA4NzBBMA0KI2RlZmlu ZSBJT0NQR1dBVENICTB4QzAwODcwQTENCiNkZWZpbmUgSU9DUF9SRUFECTEN Cg0Kc3RydWN0IGlvY3BfaW8gew0KCWxvbmcgZmQ7DQoJdm9pZCAqYnVmZmVy Ow0KCXVuc2lnbmVkIGludCBuYnl0ZXM7DQoJdW5zaWduZWQgaW50IG5yZXN1 bHQ7DQoJbG9uZyBsb25nIG9mZnNldDsNCgl1bnNpZ25lZCBpbnQgZmxhZ3M7 DQoJdW5zaWduZWQgaW50IGVycm9yOw0KfTsNCg0KaW50IGdldF9pb2NwX3Jl c3VsdChpbnQgaW9jcCwgdm9pZCAqKmJ1ZiwgaW50ICpuYnl0ZXMpDQp7DQoJ c3RydWN0IGlvY3BfaW8gY29tcGw7DQoJaW50IG47DQoNCgluID0gcmVhZChp b2NwLCAmY29tcGwsIHNpemVvZihjb21wbCkpOw0KCWlmIChuIDwgMCkgew0K CQlwZXJyb3IoImlvY3AgcmVhZCIpOw0KCQlleGl0KDEpOw0KCX0NCglpZiAo biAhPSBzaXplb2YoY29tcGwpKQ0KCQlwcmludGYoIm9kZDogaW9jcCByZWFk ICVkLCBub3QgJWRcbiIsIG4sIHNpemVvZihjb21wbCkpOw0KCXByaW50Zigi ICAgICVzKCVkLCAlMDhYLCAldSkgPSAlZFxuIiwgY29tcGwuZmxhZ3MgJiBJ T0NQX1JFQUQgPw0KCQkicmVhZCIgOiAid3JpdGUiLCBjb21wbC5mZCwgY29t cGwuYnVmZmVyLA0KCQljb21wbC5uYnl0ZXMsIGNvbXBsLmVycm9yID8gLTEg OiBjb21wbC5ucmVzdWx0KTsNCglpZiAoY29tcGwuZXJyb3IpDQoJCXByaW50 ZigiICAgIGVycm5vID0gJXVcbiIsIGNvbXBsLmVycm9yKTsNCgkqYnVmID0g Y29tcGwuYnVmZmVyOw0KCSpuYnl0ZXMgPSBjb21wbC5ucmVzdWx0Ow0KCXJl dHVybiBjb21wbC5lcnJvcjsNCn0NCg0Kdm9pZCBtYWluKGludCBhcmdjLCBj aGFyICoqYXJndikNCnsNCglpbnQgc2QsIGlvY3AsIG47DQoJc3RydWN0IGlv Y3Bfd2F0Y2ggaXc7DQoJc3RydWN0IHNvY2thZGRyX2luIHNhOw0KCWNoYXIg YnVmWzE2XSwgKmJ1ZjI7DQoNCgkvKiBtYWtlIGFuIGlvY3AgKi8NCglpb2Nw ID0gb3BlbihOVUxMLCBPX0lPQ1AsIDApOw0KCWlmIChpb2NwIDwgMCkgew0K CQlwZXJyb3IoIm9wZW4gaW9jcCIpOw0KCQlleGl0KDEpOw0KCX0NCgkvKiBv cGVuIGEgc29ja2V0ICovDQoJc2QgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19T VFJFQU0sIDApOw0KCWlmIChzZCA8IDApIHsNCgkJcGVycm9yKCJzb2NrZXQi KTsNCgkJZXhpdCgxKTsNCgl9DQoJLyogYmluZCAqLw0KCXNhLnNpbl9hZGRy LnNfYWRkciA9IDBMOw0KCXNhLnNpbl9wb3J0ID0gMDsNCglzYS5zaW5fZmFt aWx5ID0gQUZfSU5FVDsNCglpZiAoYmluZChzZCwgJnNhLCBzaXplb2Yoc2Ep KSA8IDApIHsNCgkJcGVycm9yKCJiaW5kIik7DQoJCWV4aXQoMSk7DQoJfQ0K CS8qIGNvbm5lY3QgdG8gcG9ydCA4MCh3d3cpIG9mIDIwNC43MS4xNzcuNzEg Ki8NCglpZiAoaW5ldF9hdG9uKCIyMDQuNzEuMTc3LjcxIiwgJihzYS5zaW5f YWRkcikpIDwgMCkgew0KCQlwZXJyb3IoImluZXRfYXRvbiIpOw0KCQlleGl0 KDEpOw0KCX0NCglzYS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsNCglzYS5zaW5f cG9ydCA9IGh0b25zKDgwKTsNCglpZiAoY29ubmVjdChzZCwgJnNhLCBzaXpl b2Yoc2EpKSA8IDApIHsNCgkJcGVycm9yKCJjb25uZWN0Iik7DQoJCWV4aXQo MSk7DQoJfQ0KDQoJaWYgKGZjbnRsKHNkLCBGX1NFVEZMLCBPX05PTkJMT0NL KSA8IDApIHsNCgkJcGVycm9yKCJmY250bCIpOw0KCQlleGl0KDEpOw0KCX0N Cg0KCWl3LmZkID0gc2Q7DQoJaXcud2F0Y2ggPSA5Ow0KCWlmIChpb2N0bChp b2NwLCBJT0NQR1dBVENILCAmaXcpIDwgMCkgew0KCQlwZXJyb3IoImlvY3Bn d2F0Y2giKTsNCgkJZXhpdCgxKTsNCgl9DQoJaWYgKGl3LndhdGNoKQ0KCQlw cmludGYoImtlcm5lbCBzYXlzIHNvY2tldCAlZCBpcyBhbHJlYWR5IHdhdGNo ZWQhXG4iLCBzZCk7DQoJaXcud2F0Y2ggPSAxOw0KCWlmIChpb2N0bChpb2Nw LCBJT0NQU1dBVENILCAmaXcpIDwgMCkgew0KCQlwZXJyb3IoImlvY3Bzd2F0 Y2giKTsNCgkJZXhpdCgxKTsNCgl9DQoJcHJpbnRmKCJqdXN0IHNldCBzb2Nr ZXQgJWQgdG8gYmUgd2F0Y2hlZCBieSBpb2NwICVkXG4iLCBzZCwgaW9jcCk7 DQoJaWYgKGlvY3RsKGlvY3AsIElPQ1BHV0FUQ0gsICZpdykgPCAwKSB7DQoJ CXBlcnJvcigiaW9jcGd3YXRjaCIpOw0KCQlleGl0KDEpOw0KCX0NCglwcmlu dGYoImtlcm5lbCBzYXlzIHNvY2tldCAlZCAlcyB3YXRjaGVkIGJ5IGlvY3Ag JWRcbiIsDQoJCXNkLCBpdy53YXRjaCA/ICJpcyIgOiAiaXNuJ3QiLCBpb2Nw KTsNCgkNCgkvKiB3cml0ZSBteSBodHRwIHJlcXVlc3QgKi8NCgluID0gd3Jp dGUoc2QsICJHRVQgLyBIVFRQLzEuMFxyXG5cclxuIiwgMTgpOw0KCWlmIChu IDwgMCkgcGVycm9yKCJzb2NrZXQgd3JpdGUgdmlhIGlvY3AiKTsNCglpZiAo biA+PSAwKSB7DQoJCXByaW50Zigic29tZWhvdywgaSB3cm90ZSAlZCBieXRl cyB0byB0aGUgYXN5bmMgc29ja2V0LlxuIiwNCgkJCW4pOw0KCQlleGl0KDEp Ow0KCX0NCgkvKiBub3cgdHJ5IGFuIGlvY3AgcmVhZCAqLw0KCW4gPSByZWFk KHNkLCBidWYsIDgpOw0KCWlmIChuIDwgMCkgcGVycm9yKCJzb2NrZXQgcmVh ZCB2aWEgaW9jcCIpOw0KCWlmIChuID49IDApIHsNCgkJcHJpbnRmKCJzb21l aG93LCBpIHJlYWQgJWQgYnl0ZXMgZnJvbSB0aGUgYXN5bmMgc29ja2V0Llxu IiwNCgkJCW4pOw0KCQlleGl0KDEpOw0KCX0NCglwcmludGYoInBlcmZvcm1p bmcgcmVhZCBvbiBpb2NwIHRvIHB1bGwgaW4gdGhlIHJlc3VsdHMuXG4iKTsN CglpZiAoZ2V0X2lvY3BfcmVzdWx0KGlvY3AsICh2b2lkICoqKSZidWYyLCAm bikgPT0gMCkgew0KCQlwcmludGYoIiAgICBidWZmZXIgPSAnJWMlYyVjJWMl YyVjJWMlYycuLi5cbiIsIGJ1ZjJbMF0sIGJ1ZjJbMV0sDQoJCQlidWYyWzJd LCBidWYyWzNdLCBidWYyWzRdLCBidWYyWzVdLCBidWYyWzZdLCBidWYyWzdd KTsNCgl9DQoJaWYgKGdldF9pb2NwX3Jlc3VsdChpb2NwLCAodm9pZCAqKikm YnVmMiwgJm4pID09IDApIHsNCgkJaWYgKGJ1ZiAhPSBidWYyKQ0KCQkJcHJp bnRmKCIhISAgYnVmICE9IGNvbXBsLmJ1ZmZlclxuIik7DQoJCXByaW50Zigi ICAgIGJ1ZmZlciA9ICclYyVjJWMlYyVjJWMlYyVjJ1xuIiwgYnVmMlswXSwg YnVmMlsxXSwNCgkJCWJ1ZjJbMl0sIGJ1ZjJbM10sIGJ1ZjJbNF0sIGJ1ZjJb NV0sIGJ1ZjJbNl0sIGJ1ZjJbN10pOw0KCX0NCg0KCWl3LndhdGNoID0gMDsN CglpZiAoaW9jdGwoaW9jcCwgSU9DUFNXQVRDSCwgJml3KSA8IDApIHsNCgkJ cGVycm9yKCJpb2Nwc3dhdGNoIik7DQoJCWV4aXQoMSk7DQoJfQ0KCWl3Lndh dGNoID0gOTsNCglpZiAoaW9jdGwoaW9jcCwgSU9DUEdXQVRDSCwgJml3KSA8 IDApIHsNCgkJcGVycm9yKCJpb2NwZ3dhdGNoIik7DQoJCWV4aXQoMSk7DQoJ fQ0KCWlmIChpdy53YXRjaCkNCgkJcHJpbnRmKCIhISBrZXJuZWwgZGlkbid0 IHR1cm4gb2ZmIHRoZSB3YXRjaFxuIik7DQoNCgljbG9zZShzZCk7DQoJY2xv c2UoaW9jcCk7DQp9DQoNCg== ---1647234734-886522687-891049958=:8185--

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu