Re: attempt to re-implement sillyrename for NFS in 2.1.*

Claus-Justus Heine (Heine@physik.rwth-aachen.de)
25 Aug 1997 00:55:57 +0200


--pgp-sign-Multipart_Mon_Aug_25_00:54:59_1997-1
Content-Type: multipart/mixed;
boundary="Multipart_Mon_Aug_25_00:54:59_1997-1"
Content-Transfer-Encoding: 7bit

--Multipart_Mon_Aug_25_00:54:59_1997-1
Content-Type: text/plain; charset=US-ASCII

Bill Hawes <whawes@star.net> writes:

>
> Linus Torvalds wrote:
> > > i) "rm -f fii" will create some temp file. Ok. Nice. Should do that.
> > > ii) "rm -f foo" so what? It either is a kind of no op, as the
> > > ".nfs#ino" file already exists. I encountered that case: the
> > > nfsd didn't do anything in this case.
> > > Or it silently renames "foo" to the same ".nfs#ino" file (foo and
> > > fii share the same inode).
> >
> > Good point. "jiffies" retained,
>
> A minor point ... if we're using the nfs server on the local machine,
> the jiffie counter wouldn't necessarily change between two back-to-back
> silly renames. Perhaps it would be better to just increment a
> silly-rename counter to provide the unique numbering?

Argh. I'm feeling really silly now. Yes, of course, this would be the
easiest solution. Originally I tried to avoid doing a lookup at all,
which couldn't work anyway; but this is the reason why that jiffies
idea came into my mind. I just forgot to forget this idea :)

I second that: simply use a counter instead of the jiffies hack. To
avoid too many lookups one should indeed keep the i_ino number such
that the temporary file name "tends to be unique".

The patch below drops the jiffies stuff and implements unique silly
renamed filenames using i_ino and a counter.

---- Several hours later ----

I'm sorry, no patch. The silly rename is not the problem. But (quoted from
fs/nfs/dir.c, a comment of Olaf Kirch):

* RENAME
* FIXME: Some nfsds, like the Linux user space nfsd, may generate a
* different file handle for the same inode after a rename (e.g. when
* moving to a different directory). A fail-safe method to do so would
* be to look up old_dir/old_name, create a link to new_dir/new_name and
* rename the old file using the sillyrename stuff. This way, the original
* file in old_dir will go away when the last process iput()s the inode.

Now, to be a bit more exact: all Linux user space nfsd WILL -- not may --
generate a different file handle for the same inode when

i) It is renamed accross directories
ii) It is linked into another directory.

Fine :(

Solution for
i) Create a link to the target. Update the nfs file handle from the
server, using the target's name. Then unlink the old name. This will
work and is no problem as we have access to all relevant dentries.

ii) Well, this is no problem. It works automatically, because: when the inode
is accessed using the other name, the server will get the nfs file
handle it has newly created. And this is the valid file handle. No
problem whatsoever.

But what gets really messy is the unlink() stuff. Imagine the
following scenario: two directories, one called "foo1" the other
"foo2". We touch a file called "foo" in "foo1" and run a "tail -f" to
keep that inode open, then link it into "foo2"

#!/bin/sh
touch foo1/foo
tail -f foo1/foo &
ln foo1/foo foo2

As mentioned above this doesn't produce any error. But let's have a
look what happened to the nfs filehandles on the server side:

"touch foo1/foo" created a new inode and a nfs file handle, say "fh1"
"tail -f foo1/foo &" simply keeps the inode open.

"ln foo1/foo foo2" causes the server to create a new nfs file handle,
call it "fh2". Now, I don't know whether "fh1" has been discarded by
unfsd, but in any case, the inode struct on the client side got the
new file handle "fh2" and has placed it in its "struct inode".

And now:

#!/bin/sh
rm -f foo2/foo

Argh! This causes the server to discard the "fh2" file handle and
produces an "-ESTALE" error. And the "fh1" file handle is gone, at
least on the client side.

I have thought about the following:

a) Create a new flag DCACHE_NFS_FH_INVALIDE for a dentry->d_flags that
will cause lookup_revalidate() to query the server about the new
file handle.

This will not work, unluckily, as the "tail -f" already has opened
the file and keeps it open and thus won't do any dcache lookup.

b) Before nfs_unlink() actually places the call to the server, it could
traverse the alias list of the inode like follows (pseudo code):

while (tmp != head) {
struct dentry *dalias = list_entry(tmp, etc ... )

dget(dalias);
error = nfs_fh_revalidate(dalias->d_parent->d_inode, dalias);
dput(dalias);
if (!error)
break;
tmp = tmp->next;
}

Only: it is ugly and will probably not work in all cases. Ok, when
unlinking inodes we hold a lock on the parent directory, but not
the locks for all the directories this inode has been linked into.

