* [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.