wangang wang
2008-Sep-22 09:48 UTC
[Ocfs2-devel] [PATCH 1/1] OCFS2: unhash all dentries on a inode.
In ocfs2_process_delete_request(), we should unhash all dentries on the inode. --not only the ones with 0 referrence count. so that it's possible for dput() to drop the stale inode. the patch is against 1.2 svn. Signed-off-by: Wengang wang <wen.gang.wang at oracle.com> -- Index: fs/ocfs2/vote.c ==================================================================--- fs/ocfs2/vote.c (revision 3101) +++ fs/ocfs2/vote.c (working copy) @@ -176,6 +176,7 @@ int deleting_node) { int response = OCFS2_RESPONSE_BUSY; + struct list_head *tmp, *head; mlog(0, "DELETE vote on inode %lu, read lnk_cnt = %u, slot = %d\n", inode->i_ino, inode->i_nlink, *orphaned_slot); @@ -253,9 +254,19 @@ ocfs2_mark_inode_remotely_deleted(inode, deleting_node); spin_unlock(&OCFS2_I(inode)->ip_lock); - /* Not sure this is necessary anymore. */ - d_prune_aliases(inode); + /* unhash all dentries on this inode */ + spin_lock(&dcache_lock); + head = &inode->i_dentry; + tmp = head; + while ((tmp = tmp->next) != head) { + struct dentry *dentry = list_entry(tmp, struct dentry, d_alias); + spin_lock(&dentry->d_lock); + __d_drop(dentry); + spin_unlock(&dentry->d_lock); + } + spin_unlock(&dcache_lock); + /* If we get here, then we're voting 'yes', so commit the * delete on our side. */ response = OCFS2_RESPONSE_OK;
Sunil Mushran
2008-Sep-22 21:46 UTC
[Ocfs2-devel] [PATCH 1/1] OCFS2: unhash all dentries on a inode.
NAK. I fail to understand your logic. The code you've added is pretty much what d_prune_aliases() does (the call you have deleted). wangang wang wrote:> In ocfs2_process_delete_request(), we should unhash all dentries on the inode. > --not only the ones with 0 referrence count. so that it's possible for dput() > to drop the stale inode. > > the patch is against 1.2 svn. > > Signed-off-by: Wengang wang <wen.gang.wang at oracle.com> > -- > > Index: fs/ocfs2/vote.c > ==================================================================> --- fs/ocfs2/vote.c (revision 3101) > +++ fs/ocfs2/vote.c (working copy) > @@ -176,6 +176,7 @@ > int deleting_node) > { > int response = OCFS2_RESPONSE_BUSY; > + struct list_head *tmp, *head; > > mlog(0, "DELETE vote on inode %lu, read lnk_cnt = %u, slot = %d\n", > inode->i_ino, inode->i_nlink, *orphaned_slot); > @@ -253,9 +254,19 @@ > ocfs2_mark_inode_remotely_deleted(inode, deleting_node); > spin_unlock(&OCFS2_I(inode)->ip_lock); > > - /* Not sure this is necessary anymore. */ > - d_prune_aliases(inode); > + /* unhash all dentries on this inode */ > + spin_lock(&dcache_lock); > + head = &inode->i_dentry; > + tmp = head; > > + while ((tmp = tmp->next) != head) { > + struct dentry *dentry = list_entry(tmp, struct dentry, d_alias); > + spin_lock(&dentry->d_lock); > + __d_drop(dentry); > + spin_unlock(&dentry->d_lock); > + } > + spin_unlock(&dcache_lock); > + > /* If we get here, then we're voting 'yes', so commit the > * delete on our side. */ > response = OCFS2_RESPONSE_OK; > > _______________________________________________ > Ocfs2-devel mailing list > Ocfs2-devel at oss.oracle.com > http://oss.oracle.com/mailman/listinfo/ocfs2-devel >