Re: How NLM support posix threads?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> During "fl_grant" callback wrong "block" will be compared hence
> this will result in lock failure even if lock is actually granted.

"nlm_compare_locks" will compare the locks on the bases of pid, owner,
start offset, end offset and type. In case of posix threads as pid is
same, also all other parameters can be same for locks of different
files.

Now the scenario is, if there are two posix thread with pid p1 and
they try to take the lock on different files (say l1 and l2) then
different blocks will be created (say b1 and b2). In this case
underline filesystem may send "FILE_LOCK_DEFERRED" for both the locks
and these blocks will be added to deferred block list.

So during "fl_grant" callback lock are compared with the blocks of
block list. Now lets say callback is called for l1 and the comparison
will succeed with b1 (this is as expected) and B_GOT_CALLBACK flag
will be set. But as b1 is still in block list, now when callback for
l2 arrives then also comparison with b1 can succeed instead of b2
because b1 is prior to b2 in the list. Hence B_GOT_CALLBACK flag will
not be set for b2 and when NFS client will retry for lock then lock
will be denied.

Below is the snipt fl_grant code where comparison happens.
list_for_each_entry(block, &nlm_blocked, b_list) {
if (nlm_compare_locks(&block->b_call->a_args.lock.fl, fl))


On Fri, Feb 10, 2017 at 8:40 PM, Trond Myklebust
<trondmy@xxxxxxxxxxxxxxx> wrote:
> On Fri, 2017-02-10 at 14:51 +0530, Pankaj Singh wrote:
>> Hi,
>>
>> I am getting a strange problem where locks are denied by NFSv3 server
>> even though no locks on same file where taken.
>>
>> While looking at the code it seems like NLM compares a lock by using
>> "pid" and other options like form - to file offset, type of lock etc.
>> But we are interested in "pid" because other comparison can be same
>> for different file_locks.
>>
>>  As we know posix threads use tgid as pid for all its thread hence
>> NFSv3 server will can get lock request from different posix thread
>> but
>> with same pid. Hence NLM  will treat the locking request as they are
>> coming from same process. This may result in following problems
>
> Threads that share the same process id belong, by definition, to the
> same process.
>
>> 1. Different threads of same process can get lock on same file.
>
> That is precisely how POSIX locks are expected to work in threaded
> environments.
> http://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html
> "An exclusive lock shall prevent any other process from setting a
> shared lock or an exclusive lock on any portion of the protected area."
>
>
>> 2. During "fl_grant" callback wrong "block" will be compared hence
>> this will result in lock failure even if lock is actually granted.
>
> How so?
>
>> Is this a limitation of NLM?
>>
>
>
> --
> Trond Myklebust
> Linux NFS client maintainer, PrimaryData
> trond.myklebust@xxxxxxxxxxxxxxx



-- 
Regards,
Pankaj SIngh
Phone No: 8826266889
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux