[Ocfs2-devel] question of ocfs2_do_flock()
Coly Li
coyli at suse.de
Wed Nov 5 03:15:20 PST 2008
Mark Fasheh Wrote:
> On Tue, Nov 04, 2008 at 06:52:30PM +0800, Coly Li wrote:
>> Hi list,
>>
>> These days I am working on a L3 bug on SLES10 SP2. When I read ocfs2_do_flock(), there are some
>> questions from me. Wish anybody can give me a little hint to understand the code. Thanks.
>>
>>
>>
>> static int ocfs2_do_flock(struct file *file, struct inode *inode,
>> int cmd, struct file_lock *fl)
>> {
>> int ret = 0, level = 0, trylock = 0;
>> struct ocfs2_file_private *fp = file->private_data;
>> struct ocfs2_lock_res *lockres = &fp->fp_flock;
>>
>> if (fl->fl_type == F_WRLCK)
>> level = 1;
>> if (!IS_SETLKW(cmd))
>> trylock = 1;
>>
>> mutex_lock(&fp->fp_mutex);
>>
>> if (lockres->l_flags & OCFS2_LOCK_ATTACHED &&
>> lockres->l_level > LKM_NLMODE) {
>> int old_level = 0;
>>
>> if (lockres->l_level == LKM_EXMODE)
>> old_level = 1;
>
> Hmm, we shouldn't really be using LKM_* constants any more. This must have
> slipped past me in the last merge. There shouldn't be any real problem
> though since each dlm uses the same values for the locking mode constants.
> Still, we should fix this. There also seems to be some debug stuff in
> dlmglue.c which is doing this too.
So what we are using to replace LKM_* right now ?
>
>
>> if (level == old_level)
>> goto out;
>> -----------
>> Question: when level and oldlevel are not (0 and 0) or (1 and 1), I don't see any code does dlm lock
>> compatibility logic. I don't undersand why the code here can try to unlock directly.
>>
>> -----------
>
> It's just as the below comment says - flock conversion between two modes is
> not guaranteed to be atomic. The easiest method for us to deal with these
> sorts of requests then, is to simply unlock and relock at the new level.
> From the flock man page:
>
> Converting a lock (shared to exclusive, or vice versa) is not guaran-
> teed to be atomic: the existing lock is first removed, and then a new
> lock is established.
>
> Dealing with upconversion and downconversion of locks at the distributed
> locking level is rather complex. Enough so that it's only worth the effort
> on locks which really need it.
>
If the resource is PR locked by other holder, a caller wants to hold a CR lock, does it means the
caller should wait for the resource to be unlocked firstly ?
Is this what confused me here.
>
>> /*
>> * Converting an existing lock is not guaranteed to be
>> * atomic, so we can get away with simply unlocking
>> * here and allowing the lock code to try at the new
>> * level.
>> */
>>
>> flock_lock_file_wait(file,
>> &(struct file_lock){.fl_type = F_UNLCK});
>>
>> ocfs2_file_unlock(file);
>> }
>> [snip]
>> }
--
Coly Li
SuSE PRC Labs
More information about the Ocfs2-devel
mailing list