[Ocfs2-devel] [PATCH 1/1] OCFS2: add spin lock when accessing inode->i_nlink.

wengang wang wen.gang.wang at oracle.com
Mon Sep 22 19:16:57 PDT 2008


Sunil and Srini,

Yes, it's protected by the inode_lock. and thanks for your detail.
well, I found a fragment of code in ocfs2_meta_lock_update(),

#ifdef OCFS2_DELETE_INODE_WORKAROUND
        /* We might as well check this here - since the inode is now
         * locked, an up to date view will indicate whether this was
         * never actually orphaned -- i_nlink should be zero for an
         * orphaned inode. */
        spin_lock(&oi->ip_lock);
        if (inode->i_nlink &&
            oi->ip_flags & OCFS2_INODE_MAYBE_ORPHANED) {
                mlog(0, "Inode %"MLFu64": clearing maybe_orphaned flag\n",
                     oi->ip_blkno);
                oi->ip_flags &= ~OCFS2_INODE_MAYBE_ORPHANED;
        }
        spin_unlock(&oi->ip_lock);
#endif

the i_nlink and OCFS2_INODE_MAYBE_ORPHANED flag are checked with the 
protection of ip_lock.
If ip_lock is needed here, I think it's need as well in my patch.

thanks,
wengang.

Sunil Mushran wrote:
> NAK
>
> Firstly ip_lock does not protect inode. Secondly, the field is
> protected by inode_lock. Follow the code:
>
> iput (inode_lock taken) => iput_final ==> ocfs2_drop_inode (inode_lock 
> still held).
>
> void iput(struct inode *inode)
> {
> ....
>                if (atomic_dec_and_lock(&inode->i_count, &inode_lock))
>                        iput_final(inode);
> }
>
> static inline void iput_final(struct inode *inode)
> {
>        struct super_operations *op = inode->i_sb->s_op;
>        void (*drop)(struct inode *) = generic_drop_inode;
>
>        if (op && op->drop_inode)
>                drop = op->drop_inode;
>        drop(inode);
> }
>
>
> wangang wang wrote:
>> add spin lock when accessing inode->i_nlink in ocfs2_drop_inode().
>>
>> the patch is against 1.2 svn.
>>
>> Signed-off-by: Wengang wang <wen.gang.wang at oracle.com>
>> -- 
>> Index: fs/ocfs2/inode.c
>> ===================================================================
>> --- fs/ocfs2/inode.c    (revision 3101)
>> +++ fs/ocfs2/inode.c    (working copy)
>> @@ -991,10 +991,12 @@
>>      /* Testing ip_orphaned_slot here wouldn't work because we may
>>       * not have gotten a delete_inode vote from any other nodes
>>       * yet. */
>> +    spin_lock(&oi->ip_lock);
>>      if (oi->ip_flags & OCFS2_INODE_MAYBE_ORPHANED) {
>>          mlog(0, "Inode was orphaned on another node, clearing 
>> nlink.\n");
>>          inode->i_nlink = 0;
>>      }
>> +    spin_unlock(&oi->ip_lock);
>>  
>>      generic_drop_inode(inode);
>>  
>>
>> _______________________________________________
>> Ocfs2-devel mailing list
>> Ocfs2-devel at oss.oracle.com
>> http://oss.oracle.com/mailman/listinfo/ocfs2-devel
>>   
>

-- 
Wengang Wang
Member of Technical Staff
Oracle Asia R&D Center
Open Source Technologies Development

Tel:      +86 10 8278 6265
Mobile:   +86 13381078925




More information about the Ocfs2-devel mailing list