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 >