[patch] POSIX advisory mode lock panic fix by Dfly
Matthew Dillon
dillon at apollo.backplane.com
Tue Apr 20 12:34:44 PDT 2004
:I'll get a new patch implementing this behavior of an unconditional
:up/downgrade of the count in lf_alloc() and lf_free(). By ``main
:switch'', are you referring to the F_[SETLK|GETLK|UNLCK] switch, or the
:overlap switches found in lf_setlock and lf_clearlock (I'm assuming the
:latter). More to come later :)
:
:Kind regards,
:
:Devon H. O'Dell
Yah, the F_XXX switch. F_SETLK can simply check the count prior to
setting the lock, and F_UNLCK would have to check it for the split
case. What I recommend is something like this (pseudo code):
res_exceeded = (check if resource is exceeded)
F_SETLK:
if (res_exceeded) {
... fail ...
} else {
set the lock normally
}
break;
F_UNLCK:
/*
* Note: if res_exceeded is non-zero the unlock will fail if it
* involves splitting an existing lock structure.
*/
error = dotheunlock(..., res_exceeded);
break;
Alternatively as a performance optimization you can write a procedure
which calculates whether the resource has been exceeded and just embed
a call to that procedure in just the F_SETLK and F_UNLCK cases.
F_SETLK:
if (lf_res_exceeded(ucred)) {
... fail ...
} else {
set the lock normally.
}
break;
F_UNLCK:
...
error = dotheunlock(..., lf_res_exceeded(ucred))
break;
Again, this is all pseudo code. Remember that the idea is not
necessarily to hit the resource limit 'on the mark', but simply to ensure
that the resource limit is nominally adhered to.
-Matt
Matthew Dillon
<dillon at xxxxxxxxxxxxx>
More information about the Submit
mailing list