* [Ocfs2-devel] [PATCH 1/1] OCFS2: add spin lock when accessing inode->i_nlink.
@ 2008-09-22 9:15 wangang wang
2008-09-22 21:18 ` Sunil Mushran
0 siblings, 1 reply; 5+ messages in thread
From: wangang wang @ 2008-09-22 9:15 UTC (permalink / raw)
To: ocfs2-devel
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@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);
^ permalink raw reply [flat|nested] 5+ messages in thread* [Ocfs2-devel] [PATCH 1/1] OCFS2: add spin lock when accessing inode->i_nlink. 2008-09-22 9:15 [Ocfs2-devel] [PATCH 1/1] OCFS2: add spin lock when accessing inode->i_nlink wangang wang @ 2008-09-22 21:18 ` Sunil Mushran 2008-09-23 2:16 ` wengang wang 0 siblings, 1 reply; 5+ messages in thread From: Sunil Mushran @ 2008-09-22 21:18 UTC (permalink / raw) To: ocfs2-devel 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@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 > ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Ocfs2-devel] [PATCH 1/1] OCFS2: add spin lock when accessing inode->i_nlink. 2008-09-22 21:18 ` Sunil Mushran @ 2008-09-23 2:16 ` wengang wang 2008-09-23 3:23 ` Tao Ma 0 siblings, 1 reply; 5+ messages in thread From: wengang wang @ 2008-09-23 2:16 UTC (permalink / raw) To: ocfs2-devel 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@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 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Ocfs2-devel] [PATCH 1/1] OCFS2: add spin lock when accessing inode->i_nlink. 2008-09-23 2:16 ` wengang wang @ 2008-09-23 3:23 ` Tao Ma 2008-09-23 7:42 ` wengang wang 0 siblings, 1 reply; 5+ messages in thread From: Tao Ma @ 2008-09-23 3:23 UTC (permalink / raw) To: ocfs2-devel Hi wengang, wengang wang wrote: > 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. > ip_lock here is used to protect the set of ip_flags. Regards, Tao ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Ocfs2-devel] [PATCH 1/1] OCFS2: add spin lock when accessing inode->i_nlink. 2008-09-23 3:23 ` Tao Ma @ 2008-09-23 7:42 ` wengang wang 0 siblings, 0 replies; 5+ messages in thread From: wengang wang @ 2008-09-23 7:42 UTC (permalink / raw) To: ocfs2-devel Hi, Tao Ma wrote: > Hi wengang, > > wengang wang wrote: >> 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. >> > ip_lock here is used to protect the set of ip_flags. > my concern is that the two function runs as following in timer order. process A running in ocfs2_drop_inode() and B running in ocfs2_meta_lock_update() A if (oi->ip_flags & OCFS2_INODE_MAYBE_ORPHANED) { C(omment): now inode->i_nlink is not 0. B if (inode->i_nlink && oi->ip_flags & OCFS2_INODE_MAYBE_ORPHANED) { B mlog(0, "Inode %"MLFu64": clearing maybe_orphaned flag\n", oi->ip_blkno); B oi->ip_flags &= ~OCFS2_INODE_MAYBE_ORPHANED; B } A mlog(0, "Inode was orphaned on another node, clearing nlink.\n"); A inode->i_nlink = 0; A } thus, as a result, 1) OCFS2_INODE_MAYBE_ORPHANED is cleared but inode->i_nlink is 0. but result we wanted is 2) OCFS2_INODE_MAYBE_ORPHANED is set and i_nlink is 0 or 3) OCFS2_INODE_MAYBE_ORPHANED is cleared and i_nlink is not 0. well, seems 1) won't happen. when ocfs2_drop_inode() is running, the inode is with 0 ref count and with inode_lock's protect. so other process can't get any ref on this inode and so won't run ocfs2_meta_lock_update() on this inode. so the original code is no problem. but if it's not in ocfs2_drop_inode(), it's not a good code. thanks, wengang. > Regards, > Tao > ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2008-09-23 7:42 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-09-22 9:15 [Ocfs2-devel] [PATCH 1/1] OCFS2: add spin lock when accessing inode->i_nlink wangang wang 2008-09-22 21:18 ` Sunil Mushran 2008-09-23 2:16 ` wengang wang 2008-09-23 3:23 ` Tao Ma 2008-09-23 7:42 ` wengang wang
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.