Therefore the dalias dentry may very well be scheduled for deletion
while we work on it. And even the i_dentry alias list may be
altered while nfs_fh_revalidate() places its call to the server and
sleeps.

So this won't work either.

c) Modify the NFS_FH(inode) macro to automatically update the nfs file
handle from the server, if flagged. Of course, this cannot work
either as one needs the name of the file to get the file handle
for. And this could be accomplished only by traversing the alias
list ...

In my opinion this is a severe bug in the user level nfs daemon. There
is just no simple way to compensate for it on the client side (at
least I don't see a way. FIXME.)

Maybe somebody with more experience could give a hint if this is
really a bug in the unfsd, or whether other nfs servers of other Unix
variants show the same behavior, i.e. alter the nfs file handle when
moving inodes around directories.

Ok. Here is a patch. But I have omitted the hacks my previous patch
did to allow nfs_rename() to work partly. I'd rather like to fix the
nfs server (the old user level nfs server, don't know what the kernel
level server does with such kind of stuff).

Thanks

Claus

--Multipart_Mon_Aug_25_00:54:59_1997-1
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="linux-2.1.51.silly-3.dif"
Content-Transfer-Encoding: base64

LS0tIC91c3Ivc3JjL2xpbnV4LTIuMS41MS9mcy9kY2FjaGUuYwlUaHUgQXVnIDIxIDE5OjE5
OjI3IDE5OTcKKysrIGxpbnV4LTIuMS41MS1uZnMtc3dhcC9mcy9kY2FjaGUuYwlTYXQgQXVn
IDIzIDIwOjI4OjA5IDE5OTcKQEAgLTcxLDEyICs3MSwxNiBAQAogCQl9CiAJCWRlbnRyeS0+
ZF9jb3VudCA9IGNvdW50OwogCQlpZiAoIWNvdW50KSB7CisJCQlpZiAoZGVudHJ5LT5kX29w
ICYmIGRlbnRyeS0+ZF9vcC0+ZF9kZWxldGUpIHsKKwkJCQkoKmRlbnRyeS0+ZF9vcC0+ZF9k
ZWxldGUpKGRlbnRyeSk7CisJCQl9CiAJCQlsaXN0X2RlbCgmZGVudHJ5LT5kX2xydSk7CiAJ
CQlpZiAobGlzdF9lbXB0eSgmZGVudHJ5LT5kX2hhc2gpKSB7CiAJCQkJc3RydWN0IGlub2Rl
ICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAkJCQlzdHJ1Y3QgZGVudHJ5ICogcGFyZW50
OwogCQkJCWlmIChpbm9kZSkgewogCQkJCQlsaXN0X2RlbCgmZGVudHJ5LT5kX2FsaWFzKTsK
KwkJCQkJZGVudHJ5LT5kX2lub2RlID0gTlVMTDsKIAkJCQkJaXB1dChpbm9kZSk7CiAJCQkJ
fQogCQkJCXBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7Ci0tLSAvdXNyL3NyYy9saW51eC0y
LjEuNTEvZnMvbmZzL2Rpci5jCVRodSBBdWcgMjEgMTk6MTk6MjggMTk5NworKysgbGludXgt
Mi4xLjUxLW5mcy1zd2FwL2ZzL25mcy9kaXIuYwlNb24gQXVnIDI1IDAwOjQ5OjM3IDE5OTcK
QEAgLTcsNiArNywxMSBAQAogICoKICAqIDEwIEFwciAxOTk2CUFkZGVkIHNpbGx5IHJlbmFt
ZSBmb3IgdW5saW5rCS0tb2tpcgogICogMjggU2VwIDE5OTYJSW1wcm92ZWQgZGlyZWN0b3J5
IGNhY2hlIC0tb2tpcgorICogMjMgQXVnIDE5OTcgIENsYXVzIEhlaW5lIGNsYXVzQG1vbW8u
bWF0aC5yd3RoLWFhY2hlbi5kZSAKKyAqICAgICAgICAgICAgICBSZS1pbXBsZW1lbnRlZCBz
aWxseSByZW5hbWUgZm9yIHVubGluay4KKyAqICAgICAgICAgICAgICBGb2xsb3dpbmcgTGlu
dXMgY29tbWVudHMgb24gbXkgb3JpZ2luYWwgaGFjaywgdGhpcyB2ZXJzaW9uCisgKiAgICAg
ICAgICAgICAgZGVwZW5kcyBvbmx5IG9uIHRoZSBkY2FjaGUgc3R1ZmYgYW5kIGRvZXNuJ3Qg
dG91Y2ggdGhlIGlub2RlCisgKiAgICAgICAgICAgICAgbGF5ZXIgKGlwdXQoKSBhbmQgZnJp
ZW5kcykuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CkBAIC0zNDksMTAgKzM1
NCwxMyBAQAogCXJldHVybiB0aW1lIDwgbWF4OwogfQogCitzdGF0aWMgdm9pZCBuZnNfc2ls
bHlfZGVsZXRlKHN0cnVjdCBkZW50cnkgKik7CisKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5X29w
ZXJhdGlvbnMgbmZzX2RlbnRyeV9vcGVyYXRpb25zID0gewogCW5mc19sb29rdXBfcmV2YWxp
ZGF0ZSwKIAkwLAkJCS8qIGRfaGFzaCAqLwogCTAsCQkJLyogZF9jb21wYXJlICovCisJbmZz
X3NpbGx5X2RlbGV0ZSwKIH07CiAKIHN0YXRpYyBpbnQgbmZzX2xvb2t1cChzdHJ1Y3QgaW5v
ZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKQEAgLTM3OCw3ICszODYsNiBAQAog
CiAJaW5vZGUgPSBOVUxMOwogCWlmICghZXJyb3IpIHsKLQkJZXJyb3IgPSAtRU5PRU5UOwog
CQlpbm9kZSA9IG5mc19maGdldChkaXItPmlfc2IsICZmaGFuZGxlLCAmZmF0dHIpOwogCQlp
ZiAoIWlub2RlKQogCQkJcmV0dXJuIC1FQUNDRVM7CkBAIC01MzAsMTQgKzUzNywxNDQgQEAK
IAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFdlIHNob3VsZCBkbyBzaWxseS1yZW5hbWUgaGVy
ZSwgYnV0IEknbSB0b28gbGF6eSB0byBmaXgKLSAqIHVwIHRoZSBkaXJlY3RvcnkgZW50cnkg
aW1wbGljYXRpb25zIG9mIGl0Li4KKworLyogIE5vdGU6IHdlIGNvcHkgdGhlIGNvZGUgZnJv
bSBsb29rdXBfZGVudHJ5KCkgaGVyZSwgb25seTogd2UgaGF2ZSB0bworICogIG9taXQgdGhl
IGRpcmVjdG9yeSBsb2NrLiBXZSBhcmUgYWxyZWFkeSB0aGUgb3duZXIgb2YgdGhlIGxvY2sg
d2hlbgorICogIHdlIHJlYWNoIGhlcmUuIEFuZCAiZG93bigmZGlyLT5pX3NlbSkiIHdvdWxk
IG1ha2UgdXMgc2xlZXAgZm9yZXZlcgorICogICgnY2F1c2UgV0UgaGF2ZSB0aGUgbG9jaykK
KyAqIAorICogIFZFUlkgSU1QT1JUQU5UOiBjYWxjdWxhdGUgdGhlIGhhc2ggZm9yIHRoaXMg
ZGVudHJ5ISEhISEhISEKKyAqICBPdGhlcndpc2UgdGhlIGNhY2hlZCBsb29rdXAgREVGSU5J
VEVMWSBXSUxMIGZhaWwuIEFuZCBhIG5ldyBkZW50cnkKKyAqICBpcyBjcmVhdGVkLiBXaXRo
b3V0IHRoZSBEQ0FDSEVfTkZTRlNfUkVOQU1FRCBmbGFnLiBBbmQgd2l0aCBkX2NvdW50Cisg
KiAgPT0gMS4gQW5kIHRyb3VibGUuCisgKgorICogIENvbmNlcm5pbmcgbXkgY2hvaWNlIG9m
IHRoZSB0ZW1wIG5hbWU6CisgKgorICogICAgICAgICAgICAgICAgICIubmZzI2lfaW5vLiNz
Y291bnRlciIKKyAqCisgKiAgd2hlcmUgIiNpX2lubyIgaXMgdGhlIGhleCByZXByZXNlbnRh
dGlvbiBvZiBkZW50cnktPmRfaW5vZGUtPmlfaW5vCisgKiAgd2hpY2ggc2VydmVzIHRvIGNy
ZWF0ZSBkaWZmZXJlbnQgbmFtZXMgZm9yIGRpZmZlcmVudCBpbm9kZXMuICBUaGUKKyAqICAj
c2NvdW50ZXIgc2ltcGx5IGlzIGEgY291bnRlciB0aGF0IHNlcnZlcyB0byBjcmVhdGUgZGlm
ZmVyZW50CisgKiAgbmFtZXMgZm9yIGRpZmZlcmVudCBpbnN0YW5jZXMgZm9yIHRoZSBzYW1l
IGlub2RlIGluIHRoZSBzYW1lCisgKiAgZGlyZWN0b3J5IChpLmUuIGhhcmRsaW5rcykuICBU
byBhdm9pZCB1bm5lY2Vzc2FyeSBsb29rdXBzIHdlIG1ha2UKKyAqICB0aGF0IGNvdW50ZXIg
YSBTVEFUSUMgdmFyaWFibGUgdGhhdCBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgYQorICog
IHNpbGx5cmVuYW1lKCkgaGFwcGVucy4gVGh1cyBpdHMgdmFsdWUgZ2l2ZXMgdGhlIHRvdGFs
IG51bWJlciBvZgorICogIGNhbGxzIHRvIHNpbGx5cmVuYW1lKCkgYW5kIGFscmVhZHkgdGhl
IGZpcnN0IGF0dGVtcHQgc2hvdWxkIGNyZWF0ZQorICogIGEgdW5pcXVlIG5hbWUgY3VycmVu
dGx5IHVudXNlZC4gSSdkIGxpa2UgaXQgYmV0dGVyIHRvIG1ha2UgdGhlCisgKiAgc2NvdW50
ZXIgYSBwZXItaW5vZGUgY291bnRlciBidXQgaXQncyBub3Qgd29ydGggdGhlIGVmZm9ydC4K
KyAqCisgKiAgVG8gY2F0Y2ggdGhlIHVubGlrZWx5IGNhc2UgdGhhdCB0aGVyZSByZWFsbHkg
YWxyZWFkeSBleGlzdHMKKyAqICBzdWNoIGEgZmlsZSB3ZSBzaW1wbHkgaW5jcmVtZW50IHNj
b3VudGVyIGFuZCByZXRyeS4KKyAqCisgKiAgT2YgY291cnNlLCBzb21lYm9keSBjb3VsZCB0
cnkgdG8gcGxheSB0cmlja3MgYW5kIHRvdWNoIE1BWElOVAorICogIGZpbGVzIGZvbGxvd2lu
ZyB0aGUgbmFtaW5nIHNjaGVtZSBhYm92ZSAuLi4KICAqLwotc3RhdGljIGludCBuZnNfdW5s
aW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCisKK3N0YXRp
Yworc3RydWN0IGRlbnRyeSAqbmZzX3NpbGx5X2xvb2t1cChzdHJ1Y3QgZGVudHJ5ICpwYXJl
bnQsIGNoYXIgKnNpbGx5LCBpbnQgc2xlbikKK3sKKwlzdHJ1Y3QgcXN0ciAgICBzcXN0cjsK
KwlzdHJ1Y3QgZGVudHJ5ICpzZGVudHJ5OworCWludCBpLCBlcnJvcjsKKworCXNxc3RyLm5h
bWUgPSBzaWxseTsKKwlzcXN0ci5sZW4gID0gc2xlbjsKKwlzcXN0ci5oYXNoID0gaW5pdF9u
YW1lX2hhc2goKTsKKwlmb3IgKGk9IDA7IGkgPCBzbGVuOyBpKyspCisJCXNxc3RyLmhhc2gg
PSBwYXJ0aWFsX25hbWVfaGFzaChzaWxseVtpXSwgc3FzdHIuaGFzaCk7CisJc3FzdHIuaGFz
aCA9IGVuZF9uYW1lX2hhc2goc3FzdHIuaGFzaCk7CisJc2RlbnRyeSA9IGRfbG9va3VwKHBh
cmVudCwgJnNxc3RyKTsKKwlpZiAoIXNkZW50cnkpIHsKKwkJc2RlbnRyeSA9IGRfYWxsb2Mo
cGFyZW50LCAmc3FzdHIpOworCQlpZiAoc2RlbnRyeSA9PSBOVUxMKQorCQkJcmV0dXJuIEVS
Ul9QVFIoLUVOT01FTSk7CisJCWVycm9yID0gbmZzX2xvb2t1cChwYXJlbnQtPmRfaW5vZGUs
IHNkZW50cnkpOworCQlpZiAoZXJyb3IpIHsKKwkJCWRwdXQoc2RlbnRyeSk7CisJCQlyZXR1
cm4gRVJSX1BUUihlcnJvcik7CisJCX0KKwl9CisJcmV0dXJuIHNkZW50cnk7Cit9CisKK3N0
YXRpYyBpbnQgbmZzX3NpbGx5cmVuYW1lKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVu
dHJ5ICpkZW50cnkpCit7CisJc3RhdGljIGludCAgICAgc2NvdW50ZXIgICA9IDA7CisJY29u
c3QgaW50ICAgICAgaV9pbm9zaXplICA9IHNpemVvZihkaXItPmlfaW5vKSAqIDI7CisJY29u
c3QgaW50ICAgICAgc2NzaXplICAgICA9IHNpemVvZihzY291bnRlcikgKiAyOworICAgICAg
ICBjb25zdCBpbnQgICAgICBiYXNlbGVuICAgID0gc2l6ZW9mKCIubmZzIikgLSAxICsgaV9p
bm9zaXplICsgMTsKKwljb25zdCBpbnQgICAgICBzbGVuICAgICAgID0gYmFzZWxlbiArIHNj
c2l6ZTsKKwljaGFyICAgICAgICAgICBzaWxseVtzbGVuKzFdOworCWludCAgICAgICAgICAg
IGVycm9yOworCXN0cnVjdCBkZW50cnkgKnNkZW50cnk7CisKKwlzcHJpbnRmKHNpbGx5LCAi
Lm5mcyUqLipseC4iLCBpX2lub3NpemUsIGlfaW5vc2l6ZSwKKwkJZGVudHJ5LT5kX2lub2Rl
LT5pX2lubyk7CisKKwlzZGVudHJ5ICA9IE5VTEw7CisJZG8geworCQlkcHV0KHNkZW50cnkp
OworCQlzcHJpbnRmKHNpbGx5ICsgYmFzZWxlbiwgIiUqLip4Iiwgc2NzaXplLCBzY3NpemUs
IHNjb3VudGVyKyspOworCisJCWRmcHJpbnRrKFZGUywgInRyeWluZyB0byByZW5hbWUgJXMg
dG8gJXNcbiIsCisJCQkgZGVudHJ5LT5kX25hbWUubmFtZSwgc2lsbHkpOworCQkKKwkJc2Rl
bnRyeSA9IG5mc19zaWxseV9sb29rdXAoZGVudHJ5LT5kX3BhcmVudCwgc2lsbHksIHNsZW4p
OworCQlpZiAoSVNfRVJSKHNkZW50cnkpKSB7CisJCQlyZXR1cm4gLUVJTzsgLyogRklYTUUg
PyAqLworCQl9CQkKKwl9IHdoaWxlKHNkZW50cnktPmRfaW5vZGUgIT0gTlVMTCk7IC8qIG5l
ZWQgYSBuZWdhdGl2ZSBsb29rdXAgKi8KKworCWVycm9yID0gbmZzX3JlbmFtZShkaXIsIGRl
bnRyeSwgZGlyLCBzZGVudHJ5KTsKKwlkcHV0KHNkZW50cnkpOworCisJaWYgKGVycm9yKQor
CQlyZXR1cm4gZXJyb3I7CisKKwlkZW50cnktPmRfZmxhZ3MgfD0gRENBQ0hFX05GU0ZTX1JF
TkFNRUQ7CisJcmV0dXJuIDA7IC8qIGRvbid0IHVubGluayAqLworfQorCitzdGF0aWMgaW50
IG5mc19kb191bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRy
eSkKIHsKIAlpbnQgZXJyb3I7CiAKKwllcnJvciA9IG5mc19wcm9jX3JlbW92ZShORlNfU0VS
VkVSKGRpciksCisJCQkJTkZTX0ZIKGRpciksIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWlm
IChlcnJvciA8IDApCisJCXJldHVybiBlcnJvcjsKKwkKKwluZnNfaW52YWxpZGF0ZV9kaXJj
YWNoZShkaXIpOworCWRfZGVsZXRlKGRlbnRyeSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRp
YyB2b2lkIG5mc19zaWxseV9kZWxldGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWlm
IChkZW50cnktPmRfZmxhZ3MgJiBEQ0FDSEVfTkZTRlNfUkVOQU1FRCkgeworCQlzdHJ1Y3Qg
aW5vZGUgKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJCWludCBlcnJvcjsK
KwkJCisJCWRlbnRyeS0+ZF9mbGFncyAmPSB+RENBQ0hFX05GU0ZTX1JFTkFNRUQ7CisKKwkJ
ZG93bigmZGlyLT5pX3NlbSk7IC8qIGhvcGVmdWxseSB0aGlzIHdpbGwgbm90IGxvY2sgdXAg
Ki8KKwkJZXJyb3IgPSBuZnNfZG9fdW5saW5rKGRpciwgZGVudHJ5KTsKKwkJdXAoJmRpci0+
aV9zZW0pOworCisJCWlmIChlcnJvciA8IDApCisJCQlwcmludGsoIk5GUyAiIF9fRlVOQ1RJ
T05fXyAiIGZhaWxlZCAoZXJyID0gJWQpXG4iLAorCQkJICAgICAgIC1lcnJvcik7CisJfQor
fQorCisvKiAgV2UgZG8gc2lsbHkgcmVuYW1lLiBJbiBjYXNlIHNpbGx5cmVuYW1lKCkgcmV0
dXJucyAtRUJVU1ksIHRoZSBpbm9kZQorICogIGJlbG9uZ3MgdG8gYW4gYWN0aXZlICIubmZz
Li4uIiBmaWxlIGFuZCB3ZSByZXR1cm4gLUVCVVNZLgorICoKKyAqICBJZiBzaWxseXJlbmFt
ZSgpIHJldHVybnMgMCwgd2UgZG8gbm90aGluZywgb3RoZXJ3aXNlIHdlIHVubGluay4KKyAq
Lworc3RhdGljIGludCBuZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVu
dHJ5ICpkZW50cnkpCit7CisKIAlkZnByaW50ayhWRlMsICJORlM6IHVubGluaygleC8lbGQs
ICVzKVxuIiwKIAkJCQlkaXItPmlfZGV2LCBkaXItPmlfaW5vLCBkZW50cnktPmRfbmFtZS5u
YW1lKTsKIApAQCAtNTQ2LDE2ICs2ODMsMTYgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQog
CisJaWYgKGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9ORlNGU19SRU5BTUVEKQorCQlyZXR1
cm4gLUVCVVNZOyAvKiBkb24ndCBhbGxvdyB1bmxpbmtpbmcgb2Ygc2lsbHkgZGVudHJpZXMg
Ki8KKwogCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiBORlNfTUFYTkFNTEVOKQogCQlyZXR1
cm4gLUVOQU1FVE9PTE9ORzsKIAotCWVycm9yID0gbmZzX3Byb2NfcmVtb3ZlKE5GU19TRVJW
RVIoZGlyKSwgTkZTX0ZIKGRpciksIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwotCWlmIChlcnJv
cikKLQkJcmV0dXJuIGVycm9yOwotCi0JbmZzX2ludmFsaWRhdGVfZGlyY2FjaGUoZGlyKTsK
LQlkX2RlbGV0ZShkZW50cnkpOwotCXJldHVybiAwOworCWlmIChkZW50cnktPmRfY291bnQg
PT0gMSB8fCBuZnNfc2lsbHlyZW5hbWUoZGlyLCBkZW50cnkpIDwgMCkKKwkJcmV0dXJuIG5m
c19kb191bmxpbmsoZGlyLCBkZW50cnkpOworCWVsc2UKKwkJcmV0dXJuIDA7CiB9CiAKIHN0
YXRpYyBpbnQgbmZzX3N5bWxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkg
KmRlbnRyeSwgY29uc3QgY2hhciAqc3ltbmFtZSkKQEAgLTU4OCw3ICs3MjUsNyBAQAogCQly
ZXR1cm4gZXJyb3I7CiAKIAluZnNfaW52YWxpZGF0ZV9kaXJjYWNoZShkaXIpOwotCS8qICB0
aGlzIGxvb2tzIF9mdW5ueV8gZG9lc24ndCBpdD8gQnV0OiBuZnNfcHJvY19zeW1seW5rKCkK
KwkvKiAgdGhpcyBsb29rcyBfZnVubnlfIGRvZXNuJ3QgaXQ/IEJ1dDogbmZzX3Byb2Nfc3lt
bGluaygpCiAJICogIG9ubHkgZmlsbHMgaW4gc2F0dHIsIG5vdCBmYXR0ci4gVGh1cyBuZnNf
ZmhnZXQoKSBjYW5ub3QgYmUKIAkgKiAgY2FsbGVkLCBpdCB3b3VsZCBiZSBwb2ludGxlc3Ms
IHdpdGhvdXQgYSB2YWxpZCBmYXR0cgogCSAqICBhcmd1bWVudC4gT3RoZXIgcG9zc2liaWxp
dHk6IGNhbGwgbmZzX3Byb2NfbG9va3VwKCkKQEAgLTYzNCw4ICs3NzEsMTEgQEAKICAqIGRp
ZmZlcmVudCBmaWxlIGhhbmRsZSBmb3IgdGhlIHNhbWUgaW5vZGUgYWZ0ZXIgYSByZW5hbWUg
KGUuZy4gd2hlbgogICogbW92aW5nIHRvIGEgZGlmZmVyZW50IGRpcmVjdG9yeSkuIEEgZmFp
bC1zYWZlIG1ldGhvZCB0byBkbyBzbyB3b3VsZAogICogYmUgdG8gbG9vayB1cCBvbGRfZGly
L29sZF9uYW1lLCBjcmVhdGUgYSBsaW5rIHRvIG5ld19kaXIvbmV3X25hbWUgYW5kCi0gKiBy
ZW5hbWUgdGhlIG9sZCBmaWxlIHVzaW5nIHRoZSBzaWxseV9yZW5hbWUgc3R1ZmYuIFRoaXMg
d2F5LCB0aGUgb3JpZ2luYWwKKyAqIHJlbmFtZSB0aGUgb2xkIGZpbGUgdXNpbmcgdGhlIHNp
bGx5cmVuYW1lIHN0dWZmLiBUaGlzIHdheSwgdGhlIG9yaWdpbmFsCiAgKiBmaWxlIGluIG9s
ZF9kaXIgd2lsbCBnbyBhd2F5IHdoZW4gdGhlIGxhc3QgcHJvY2VzcyBpcHV0KClzIHRoZSBp
bm9kZS4KKyAqCisgKiBOb3QgZml4ZWQuIEkgZG9uJ3QgdGhpbmsgdGhhdCB0aGlzIGNhbiBi
ZSBmaXhlZCBoZXJlLiBOb3BlLiA6LSgKKyAqCiAgKi8KIHN0YXRpYyBpbnQgbmZzX3JlbmFt
ZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCiAJ
CSAgICAgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRy
eSkKQEAgLTY1NiwxMyArNzk2LDE1IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAorCWlm
IChvbGRfZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX05GU0ZTX1JFTkFNRUQpCisJCXJldHVy
biAtRUJVU1k7IC8qIGRvbid0IGFsbG93IHJlbmFtaW5nIG9mIHNpbGx5IGRlbnRyaWVzICov
CisKIAlpZiAob2xkX2RlbnRyeS0+ZF9uYW1lLmxlbiA+IE5GU19NQVhOQU1MRU4gfHwgbmV3
X2RlbnRyeS0+ZF9uYW1lLmxlbiA+IE5GU19NQVhOQU1MRU4pCiAJCXJldHVybiAtRU5BTUVU
T09MT05HOwogCiAJZXJyb3IgPSBuZnNfcHJvY19yZW5hbWUoTkZTX1NFUlZFUihvbGRfZGly
KSwKLQkJTkZTX0ZIKG9sZF9kaXIpLCBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwKLQkJTkZT
X0ZIKG5ld19kaXIpLCBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSk7Ci0KKwkJCQlORlNfRkgo
b2xkX2RpciksIG9sZF9kZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCU5GU19GSChuZXdfZGly
KSwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVy
cm9yOwogCkBAIC03MzcsMyArODc5LDEwIEBACiAJfSBlbHNlCiAJCWlub2RlLT5pX29wID0g
TlVMTDsKIH0KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICB2ZXJzaW9uLWNvbnRy
b2w6IHQKKyAqICBrZXB0LW5ldy12ZXJzaW9uczogNQorICogRW5kOgorICovCi0tLSAvdXNy
L3NyYy9saW51eC0yLjEuNTEvZnMvbmZzL2lub2RlLmMJVGh1IEF1ZyAxNCAwMjozNzo0OCAx
OTk3CisrKyBsaW51eC0yLjEuNTEtbmZzLXN3YXAvZnMvbmZzL2lub2RlLmMJU3VuIEF1ZyAy
NCAxODoxMjowMiAxOTk3CkBAIC03NywxMCArNzcsNiBAQAogCWRwcmludGsoIk5GUzogcHV0
X2lub2RlKCV4LyVsZClcbiIsIGlub2RlLT5pX2RldiwgaW5vZGUtPmlfaW5vKTsKIH0KIAot
LyoKLSAqIFRoaXMgc2hvdWxkIGRvIGFueSBzaWxseS1yZW5hbWUgY2xlYW51cHMgb25jZSB3
ZQotICogZ2V0IHNpbGx5LXJlbmFtaW5nIHdvcmtpbmcgYWdhaW4uLgotICovCiBzdGF0aWMg
dm9pZAogbmZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKIHsKQEAgLTQ1
NCw2ICs0NTAsOCBAQAogaW5pdF9uZnNfZnModm9pZCkKIHsKICNpZmRlZiBDT05GSUdfUFJP
Q19GUworCXJwY19yZWdpc3Rlcl9zeXNjdGwoKTsKKwlycGNfcHJvY19pbml0KCk7CiAJcnBj
X3Byb2NfcmVnaXN0ZXIoJm5mc19ycGNzdGF0KTsKICNlbmRpZgogICAgICAgICByZXR1cm4g
cmVnaXN0ZXJfZmlsZXN5c3RlbSgmbmZzX2ZzX3R5cGUpOwotLS0gL3Vzci9zcmMvbGludXgt
Mi4xLjUxL2luY2x1ZGUvbGludXgvbmZzX2ZzX2kuaAlNb24gQXVnIDE4IDAwOjA5OjQ0IDE5
OTcKKysrIGxpbnV4LTIuMS41MS1uZnMtc3dhcC9pbmNsdWRlL2xpbnV4L25mc19mc19pLmgJ
TW9uIEF1ZyAyNSAwMDo1MDoxNCAxOTk3CkBAIC00NywxMyArNDcsNiBAQAogCXVuc2lnbmVk
IGxvbmcJCWF0dHJ0aW1lbzsKIAogCS8qCi0JICogVGhpcyBpcyB0byBzdXBwb3J0IHRoZSBj
bGFuZGVzdGluZSByZW5hbWUgb24gdW5saW5rLgotCSAqIEluc3RlYWQgb2YgdGhlIGRpcmVj
dG9yeSBpbm9kZSwgd2UgbWlnaHQgYXMgd2VsbCBrZWVwCi0JICogaXRzIE5GUyBGSCwgYnV0
IHRoYXQgcmVxdWlyZXMgYSBrbWFsbG9jLgotCSAqLwotCXN0cnVjdCBpbm9kZSAqCQlzaWxs
eV9pbm9kZTsKLQotCS8qCiAJICogVGhpcyBpcyB0aGUgbGlzdCBvZiBkaXJ0eSB1bndyaXR0
ZW4gcGFnZXMuCiAJICogTkZTdjMgd2lsbCB3YW50IHRvIGFkZCBhIGxpc3QgZm9yIHdyaXR0
ZW4gYnV0IHVuY29tbWl0dGVkCiAJICogcGFnZXMuCi0tLSAvdXNyL3NyYy9saW51eC0yLjEu
NTEvaW5jbHVkZS9saW51eC9kY2FjaGUuaAlUaHUgQXVnIDIxIDE5OjE5OjMzIDE5OTcKKysr
IGxpbnV4LTIuMS41MS1uZnMtc3dhcC9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oCVNhdCBBdWcg
MjMgMjA6NTI6MDQgMTk5NwpAQCAtNTcsNiArNTcsNyBAQAogCWludCAoKmRfcmV2YWxpZGF0
ZSkoc3RydWN0IGRlbnRyeSAqKTsKIAlpbnQgKCpkX2hhc2gpIChzdHJ1Y3QgZGVudHJ5ICos
c3RydWN0IHFzdHIgKik7CiAJaW50ICgqZF9jb21wYXJlKSAoc3RydWN0IGRlbnRyeSAqLHN0
cnVjdCBxc3RyICosIHN0cnVjdCBxc3RyICopOworCXZvaWQgKCpkX2RlbGV0ZSkoc3RydWN0
IGRlbnRyeSAqKTsKIH07CiAKIC8qIHRoZSBkZW50cnkgcGFyYW1ldGVyIHBhc3NlZCB0byBk
X2hhc2ggYW5kIGRfY29tcGFyZSBpcyB0aGUgcGFyZW50CkBAIC03MCw2ICs3MSwxMCBAQAog
CiAvKiBkX2ZsYWdzIGVudHJpZXMgKi8KICNkZWZpbmUgRENBQ0hFX0FVVE9GU19QRU5ESU5H
IDB4MDAwMSAgICAvKiBhdXRvZnM6ICJ1bmRlciBjb25zdHJ1Y3Rpb24iICovCisjZGVmaW5l
IERDQUNIRV9ORlNGU19SRU5BTUVEICAweDAwMDIgICAgLyogdGhpcyBkZW50cnkgaGFzIGJl
ZW4gInNpbGx5CisJCQkJCSAqIHJlbmFtZWQiIGFuZCBoYXMgdG8gYmUKKwkJCQkJICogZGVs
ZXRlZCBvbiB0aGUgbGFzdCBkcHV0KCkKKwkJCQkJICovCiAKIC8qCiAgKiBkX2Ryb3AoKSB1
bmhhc2hlcyB0aGUgZW50cnkgZnJvbSB0aGUgcGFyZW50Cgo=

--Multipart_Mon_Aug_25_00:54:59_1997-1--

--pgp-sign-Multipart_Mon_Aug_25_00:54:59_1997-1
Content-Type: application/pgp-signature
Content-Transfer-Encoding: 7bit

-----BEGIN PGP MESSAGE-----
Version: 2.6.3i
Comment: Processed by Mailcrypt 3.4, an Emacs/PGP interface

iQCVAwUBNAC7/No/s1zPE7AdAQFBGQP9FACKKLfIAQeFEbpFn2fv7lwOUictiryH
Dw+pbuz4DmquhLtdDzByO0hej2o5i670j/vopbFt2abcJ8znMp2Mw38u2Zx/Jmdv
PioN3n6w0TFyaKAGgKCR+Qv8NTU1C4zwLO0j4h3Ilvf/kxiAhboXWAhNlx0njLGH
eFKIwld9rCA=
=YvNG
-----END PGP MESSAGE-----

--pgp-sign-Multipart_Mon_Aug_25_00:54:59_1997-1--