tech-kern archive

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

Re: locking from VOP_INACTIVE to VOP_RECLAIM



> On 2. Apr 2017, at 18:19, Taylor R Campbell <campbell+netbsd-tech-kern%mumble.net@localhost> wrote:
> 
>> Date: Sun, 2 Apr 2017 16:34:20 +0200
>> From: "J. Hannken-Illjes" <hannken%eis.cs.tu-bs.de@localhost>
>> 
>> Looks like your proposal needs some clarification regarding "vnode lock"
>> and "the lock".
>> 
>> We have two vnode related locks:
>> 
>> - the "vnode lock", located as field "vi_lock" in "struct vnode_impl"
>>  used by genfs_*lock() aka VOP_*LOCK.
>> 
>> - the "genfs lock" located as field "g_lock" in "struct genfs_node"
>>  used by genfs_node_*lock().
>> 
>> Which lock do you want to be held across VOP_INACTIVE and destroyed
>> from VOP_RECLAIM?
> 
> Aha!  That would explain why I had trouble tracking down why an assert
> I was planning to add kept firing.  I was thinking that the genfs node
> lock and the vnode lock were one and the same.
> 
> My proposal was about the vnode lock, not the genfs lock.  Since
> VOP_RECLAIM does *not* destroy the vnode lock, and must leave it
> either locked or unlocked, I suggest leaving it locked -- it's always
> easier to think about subroutines that preserve the state of a lock
> (locked to locked, or unlocked to unlocked) rather than changing it
> (locked to unlocked or unlocked to locked).

Looks good to me so far and please keep in mind that VOP_RECLAIM
must not drop/aquire the lock as it will never get it back for a
vnode in state RECLAIMING.

> (As an aside, we may have some bugs in ffs concerning use of the
> struct inode::i_size field -- some callers seem to think access is
> serialized by the genfs lock, while others, e.g. ufs_readwrite.c, seem
> to use the vnode lock.  This needs to be documented more clearly...)

--
J. Hannken-Illjes - hannken%eis.cs.tu-bs.de@localhost - TU Braunschweig (Germany)



Home | Main Index | Thread Index | Old Index